11'use strict' ;
22
33const MergeTrees = require ( 'broccoli-merge-trees' ) ;
4+ const createFile = require ( 'broccoli-file-creator' ) ;
45const Funnel = require ( 'broccoli-funnel' ) ;
56const path = require ( 'path' ) ;
67const Overrides = require ( './overrides' ) ;
78const 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
924const paths = { } ;
1025const absolutePaths = { } ;
@@ -25,15 +40,198 @@ add(paths, 'testing', 'vendor/ember/ember-testing.js');
2540add (
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
3148const { addonV1Shim } = require ( '@embroider/addon-shim' ) ;
3249
3350const 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 ,
0 commit comments