Skip to content

Commit fd9a557

Browse files
authored
Merge pull request #21009 from emberjs/use-ember-modules
2 parents 95b20cb + 89e4065 commit fd9a557

File tree

10 files changed

+4844
-5898
lines changed

10 files changed

+4844
-5898
lines changed

.github/actions/setup/action.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ inputs:
99
node-version:
1010
description: 'The node version to use'
1111
required: false
12-
default: 18
12+
default: 20
1313
runs:
1414
using: 'composite'
1515
steps:

lib/index.js

Lines changed: 228 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,25 @@
11
'use strict';
22

33
const MergeTrees = require('broccoli-merge-trees');
4+
const createFile = require('broccoli-file-creator');
45
const Funnel = require('broccoli-funnel');
56
const path = require('path');
67
const Overrides = require('./overrides');
78
const SupportedBrowsers = require('./browsers');
9+
const fs = require('fs');
10+
11+
const useEmberModules = (() => {
12+
// this doesn't go through the documented API of the @ember/optional-features
13+
// package because that is available way too late for this.
14+
let pkg = require(path.join(process.cwd(), 'package.json'));
15+
let configDir = pkg['ember-addon']?.['configPath'] ?? 'config';
16+
let optionalFeaturesPath = `./${configDir}/optional-features.json`;
17+
if (fs.existsSync(optionalFeaturesPath)) {
18+
return require(path.join(process.cwd(), optionalFeaturesPath))?.['use-ember-modules'] ?? false;
19+
} else {
20+
return false;
21+
}
22+
})();
823

924
const paths = {};
1025
const absolutePaths = {};
@@ -25,15 +40,198 @@ add(paths, 'testing', 'vendor/ember/ember-testing.js');
2540
add(
2641
absolutePaths,
2742
'templateCompiler',
28-
path.join(__dirname, '..', 'dist', 'ember-template-compiler.js')
43+
useEmberModules
44+
? path.join(__dirname, '..', 'dist', 'packages', 'ember-template-compiler', 'index.js')
45+
: path.join(__dirname, '..', 'dist', 'ember-template-compiler.js')
2946
);
3047

3148
const { addonV1Shim } = require('@embroider/addon-shim');
3249

