@embroider/compat 3.5.6-unstable.26f34c4 → 3.5.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +6 -6
- package/src/audit/babel-visitor.js +1 -7
- package/src/audit/babel-visitor.js.map +1 -1
- package/src/audit.d.ts +53 -6
- package/src/audit.js +276 -92
- package/src/audit.js.map +1 -1
- package/src/babel-plugin-adjust-imports.js +1 -1
- package/src/babel-plugin-adjust-imports.js.map +1 -1
- package/src/compat-adapters/@ember-data/debug.d.ts +6 -0
- package/src/compat-adapters/@ember-data/debug.js +22 -0
- package/src/compat-adapters/@ember-data/debug.js.map +1 -0
- package/src/compat-adapters/@ember-data/store.d.ts +5 -1
- package/src/compat-adapters/@ember-data/store.js +15 -3
- package/src/compat-adapters/@ember-data/store.js.map +1 -1
- package/src/compat-addons.js +1 -1
- package/src/compat-addons.js.map +1 -1
- package/src/compat-app-builder.d.ts +31 -9
- package/src/compat-app-builder.js +856 -101
- package/src/compat-app-builder.js.map +1 -1
- package/src/compat-app.d.ts +10 -2
- package/src/compat-app.js +73 -52
- package/src/compat-app.js.map +1 -1
- package/src/default-pipeline.d.ts +2 -2
- package/src/default-pipeline.js +0 -21
- package/src/default-pipeline.js.map +1 -1
- package/src/empty-package-tree.js +6 -0
- package/src/empty-package-tree.js.map +1 -1
- package/src/index.d.ts +1 -1
- package/src/index.js +1 -2
- package/src/index.js.map +1 -1
- package/src/options.d.ts +0 -2
- package/src/options.js +0 -2
- package/src/options.js.map +1 -1
- package/src/resolver-transform.js +0 -3
- package/src/resolver-transform.js.map +1 -1
- package/src/standalone-addon-build.js +4 -4
- package/src/standalone-addon-build.js.map +1 -1
- package/src/v1-appboot.d.ts +14 -0
- package/src/v1-appboot.js +47 -0
- package/src/v1-appboot.js.map +1 -0
- package/src/v1-config.d.ts +8 -0
- package/src/v1-config.js +51 -1
- package/src/v1-config.js.map +1 -1
- package/src/compat-adapters/ember-fetch.d.ts +0 -5
- package/src/compat-adapters/ember-fetch.js +0 -19
- package/src/compat-adapters/ember-fetch.js.map +0 -1
- package/src/content-for-config.d.ts +0 -11
- package/src/content-for-config.js +0 -66
- package/src/content-for-config.js.map +0 -1
- package/src/http-audit.d.ts +0 -13
- package/src/http-audit.js +0 -45
- package/src/http-audit.js.map +0 -1
- package/src/module-visitor.d.ts +0 -52
- package/src/module-visitor.js +0 -285
- package/src/module-visitor.js.map +0 -1
|
@@ -1,46 +1,78 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
2
18
|
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
19
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
20
|
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
21
|
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
22
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
23
|
};
|
|
24
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
25
|
+
if (mod && mod.__esModule) return mod;
|
|
26
|
+
var result = {};
|
|
27
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
28
|
+
__setModuleDefault(result, mod);
|
|
29
|
+
return result;
|
|
30
|
+
};
|
|
8
31
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
9
32
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
10
33
|
};
|
|
11
34
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
35
|
exports.CompatAppBuilder = void 0;
|
|
13
36
|
const core_1 = require("@embroider/core");
|
|
37
|
+
const walk_sync_1 = __importDefault(require("walk-sync"));
|
|
14
38
|
const path_1 = require("path");
|
|
15
39
|
const dependency_rules_1 = require("./dependency-rules");
|
|
16
40
|
const flatMap_1 = __importDefault(require("lodash/flatMap"));
|
|
41
|
+
const sortBy_1 = __importDefault(require("lodash/sortBy"));
|
|
42
|
+
const flatten_1 = __importDefault(require("lodash/flatten"));
|
|
43
|
+
const partition_1 = __importDefault(require("lodash/partition"));
|
|
17
44
|
const mergeWith_1 = __importDefault(require("lodash/mergeWith"));
|
|
18
45
|
const cloneDeep_1 = __importDefault(require("lodash/cloneDeep"));
|
|
46
|
+
const resolve_1 = require("resolve");
|
|
19
47
|
const bind_decorator_1 = __importDefault(require("bind-decorator"));
|
|
20
48
|
const fs_extra_1 = require("fs-extra");
|
|
49
|
+
const ember_html_1 = require("@embroider/core/src/ember-html");
|
|
21
50
|
const portable_babel_config_1 = require("@embroider/core/src/portable-babel-config");
|
|
22
51
|
const app_files_1 = require("@embroider/core/src/app-files");
|
|
23
52
|
const portable_1 = require("@embroider/core/src/portable");
|
|
53
|
+
const assert_never_1 = __importDefault(require("assert-never"));
|
|
24
54
|
const typescript_memoize_1 = require("typescript-memoize");
|
|
25
55
|
const path_2 = require("path");
|
|
26
|
-
const
|
|
56
|
+
const resolve_2 = __importDefault(require("resolve"));
|
|
27
57
|
const fs_extra_2 = require("fs-extra");
|
|
28
58
|
const node_1 = require("@embroider/macros/src/node");
|
|
59
|
+
const fast_sourcemap_concat_1 = __importDefault(require("fast-sourcemap-concat"));
|
|
29
60
|
const escape_string_regexp_1 = __importDefault(require("escape-string-regexp"));
|
|
30
61
|
const sync_dir_1 = require("./sync-dir");
|
|
31
62
|
// This exists during the actual broccoli build step. As opposed to CompatApp,
|
|
32
63
|
// which also exists during pipeline-construction time.
|
|
33
64
|
class CompatAppBuilder {
|
|
34
|
-
constructor(root, origAppPackage, appPackageWithMovedDeps, options, compatApp, configTree,
|
|
65
|
+
constructor(root, origAppPackage, appPackageWithMovedDeps, options, compatApp, configTree, synthVendor, synthStyles) {
|
|
35
66
|
this.root = root;
|
|
36
67
|
this.origAppPackage = origAppPackage;
|
|
37
68
|
this.appPackageWithMovedDeps = appPackageWithMovedDeps;
|
|
38
69
|
this.options = options;
|
|
39
70
|
this.compatApp = compatApp;
|
|
40
71
|
this.configTree = configTree;
|
|
41
|
-
this.contentForTree = contentForTree;
|
|
42
72
|
this.synthVendor = synthVendor;
|
|
43
73
|
this.synthStyles = synthStyles;
|
|
74
|
+
// for each relativePath, an Asset we have already emitted
|
|
75
|
+
this.assets = new Map();
|
|
44
76
|
this.firstBuild = true;
|
|
45
77
|
}
|
|
46
78
|
fastbootJSSrcDir() {
|
|
@@ -49,6 +81,54 @@ class CompatAppBuilder {
|
|
|
49
81
|
return target;
|
|
50
82
|
}
|
|
51
83
|
}
|
|
84
|
+
extractAssets(treePaths) {
|
|
85
|
+
let assets = [];
|
|
86
|
+
// Everything in our traditional public tree is an on-disk asset
|
|
87
|
+
if (treePaths.publicTree) {
|
|
88
|
+
walk_sync_1.default
|
|
89
|
+
.entries(treePaths.publicTree, {
|
|
90
|
+
directories: false,
|
|
91
|
+
})
|
|
92
|
+
.forEach(entry => {
|
|
93
|
+
assets.push({
|
|
94
|
+
kind: 'on-disk',
|
|
95
|
+
relativePath: entry.relativePath,
|
|
96
|
+
sourcePath: entry.fullPath,
|
|
97
|
+
mtime: entry.mtime, // https://github.com/joliss/node-walk-sync/pull/38
|
|
98
|
+
size: entry.size,
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
// ember-cli traditionally outputs a dummy testem.js file to prevent
|
|
103
|
+
// spurious errors when running tests under "ember s".
|
|
104
|
+
if (this.compatApp.shouldBuildTests) {
|
|
105
|
+
let testemAsset = this.findTestemAsset();
|
|
106
|
+
if (testemAsset) {
|
|
107
|
+
assets.push(testemAsset);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
for (let asset of this.emberEntrypoints(treePaths.htmlTree)) {
|
|
111
|
+
assets.push(asset);
|
|
112
|
+
}
|
|
113
|
+
return assets;
|
|
114
|
+
}
|
|
115
|
+
findTestemAsset() {
|
|
116
|
+
let sourcePath;
|
|
117
|
+
try {
|
|
118
|
+
sourcePath = (0, resolve_1.sync)('ember-cli/lib/broccoli/testem.js', { basedir: this.root });
|
|
119
|
+
}
|
|
120
|
+
catch (err) { }
|
|
121
|
+
if (sourcePath) {
|
|
122
|
+
let stat = (0, fs_extra_1.statSync)(sourcePath);
|
|
123
|
+
return {
|
|
124
|
+
kind: 'on-disk',
|
|
125
|
+
relativePath: 'testem.js',
|
|
126
|
+
sourcePath,
|
|
127
|
+
mtime: stat.mtime.getTime(),
|
|
128
|
+
size: stat.size,
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
}
|
|
52
132
|
activeAddonChildren(pkg) {
|
|
53
133
|
let result = pkg.dependencies.filter(this.isActiveAddon).filter(
|
|
54
134
|
// When looking for child addons, we want to ignore 'peerDependencies' of
|
|
@@ -97,19 +177,43 @@ class CompatAppBuilder {
|
|
|
97
177
|
// For TS, we defer to ember-cli-babel, and the setting for
|
|
98
178
|
// "enableTypescriptTransform" can be set with and without
|
|
99
179
|
// ember-cli-typescript
|
|
100
|
-
return ['.wasm', '.mjs', '.js', '.json', '.ts', '.hbs', '.hbs.js'
|
|
180
|
+
return ['.wasm', '.mjs', '.js', '.json', '.ts', '.hbs', '.hbs.js'];
|
|
101
181
|
}
|
|
102
|
-
|
|
103
|
-
let classicEntrypoints = [
|
|
182
|
+
*emberEntrypoints(htmlTreePath) {
|
|
183
|
+
let classicEntrypoints = [
|
|
184
|
+
{ entrypoint: 'index.html', includeTests: false },
|
|
185
|
+
{ entrypoint: 'tests/index.html', includeTests: true },
|
|
186
|
+
];
|
|
104
187
|
if (!this.compatApp.shouldBuildTests) {
|
|
105
188
|
classicEntrypoints.pop();
|
|
106
189
|
}
|
|
107
|
-
for (let entrypoint of classicEntrypoints) {
|
|
190
|
+
for (let { entrypoint, includeTests } of classicEntrypoints) {
|
|
108
191
|
let sourcePath = (0, path_2.join)(htmlTreePath, entrypoint);
|
|
109
|
-
let
|
|
110
|
-
|
|
192
|
+
let stats = (0, fs_extra_1.statSync)(sourcePath);
|
|
193
|
+
let asset = {
|
|
194
|
+
kind: 'ember',
|
|
195
|
+
relativePath: entrypoint,
|
|
196
|
+
includeTests,
|
|
197
|
+
sourcePath,
|
|
198
|
+
mtime: stats.mtime.getTime(),
|
|
199
|
+
size: stats.size,
|
|
200
|
+
rootURL: this.rootURL(),
|
|
201
|
+
prepare: (dom) => {
|
|
202
|
+
let scripts = [...dom.window.document.querySelectorAll('script')];
|
|
203
|
+
let styles = [...dom.window.document.querySelectorAll('link[rel*="stylesheet"]')];
|
|
204
|
+
return {
|
|
205
|
+
javascript: this.compatApp.findAppScript(scripts, entrypoint),
|
|
206
|
+
styles: this.compatApp.findAppStyles(styles, entrypoint),
|
|
207
|
+
implicitScripts: this.compatApp.findVendorScript(scripts, entrypoint),
|
|
208
|
+
implicitStyles: this.compatApp.findVendorStyles(styles, entrypoint),
|
|
209
|
+
testJavascript: this.compatApp.findTestScript(scripts),
|
|
210
|
+
implicitTestScripts: this.compatApp.findTestSupportScript(scripts),
|
|
211
|
+
implicitTestStyles: this.compatApp.findTestSupportStyles(styles),
|
|
212
|
+
};
|
|
213
|
+
},
|
|
214
|
+
};
|
|
215
|
+
yield asset;
|
|
111
216
|
}
|
|
112
|
-
return classicEntrypoints;
|
|
113
217
|
}
|
|
114
218
|
modulePrefix() {
|
|
115
219
|
return this.configTree.readConfig().modulePrefix;
|
|
@@ -129,6 +233,10 @@ class CompatAppBuilder {
|
|
|
129
233
|
resolverConfig(engines) {
|
|
130
234
|
let renamePackages = Object.assign({}, ...this.allActiveAddons.map(dep => dep.meta['renamed-packages']));
|
|
131
235
|
let renameModules = Object.assign({}, ...this.allActiveAddons.map(dep => dep.meta['renamed-modules']));
|
|
236
|
+
let activeAddons = {};
|
|
237
|
+
for (let addon of this.allActiveAddons) {
|
|
238
|
+
activeAddons[addon.name] = addon.root;
|
|
239
|
+
}
|
|
132
240
|
let options = {
|
|
133
241
|
staticHelpers: this.options.staticHelpers,
|
|
134
242
|
staticModifiers: this.options.staticModifiers,
|
|
@@ -137,6 +245,7 @@ class CompatAppBuilder {
|
|
|
137
245
|
};
|
|
138
246
|
let config = {
|
|
139
247
|
// this part is the base ModuleResolverOptions as required by @embroider/core
|
|
248
|
+
activeAddons,
|
|
140
249
|
renameModules,
|
|
141
250
|
renamePackages,
|
|
142
251
|
resolvableExtensions: this.resolvableExtensions(),
|
|
@@ -148,34 +257,118 @@ class CompatAppBuilder {
|
|
|
148
257
|
root: (0, fs_extra_1.realpathSync)(index === 0 ? this.root : appFiles.engine.package.root),
|
|
149
258
|
fastbootFiles: appFiles.fastbootFiles,
|
|
150
259
|
activeAddons: [...appFiles.engine.addons]
|
|
151
|
-
.map(
|
|
152
|
-
name:
|
|
153
|
-
root:
|
|
154
|
-
canResolveFromFile,
|
|
260
|
+
.map(a => ({
|
|
261
|
+
name: a.name,
|
|
262
|
+
root: a.root,
|
|
155
263
|
}))
|
|
156
264
|
// the traditional order is the order in which addons will run, such
|
|
157
265
|
// that the last one wins. Our resolver's order is the order to
|
|
158
266
|
// search, so first one wins.
|
|
159
267
|
.reverse(),
|
|
160
|
-
isLazy: appFiles.engine.package.isLazyEngine(),
|
|
161
268
|
})),
|
|
162
269
|
amdCompatibility: this.options.amdCompatibility,
|
|
163
270
|
// this is the additional stufff that @embroider/compat adds on top to do
|
|
164
271
|
// global template resolving
|
|
165
272
|
modulePrefix: this.modulePrefix(),
|
|
166
|
-
splitAtRoutes: this.options.splitAtRoutes,
|
|
167
273
|
podModulePrefix: this.podModulePrefix(),
|
|
168
274
|
activePackageRules: this.activeRules(),
|
|
169
275
|
options,
|
|
170
|
-
autoRun: this.compatApp.autoRun,
|
|
171
|
-
staticAppPaths: this.options.staticAppPaths,
|
|
172
276
|
};
|
|
173
277
|
return config;
|
|
174
278
|
}
|
|
279
|
+
scriptPriority(pkg) {
|
|
280
|
+
switch (pkg.name) {
|
|
281
|
+
case 'loader.js':
|
|
282
|
+
return 0;
|
|
283
|
+
case 'ember-source':
|
|
284
|
+
return 10;
|
|
285
|
+
default:
|
|
286
|
+
return 1000;
|
|
287
|
+
}
|
|
288
|
+
}
|
|
175
289
|
get resolvableExtensionsPattern() {
|
|
176
290
|
return (0, core_1.extensionsPattern)(this.resolvableExtensions());
|
|
177
291
|
}
|
|
178
|
-
|
|
292
|
+
impliedAssets(type, engine, emberENV) {
|
|
293
|
+
let result = this.impliedAddonAssets(type, engine).map((sourcePath) => {
|
|
294
|
+
let stats = (0, fs_extra_1.statSync)(sourcePath);
|
|
295
|
+
return {
|
|
296
|
+
kind: 'on-disk',
|
|
297
|
+
relativePath: (0, core_1.explicitRelative)(this.root, sourcePath),
|
|
298
|
+
sourcePath,
|
|
299
|
+
mtime: stats.mtimeMs,
|
|
300
|
+
size: stats.size,
|
|
301
|
+
};
|
|
302
|
+
});
|
|
303
|
+
if (type === 'implicit-scripts') {
|
|
304
|
+
result.unshift({
|
|
305
|
+
kind: 'in-memory',
|
|
306
|
+
relativePath: '_testing_prefix_.js',
|
|
307
|
+
source: `var runningTests=false;`,
|
|
308
|
+
});
|
|
309
|
+
result.unshift({
|
|
310
|
+
kind: 'in-memory',
|
|
311
|
+
relativePath: '_ember_env_.js',
|
|
312
|
+
source: `window.EmberENV={ ...(window.EmberENV || {}), ...${JSON.stringify(emberENV, null, 2)} };`,
|
|
313
|
+
});
|
|
314
|
+
result.push({
|
|
315
|
+
kind: 'in-memory',
|
|
316
|
+
relativePath: '_loader_.js',
|
|
317
|
+
source: `loader.makeDefaultExport=false;`,
|
|
318
|
+
});
|
|
319
|
+
}
|
|
320
|
+
if (type === 'implicit-test-scripts') {
|
|
321
|
+
// this is the traditional test-support-suffix.js
|
|
322
|
+
result.push({
|
|
323
|
+
kind: 'in-memory',
|
|
324
|
+
relativePath: '_testing_suffix_.js',
|
|
325
|
+
source: `
|
|
326
|
+
var runningTests=true;
|
|
327
|
+
if (typeof Testem !== 'undefined' && (typeof QUnit !== 'undefined' || typeof Mocha !== 'undefined')) {
|
|
328
|
+
Testem.hookIntoTestFramework();
|
|
329
|
+
}`,
|
|
330
|
+
});
|
|
331
|
+
// whether or not anybody was actually using @embroider/macros
|
|
332
|
+
// explicitly as an addon, we ensure its test-support file is always
|
|
333
|
+
// present.
|
|
334
|
+
if (!result.find(s => s.kind === 'on-disk' && s.sourcePath.endsWith('embroider-macros-test-support.js'))) {
|
|
335
|
+
result.unshift({
|
|
336
|
+
kind: 'on-disk',
|
|
337
|
+
sourcePath: require.resolve('@embroider/macros/src/vendor/embroider-macros-test-support'),
|
|
338
|
+
mtime: 0,
|
|
339
|
+
size: 0,
|
|
340
|
+
relativePath: 'embroider-macros-test-support.js',
|
|
341
|
+
});
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
return result;
|
|
345
|
+
}
|
|
346
|
+
impliedAddonAssets(type, { engine }) {
|
|
347
|
+
let result = [];
|
|
348
|
+
for (let addon of (0, sortBy_1.default)(Array.from(engine.addons), this.scriptPriority.bind(this))) {
|
|
349
|
+
let implicitScripts = addon.meta[type];
|
|
350
|
+
if (implicitScripts) {
|
|
351
|
+
let styles = [];
|
|
352
|
+
let options = { basedir: addon.root };
|
|
353
|
+
for (let mod of implicitScripts) {
|
|
354
|
+
if (type === 'implicit-styles') {
|
|
355
|
+
// exclude engines because they will handle their own css importation
|
|
356
|
+
if (!addon.isLazyEngine()) {
|
|
357
|
+
styles.push(resolve_2.default.sync(mod, options));
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
else {
|
|
361
|
+
result.push(resolve_2.default.sync(mod, options));
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
if (styles.length) {
|
|
365
|
+
result = [...styles, ...result];
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
return result;
|
|
370
|
+
}
|
|
371
|
+
babelConfig(resolverConfig) {
|
|
179
372
|
let babel = (0, cloneDeep_1.default)(this.compatApp.babelConfig());
|
|
180
373
|
if (!babel.plugins) {
|
|
181
374
|
babel.plugins = [];
|
|
@@ -185,10 +378,7 @@ class CompatAppBuilder {
|
|
|
185
378
|
babel.plugins.push(require.resolve('@babel/plugin-syntax-dynamic-import'));
|
|
186
379
|
// https://github.com/webpack/webpack/issues/12154
|
|
187
380
|
babel.plugins.push(require.resolve('./rename-require-plugin'));
|
|
188
|
-
babel.plugins.push([
|
|
189
|
-
require.resolve('babel-plugin-ember-template-compilation'),
|
|
190
|
-
await this.etcOptions(resolverConfig),
|
|
191
|
-
]);
|
|
381
|
+
babel.plugins.push([require.resolve('babel-plugin-ember-template-compilation'), this.etcOptions(resolverConfig)]);
|
|
192
382
|
// this is @embroider/macros configured for full stage3 resolution
|
|
193
383
|
babel.plugins.push(...this.compatApp.macrosConfig.babelPluginConfig());
|
|
194
384
|
let colocationOptions = {
|
|
@@ -240,6 +430,107 @@ class CompatAppBuilder {
|
|
|
240
430
|
addCachablePlugin(portable.config);
|
|
241
431
|
return portable;
|
|
242
432
|
}
|
|
433
|
+
insertEmberApp(asset, appFiles, prepared, emberENV) {
|
|
434
|
+
let html = asset.html;
|
|
435
|
+
if (this.fastbootConfig) {
|
|
436
|
+
// ignore scripts like ember-cli-livereload.js which are not really associated with
|
|
437
|
+
// "the app".
|
|
438
|
+
let ignoreScripts = html.dom.window.document.querySelectorAll('script');
|
|
439
|
+
ignoreScripts.forEach(script => {
|
|
440
|
+
script.setAttribute('data-fastboot-ignore', '');
|
|
441
|
+
});
|
|
442
|
+
}
|
|
443
|
+
// our tests entrypoint already includes a correct module dependency on the
|
|
444
|
+
// app, so we only insert the app when we're not inserting tests
|
|
445
|
+
if (!asset.fileAsset.includeTests) {
|
|
446
|
+
let appJS = this.topAppJSAsset(appFiles, prepared);
|
|
447
|
+
html.insertScriptTag(html.javascript, appJS.relativePath, { type: 'module' });
|
|
448
|
+
}
|
|
449
|
+
if (this.fastbootConfig) {
|
|
450
|
+
// any extra fastboot app files get inserted into our html.javascript
|
|
451
|
+
// section, after the app has been inserted.
|
|
452
|
+
for (let script of this.fastbootConfig.extraAppFiles) {
|
|
453
|
+
html.insertScriptTag(html.javascript, script, { tag: 'fastboot-script' });
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
html.insertStyleLink(html.styles, `assets/${this.origAppPackage.name}.css`);
|
|
457
|
+
const parentEngine = appFiles.find(e => !e.engine.parent);
|
|
458
|
+
let vendorJS = this.implicitScriptsAsset(prepared, parentEngine, emberENV);
|
|
459
|
+
if (vendorJS) {
|
|
460
|
+
html.insertScriptTag(html.implicitScripts, vendorJS.relativePath);
|
|
461
|
+
}
|
|
462
|
+
if (this.fastbootConfig) {
|
|
463
|
+
// any extra fastboot vendor files get inserted into our
|
|
464
|
+
// html.implicitScripts section, after the regular implicit script
|
|
465
|
+
// (vendor.js) have been inserted.
|
|
466
|
+
for (let script of this.fastbootConfig.extraVendorFiles) {
|
|
467
|
+
html.insertScriptTag(html.implicitScripts, script, { tag: 'fastboot-script' });
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
let implicitStyles = this.implicitStylesAsset(prepared, parentEngine);
|
|
471
|
+
if (implicitStyles) {
|
|
472
|
+
html.insertStyleLink(html.implicitStyles, implicitStyles.relativePath);
|
|
473
|
+
}
|
|
474
|
+
if (!asset.fileAsset.includeTests) {
|
|
475
|
+
return;
|
|
476
|
+
}
|
|
477
|
+
// Test-related assets happen below this point
|
|
478
|
+
let testJS = this.testJSEntrypoint(appFiles, prepared);
|
|
479
|
+
html.insertScriptTag(html.testJavascript, testJS.relativePath, { type: 'module' });
|
|
480
|
+
let implicitTestScriptsAsset = this.implicitTestScriptsAsset(prepared, parentEngine);
|
|
481
|
+
if (implicitTestScriptsAsset) {
|
|
482
|
+
html.insertScriptTag(html.implicitTestScripts, implicitTestScriptsAsset.relativePath);
|
|
483
|
+
}
|
|
484
|
+
let implicitTestStylesAsset = this.implicitTestStylesAsset(prepared, parentEngine);
|
|
485
|
+
if (implicitTestStylesAsset) {
|
|
486
|
+
html.insertStyleLink(html.implicitTestStyles, implicitTestStylesAsset.relativePath);
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
implicitScriptsAsset(prepared, application, emberENV) {
|
|
490
|
+
let asset = prepared.get('assets/vendor.js');
|
|
491
|
+
if (!asset) {
|
|
492
|
+
let implicitScripts = this.impliedAssets('implicit-scripts', application, emberENV);
|
|
493
|
+
if (implicitScripts.length > 0) {
|
|
494
|
+
asset = new ConcatenatedAsset('assets/vendor.js', implicitScripts, this.resolvableExtensionsPattern);
|
|
495
|
+
prepared.set(asset.relativePath, asset);
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
return asset;
|
|
499
|
+
}
|
|
500
|
+
implicitStylesAsset(prepared, application) {
|
|
501
|
+
let asset = prepared.get('assets/vendor.css');
|
|
502
|
+
if (!asset) {
|
|
503
|
+
let implicitStyles = this.impliedAssets('implicit-styles', application);
|
|
504
|
+
if (implicitStyles.length > 0) {
|
|
505
|
+
// we reverse because we want the synthetic vendor style at the top
|
|
506
|
+
asset = new ConcatenatedAsset('assets/vendor.css', implicitStyles.reverse(), this.resolvableExtensionsPattern);
|
|
507
|
+
prepared.set(asset.relativePath, asset);
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
return asset;
|
|
511
|
+
}
|
|
512
|
+
implicitTestScriptsAsset(prepared, application) {
|
|
513
|
+
let testSupportJS = prepared.get('assets/test-support.js');
|
|
514
|
+
if (!testSupportJS) {
|
|
515
|
+
let implicitTestScripts = this.impliedAssets('implicit-test-scripts', application);
|
|
516
|
+
if (implicitTestScripts.length > 0) {
|
|
517
|
+
testSupportJS = new ConcatenatedAsset('assets/test-support.js', implicitTestScripts, this.resolvableExtensionsPattern);
|
|
518
|
+
prepared.set(testSupportJS.relativePath, testSupportJS);
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
return testSupportJS;
|
|
522
|
+
}
|
|
523
|
+
implicitTestStylesAsset(prepared, application) {
|
|
524
|
+
let asset = prepared.get('assets/test-support.css');
|
|
525
|
+
if (!asset) {
|
|
526
|
+
let implicitTestStyles = this.impliedAssets('implicit-test-styles', application);
|
|
527
|
+
if (implicitTestStyles.length > 0) {
|
|
528
|
+
asset = new ConcatenatedAsset('assets/test-support.css', implicitTestStyles, this.resolvableExtensionsPattern);
|
|
529
|
+
prepared.set(asset.relativePath, asset);
|
|
530
|
+
}
|
|
531
|
+
}
|
|
532
|
+
return asset;
|
|
533
|
+
}
|
|
243
534
|
// recurse to find all active addons that don't cross an engine boundary.
|
|
244
535
|
// Inner engines themselves will be returned, but not those engines' children.
|
|
245
536
|
// The output set's insertion order is the proper ember-cli compatible
|
|
@@ -249,31 +540,22 @@ class CompatAppBuilder {
|
|
|
249
540
|
if (!child.isEngine()) {
|
|
250
541
|
this.findActiveAddons(child, engine, true);
|
|
251
542
|
}
|
|
252
|
-
|
|
253
|
-
if (pkg === this.appPackageWithMovedDeps) {
|
|
254
|
-
// we want canResolveFrom to always be a rewritten package path, and our
|
|
255
|
-
// app's package is not rewritten yet here.
|
|
256
|
-
canResolveFrom = (0, path_1.resolve)(this.root, 'package.json');
|
|
257
|
-
}
|
|
258
|
-
else {
|
|
259
|
-
// whereas our addons are already moved
|
|
260
|
-
canResolveFrom = (0, path_1.resolve)(pkg.root, 'package.json');
|
|
261
|
-
}
|
|
262
|
-
engine.addons.set(child, canResolveFrom);
|
|
543
|
+
engine.addons.add(child);
|
|
263
544
|
}
|
|
264
545
|
// ensure addons are applied in the correct order, if set (via @embroider/compat/v1-addon)
|
|
265
546
|
if (!isChild) {
|
|
266
|
-
engine.addons = new
|
|
547
|
+
engine.addons = new Set([...engine.addons].sort((a, b) => {
|
|
267
548
|
return (a.meta['order-index'] || 0) - (b.meta['order-index'] || 0);
|
|
268
549
|
}));
|
|
269
550
|
}
|
|
270
551
|
}
|
|
271
|
-
partitionEngines() {
|
|
552
|
+
partitionEngines(appJSPath) {
|
|
272
553
|
let queue = [
|
|
273
554
|
{
|
|
274
555
|
package: this.appPackageWithMovedDeps,
|
|
275
|
-
addons: new
|
|
276
|
-
|
|
556
|
+
addons: new Set(),
|
|
557
|
+
parent: undefined,
|
|
558
|
+
sourcePath: appJSPath,
|
|
277
559
|
modulePrefix: this.modulePrefix(),
|
|
278
560
|
appRelativePath: '.',
|
|
279
561
|
},
|
|
@@ -286,13 +568,14 @@ class CompatAppBuilder {
|
|
|
286
568
|
break;
|
|
287
569
|
}
|
|
288
570
|
this.findActiveAddons(current.package, current);
|
|
289
|
-
for (let addon of current.addons
|
|
571
|
+
for (let addon of current.addons) {
|
|
290
572
|
if (addon.isEngine() && !seenEngines.has(addon)) {
|
|
291
573
|
seenEngines.add(addon);
|
|
292
574
|
queue.push({
|
|
293
575
|
package: addon,
|
|
294
|
-
addons: new
|
|
295
|
-
|
|
576
|
+
addons: new Set(),
|
|
577
|
+
parent: current,
|
|
578
|
+
sourcePath: addon.root,
|
|
296
579
|
modulePrefix: addon.name,
|
|
297
580
|
appRelativePath: (0, core_1.explicitRelative)(this.root, addon.root),
|
|
298
581
|
});
|
|
@@ -325,8 +608,8 @@ class CompatAppBuilder {
|
|
|
325
608
|
updateAppJS(appJSPath) {
|
|
326
609
|
var _a;
|
|
327
610
|
if (!this.engines) {
|
|
328
|
-
this.engines = this.partitionEngines().map(engine => {
|
|
329
|
-
if (engine.
|
|
611
|
+
this.engines = this.partitionEngines(appJSPath).map(engine => {
|
|
612
|
+
if (engine.sourcePath === appJSPath) {
|
|
330
613
|
// this is the app. We have more to do for the app than for other
|
|
331
614
|
// engines.
|
|
332
615
|
let fastbootSync;
|
|
@@ -348,7 +631,7 @@ class CompatAppBuilder {
|
|
|
348
631
|
// their files, not doing any actual copying or building.
|
|
349
632
|
return {
|
|
350
633
|
engine,
|
|
351
|
-
appSync: new sync_dir_1.SyncDir(engine.
|
|
634
|
+
appSync: new sync_dir_1.SyncDir(engine.sourcePath, undefined),
|
|
352
635
|
// AFAIK, we've never supported a fastboot overlay directory in an
|
|
353
636
|
// engine. But if we do need that, it would go here.
|
|
354
637
|
fastbootSync: undefined,
|
|
@@ -362,14 +645,165 @@ class CompatAppBuilder {
|
|
|
362
645
|
}
|
|
363
646
|
return this.engines.map(({ engine, appSync, fastbootSync }) => {
|
|
364
647
|
var _a;
|
|
365
|
-
return new app_files_1.AppFiles(engine, appSync.files, (_a = fastbootSync === null || fastbootSync === void 0 ? void 0 : fastbootSync.files) !== null && _a !== void 0 ? _a : new Set(), this.resolvableExtensionsPattern, this.
|
|
648
|
+
return new app_files_1.AppFiles(engine, appSync.files, (_a = fastbootSync === null || fastbootSync === void 0 ? void 0 : fastbootSync.files) !== null && _a !== void 0 ? _a : new Set(), this.resolvableExtensionsPattern, this.podModulePrefix());
|
|
366
649
|
});
|
|
367
650
|
}
|
|
368
|
-
|
|
369
|
-
if (
|
|
370
|
-
|
|
651
|
+
prepareAsset(asset, appFiles, prepared, emberENV) {
|
|
652
|
+
if (asset.kind === 'ember') {
|
|
653
|
+
let prior = this.assets.get(asset.relativePath);
|
|
654
|
+
let parsed;
|
|
655
|
+
if (prior && prior.kind === 'built-ember' && prior.parsedAsset.validFor(asset)) {
|
|
656
|
+
// we can reuse the parsed html
|
|
657
|
+
parsed = prior.parsedAsset;
|
|
658
|
+
parsed.html.clear();
|
|
659
|
+
}
|
|
660
|
+
else {
|
|
661
|
+
parsed = new ParsedEmberAsset(asset);
|
|
662
|
+
}
|
|
663
|
+
this.insertEmberApp(parsed, appFiles, prepared, emberENV);
|
|
664
|
+
prepared.set(asset.relativePath, new BuiltEmberAsset(parsed));
|
|
665
|
+
}
|
|
666
|
+
else {
|
|
667
|
+
prepared.set(asset.relativePath, asset);
|
|
371
668
|
}
|
|
372
669
|
}
|
|
670
|
+
prepareAssets(requestedAssets, appFiles, emberENV) {
|
|
671
|
+
let prepared = new Map();
|
|
672
|
+
for (let asset of requestedAssets) {
|
|
673
|
+
this.prepareAsset(asset, appFiles, prepared, emberENV);
|
|
674
|
+
}
|
|
675
|
+
return prepared;
|
|
676
|
+
}
|
|
677
|
+
assetIsValid(asset, prior) {
|
|
678
|
+
if (!prior) {
|
|
679
|
+
return false;
|
|
680
|
+
}
|
|
681
|
+
switch (asset.kind) {
|
|
682
|
+
case 'on-disk':
|
|
683
|
+
return prior.kind === 'on-disk' && prior.size === asset.size && prior.mtime === asset.mtime;
|
|
684
|
+
case 'in-memory':
|
|
685
|
+
return prior.kind === 'in-memory' && stringOrBufferEqual(prior.source, asset.source);
|
|
686
|
+
case 'built-ember':
|
|
687
|
+
return prior.kind === 'built-ember' && prior.source === asset.source;
|
|
688
|
+
case 'concatenated-asset':
|
|
689
|
+
return (prior.kind === 'concatenated-asset' &&
|
|
690
|
+
prior.sources.length === asset.sources.length &&
|
|
691
|
+
prior.sources.every((priorFile, index) => {
|
|
692
|
+
let newFile = asset.sources[index];
|
|
693
|
+
return this.assetIsValid(newFile, priorFile);
|
|
694
|
+
}));
|
|
695
|
+
}
|
|
696
|
+
}
|
|
697
|
+
updateOnDiskAsset(asset) {
|
|
698
|
+
let destination = (0, path_2.join)(this.root, asset.relativePath);
|
|
699
|
+
(0, fs_extra_2.ensureDirSync)((0, path_2.dirname)(destination));
|
|
700
|
+
(0, fs_extra_2.copySync)(asset.sourcePath, destination, { dereference: true });
|
|
701
|
+
}
|
|
702
|
+
updateInMemoryAsset(asset) {
|
|
703
|
+
let destination = (0, path_2.join)(this.root, asset.relativePath);
|
|
704
|
+
(0, fs_extra_2.ensureDirSync)((0, path_2.dirname)(destination));
|
|
705
|
+
(0, fs_extra_1.writeFileSync)(destination, asset.source, 'utf8');
|
|
706
|
+
}
|
|
707
|
+
updateBuiltEmberAsset(asset) {
|
|
708
|
+
let destination = (0, path_2.join)(this.root, asset.relativePath);
|
|
709
|
+
(0, fs_extra_2.ensureDirSync)((0, path_2.dirname)(destination));
|
|
710
|
+
(0, fs_extra_1.writeFileSync)(destination, asset.source, 'utf8');
|
|
711
|
+
}
|
|
712
|
+
async updateConcatenatedAsset(asset) {
|
|
713
|
+
let concat = new fast_sourcemap_concat_1.default({
|
|
714
|
+
outputFile: (0, path_2.join)(this.root, asset.relativePath),
|
|
715
|
+
mapCommentType: asset.relativePath.endsWith('.js') ? 'line' : 'block',
|
|
716
|
+
baseDir: this.root,
|
|
717
|
+
});
|
|
718
|
+
if (process.env.EMBROIDER_CONCAT_STATS) {
|
|
719
|
+
let MeasureConcat = (await Promise.resolve().then(() => __importStar(require('@embroider/core/src/measure-concat')))).default;
|
|
720
|
+
concat = new MeasureConcat(asset.relativePath, concat, this.root);
|
|
721
|
+
}
|
|
722
|
+
for (let source of asset.sources) {
|
|
723
|
+
switch (source.kind) {
|
|
724
|
+
case 'on-disk':
|
|
725
|
+
concat.addFile((0, core_1.explicitRelative)(this.root, source.sourcePath));
|
|
726
|
+
break;
|
|
727
|
+
case 'in-memory':
|
|
728
|
+
if (typeof source.source !== 'string') {
|
|
729
|
+
throw new Error(`attempted to concatenated a Buffer-backed in-memory asset`);
|
|
730
|
+
}
|
|
731
|
+
concat.addSpace(source.source);
|
|
732
|
+
break;
|
|
733
|
+
default:
|
|
734
|
+
(0, assert_never_1.default)(source);
|
|
735
|
+
}
|
|
736
|
+
}
|
|
737
|
+
await concat.end();
|
|
738
|
+
}
|
|
739
|
+
async updateAssets(requestedAssets, appFiles, emberENV) {
|
|
740
|
+
let assets = this.prepareAssets(requestedAssets, appFiles, emberENV);
|
|
741
|
+
for (let asset of assets.values()) {
|
|
742
|
+
if (this.assetIsValid(asset, this.assets.get(asset.relativePath))) {
|
|
743
|
+
continue;
|
|
744
|
+
}
|
|
745
|
+
(0, core_1.debug)('rebuilding %s', asset.relativePath);
|
|
746
|
+
switch (asset.kind) {
|
|
747
|
+
case 'on-disk':
|
|
748
|
+
this.updateOnDiskAsset(asset);
|
|
749
|
+
break;
|
|
750
|
+
case 'in-memory':
|
|
751
|
+
this.updateInMemoryAsset(asset);
|
|
752
|
+
break;
|
|
753
|
+
case 'built-ember':
|
|
754
|
+
this.updateBuiltEmberAsset(asset);
|
|
755
|
+
break;
|
|
756
|
+
case 'concatenated-asset':
|
|
757
|
+
await this.updateConcatenatedAsset(asset);
|
|
758
|
+
break;
|
|
759
|
+
default:
|
|
760
|
+
(0, assert_never_1.default)(asset);
|
|
761
|
+
}
|
|
762
|
+
}
|
|
763
|
+
for (let oldAsset of this.assets.values()) {
|
|
764
|
+
if (!assets.has(oldAsset.relativePath)) {
|
|
765
|
+
(0, fs_extra_1.unlinkSync)((0, path_2.join)(this.root, oldAsset.relativePath));
|
|
766
|
+
}
|
|
767
|
+
}
|
|
768
|
+
this.assets = assets;
|
|
769
|
+
return [...assets.values()];
|
|
770
|
+
}
|
|
771
|
+
gatherAssets(inputPaths) {
|
|
772
|
+
// first gather all the assets out of addons
|
|
773
|
+
let assets = [];
|
|
774
|
+
for (let pkg of this.allActiveAddons) {
|
|
775
|
+
if (pkg.meta['public-assets']) {
|
|
776
|
+
for (let [filename, appRelativeURL] of Object.entries(pkg.meta['public-assets'] || {})) {
|
|
777
|
+
let sourcePath = (0, path_1.resolve)(pkg.root, filename);
|
|
778
|
+
let stats = (0, fs_extra_1.statSync)(sourcePath);
|
|
779
|
+
assets.push({
|
|
780
|
+
kind: 'on-disk',
|
|
781
|
+
sourcePath,
|
|
782
|
+
relativePath: appRelativeURL,
|
|
783
|
+
mtime: stats.mtimeMs,
|
|
784
|
+
size: stats.size,
|
|
785
|
+
});
|
|
786
|
+
}
|
|
787
|
+
}
|
|
788
|
+
}
|
|
789
|
+
if (this.activeFastboot) {
|
|
790
|
+
const source = `
|
|
791
|
+
(function(){
|
|
792
|
+
var key = '_embroider_macros_runtime_config';
|
|
793
|
+
if (!window[key]){ window[key] = [];}
|
|
794
|
+
window[key].push(function(m) {
|
|
795
|
+
m.setGlobalConfig('fastboot', Object.assign({}, m.getGlobalConfig().fastboot, { isRunning: true }));
|
|
796
|
+
});
|
|
797
|
+
}())`;
|
|
798
|
+
assets.push({
|
|
799
|
+
kind: 'in-memory',
|
|
800
|
+
source,
|
|
801
|
+
relativePath: 'assets/embroider_macros_fastboot_init.js',
|
|
802
|
+
});
|
|
803
|
+
}
|
|
804
|
+
// and finally tack on the ones from our app itself
|
|
805
|
+
return assets.concat(this.extractAssets(inputPaths));
|
|
806
|
+
}
|
|
373
807
|
async build(inputPaths) {
|
|
374
808
|
// on the first build, we lock down the macros config. on subsequent builds,
|
|
375
809
|
// this doesn't do anything anyway because it's idempotent.
|
|
@@ -380,11 +814,22 @@ class CompatAppBuilder {
|
|
|
380
814
|
this.firstBuild = false;
|
|
381
815
|
}
|
|
382
816
|
let appFiles = this.updateAppJS(inputPaths.appJS);
|
|
383
|
-
let
|
|
817
|
+
let emberENV = this.configTree.readConfig().EmberENV;
|
|
818
|
+
let assets = this.gatherAssets(inputPaths);
|
|
819
|
+
let finalAssets = await this.updateAssets(assets, appFiles, emberENV);
|
|
820
|
+
let assetPaths = assets.map(asset => asset.relativePath);
|
|
384
821
|
if (this.activeFastboot) {
|
|
385
822
|
// when using fastboot, our own package.json needs to be in the output so fastboot can read it.
|
|
386
823
|
assetPaths.push('package.json');
|
|
387
824
|
}
|
|
825
|
+
for (let asset of finalAssets) {
|
|
826
|
+
// our concatenated assets all have map files that ride along. Here we're
|
|
827
|
+
// telling the final stage packager to be sure and serve the map files
|
|
828
|
+
// too.
|
|
829
|
+
if (asset.kind === 'concatenated-asset') {
|
|
830
|
+
assetPaths.push(asset.sourcemapPath);
|
|
831
|
+
}
|
|
832
|
+
}
|
|
388
833
|
let meta = {
|
|
389
834
|
type: 'app',
|
|
390
835
|
version: 2,
|
|
@@ -402,15 +847,9 @@ class CompatAppBuilder {
|
|
|
402
847
|
let pkg = this.combinePackageJSON(meta);
|
|
403
848
|
(0, fs_extra_1.writeFileSync)((0, path_2.join)(this.root, 'package.json'), JSON.stringify(pkg, null, 2), 'utf8');
|
|
404
849
|
let resolverConfig = this.resolverConfig(appFiles);
|
|
405
|
-
let config = this.configTree.readConfig();
|
|
406
|
-
let contentForConfig = this.contentForTree.readContents();
|
|
407
850
|
this.addResolverConfig(resolverConfig);
|
|
408
|
-
this.
|
|
409
|
-
this.addEmberEnvConfig(config.EmberENV);
|
|
410
|
-
this.outputAppBootError(config.modulePrefix, config.APP, contentForConfig);
|
|
411
|
-
let babelConfig = await this.babelConfig(resolverConfig);
|
|
851
|
+
let babelConfig = this.babelConfig(resolverConfig);
|
|
412
852
|
this.addBabelConfig(babelConfig);
|
|
413
|
-
this.addMacrosConfig(this.compatApp.macrosConfig.babelPluginConfig()[0]);
|
|
414
853
|
}
|
|
415
854
|
combinePackageJSON(meta) {
|
|
416
855
|
let pkgLayers = [this.origAppPackage.packageJSON];
|
|
@@ -420,10 +859,10 @@ class CompatAppBuilder {
|
|
|
420
859
|
pkgLayers.push(fastbootConfig.packageJSON);
|
|
421
860
|
}
|
|
422
861
|
// but our own new v2 app metadata takes precedence over both
|
|
423
|
-
pkgLayers.push({ 'ember-addon': meta });
|
|
862
|
+
pkgLayers.push({ keywords: ['ember-addon'], 'ember-addon': meta });
|
|
424
863
|
return combinePackageJSON(...pkgLayers);
|
|
425
864
|
}
|
|
426
|
-
|
|
865
|
+
etcOptions(resolverConfig) {
|
|
427
866
|
let transforms = this.compatApp.htmlbarsPlugins;
|
|
428
867
|
let { plugins: macroPlugins, setConfig } = node_1.MacrosConfig.transforms();
|
|
429
868
|
setConfig(this.compatApp.macrosConfig);
|
|
@@ -441,7 +880,7 @@ class CompatAppBuilder {
|
|
|
441
880
|
transforms.push([require.resolve('./resolver-transform'), opts]);
|
|
442
881
|
}
|
|
443
882
|
let resolver = new core_1.Resolver(resolverConfig);
|
|
444
|
-
let resolution =
|
|
883
|
+
let resolution = resolver.nodeResolve('ember-source/vendor/ember/ember-template-compiler', (0, path_1.resolve)(this.root, 'package.json'));
|
|
445
884
|
if (resolution.type !== 'real') {
|
|
446
885
|
throw new Error(`bug: unable to resolve ember-template-compiler from ${this.root}`);
|
|
447
886
|
}
|
|
@@ -459,7 +898,7 @@ class CompatAppBuilder {
|
|
|
459
898
|
if (i < hint.resolve.length - 1) {
|
|
460
899
|
target = (0, path_2.join)(target, 'package.json');
|
|
461
900
|
}
|
|
462
|
-
cursor =
|
|
901
|
+
cursor = resolve_2.default.sync(target, { basedir: (0, path_2.dirname)(cursor) });
|
|
463
902
|
}
|
|
464
903
|
return {
|
|
465
904
|
requireFile: cursor,
|
|
@@ -472,61 +911,246 @@ class CompatAppBuilder {
|
|
|
472
911
|
if (!pconfig.isParallelSafe) {
|
|
473
912
|
(0, core_1.warn)('Your build is slower because some babel plugins are non-serializable');
|
|
474
913
|
}
|
|
475
|
-
(0, fs_extra_1.writeFileSync)((0, path_2.join)(
|
|
476
|
-
(0, fs_extra_1.writeFileSync)((0, path_2.join)(
|
|
914
|
+
(0, fs_extra_1.writeFileSync)((0, path_2.join)(this.root, '_babel_config_.js'), `module.exports = ${JSON.stringify(pconfig.config, null, 2)}`, 'utf8');
|
|
915
|
+
(0, fs_extra_1.writeFileSync)((0, path_2.join)(this.root, '_babel_filter_.js'), babelFilterTemplate({ skipBabel: this.options.skipBabel, appRoot: this.origAppPackage.root }), 'utf8');
|
|
477
916
|
}
|
|
478
917
|
addResolverConfig(config) {
|
|
479
918
|
(0, fs_extra_1.outputJSONSync)((0, path_2.join)((0, core_1.locateEmbroiderWorkingDir)(this.compatApp.root), 'resolver.json'), config, { spaces: 2 });
|
|
480
919
|
}
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
920
|
+
shouldSplitRoute(routeName) {
|
|
921
|
+
return (!this.options.splitAtRoutes ||
|
|
922
|
+
this.options.splitAtRoutes.find(pattern => {
|
|
923
|
+
if (typeof pattern === 'string') {
|
|
924
|
+
return pattern === routeName;
|
|
925
|
+
}
|
|
926
|
+
else {
|
|
927
|
+
return pattern.test(routeName);
|
|
928
|
+
}
|
|
929
|
+
}));
|
|
485
930
|
}
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
931
|
+
splitRoute(routeName, files, addToParent, addLazyBundle) {
|
|
932
|
+
let shouldSplit = routeName && this.shouldSplitRoute(routeName);
|
|
933
|
+
let ownFiles = [];
|
|
934
|
+
let ownNames = new Set();
|
|
935
|
+
if (files.template) {
|
|
936
|
+
if (shouldSplit) {
|
|
937
|
+
ownFiles.push(files.template);
|
|
938
|
+
ownNames.add(routeName);
|
|
939
|
+
}
|
|
940
|
+
else {
|
|
941
|
+
addToParent(routeName, files.template);
|
|
942
|
+
}
|
|
943
|
+
}
|
|
944
|
+
if (files.controller) {
|
|
945
|
+
if (shouldSplit) {
|
|
946
|
+
ownFiles.push(files.controller);
|
|
947
|
+
ownNames.add(routeName);
|
|
948
|
+
}
|
|
949
|
+
else {
|
|
950
|
+
addToParent(routeName, files.controller);
|
|
951
|
+
}
|
|
952
|
+
}
|
|
953
|
+
if (files.route) {
|
|
954
|
+
if (shouldSplit) {
|
|
955
|
+
ownFiles.push(files.route);
|
|
956
|
+
ownNames.add(routeName);
|
|
957
|
+
}
|
|
958
|
+
else {
|
|
959
|
+
addToParent(routeName, files.route);
|
|
960
|
+
}
|
|
961
|
+
}
|
|
962
|
+
for (let [childName, childFiles] of files.children) {
|
|
963
|
+
this.splitRoute(`${routeName}.${childName}`, childFiles, (childRouteName, childFile) => {
|
|
964
|
+
// this is our child calling "addToParent"
|
|
965
|
+
if (shouldSplit) {
|
|
966
|
+
ownFiles.push(childFile);
|
|
967
|
+
ownNames.add(childRouteName);
|
|
968
|
+
}
|
|
969
|
+
else {
|
|
970
|
+
addToParent(childRouteName, childFile);
|
|
971
|
+
}
|
|
972
|
+
}, (routeNames, files) => {
|
|
973
|
+
addLazyBundle(routeNames, files);
|
|
974
|
+
});
|
|
975
|
+
}
|
|
976
|
+
if (ownFiles.length > 0) {
|
|
977
|
+
addLazyBundle([...ownNames], ownFiles);
|
|
978
|
+
}
|
|
490
979
|
}
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
980
|
+
topAppJSAsset(engines, prepared) {
|
|
981
|
+
let [app, ...childEngines] = engines;
|
|
982
|
+
let relativePath = `assets/${this.origAppPackage.name}.js`;
|
|
983
|
+
return this.appJSAsset(relativePath, app, childEngines, prepared, {
|
|
984
|
+
autoRun: this.compatApp.autoRun,
|
|
985
|
+
appBoot: !this.compatApp.autoRun ? this.compatApp.appBoot.readAppBoot() : '',
|
|
986
|
+
mainModule: (0, core_1.explicitRelative)((0, path_2.dirname)(relativePath), 'app'),
|
|
987
|
+
appConfig: this.configTree.readConfig().APP,
|
|
494
988
|
});
|
|
495
989
|
}
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
outputAppBootError(modulePrefix, appConfig, contentForConfig) {
|
|
500
|
-
if (!this.compatApp.options.useAddonAppBoot) {
|
|
501
|
-
return;
|
|
990
|
+
get staticAppPathsPattern() {
|
|
991
|
+
if (this.options.staticAppPaths.length > 0) {
|
|
992
|
+
return new RegExp('^(?:' + this.options.staticAppPaths.map(staticAppPath => (0, escape_string_regexp_1.default)(staticAppPath)).join('|') + ')(?:$|/)');
|
|
502
993
|
}
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
throw new Error(`
|
|
514
|
-
Your app uses at least one classic addon that provides content-for 'app-boot'. This is no longer supported.
|
|
515
|
-
With Embroider, you have full control over the app-boot script, so classic addons no longer need to modify it under the hood.
|
|
516
|
-
The following code is used for your app boot:
|
|
517
|
-
|
|
518
|
-
${appBoot}
|
|
519
|
-
|
|
520
|
-
1. If you want to keep the same behavior, copy and paste it to the app-boot script included in app/index.html.
|
|
521
|
-
2. Once app/index.html has the content you need, remove the present error by setting "useAddonAppBoot" to false in the build options.
|
|
522
|
-
`);
|
|
994
|
+
}
|
|
995
|
+
requiredOtherFiles(appFiles) {
|
|
996
|
+
let pattern = this.staticAppPathsPattern;
|
|
997
|
+
if (pattern) {
|
|
998
|
+
return appFiles.otherAppFiles.filter(f => {
|
|
999
|
+
return !pattern.test(f);
|
|
1000
|
+
});
|
|
1001
|
+
}
|
|
1002
|
+
else {
|
|
1003
|
+
return appFiles.otherAppFiles;
|
|
523
1004
|
}
|
|
524
1005
|
}
|
|
1006
|
+
appJSAsset(relativePath, appFiles, childEngines, prepared, entryParams) {
|
|
1007
|
+
let cached = prepared.get(relativePath);
|
|
1008
|
+
if (cached) {
|
|
1009
|
+
return cached;
|
|
1010
|
+
}
|
|
1011
|
+
let eagerModules = [];
|
|
1012
|
+
let requiredAppFiles = [this.requiredOtherFiles(appFiles)];
|
|
1013
|
+
if (!this.options.staticComponents) {
|
|
1014
|
+
requiredAppFiles.push(appFiles.components);
|
|
1015
|
+
}
|
|
1016
|
+
if (!this.options.staticHelpers) {
|
|
1017
|
+
requiredAppFiles.push(appFiles.helpers);
|
|
1018
|
+
}
|
|
1019
|
+
if (!this.options.staticModifiers) {
|
|
1020
|
+
requiredAppFiles.push(appFiles.modifiers);
|
|
1021
|
+
}
|
|
1022
|
+
let styles = [];
|
|
1023
|
+
// only import styles from engines with a parent (this excludeds the parent application) as their styles
|
|
1024
|
+
// will be inserted via a direct <link> tag.
|
|
1025
|
+
if (appFiles.engine.parent && appFiles.engine.package.isLazyEngine()) {
|
|
1026
|
+
let implicitStyles = this.impliedAssets('implicit-styles', appFiles);
|
|
1027
|
+
for (let style of implicitStyles) {
|
|
1028
|
+
styles.push({
|
|
1029
|
+
path: (0, core_1.explicitRelative)('assets/_engine_', style.relativePath),
|
|
1030
|
+
});
|
|
1031
|
+
}
|
|
1032
|
+
let engineMeta = appFiles.engine.package.meta;
|
|
1033
|
+
if (engineMeta && engineMeta['implicit-styles']) {
|
|
1034
|
+
for (let style of engineMeta['implicit-styles']) {
|
|
1035
|
+
styles.push({
|
|
1036
|
+
path: (0, core_1.explicitRelative)((0, path_2.dirname)(relativePath), (0, path_2.join)(appFiles.engine.appRelativePath, style)),
|
|
1037
|
+
});
|
|
1038
|
+
}
|
|
1039
|
+
}
|
|
1040
|
+
}
|
|
1041
|
+
let lazyEngines = [];
|
|
1042
|
+
for (let childEngine of childEngines) {
|
|
1043
|
+
let asset = this.appJSAsset(`assets/_engine_/${encodeURIComponent(childEngine.engine.package.name)}.js`, childEngine, [], prepared);
|
|
1044
|
+
if (childEngine.engine.package.isLazyEngine()) {
|
|
1045
|
+
lazyEngines.push({
|
|
1046
|
+
names: [childEngine.engine.package.name],
|
|
1047
|
+
path: (0, core_1.explicitRelative)((0, path_2.dirname)(relativePath), asset.relativePath),
|
|
1048
|
+
});
|
|
1049
|
+
}
|
|
1050
|
+
else {
|
|
1051
|
+
eagerModules.push((0, core_1.explicitRelative)((0, path_2.dirname)(relativePath), asset.relativePath));
|
|
1052
|
+
}
|
|
1053
|
+
}
|
|
1054
|
+
let lazyRoutes = [];
|
|
1055
|
+
for (let [routeName, routeFiles] of appFiles.routeFiles.children) {
|
|
1056
|
+
this.splitRoute(routeName, routeFiles, (_, filename) => {
|
|
1057
|
+
requiredAppFiles.push([filename]);
|
|
1058
|
+
}, (routeNames, files) => {
|
|
1059
|
+
let routeEntrypoint = `assets/_route_/${encodeURIComponent(routeNames[0])}.js`;
|
|
1060
|
+
if (!prepared.has(routeEntrypoint)) {
|
|
1061
|
+
prepared.set(routeEntrypoint, this.routeEntrypoint(appFiles, routeEntrypoint, files));
|
|
1062
|
+
}
|
|
1063
|
+
lazyRoutes.push({
|
|
1064
|
+
names: routeNames,
|
|
1065
|
+
path: this.importPaths(appFiles, routeEntrypoint).buildtime,
|
|
1066
|
+
});
|
|
1067
|
+
});
|
|
1068
|
+
}
|
|
1069
|
+
let [fastboot, nonFastboot] = (0, partition_1.default)(excludeDotFiles((0, flatten_1.default)(requiredAppFiles)), file => appFiles.isFastbootOnly.get(file));
|
|
1070
|
+
let amdModules = nonFastboot.map(file => this.importPaths(appFiles, file));
|
|
1071
|
+
let fastbootOnlyAmdModules = fastboot.map(file => this.importPaths(appFiles, file));
|
|
1072
|
+
// this is a backward-compatibility feature: addons can force inclusion of
|
|
1073
|
+
// modules.
|
|
1074
|
+
eagerModules.push('./-embroider-implicit-modules.js');
|
|
1075
|
+
let params = { amdModules, fastbootOnlyAmdModules, lazyRoutes, lazyEngines, eagerModules, styles };
|
|
1076
|
+
if (entryParams) {
|
|
1077
|
+
Object.assign(params, entryParams);
|
|
1078
|
+
}
|
|
1079
|
+
let source = entryTemplate(params);
|
|
1080
|
+
let asset = {
|
|
1081
|
+
kind: 'in-memory',
|
|
1082
|
+
source,
|
|
1083
|
+
relativePath,
|
|
1084
|
+
};
|
|
1085
|
+
prepared.set(relativePath, asset);
|
|
1086
|
+
return asset;
|
|
1087
|
+
}
|
|
1088
|
+
importPaths({ engine }, engineRelativePath) {
|
|
1089
|
+
let noHBS = engineRelativePath.replace(this.resolvableExtensionsPattern, '').replace(/\.hbs$/, '');
|
|
1090
|
+
return {
|
|
1091
|
+
runtime: `${engine.modulePrefix}/${noHBS}`,
|
|
1092
|
+
buildtime: path_1.posix.join(engine.package.name, engineRelativePath),
|
|
1093
|
+
};
|
|
1094
|
+
}
|
|
1095
|
+
routeEntrypoint(appFiles, relativePath, files) {
|
|
1096
|
+
let [fastboot, nonFastboot] = (0, partition_1.default)(files, file => appFiles.isFastbootOnly.get(file));
|
|
1097
|
+
let asset = {
|
|
1098
|
+
kind: 'in-memory',
|
|
1099
|
+
source: routeEntryTemplate({
|
|
1100
|
+
files: nonFastboot.map(f => this.importPaths(appFiles, f)),
|
|
1101
|
+
fastbootOnlyFiles: fastboot.map(f => this.importPaths(appFiles, f)),
|
|
1102
|
+
}),
|
|
1103
|
+
relativePath,
|
|
1104
|
+
};
|
|
1105
|
+
return asset;
|
|
1106
|
+
}
|
|
1107
|
+
testJSEntrypoint(appFiles, prepared) {
|
|
1108
|
+
let asset = prepared.get(`assets/test.js`);
|
|
1109
|
+
if (asset) {
|
|
1110
|
+
return asset;
|
|
1111
|
+
}
|
|
1112
|
+
// We're only building tests from the first engine (the app). This is the
|
|
1113
|
+
// normal thing to do -- tests from engines don't automatically roll up into
|
|
1114
|
+
// the app.
|
|
1115
|
+
let engine = appFiles[0];
|
|
1116
|
+
const myName = 'assets/test.js';
|
|
1117
|
+
// tests necessarily also include the app. This is where we account for
|
|
1118
|
+
// that. The classic solution was to always include the app's separate
|
|
1119
|
+
// script tag in the tests HTML, but that isn't as easy for final stage
|
|
1120
|
+
// packagers to understand. It's better to express it here as a direct
|
|
1121
|
+
// module dependency.
|
|
1122
|
+
let eagerModules = [
|
|
1123
|
+
'ember-testing',
|
|
1124
|
+
(0, core_1.explicitRelative)((0, path_2.dirname)(myName), this.topAppJSAsset(appFiles, prepared).relativePath),
|
|
1125
|
+
];
|
|
1126
|
+
let amdModules = [];
|
|
1127
|
+
// this is a backward-compatibility feature: addons can force inclusion of
|
|
1128
|
+
// test support modules.
|
|
1129
|
+
eagerModules.push('./-embroider-implicit-test-modules.js');
|
|
1130
|
+
for (let relativePath of engine.tests) {
|
|
1131
|
+
amdModules.push(this.importPaths(engine, relativePath));
|
|
1132
|
+
}
|
|
1133
|
+
let source = entryTemplate({
|
|
1134
|
+
amdModules,
|
|
1135
|
+
eagerModules,
|
|
1136
|
+
testSuffix: true,
|
|
1137
|
+
});
|
|
1138
|
+
asset = {
|
|
1139
|
+
kind: 'in-memory',
|
|
1140
|
+
source,
|
|
1141
|
+
relativePath: myName,
|
|
1142
|
+
};
|
|
1143
|
+
prepared.set(asset.relativePath, asset);
|
|
1144
|
+
return asset;
|
|
1145
|
+
}
|
|
525
1146
|
}
|
|
526
1147
|
exports.CompatAppBuilder = CompatAppBuilder;
|
|
527
1148
|
__decorate([
|
|
528
1149
|
(0, typescript_memoize_1.Memoize)()
|
|
529
1150
|
], CompatAppBuilder.prototype, "fastbootJSSrcDir", null);
|
|
1151
|
+
__decorate([
|
|
1152
|
+
(0, typescript_memoize_1.Memoize)()
|
|
1153
|
+
], CompatAppBuilder.prototype, "findTestemAsset", null);
|
|
530
1154
|
__decorate([
|
|
531
1155
|
(0, typescript_memoize_1.Memoize)()
|
|
532
1156
|
], CompatAppBuilder.prototype, "allActiveAddons", null);
|
|
@@ -553,10 +1177,10 @@ __decorate([
|
|
|
553
1177
|
], CompatAppBuilder.prototype, "fastbootConfig", null);
|
|
554
1178
|
__decorate([
|
|
555
1179
|
(0, typescript_memoize_1.Memoize)()
|
|
556
|
-
], CompatAppBuilder.prototype, "
|
|
1180
|
+
], CompatAppBuilder.prototype, "portableHints", null);
|
|
557
1181
|
__decorate([
|
|
558
1182
|
(0, typescript_memoize_1.Memoize)()
|
|
559
|
-
], CompatAppBuilder.prototype, "
|
|
1183
|
+
], CompatAppBuilder.prototype, "staticAppPathsPattern", null);
|
|
560
1184
|
function defaultAddonPackageRules() {
|
|
561
1185
|
return (0, fs_extra_2.readdirSync)((0, path_2.join)(__dirname, 'addon-dependency-rules'))
|
|
562
1186
|
.map(filename => {
|
|
@@ -568,6 +1192,104 @@ function defaultAddonPackageRules() {
|
|
|
568
1192
|
.filter(Boolean)
|
|
569
1193
|
.reduce((a, b) => a.concat(b), []);
|
|
570
1194
|
}
|
|
1195
|
+
const entryTemplate = (0, core_1.jsHandlebarsCompile)(`
|
|
1196
|
+
import { importSync as i, macroCondition, getGlobalConfig } from '@embroider/macros';
|
|
1197
|
+
let w = window;
|
|
1198
|
+
let d = w.define;
|
|
1199
|
+
|
|
1200
|
+
{{#if styles}}
|
|
1201
|
+
if (macroCondition(!getGlobalConfig().fastboot?.isRunning)) {
|
|
1202
|
+
{{#each styles as |stylePath| ~}}
|
|
1203
|
+
i("{{js-string-escape stylePath.path}}");
|
|
1204
|
+
{{/each}}
|
|
1205
|
+
}
|
|
1206
|
+
{{/if}}
|
|
1207
|
+
|
|
1208
|
+
{{#each eagerModules as |eagerModule| ~}}
|
|
1209
|
+
i("{{js-string-escape eagerModule}}");
|
|
1210
|
+
{{/each}}
|
|
1211
|
+
|
|
1212
|
+
{{#each amdModules as |amdModule| ~}}
|
|
1213
|
+
d("{{js-string-escape amdModule.runtime}}", function(){ return i("{{js-string-escape amdModule.buildtime}}");});
|
|
1214
|
+
{{/each}}
|
|
1215
|
+
|
|
1216
|
+
{{#if fastbootOnlyAmdModules}}
|
|
1217
|
+
if (macroCondition(getGlobalConfig().fastboot?.isRunning)) {
|
|
1218
|
+
{{#each fastbootOnlyAmdModules as |amdModule| ~}}
|
|
1219
|
+
d("{{js-string-escape amdModule.runtime}}", function(){ return i("{{js-string-escape amdModule.buildtime}}");});
|
|
1220
|
+
{{/each}}
|
|
1221
|
+
}
|
|
1222
|
+
{{/if}}
|
|
1223
|
+
|
|
1224
|
+
|
|
1225
|
+
{{#if lazyRoutes}}
|
|
1226
|
+
w._embroiderRouteBundles_ = [
|
|
1227
|
+
{{#each lazyRoutes as |route|}}
|
|
1228
|
+
{
|
|
1229
|
+
names: {{json-stringify route.names}},
|
|
1230
|
+
load: function() {
|
|
1231
|
+
return import("{{js-string-escape route.path}}");
|
|
1232
|
+
}
|
|
1233
|
+
},
|
|
1234
|
+
{{/each}}
|
|
1235
|
+
]
|
|
1236
|
+
{{/if}}
|
|
1237
|
+
|
|
1238
|
+
{{#if lazyEngines}}
|
|
1239
|
+
w._embroiderEngineBundles_ = [
|
|
1240
|
+
{{#each lazyEngines as |engine|}}
|
|
1241
|
+
{
|
|
1242
|
+
names: {{json-stringify engine.names}},
|
|
1243
|
+
load: function() {
|
|
1244
|
+
return import("{{js-string-escape engine.path}}");
|
|
1245
|
+
}
|
|
1246
|
+
},
|
|
1247
|
+
{{/each}}
|
|
1248
|
+
]
|
|
1249
|
+
{{/if}}
|
|
1250
|
+
|
|
1251
|
+
{{#if autoRun ~}}
|
|
1252
|
+
if (!runningTests) {
|
|
1253
|
+
i("{{js-string-escape mainModule}}").default.create({{json-stringify appConfig}});
|
|
1254
|
+
}
|
|
1255
|
+
{{else if appBoot ~}}
|
|
1256
|
+
{{ appBoot }}
|
|
1257
|
+
{{/if}}
|
|
1258
|
+
|
|
1259
|
+
{{#if testSuffix ~}}
|
|
1260
|
+
{{!- TODO: both of these suffixes should get dynamically generated so they incorporate
|
|
1261
|
+
any content-for added by addons. -}}
|
|
1262
|
+
|
|
1263
|
+
|
|
1264
|
+
{{!- this is the traditional tests-suffix.js -}}
|
|
1265
|
+
i('../tests/test-helper');
|
|
1266
|
+
EmberENV.TESTS_FILE_LOADED = true;
|
|
1267
|
+
{{/if}}
|
|
1268
|
+
`);
|
|
1269
|
+
const routeEntryTemplate = (0, core_1.jsHandlebarsCompile)(`
|
|
1270
|
+
import { importSync as i } from '@embroider/macros';
|
|
1271
|
+
let d = window.define;
|
|
1272
|
+
{{#each files as |amdModule| ~}}
|
|
1273
|
+
d("{{js-string-escape amdModule.runtime}}", function(){ return i("{{js-string-escape amdModule.buildtime}}");});
|
|
1274
|
+
{{/each}}
|
|
1275
|
+
{{#if fastbootOnlyFiles}}
|
|
1276
|
+
import { macroCondition, getGlobalConfig } from '@embroider/macros';
|
|
1277
|
+
if (macroCondition(getGlobalConfig().fastboot?.isRunning)) {
|
|
1278
|
+
{{#each fastbootOnlyFiles as |amdModule| ~}}
|
|
1279
|
+
d("{{js-string-escape amdModule.runtime}}", function(){ return i("{{js-string-escape amdModule.buildtime}}");});
|
|
1280
|
+
{{/each}}
|
|
1281
|
+
}
|
|
1282
|
+
{{/if}}
|
|
1283
|
+
`);
|
|
1284
|
+
function stringOrBufferEqual(a, b) {
|
|
1285
|
+
if (typeof a === 'string' && typeof b === 'string') {
|
|
1286
|
+
return a === b;
|
|
1287
|
+
}
|
|
1288
|
+
if (a instanceof Buffer && b instanceof Buffer) {
|
|
1289
|
+
return Buffer.compare(a, b) === 0;
|
|
1290
|
+
}
|
|
1291
|
+
return false;
|
|
1292
|
+
}
|
|
571
1293
|
const babelFilterTemplate = (0, core_1.jsHandlebarsCompile)(`
|
|
572
1294
|
const { babelFilter } = require(${JSON.stringify(require.resolve('@embroider/core'))});
|
|
573
1295
|
module.exports = babelFilter({{json-stringify skipBabel}}, "{{js-string-escape appRoot}}");
|
|
@@ -607,4 +1329,37 @@ function addCachablePlugin(babelConfig) {
|
|
|
607
1329
|
]);
|
|
608
1330
|
}
|
|
609
1331
|
}
|
|
1332
|
+
function excludeDotFiles(files) {
|
|
1333
|
+
return files.filter(file => !file.startsWith('.') && !file.includes('/.'));
|
|
1334
|
+
}
|
|
1335
|
+
class ParsedEmberAsset {
|
|
1336
|
+
constructor(asset) {
|
|
1337
|
+
this.kind = 'parsed-ember';
|
|
1338
|
+
this.fileAsset = asset;
|
|
1339
|
+
this.html = new ember_html_1.PreparedEmberHTML(asset);
|
|
1340
|
+
this.relativePath = asset.relativePath;
|
|
1341
|
+
}
|
|
1342
|
+
validFor(other) {
|
|
1343
|
+
return this.fileAsset.mtime === other.mtime && this.fileAsset.size === other.size;
|
|
1344
|
+
}
|
|
1345
|
+
}
|
|
1346
|
+
class BuiltEmberAsset {
|
|
1347
|
+
constructor(asset) {
|
|
1348
|
+
this.kind = 'built-ember';
|
|
1349
|
+
this.parsedAsset = asset;
|
|
1350
|
+
this.source = asset.html.dom.serialize();
|
|
1351
|
+
this.relativePath = asset.relativePath;
|
|
1352
|
+
}
|
|
1353
|
+
}
|
|
1354
|
+
class ConcatenatedAsset {
|
|
1355
|
+
constructor(relativePath, sources, resolvableExtensions) {
|
|
1356
|
+
this.relativePath = relativePath;
|
|
1357
|
+
this.sources = sources;
|
|
1358
|
+
this.resolvableExtensions = resolvableExtensions;
|
|
1359
|
+
this.kind = 'concatenated-asset';
|
|
1360
|
+
}
|
|
1361
|
+
get sourcemapPath() {
|
|
1362
|
+
return this.relativePath.replace(this.resolvableExtensions, '') + '.map';
|
|
1363
|
+
}
|
|
1364
|
+
}
|
|
610
1365
|
//# sourceMappingURL=compat-app-builder.js.map
|