Skip to content

Commit c50704f

Browse files
nlfurnisssimonihmig
authored andcommitted
Add transform for .get()
(cherry picked from commit 807cda6)
1 parent ae48a75 commit c50704f

8 files changed

Lines changed: 180 additions & 2 deletions

File tree

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ This addon will perform the following transformations suitable for integration t
5454
| `this.$('.foo').html()` | `find('.foo').innerHTML` | `html.js` |
5555
| `this.$('.foo').html('foo')` | `find('.foo').innerHTML = 'foo'` | `html.js` |
5656
| `this.$('.foo').each((index, elem) => {...})` | `findAll('.foo').forEach((elem, index) => {...})` | `each.js` |
57+
| `this.$('.foo').get(3)` | `findAll('.foo')[3]` | `get.js` |
5758

5859

5960
If you want to run only selected transforms on your code, you can pick just the needed transform:
@@ -84,6 +85,7 @@ These transformations are available for acceptance tests:
8485
| `find('.foo').html()` | `find('.foo').innerHTML` | `html.js` |
8586
| `find('.foo').html('foo')` | `find('.foo').innerHTML = 'foo'` | `html.js` |
8687
| `find('.foo').each((index, elem) => {...})` | `findAll('.foo').forEach((elem, index) => {...})` | `each.js` |
88+
| `find('.foo').get(3)` | `findAll('.foo')[3]` | `get.js` |
8789

8890
If you want to run only selected transforms on your code, you can pick just the needed transform:
8991

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { test } from 'qunit';
2+
import moduleForAcceptance from '../../tests/helpers/module-for-acceptance';
3+
4+
moduleForAcceptance('get');
5+
6+
test('transforms get() correctly', function(assert) {
7+
assert.ok(find('.foo bar').get(3));
8+
9+
const otherGet = someOtherObj.get(1);
10+
});
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import { findAll } from 'ember-native-dom-helpers';
2+
import { test } from 'qunit';
3+
import moduleForAcceptance from '../../tests/helpers/module-for-acceptance';
4+
5+
moduleForAcceptance('get');
6+
7+
test('transforms get() correctly', function(assert) {
8+
assert.ok(findAll('.foo bar')[3]);
9+
10+
const otherGet = someOtherObj.get(1);
11+
});
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import { moduleForComponent, test } from 'ember-qunit';
2+
import hbs from 'htmlbars-inline-precompile';
3+
4+
moduleForComponent('foo-bar', 'Integration | Component | foo bar', {
5+
integration: true
6+
});
7+
8+
test('transforms get() correctly', function(assert) {
9+
assert.ok(this.$('.foo').get(1));
10+
11+
const otherGet = someOtherObj.get(1);
12+
});
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import { findAll } from 'ember-native-dom-helpers';
2+
import { moduleForComponent, test } from 'ember-qunit';
3+
import hbs from 'htmlbars-inline-precompile';
4+
5+
moduleForComponent('foo-bar', 'Integration | Component | foo bar', {
6+
integration: true
7+
});
8+
9+
test('transforms get() correctly', function(assert) {
10+
assert.ok(findAll('.foo')[1]);
11+
12+
const otherGet = someOtherObj.get(1);
13+
});

lib/transforms/acceptance/each.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
11
const {
22
createFindAllExpression,
3-
createPropExpression,
43
isFindExpression,
54
addImportStatement,
65
writeImportStatements,
76
transformEachsCallbackArgs
8-
} = require('../../utils');
7+
} = require('../../utils');
98

109
/**
1110
* Creates a `findAll(selector).forEach()` expression

lib/transforms/acceptance/get.js

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
const {
2+
createFindAllExpression,
3+
isFindExpression,
4+
addImportStatement,
5+
writeImportStatements,
6+
} = require('../../utils');
7+
8+
/**
9+
* Creates a `findAll(selector)[0]` expression
10+
*
11+
* @param j
12+
* @param findArgs
13+
* @param indexArg
14+
* @returns {*}
15+
*/
16+
function createExpression(j, findArgs, indexArg) {
17+
const index = indexArg[0] && indexArg[0].value || 0;
18+
return j.memberExpression(
19+
createFindAllExpression(j, findArgs),
20+
j.literal(index)
21+
);
22+
}
23+
24+
/**
25+
* Check if `node` is a `find(selector).get(0)` expression
26+
*
27+
* @param j
28+
* @param node
29+
* @returns {*|boolean}
30+
*/
31+
function isJQueryExpression(j, node) {
32+
return j.CallExpression.check(node)
33+
&& j.MemberExpression.check(node.callee)
34+
&& isFindExpression(j, node.callee.object)
35+
&& j.Identifier.check(node.callee.property)
36+
&& node.callee.property.name === 'get';
37+
}
38+
39+
/**
40+
* Transform `find(selector).get(0)` to `findAll(selector)[0]`
41+
*
42+
* @param file
43+
* @param api
44+
* @returns {*|string}
45+
*/
46+
function transform(file, api) {
47+
let source = file.source;
48+
let j = api.jscodeshift;
49+
50+
let root = j(source);
51+
52+
let replacements = root
53+
.find(j.CallExpression)
54+
.filter(({ node }) => isJQueryExpression(j, node))
55+
.replaceWith(({ node }) => createExpression(j, node.callee.object.arguments, node.arguments));
56+
57+
if (replacements.length > 0) {
58+
addImportStatement(['findAll']);
59+
}
60+
61+
writeImportStatements(j, root);
62+
return root.toSource({ quote: 'single' });
63+
}
64+
65+
module.exports = transform;

lib/transforms/integration/get.js

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
const {
2+
createFindAllExpression,
3+
isJQuerySelectExpression,
4+
addImportStatement,
5+
writeImportStatements,
6+
} = require('../../utils');
7+
8+
/**
9+
* Creates a `findAll(selector)[0]` expression
10+
*
11+
* @param j
12+
* @param findArgs
13+
* @param indexArg
14+
* @returns {*}
15+
*/
16+
function createExpression(j, findArgs, indexArg) {
17+
const index = indexArg[0] && indexArg[0].value || 0;
18+
return j.memberExpression(
19+
createFindAllExpression(j, findArgs),
20+
j.literal(index)
21+
);
22+
}
23+
24+
/**
25+
* Check if `node` is a `this.$(selector).get(0)` expression
26+
*
27+
* @param j
28+
* @param node
29+
* @returns {*|boolean}
30+
*/
31+
function isJQueryExpression(j, path) {
32+
let node = path.node;
33+
return j.CallExpression.check(node)
34+
&& j.MemberExpression.check(node.callee)
35+
&& isJQuerySelectExpression(j, node.callee.object, path)
36+
&& j.Identifier.check(node.callee.property)
37+
&& node.callee.property.name === 'get';
38+
}
39+
40+
/**
41+
* Transforms `this.$(selector).get(0)` to `findAll(selector)[0]`
42+
*
43+
* @param file
44+
* @param api
45+
* @returns {*|string}
46+
*/
47+
function transform(file, api) {
48+
let source = file.source;
49+
let j = api.jscodeshift;
50+
51+
let root = j(source);
52+
53+
let replacements = root
54+
.find(j.CallExpression)
55+
.filter((path) => isJQueryExpression(j, path))
56+
.replaceWith(({ node }) => createExpression(j, node.callee.object.arguments, node.arguments));
57+
58+
if (replacements.length > 0) {
59+
addImportStatement(['findAll']);
60+
}
61+
62+
writeImportStatements(j, root);
63+
return root.toSource({ quote: 'single' });
64+
}
65+
66+
module.exports = transform;

0 commit comments

Comments
 (0)