3350
const shim = addonV1Shim(path.join(__dirname, '..'), {
3451
autoImportCompat: {
3552
customizeMeta(meta) {
36-
return { ...meta, 'renamed-modules': {} };
53+
/* This whole hook is an ember-auto-import feature that only effects classic builds, not embroider builds. */
54+
55+
if (useEmberModules) {
56+
// this is our forward-compatible mode where all of ember-source is
57+
// handled by ember-auto-import, like a normal v2 addon.
58+
//
59+
// In this case, we need to inject an implicit-modules config to force
60+
// all the traditionally-included modules to be included whether or not
61+
// we see an import for them, because ember-auto-import does not have
62+
// global visiblity of all imports in all v1 addons.
63+
//
64+
// This means ember-source is not tree-shakable on classic builds, but
65+
// that's the normal status quo for classic builds. It's all
66+
// tree-shakable on the current default build (@embroider/vite).
67+
return {
68+
...meta,
69+
'implicit-modules': [
70+
'./dist/packages/@ember/-internals/browser-environment/index.js',
71+
'./dist/packages/@ember/-internals/container/index.js',
72+
'./dist/packages/@ember/-internals/deprecations/index.js',
73+
'./dist/packages/@ember/-internals/environment/index.js',
74+
'./dist/packages/@ember/-internals/error-handling/index.js',
75+
'./dist/packages/@ember/-internals/glimmer/index.js',
76+
'./dist/packages/@ember/-internals/meta/index.js',
77+
'./dist/packages/@ember/-internals/meta/lib/meta.js',
78+
'./dist/packages/@ember/-internals/metal/index.js',
79+
'./dist/packages/@ember/-internals/owner/index.js',
80+
'./dist/packages/@ember/-internals/routing/index.js',
81+
'./dist/packages/@ember/-internals/runtime/index.js',
82+
'./dist/packages/@ember/-internals/runtime/lib/ext/rsvp.js',
83+
'./dist/packages/@ember/-internals/runtime/lib/mixins/-proxy.js',
84+
'./dist/packages/@ember/-internals/runtime/lib/mixins/comparable.js',
85+
'./dist/packages/@ember/-internals/string/index.js',
86+
'./dist/packages/@ember/-internals/utility-types/index.js',
87+
'./dist/packages/@ember/-internals/utils/index.js',
88+
'./dist/packages/@ember/-internals/views/index.js',
89+
'./dist/packages/@ember/-internals/views/lib/compat/attrs.js',
90+
'./dist/packages/@ember/-internals/views/lib/component_lookup.js',
91+
'./dist/packages/@ember/-internals/views/lib/mixins/action_support.js',
92+
'./dist/packages/@ember/-internals/views/lib/system/utils.js',
93+
'./dist/packages/@ember/-internals/views/lib/views/core_view.js',
94+
'./dist/packages/@ember/-internals/views/lib/views/states.js',
95+
'./dist/packages/@ember/application/index.js',
96+
'./dist/packages/@ember/application/instance.js',
97+
'./dist/packages/@ember/application/lib/lazy_load.js',
98+
'./dist/packages/@ember/application/namespace.js',
99+
'./dist/packages/@ember/array/-internals.js',
100+
'./dist/packages/@ember/array/index.js',
101+
'./dist/packages/@ember/array/lib/make-array.js',
102+
'./dist/packages/@ember/array/mutable.js',
103+
'./dist/packages/@ember/array/proxy.js',
104+
'./dist/packages/@ember/canary-features/index.js',
105+
'./dist/packages/@ember/component/helper.js',
106+
'./dist/packages/@ember/component/index.js',
107+
'./dist/packages/@ember/component/template-only.js',
108+
'./dist/packages/@ember/controller/index.js',
109+
'./dist/packages/@ember/debug/index.js',
110+
'./dist/packages/@ember/debug/lib/capture-render-tree.js',
111+
'./dist/packages/@ember/debug/lib/deprecate.js',
112+
'./dist/packages/@ember/debug/lib/handlers.js',
113+
'./dist/packages/@ember/debug/lib/inspect.js',
114+
'./dist/packages/@ember/debug/lib/testing.js',
115+
'./dist/packages/@ember/debug/lib/warn.js',
116+
'./dist/packages/@ember/debug/container-debug-adapter.js',
117+
'./dist/packages/@ember/debug/data-adapter.js',
118+
'./dist/packages/@ember/deprecated-features/index.js',
119+
'./dist/packages/@ember/destroyable/index.js',
120+
'./dist/packages/@ember/engine/index.js',
121+
'./dist/packages/@ember/engine/instance.js',
122+
'./dist/packages/@ember/engine/lib/engine-parent.js',
123+
'./dist/packages/@ember/enumerable/index.js',
124+
'./dist/packages/@ember/enumerable/mutable.js',
125+
'./dist/packages/@ember/helper/index.js',
126+
'./dist/packages/@ember/instrumentation/index.js',
127+
'./dist/packages/@ember/modifier/index.js',
128+
'./dist/packages/@ember/object/-internals.js',
129+
'./dist/packages/@ember/object/compat.js',
130+
'./dist/packages/@ember/object/computed.js',
131+
'./dist/packages/@ember/object/core.js',
132+
'./dist/packages/@ember/object/evented.js',
133+
'./dist/packages/@ember/object/events.js',
134+
'./dist/packages/@ember/object/index.js',
135+
'./dist/packages/@ember/object/internals.js',
136+
'./dist/packages/@ember/object/lib/computed/computed_macros.js',
137+
'./dist/packages/@ember/object/lib/computed/reduce_computed_macros.js',
138+
'./dist/packages/@ember/object/mixin.js',
139+
'./dist/packages/@ember/object/observable.js',
140+
'./dist/packages/@ember/object/observers.js',
141+
'./dist/packages/@ember/object/promise-proxy-mixin.js',
142+
'./dist/packages/@ember/object/proxy.js',
143+
'./dist/packages/@ember/owner/index.js',
144+
'./dist/packages/@ember/renderer/index.js',
145+
'./dist/packages/@ember/routing/-internals.js',
146+
'./dist/packages/@ember/routing/hash-location.js',
147+
'./dist/packages/@ember/routing/history-location.js',
148+
'./dist/packages/@ember/routing/index.js',
149+
'./dist/packages/@ember/routing/lib/cache.js',
150+
'./dist/packages/@ember/routing/lib/controller_for.js',
151+
'./dist/packages/@ember/routing/lib/dsl.js',
152+
'./dist/packages/@ember/routing/lib/generate_controller.js',
153+
'./dist/packages/@ember/routing/lib/location-utils.js',
154+
'./dist/packages/@ember/routing/lib/query_params.js',
155+
'./dist/packages/@ember/routing/lib/router_state.js',
156+
'./dist/packages/@ember/routing/lib/routing-service.js',
157+
'./dist/packages/@ember/routing/lib/utils.js',
158+
'./dist/packages/@ember/routing/none-location.js',
159+
'./dist/packages/@ember/routing/route.js',
160+
'./dist/packages/@ember/routing/router-service.js',
161+
'./dist/packages/@ember/routing/router.js',
162+
'./dist/packages/@ember/runloop/index.js',
163+
'./dist/packages/@ember/service/index.js',
164+
'./dist/packages/@ember/template-compilation/index.js',
165+
'./dist/packages/@ember/template-factory/index.js',
166+
'./dist/packages/@ember/template/index.js',
167+
'./dist/packages/@ember/test/adapter.js',
168+
'./dist/packages/@ember/test/index.js',
169+
'./dist/packages/@ember/utils/index.js',
170+
'./dist/packages/@ember/utils/lib/compare.js',
171+
'./dist/packages/@ember/utils/lib/is-equal.js',
172+
'./dist/packages/@ember/utils/lib/is_blank.js',
173+
'./dist/packages/@ember/utils/lib/is_empty.js',
174+
'./dist/packages/@ember/utils/lib/is_none.js',
175+
'./dist/packages/@ember/utils/lib/is_present.js',
176+
'./dist/packages/@ember/utils/lib/type-of.js',
177+
'./dist/packages/@ember/version/index.js',
178+
'./dist/packages/@glimmer/destroyable.js',
179+
'./dist/packages/@glimmer/encoder.js',
180+
'./dist/packages/@glimmer/env.js',
181+
'./dist/packages/@glimmer/global-context.js',
182+
'./dist/packages/@glimmer/manager.js',
183+
'./dist/packages/@glimmer/node.js',
184+
'./dist/packages/@glimmer/opcode-compiler.js',
185+
'./dist/packages/@glimmer/owner.js',
186+
'./dist/packages/@glimmer/program.js',
187+
'./dist/packages/@glimmer/reference.js',
188+
'./dist/packages/@glimmer/runtime.js',
189+
'./dist/packages/@glimmer/tracking/index.js',
190+
'./dist/packages/@glimmer/tracking/primitives/cache.js',
191+
'./dist/packages/@glimmer/util.js',
192+
'./dist/packages/@glimmer/validator.js',
193+
'./dist/packages/@glimmer/vm.js',
194+
'./dist/packages/@glimmer/wire-format.js',
195+
'./dist/packages/@simple-dom/document.js',
196+
'./dist/packages/backburner.js/index.js',
197+
'./dist/packages/dag-map.js',
198+
'./dist/packages/ember/index.js',
199+
'./dist/packages/ember/version.js',
200+
'./dist/packages/route-recognizer.js',
201+
'./dist/packages/router_js.js',
202+
'./dist/packages/rsvp.js',
203+
],
204+
'implicit-test-modules': [
205+
'./dist/packages/ember-testing/index.js',
206+
'./dist/packages/ember-testing/lib/adapters/adapter.js',
207+
'./dist/packages/ember-testing/lib/adapters/qunit.js',
208+
'./dist/packages/ember-testing/lib/ext/application.js',
209+
'./dist/packages/ember-testing/lib/ext/rsvp.js',
210+
'./dist/packages/ember-testing/lib/helpers.js',
211+
'./dist/packages/ember-testing/lib/helpers/and_then.js',
212+
'./dist/packages/ember-testing/lib/helpers/current_path.js',
213+
'./dist/packages/ember-testing/lib/helpers/current_route_name.js',
214+
'./dist/packages/ember-testing/lib/helpers/current_url.js',
215+
'./dist/packages/ember-testing/lib/helpers/pause_test.js',
216+
'./dist/packages/ember-testing/lib/helpers/visit.js',
217+
'./dist/packages/ember-testing/lib/helpers/wait.js',
218+
'./dist/packages/ember-testing/lib/initializers.js',
219+
'./dist/packages/ember-testing/lib/public-api.js',
220+
'./dist/packages/ember-testing/lib/setup_for_testing.js',
221+
'./dist/packages/ember-testing/lib/test.js',
222+
'./dist/packages/ember-testing/lib/test/adapter.js',
223+
'./dist/packages/ember-testing/lib/test/helpers.js',
224+
'./dist/packages/ember-testing/lib/test/on_inject_helpers.js',
225+
'./dist/packages/ember-testing/lib/test/pending_requests.js',
226+
'./dist/packages/ember-testing/lib/test/promise.js',
227+
'./dist/packages/ember-testing/lib/test/run.js',
228+
'./dist/packages/ember-testing/lib/test/waiters.js',
229+
],
230+
};
231+
} else {
232+
// this is our backward-compatible mode that actually keeps most of ember-source in vendor.js.
233+
return { ...meta, 'renamed-modules': {} };
234+
}
37235
},
38236
},
39237
});
@@ -67,6 +265,7 @@ module.exports = {
67265

68266
included() {
69267
if (shim.included) {
268+
// this is what actually uses our autoImportCompat closure
70269
shim.included.apply(this, arguments);
71270
} else {
72271
this._super.included.apply(this, arguments);
@@ -94,26 +293,39 @@ module.exports = {
94293
include: ['ember-template-compiler.js', 'ember-template-compiler.js.map'],
95294
});
96295

97-
let which = isProduction ? 'prod' : 'debug';
296+
let emberAMDBundles;
98297

99-
let ember = new Funnel(tree, {
100-
destDir: 'ember',
101-
include: [
102-
`ember.${which}.js`,
103-
`ember.${which}.js.map`,
104-
'ember-testing.js',
105-
'ember-testing.js.map',
106-
],
107-
getDestinationPath(path) {
108-
return path.replace(`ember.${which}.`, 'ember.');
109-
},
110-
});
298+
if (useEmberModules) {
299+
// ember-cli always tries to append these to vendor.js, so even when we
300+
// don't want to put anything in them they need to exist as empty files.
301+
emberAMDBundles = new MergeTrees([
302+
createFile('ember/ember.js', ''),
303+
createFile('ember/ember.js.map', ''),
304+
createFile('ember/ember-testing.js', ''),
305+
createFile('ember/ember-testing.js.map', ''),
306+
]);
307+
} else {
308+
let which = isProduction ? 'prod' : 'debug';
309+
310+
emberAMDBundles = new Funnel(tree, {
311+
destDir: 'ember',
312+
include: [
313+
`ember.${which}.js`,
314+
`ember.${which}.js.map`,
315+
'ember-testing.js',
316+
'ember-testing.js.map',
317+
],
318+
getDestinationPath(path) {
319+
return path.replace(`ember.${which}.`, 'ember.');
320+
},
321+
});
322+
}
111323

112324
let emberCliBabel = this.addons.find((a) => a.name === 'ember-cli-babel');
113325

114326
// this is primarily so we get preset-env with the app's targets. All our
115327
// special stuff was already accounted for in the building of the bundles.
116-
return emberCliBabel.transpileTree(new MergeTrees([ember, templateCompiler]), {
328+
return emberCliBabel.transpileTree(new MergeTrees([emberAMDBundles, templateCompiler]), {
117329
'ember-cli-babel': {
118330
compileModules: false,
119331
disableDebugTooling: true,

package.json

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,8 @@
176176
},
177177
"pnpm": {
178178
"overrides": {
179-
"rollup": "^4.2.0"
179+
"rollup": "^4.2.0",
180+
"ember-cli-htmlbars": "^7.0.0"
180181
},
181182
"onlyBuiltDependencies": [
182183
"@swc/core",
@@ -189,7 +190,7 @@
189190
"@glimmer/component": ">= 1.1.2"
190191
},
191192
"engines": {
192-
"node": ">= 18.*"
193+
"node": ">= 20.19"
193194
},
194195
"ember-addon": {
195196
"after": "ember-cli-legacy-blueprints",
@@ -360,6 +361,7 @@
360361
"@simple-dom/document/index.js": "ember-source/@simple-dom/document/index.js",
361362
"backburner.js/index.js": "ember-source/backburner.js/index.js",
362363
"dag-map/index.js": "ember-source/dag-map/index.js",
364+
"ember-template-compiler/index.js": "ember-source/ember-template-compiler/index.js",
363365
"ember-testing/index.js": "ember-source/ember-testing/index.js",
364366
"ember-testing/lib/adapters/adapter.js": "ember-source/ember-testing/lib/adapters/adapter.js",
365367
"ember-testing/lib/adapters/qunit.js": "ember-source/ember-testing/lib/adapters/qunit.js",
@@ -403,4 +405,4 @@
403405
}
404406
},
405407
"packageManager": "[email protected]"
406-
}
408+
}

packages/@ember/-internals/metal/tests/computed_test.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -984,8 +984,8 @@ moduleFor(
984984
class LazyObject {
985985
value = 123;
986986

987-
// eslint-disable-next-line no-dupe-class-members
988987
@computed('_value')
988+
// eslint-disable-next-line no-dupe-class-members
989989
get value() {
990990
return get(this, '_value');
991991
}

0 commit comments

Comments
 (0)