From 3a2d6368ed9493ae9b6946555cfa43097fd700f2 Mon Sep 17 00:00:00 2001 From: snewcomer Date: Thu, 8 Feb 2018 09:57:22 -0800 Subject: [PATCH] find chained jquery expression --- __testfixtures__/acceptance/find.input.js | 28 +++++++++ __testfixtures__/acceptance/find.output.js | 29 +++++++++ lib/transforms/acceptance/find.js | 68 ++++++++++++++++++++++ 3 files changed, 125 insertions(+) create mode 100644 __testfixtures__/acceptance/find.input.js create mode 100644 __testfixtures__/acceptance/find.output.js create mode 100644 lib/transforms/acceptance/find.js diff --git a/__testfixtures__/acceptance/find.input.js b/__testfixtures__/acceptance/find.input.js new file mode 100644 index 0000000..3db5a5a --- /dev/null +++ b/__testfixtures__/acceptance/find.input.js @@ -0,0 +1,28 @@ +import { test } from 'qunit'; +import moduleForAcceptance from '../../tests/helpers/module-for-acceptance'; + +moduleForAcceptance('find'); + +test('anonymous function callback with two args', function(assert) { + const elemIds = find('.button-class').find((index, element) => { + assert.equal(element.id, `button${index}`); + }); +}); + +test('anonymous function callback with one arg', function(assert) { + const elemIds = find('.button-class').find((index) => { + assert.equal(element.id, `button${index}`); + }); +}); + +test('function callback with two args', function(assert) { + const elemIds = find('.button-class').find(function(i, elem) { + assert.equal(element.id, `button${index}`); + }); +}); + +test('function callback with one arg', function(assert) { + const elemIds = find('.button-class').find((index) => { + assert.equal(element.id, `button${index}`); + }); +}); diff --git a/__testfixtures__/acceptance/find.output.js b/__testfixtures__/acceptance/find.output.js new file mode 100644 index 0000000..9326679 --- /dev/null +++ b/__testfixtures__/acceptance/find.output.js @@ -0,0 +1,29 @@ +import { findAll } from '@ember/test-helpers'; +import { test } from 'qunit'; +import moduleForAcceptance from '../../tests/helpers/module-for-acceptance'; + +moduleForAcceptance('find'); + +test('anonymous function callback with two args', function(assert) { + const elemIds = findAll('.button-class').find((element, index) => { + assert.equal(element.id, `button${index}`); + }); +}); + +test('anonymous function callback with one arg', function(assert) { + const elemIds = findAll('.button-class').find((element, index) => { + assert.equal(element.id, `button${index}`); + }); +}); + +test('function callback with two args', function(assert) { + const elemIds = findAll('.button-class').find(function(elem, i) { + assert.equal(element.id, `button${index}`); + }); +}); + +test('function callback with one arg', function(assert) { + const elemIds = findAll('.button-class').find((element, index) => { + assert.equal(element.id, `button${index}`); + }); +}); diff --git a/lib/transforms/acceptance/find.js b/lib/transforms/acceptance/find.js new file mode 100644 index 0000000..b4e17f2 --- /dev/null +++ b/lib/transforms/acceptance/find.js @@ -0,0 +1,68 @@ +const { + createFindAllExpression, + isFindExpression, + addImportStatement, + writeImportStatements, + transformEachsCallbackArgs +} = require('../../utils'); + +/** + * Creates a `findAll(selector).find()` expression + * + * @param j + * @param findArgs + * @param eachCallback + * @returns {*} + */ +function createExpression(j, findArgs, eachCallback) { + const transformedCallback = transformEachsCallbackArgs(eachCallback); + return j.callExpression( + j.memberExpression( + createFindAllExpression(j, findArgs), + j.identifier('find') + ), transformedCallback + ); +} + +/** + * Check if `node` is a `find(selector).find()` expression + * + * @param j + * @param node + * @returns {*|boolean} + */ +function isJQueryExpression(j, node) { + return j.CallExpression.check(node) + && j.MemberExpression.check(node.callee) + && isFindExpression(j, node.callee.object) + && j.Identifier.check(node.callee.property) + && node.callee.property.name === 'find' +} + +/** + * Transform `find(selector).find()` to `findAll(selector).find()` + * + * @param file + * @param api + * @returns {*|string} + */ +function transform(file, api) { + let source = file.source; + let j = api.jscodeshift; + + let root = j(source); + + let replacements = root + .find(j.CallExpression) + .filter(({ node }) => isJQueryExpression(j, node)) + .replaceWith(({ node }) => createExpression(j, node.callee.object.arguments, node.arguments)); + + if (replacements.length > 0) { + addImportStatement(['findAll']); + } + + writeImportStatements(j, root); + return root.toSource({ quote: 'single' }); +} + +module.exports = transform;