Skip to content

Commit e017d85

Browse files
committed
Add support for Component.$() as part of RFC386
1 parent 2e90913 commit e017d85

File tree

5 files changed

+88
-12
lines changed

5 files changed

+88
-12
lines changed

index.js

+23-4
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,59 @@
11
'use strict';
22

3+
const EMBER_VERSION_WITH_JQUERY_DEPRECATION = '3.0.0'; // @todo replace with real version
4+
35
module.exports = {
46
name: require('./package').name,
57
included() {
68
this._super.included.apply(this, arguments);
9+
10+
const VersionChecker = require('ember-cli-version-checker');
11+
712
let app = this._findHost();
813
let optionalFeatures = app.project.findAddonByName("@ember/optional-features");
914

1015
if (!app.vendorFiles || !app.vendorFiles['jquery.js']) {
1116
app.import('vendor/jquery/jquery.js', { prepend: true });
1217
}
1318

19+
let checker = new VersionChecker(this);
20+
let ember = checker.forEmber();
21+
22+
if (ember.gte(EMBER_VERSION_WITH_JQUERY_DEPRECATION)) {
23+
app.import('vendor/jquery/component.dollar.js');
24+
}
25+
1426
if (optionalFeatures && !optionalFeatures.isFeatureEnabled('jquery-integration')) {
1527
app.project.ui.writeDeprecateLine('You have disabled the `jquery-integration` optional feature. You now have to delete `@ember/jquery` from your package.json');
1628
}
1729
},
1830

1931
treeForVendor: function() {
32+
const BroccoliMergeTrees = require('broccoli-merge-trees');
2033
const Funnel = require('broccoli-funnel');
2134
const resolve = require('resolve');
2235
const path = require('path');
2336

24-
var jqueryPath;
37+
let jqueryPath;
2538
try {
2639
jqueryPath = path.dirname(
2740
resolve.sync('jquery/package.json', { basedir: this.project.root })
2841
);
29-
} catch (error) {
42+
} catch(error) {
3043
jqueryPath = path.dirname(require.resolve('jquery/package.json'));
3144
}
3245

33-
var jquery = new Funnel(jqueryPath + '/dist', {
46+
let jquery = new Funnel(jqueryPath + '/dist', {
3447
destDir: 'jquery',
3548
files: ['jquery.js'],
3649
});
3750

38-
return jquery;
51+
let babelAddon = this.project.findAddonByName('ember-cli-babel');
52+
let componentDollarTree = new Funnel(path.join(__dirname, 'vendor'), {
53+
destDir: 'jquery',
54+
});
55+
let transpiledComponentDollarTree = babelAddon.transpileTree(componentDollarTree);
56+
57+
return new BroccoliMergeTrees([jquery, transpiledComponentDollarTree]);
3958
},
4059
};

package.json

+2
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,9 @@
2121
},
2222
"dependencies": {
2323
"broccoli-funnel": "^2.0.1",
24+
"broccoli-merge-trees": "^3.0.2",
2425
"ember-cli-babel": "^7.1.2",
26+
"ember-cli-version-checker": "^3.0.0",
2527
"jquery": "^3.3.1",
2628
"resolve": "^1.9.0"
2729
},
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import { module, test } from 'qunit';
2+
import { setupRenderingTest } from 'ember-qunit';
3+
import { render } from '@ember/test-helpers';
4+
import hbs from 'htmlbars-inline-precompile';
5+
import Component from '@ember/component';
6+
import jQuery from 'jquery';
7+
8+
const component = Component.extend({
9+
didInsertElement() {
10+
this.setJQueryElement(this.$(this.get('selector')));
11+
}
12+
});
13+
14+
module('Integration | Component | component-dot-dollar', function(hooks) {
15+
setupRenderingTest(hooks);
16+
hooks.beforeEach(function() {
17+
this.owner.register('component:jquery-component', component);
18+
this.$element = null;
19+
this.setJQueryElement = ($) => this.$element = $;
20+
});
21+
22+
test('it implements Component.$()', async function(assert) {
23+
await render(hbs`{{jquery-component id="jq" setJQueryElement=setJQueryElement}}`);
24+
25+
assert.ok(this.$element, 'Component.$() is available');
26+
assert.ok(this.$element instanceof jQuery, 'Component.$() returns a jQuery object');
27+
assert.equal(this.$element.get(0), this.element.querySelector('#jq'), 'Component.$() is a jQuery wrapper around Component.element');
28+
});
29+
30+
test('it implements Component.$(selector)', async function(assert) {
31+
await render(hbs`{{#jquery-component id="jq" selector="div" setJQueryElement=setJQueryElement}}<div id="child"/>{{/jquery-component}}`);
32+
33+
assert.equal(this.$element.get(0), this.element.querySelector('#child'), 'Component.$(selector) is a jQuery object of the child elements matching selector');
34+
});
35+
});

vendor/component.dollar.js

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import Component from '@ember/component';
2+
import jQuery from 'jquery';
3+
import { assert } from '@ember/debug';
4+
5+
Component.reopen({
6+
$(sel) {
7+
assert(
8+
"You cannot access this.$() on a component with `tagName: ''` specified.",
9+
this.tagName !== ''
10+
);
11+
12+
if (this.element) {
13+
return sel ? jQuery(sel, this.element) : jQuery(this.element);
14+
}
15+
}
16+
});

yarn.lock

+12-8
Original file line numberDiff line numberDiff line change
@@ -2877,6 +2877,13 @@ ember-cli-version-checker@^2.0.0, ember-cli-version-checker@^2.1.0, ember-cli-ve
28772877
resolve "^1.3.3"
28782878
semver "^5.3.0"
28792879

2880+
ember-cli-version-checker@^3.0.0:
2881+
version "3.0.1"
2882+
resolved "https://registry.yarnpkg.com/ember-cli-version-checker/-/ember-cli-version-checker-3.0.1.tgz#2d084d2b261374582c68edb658a7df3a10112749"
2883+
dependencies:
2884+
resolve "^1.9.0"
2885+
semver "^5.6.0"
2886+
28802887
ember-cli@~3.6.1:
28812888
version "3.6.1"
28822889
resolved "https://registry.yarnpkg.com/ember-cli/-/ember-cli-3.6.1.tgz#2a8394bb6d3859d3cdb9e6e79d6d7455f80db9e1"
@@ -6473,6 +6480,10 @@ sax@^1.2.4:
64736480
version "5.5.0"
64746481
resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab"
64756482

6483+
semver@^5.6.0:
6484+
version "5.6.0"
6485+
resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004"
6486+
64766487
64776488
version "0.16.2"
64786489
resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1"
@@ -7108,14 +7119,7 @@ ultron@~1.1.0:
71087119
version "1.1.1"
71097120
resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c"
71107121

7111-
underscore.string@^3.2.2:
7112-
version "3.3.5"
7113-
resolved "https://registry.yarnpkg.com/underscore.string/-/underscore.string-3.3.5.tgz#fc2ad255b8bd309e239cbc5816fd23a9b7ea4023"
7114-
dependencies:
7115-
sprintf-js "^1.0.3"
7116-
util-deprecate "^1.0.2"
7117-
7118-
underscore.string@~3.3.4:
7122+
underscore.string@^3.2.2, underscore.string@~3.3.4:
71197123
version "3.3.5"
71207124
resolved "https://registry.yarnpkg.com/underscore.string/-/underscore.string-3.3.5.tgz#fc2ad255b8bd309e239cbc5816fd23a9b7ea4023"
71217125
dependencies:

0 commit comments

Comments
 (0)