@embroider/core 2.0.1 → 2.1.0
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 +1 -1
- package/src/babel-plugin-adjust-imports.d.ts +3 -34
- package/src/babel-plugin-adjust-imports.js +94 -318
- package/src/babel-plugin-adjust-imports.js.map +1 -1
- package/src/babel-plugin-inline-hbs-deps-node.d.ts +14 -0
- package/src/babel-plugin-inline-hbs-deps-node.js +27 -0
- package/src/babel-plugin-inline-hbs-deps-node.js.map +1 -0
- package/src/babel-plugin-inline-hbs-deps.d.ts +10 -0
- package/src/babel-plugin-inline-hbs-deps.js +134 -0
- package/src/babel-plugin-inline-hbs-deps.js.map +1 -0
- package/src/babel-plugin-inline-hbs-node.d.ts +7 -0
- package/src/babel-plugin-inline-hbs-node.js +15 -0
- package/src/babel-plugin-inline-hbs-node.js.map +1 -0
- package/src/babel-plugin-inline-hbs.d.ts +24 -0
- package/src/babel-plugin-inline-hbs.js +142 -0
- package/src/babel-plugin-inline-hbs.js.map +1 -0
- package/src/babel-plugin-stage1-inline-hbs-node.d.ts +12 -0
- package/src/babel-plugin-stage1-inline-hbs-node.js +9 -0
- package/src/babel-plugin-stage1-inline-hbs-node.js.map +1 -0
- package/src/babel-plugin-stage1-inline-hbs.d.ts +9 -0
- package/src/babel-plugin-stage1-inline-hbs.js +96 -0
- package/src/babel-plugin-stage1-inline-hbs.js.map +1 -0
- package/src/browser-index.d.ts +1 -0
- package/src/browser-index.js +6 -0
- package/src/browser-index.js.map +1 -0
- package/src/ember-template-compiler-types.d.ts +41 -0
- package/src/ember-template-compiler-types.js +3 -0
- package/src/ember-template-compiler-types.js.map +1 -0
- package/src/load-ember-template-compiler.d.ts +6 -0
- package/src/load-ember-template-compiler.js +57 -0
- package/src/load-ember-template-compiler.js.map +1 -0
- package/src/messages.d.ts +0 -1
- package/src/mini-modules-polyfill.d.ts +12 -0
- package/src/mini-modules-polyfill.js +80 -0
- package/src/mini-modules-polyfill.js.map +1 -0
- package/src/module-resolver.d.ts +46 -0
- package/src/module-resolver.js +260 -0
- package/src/module-resolver.js.map +1 -0
- package/src/patch-template-compiler.d.ts +1 -0
- package/src/patch-template-compiler.js +176 -0
- package/src/patch-template-compiler.js.map +1 -0
- package/src/resolver-plugin.d.ts +3 -0
- package/src/resolver-plugin.js +53 -0
- package/src/resolver-plugin.js.map +1 -0
- package/src/resolver.d.ts +14 -0
- package/src/resolver.js +3 -0
- package/src/resolver.js.map +1 -0
- package/src/template-compiler-common.d.ts +70 -0
- package/src/template-compiler-common.js +176 -0
- package/src/template-compiler-common.js.map +1 -0
- package/src/template-compiler-node.d.ts +17 -0
- package/src/template-compiler-node.js +32 -0
- package/src/template-compiler-node.js.map +1 -0
@@ -0,0 +1,260 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
5
|
+
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
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
7
|
+
};
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
9
|
+
exports.Resolver = void 0;
|
10
|
+
const shared_internals_1 = require("@embroider/shared-internals");
|
11
|
+
const path_1 = require("path");
|
12
|
+
const shared_internals_2 = require("@embroider/shared-internals");
|
13
|
+
const typescript_memoize_1 = require("typescript-memoize");
|
14
|
+
class Resolver {
|
15
|
+
constructor(filename, options) {
|
16
|
+
this.filename = filename;
|
17
|
+
this.options = options;
|
18
|
+
this.originalFilename = options.relocatedFiles[filename] || filename;
|
19
|
+
}
|
20
|
+
resolve(specifier, isDynamic) {
|
21
|
+
if (specifier === '@embroider/macros') {
|
22
|
+
// the macros package is always handled directly within babel (not
|
23
|
+
// necessarily as a real resolvable package), so we should not mess with it.
|
24
|
+
// It might not get compiled away until *after* our plugin has run, which is
|
25
|
+
// why we need to know about it.
|
26
|
+
return { result: 'continue' };
|
27
|
+
}
|
28
|
+
let maybeRenamed = this.handleRenaming(specifier);
|
29
|
+
let resolution = this.handleExternal(maybeRenamed, isDynamic);
|
30
|
+
if (resolution.result === 'continue' && maybeRenamed !== specifier) {
|
31
|
+
return { result: 'redirect-to', specifier: maybeRenamed };
|
32
|
+
}
|
33
|
+
return resolution;
|
34
|
+
}
|
35
|
+
owningPackage() {
|
36
|
+
return shared_internals_2.PackageCache.shared('embroider-stage3', this.options.appRoot).ownerOfFile(this.originalFilename);
|
37
|
+
}
|
38
|
+
relocatedIntoPackage() {
|
39
|
+
if (this.originalFilename !== this.filename) {
|
40
|
+
let owning = shared_internals_2.PackageCache.shared('embroider-stage3', this.options.appRoot).ownerOfFile(this.filename);
|
41
|
+
if (owning && !owning.isV2Ember()) {
|
42
|
+
throw new Error(`bug: it should only be possible to get relocated into a v2 ember package here`);
|
43
|
+
}
|
44
|
+
return owning;
|
45
|
+
}
|
46
|
+
}
|
47
|
+
handleRenaming(specifier) {
|
48
|
+
let packageName = (0, shared_internals_1.packageName)(specifier);
|
49
|
+
if (!packageName) {
|
50
|
+
return specifier;
|
51
|
+
}
|
52
|
+
for (let [candidate, replacement] of Object.entries(this.options.renameModules)) {
|
53
|
+
if (candidate === specifier) {
|
54
|
+
return replacement;
|
55
|
+
}
|
56
|
+
for (let extension of this.options.resolvableExtensions) {
|
57
|
+
if (candidate === specifier + '/index' + extension) {
|
58
|
+
return replacement;
|
59
|
+
}
|
60
|
+
if (candidate === specifier + extension) {
|
61
|
+
return replacement;
|
62
|
+
}
|
63
|
+
}
|
64
|
+
}
|
65
|
+
if (this.options.renamePackages[packageName]) {
|
66
|
+
return specifier.replace(packageName, this.options.renamePackages[packageName]);
|
67
|
+
}
|
68
|
+
let pkg = this.owningPackage();
|
69
|
+
if (!pkg || !pkg.isV2Ember()) {
|
70
|
+
return specifier;
|
71
|
+
}
|
72
|
+
if (pkg.meta['auto-upgraded'] && pkg.name === packageName) {
|
73
|
+
// we found a self-import, make it relative. Only auto-upgraded packages get
|
74
|
+
// this help, v2 packages are natively supposed to use relative imports for
|
75
|
+
// their own modules, and we want to push them all to do that correctly.
|
76
|
+
let fullPath = specifier.replace(packageName, pkg.root);
|
77
|
+
return (0, shared_internals_2.explicitRelative)((0, path_1.dirname)(this.filename), fullPath);
|
78
|
+
}
|
79
|
+
let relocatedIntoPkg = this.relocatedIntoPackage();
|
80
|
+
if (relocatedIntoPkg && pkg.meta['auto-upgraded'] && relocatedIntoPkg.name === packageName) {
|
81
|
+
// a file that was relocated into a package does a self-import of that
|
82
|
+
// package's name. This can happen when an addon (like ember-cli-mirage)
|
83
|
+
// emits files from its own treeForApp that contain imports of the app's own
|
84
|
+
// fully qualified name.
|
85
|
+
let fullPath = specifier.replace(packageName, relocatedIntoPkg.root);
|
86
|
+
return (0, shared_internals_2.explicitRelative)((0, path_1.dirname)(this.filename), fullPath);
|
87
|
+
}
|
88
|
+
return specifier;
|
89
|
+
}
|
90
|
+
handleExternal(specifier, isDynamic) {
|
91
|
+
let pkg = this.owningPackage();
|
92
|
+
if (!pkg || !pkg.isV2Ember()) {
|
93
|
+
return { result: 'continue' };
|
94
|
+
}
|
95
|
+
let packageName = (0, shared_internals_1.packageName)(specifier);
|
96
|
+
if (!packageName) {
|
97
|
+
// This is a relative import. We don't automatically externalize those
|
98
|
+
// because it's rare, and by keeping them static we give better errors. But
|
99
|
+
// we do allow them to be explicitly externalized by the package author (or
|
100
|
+
// a compat adapter). In the metadata, they would be listed in
|
101
|
+
// package-relative form, so we need to convert this specifier to that.
|
102
|
+
let absoluteSpecifier = (0, path_1.resolve)((0, path_1.dirname)(this.filename), specifier);
|
103
|
+
let packageRelativeSpecifier = (0, shared_internals_2.explicitRelative)(pkg.root, absoluteSpecifier);
|
104
|
+
if (isExplicitlyExternal(packageRelativeSpecifier, pkg)) {
|
105
|
+
let publicSpecifier = absoluteSpecifier.replace(pkg.root, pkg.name);
|
106
|
+
return { result: 'external', specifier: publicSpecifier };
|
107
|
+
}
|
108
|
+
else {
|
109
|
+
return { result: 'continue' };
|
110
|
+
}
|
111
|
+
}
|
112
|
+
// absolute package imports can also be explicitly external based on their
|
113
|
+
// full specifier name
|
114
|
+
if (isExplicitlyExternal(specifier, pkg)) {
|
115
|
+
return { result: 'external', specifier };
|
116
|
+
}
|
117
|
+
if (!pkg.meta['auto-upgraded'] && shared_internals_1.emberVirtualPeerDeps.has(packageName)) {
|
118
|
+
// Native v2 addons are allowed to use the emberVirtualPeerDeps like
|
119
|
+
// `@glimmer/component`. And like all v2 addons, it's important that they
|
120
|
+
// see those dependencies after those dependencies have been converted to
|
121
|
+
// v2.
|
122
|
+
//
|
123
|
+
// But unlike auto-upgraded addons, native v2 addons are not necessarily
|
124
|
+
// copied out of their original place in node_modules. And from that
|
125
|
+
// original place they might accidentally resolve the emberVirtualPeerDeps
|
126
|
+
// that are present there in v1 format.
|
127
|
+
//
|
128
|
+
// So before we even check isResolvable, we adjust these imports to point at
|
129
|
+
// the app's copies instead.
|
130
|
+
if (shared_internals_1.emberVirtualPeerDeps.has(packageName)) {
|
131
|
+
if (!this.options.activeAddons[packageName]) {
|
132
|
+
throw new Error(`${pkg.name} is trying to import the app's ${packageName} package, but it seems to be missing`);
|
133
|
+
}
|
134
|
+
return {
|
135
|
+
result: 'redirect-to',
|
136
|
+
specifier: (0, shared_internals_2.explicitRelative)((0, path_1.dirname)(this.filename), specifier.replace(packageName, this.options.activeAddons[packageName])),
|
137
|
+
};
|
138
|
+
}
|
139
|
+
}
|
140
|
+
let relocatedPkg = this.relocatedIntoPackage();
|
141
|
+
if (relocatedPkg) {
|
142
|
+
// this file has been moved into another package (presumably the app).
|
143
|
+
// first try to resolve from the destination package
|
144
|
+
if (isResolvable(packageName, relocatedPkg, this.options.appRoot)) {
|
145
|
+
// self-imports are legal in the app tree, even for v2 packages.
|
146
|
+
if (!pkg.meta['auto-upgraded'] && packageName !== pkg.name) {
|
147
|
+
throw new Error(`${pkg.name} is trying to import ${packageName} from within its app tree. This is unsafe, because ${pkg.name} can't control which dependencies are resolvable from the app`);
|
148
|
+
}
|
149
|
+
return { result: 'continue' };
|
150
|
+
}
|
151
|
+
else {
|
152
|
+
// second try to resolve from the source package
|
153
|
+
let targetPkg = isResolvable(packageName, pkg, this.options.appRoot);
|
154
|
+
if (targetPkg) {
|
155
|
+
// self-imports are legal in the app tree, even for v2 packages.
|
156
|
+
if (!pkg.meta['auto-upgraded'] && packageName !== pkg.name) {
|
157
|
+
throw new Error(`${pkg.name} is trying to import ${packageName} from within its app tree. This is unsafe, because ${pkg.name} can't control which dependencies are resolvable from the app`);
|
158
|
+
}
|
159
|
+
// we found it, but we need to rewrite it because it's not really going to
|
160
|
+
// resolve from where its sitting
|
161
|
+
return {
|
162
|
+
result: 'redirect-to',
|
163
|
+
specifier: (0, shared_internals_2.explicitRelative)((0, path_1.dirname)(this.filename), specifier.replace(packageName, targetPkg.root)),
|
164
|
+
};
|
165
|
+
}
|
166
|
+
}
|
167
|
+
}
|
168
|
+
else {
|
169
|
+
if (isResolvable(packageName, pkg, this.options.appRoot)) {
|
170
|
+
if (!pkg.meta['auto-upgraded'] && !reliablyResolvable(pkg, packageName)) {
|
171
|
+
throw new Error(`${pkg.name} is trying to import from ${packageName} but that is not one of its explicit dependencies`);
|
172
|
+
}
|
173
|
+
return { result: 'continue' };
|
174
|
+
}
|
175
|
+
}
|
176
|
+
// auto-upgraded packages can fall back to the set of known active addons
|
177
|
+
//
|
178
|
+
// v2 packages can fall back to the set of known active addons only to find
|
179
|
+
// themselves (which is needed due to app tree merging)
|
180
|
+
if ((pkg.meta['auto-upgraded'] || packageName === pkg.name) && this.options.activeAddons[packageName]) {
|
181
|
+
return {
|
182
|
+
result: 'redirect-to',
|
183
|
+
specifier: (0, shared_internals_2.explicitRelative)((0, path_1.dirname)(this.filename), specifier.replace(packageName, this.options.activeAddons[packageName])),
|
184
|
+
};
|
185
|
+
}
|
186
|
+
if (pkg.meta['auto-upgraded']) {
|
187
|
+
// auto-upgraded packages can fall back to attempting to find dependencies at
|
188
|
+
// runtime. Native v2 packages can only get this behavior in the
|
189
|
+
// isExplicitlyExternal case above because they need to explicitly ask for
|
190
|
+
// externals.
|
191
|
+
return { result: 'external', specifier };
|
192
|
+
}
|
193
|
+
else {
|
194
|
+
// native v2 packages don't automatically externalize *everything* the way
|
195
|
+
// auto-upgraded packages do, but they still externalize known and approved
|
196
|
+
// ember virtual packages (like @ember/component)
|
197
|
+
if (shared_internals_1.emberVirtualPackages.has(packageName)) {
|
198
|
+
return { result: 'external', specifier };
|
199
|
+
}
|
200
|
+
}
|
201
|
+
// non-resolvable imports in dynamic positions become runtime errors, not
|
202
|
+
// build-time errors, so we emit the runtime error module here before the
|
203
|
+
// stage3 packager has a chance to see the missing module. (Maybe some stage3
|
204
|
+
// packagers will have this behavior by default, because it would make sense,
|
205
|
+
// but webpack at least does not.)
|
206
|
+
if (isDynamic) {
|
207
|
+
return { result: 'runtime-failure', specifier };
|
208
|
+
}
|
209
|
+
// this is falling through with the original specifier which was
|
210
|
+
// non-resolvable, which will presumably cause a static build error in stage3.
|
211
|
+
return { result: 'continue' };
|
212
|
+
}
|
213
|
+
}
|
214
|
+
__decorate([
|
215
|
+
(0, typescript_memoize_1.Memoize)()
|
216
|
+
], Resolver.prototype, "owningPackage", null);
|
217
|
+
__decorate([
|
218
|
+
(0, typescript_memoize_1.Memoize)()
|
219
|
+
], Resolver.prototype, "relocatedIntoPackage", null);
|
220
|
+
exports.Resolver = Resolver;
|
221
|
+
function isExplicitlyExternal(specifier, fromPkg) {
|
222
|
+
return Boolean(fromPkg.isV2Addon() && fromPkg.meta['externals'] && fromPkg.meta['externals'].includes(specifier));
|
223
|
+
}
|
224
|
+
function isResolvable(packageName, fromPkg, appRoot) {
|
225
|
+
try {
|
226
|
+
let dep = shared_internals_2.PackageCache.shared('embroider-stage3', appRoot).resolve(packageName, fromPkg);
|
227
|
+
if (!dep.isEmberPackage() && fromPkg.meta['auto-upgraded'] && !fromPkg.hasDependency('ember-auto-import')) {
|
228
|
+
// classic ember addons can only import non-ember dependencies if they
|
229
|
+
// have ember-auto-import.
|
230
|
+
//
|
231
|
+
// whereas native v2 packages can always import any dependency
|
232
|
+
return false;
|
233
|
+
}
|
234
|
+
return dep;
|
235
|
+
}
|
236
|
+
catch (err) {
|
237
|
+
if (err.code !== 'MODULE_NOT_FOUND') {
|
238
|
+
throw err;
|
239
|
+
}
|
240
|
+
return false;
|
241
|
+
}
|
242
|
+
}
|
243
|
+
// we don't want to allow things that resolve only by accident that are likely
|
244
|
+
// to break in other setups. For example: import your dependencies'
|
245
|
+
// dependencies, or importing your own name from within a monorepo (which will
|
246
|
+
// work because of the symlinking) without setting up "exports" (which makes
|
247
|
+
// your own name reliably resolvable)
|
248
|
+
function reliablyResolvable(pkg, packageName) {
|
249
|
+
if (pkg.hasDependency(packageName)) {
|
250
|
+
return true;
|
251
|
+
}
|
252
|
+
if (pkg.name === packageName && pkg.packageJSON.exports) {
|
253
|
+
return true;
|
254
|
+
}
|
255
|
+
if (shared_internals_1.emberVirtualPeerDeps.has(packageName)) {
|
256
|
+
return true;
|
257
|
+
}
|
258
|
+
return false;
|
259
|
+
}
|
260
|
+
//# sourceMappingURL=module-resolver.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"module-resolver.js","sourceRoot":"","sources":["module-resolver.ts"],"names":[],"mappings":"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","sourcesContent":["import { emberVirtualPackages, emberVirtualPeerDeps, packageName as getPackageName } from '@embroider/shared-internals';\nimport { dirname, resolve } from 'path';\nimport { PackageCache, Package, V2Package, explicitRelative } from '@embroider/shared-internals';\nimport { Memoize } from 'typescript-memoize';\n\nexport interface Options {\n renamePackages: {\n [fromName: string]: string;\n };\n renameModules: {\n [fromName: string]: string;\n };\n extraImports: {\n absPath: string;\n target: string;\n runtimeName?: string;\n }[];\n externalsDir: string;\n activeAddons: {\n [packageName: string]: string;\n };\n relocatedFiles: { [relativePath: string]: string };\n resolvableExtensions: string[];\n appRoot: string;\n}\n\nexport type Resolution =\n | { result: 'continue' }\n | { result: 'redirect-to'; specifier: string }\n | { result: 'external'; specifier: string }\n | { result: 'runtime-failure'; specifier: string };\n\nexport class Resolver {\n readonly originalFilename: string;\n\n constructor(readonly filename: string, private options: Options) {\n this.originalFilename = options.relocatedFiles[filename] || filename;\n }\n resolve(specifier: string, isDynamic: boolean): Resolution {\n if (specifier === '@embroider/macros') {\n // the macros package is always handled directly within babel (not\n // necessarily as a real resolvable package), so we should not mess with it.\n // It might not get compiled away until *after* our plugin has run, which is\n // why we need to know about it.\n return { result: 'continue' };\n }\n\n let maybeRenamed = this.handleRenaming(specifier);\n let resolution = this.handleExternal(maybeRenamed, isDynamic);\n if (resolution.result === 'continue' && maybeRenamed !== specifier) {\n return { result: 'redirect-to', specifier: maybeRenamed };\n }\n return resolution;\n }\n\n @Memoize()\n owningPackage(): Package | undefined {\n return PackageCache.shared('embroider-stage3', this.options.appRoot).ownerOfFile(this.originalFilename);\n }\n\n @Memoize()\n private relocatedIntoPackage(): V2Package | undefined {\n if (this.originalFilename !== this.filename) {\n let owning = PackageCache.shared('embroider-stage3', this.options.appRoot).ownerOfFile(this.filename);\n if (owning && !owning.isV2Ember()) {\n throw new Error(`bug: it should only be possible to get relocated into a v2 ember package here`);\n }\n return owning;\n }\n }\n\n private handleRenaming(specifier: string) {\n let packageName = getPackageName(specifier);\n if (!packageName) {\n return specifier;\n }\n\n for (let [candidate, replacement] of Object.entries(this.options.renameModules)) {\n if (candidate === specifier) {\n return replacement;\n }\n for (let extension of this.options.resolvableExtensions) {\n if (candidate === specifier + '/index' + extension) {\n return replacement;\n }\n if (candidate === specifier + extension) {\n return replacement;\n }\n }\n }\n\n if (this.options.renamePackages[packageName]) {\n return specifier.replace(packageName, this.options.renamePackages[packageName]);\n }\n\n let pkg = this.owningPackage();\n if (!pkg || !pkg.isV2Ember()) {\n return specifier;\n }\n\n if (pkg.meta['auto-upgraded'] && pkg.name === packageName) {\n // we found a self-import, make it relative. Only auto-upgraded packages get\n // this help, v2 packages are natively supposed to use relative imports for\n // their own modules, and we want to push them all to do that correctly.\n let fullPath = specifier.replace(packageName, pkg.root);\n return explicitRelative(dirname(this.filename), fullPath);\n }\n\n let relocatedIntoPkg = this.relocatedIntoPackage();\n if (relocatedIntoPkg && pkg.meta['auto-upgraded'] && relocatedIntoPkg.name === packageName) {\n // a file that was relocated into a package does a self-import of that\n // package's name. This can happen when an addon (like ember-cli-mirage)\n // emits files from its own treeForApp that contain imports of the app's own\n // fully qualified name.\n let fullPath = specifier.replace(packageName, relocatedIntoPkg.root);\n return explicitRelative(dirname(this.filename), fullPath);\n }\n\n return specifier;\n }\n\n private handleExternal(specifier: string, isDynamic: boolean): Resolution {\n let pkg = this.owningPackage();\n if (!pkg || !pkg.isV2Ember()) {\n return { result: 'continue' };\n }\n\n let packageName = getPackageName(specifier);\n if (!packageName) {\n // This is a relative import. We don't automatically externalize those\n // because it's rare, and by keeping them static we give better errors. But\n // we do allow them to be explicitly externalized by the package author (or\n // a compat adapter). In the metadata, they would be listed in\n // package-relative form, so we need to convert this specifier to that.\n let absoluteSpecifier = resolve(dirname(this.filename), specifier);\n let packageRelativeSpecifier = explicitRelative(pkg.root, absoluteSpecifier);\n if (isExplicitlyExternal(packageRelativeSpecifier, pkg)) {\n let publicSpecifier = absoluteSpecifier.replace(pkg.root, pkg.name);\n return { result: 'external', specifier: publicSpecifier };\n } else {\n return { result: 'continue' };\n }\n }\n\n // absolute package imports can also be explicitly external based on their\n // full specifier name\n if (isExplicitlyExternal(specifier, pkg)) {\n return { result: 'external', specifier };\n }\n\n if (!pkg.meta['auto-upgraded'] && emberVirtualPeerDeps.has(packageName)) {\n // Native v2 addons are allowed to use the emberVirtualPeerDeps like\n // `@glimmer/component`. And like all v2 addons, it's important that they\n // see those dependencies after those dependencies have been converted to\n // v2.\n //\n // But unlike auto-upgraded addons, native v2 addons are not necessarily\n // copied out of their original place in node_modules. And from that\n // original place they might accidentally resolve the emberVirtualPeerDeps\n // that are present there in v1 format.\n //\n // So before we even check isResolvable, we adjust these imports to point at\n // the app's copies instead.\n if (emberVirtualPeerDeps.has(packageName)) {\n if (!this.options.activeAddons[packageName]) {\n throw new Error(\n `${pkg.name} is trying to import the app's ${packageName} package, but it seems to be missing`\n );\n }\n return {\n result: 'redirect-to',\n specifier: explicitRelative(\n dirname(this.filename),\n specifier.replace(packageName, this.options.activeAddons[packageName])\n ),\n };\n }\n }\n\n let relocatedPkg = this.relocatedIntoPackage();\n if (relocatedPkg) {\n // this file has been moved into another package (presumably the app).\n\n // first try to resolve from the destination package\n if (isResolvable(packageName, relocatedPkg, this.options.appRoot)) {\n // self-imports are legal in the app tree, even for v2 packages.\n if (!pkg.meta['auto-upgraded'] && packageName !== pkg.name) {\n throw new Error(\n `${pkg.name} is trying to import ${packageName} from within its app tree. This is unsafe, because ${pkg.name} can't control which dependencies are resolvable from the app`\n );\n }\n return { result: 'continue' };\n } else {\n // second try to resolve from the source package\n let targetPkg = isResolvable(packageName, pkg, this.options.appRoot);\n if (targetPkg) {\n // self-imports are legal in the app tree, even for v2 packages.\n if (!pkg.meta['auto-upgraded'] && packageName !== pkg.name) {\n throw new Error(\n `${pkg.name} is trying to import ${packageName} from within its app tree. This is unsafe, because ${pkg.name} can't control which dependencies are resolvable from the app`\n );\n }\n // we found it, but we need to rewrite it because it's not really going to\n // resolve from where its sitting\n return {\n result: 'redirect-to',\n specifier: explicitRelative(dirname(this.filename), specifier.replace(packageName, targetPkg.root)),\n };\n }\n }\n } else {\n if (isResolvable(packageName, pkg, this.options.appRoot)) {\n if (!pkg.meta['auto-upgraded'] && !reliablyResolvable(pkg, packageName)) {\n throw new Error(\n `${pkg.name} is trying to import from ${packageName} but that is not one of its explicit dependencies`\n );\n }\n return { result: 'continue' };\n }\n }\n\n // auto-upgraded packages can fall back to the set of known active addons\n //\n // v2 packages can fall back to the set of known active addons only to find\n // themselves (which is needed due to app tree merging)\n if ((pkg.meta['auto-upgraded'] || packageName === pkg.name) && this.options.activeAddons[packageName]) {\n return {\n result: 'redirect-to',\n specifier: explicitRelative(\n dirname(this.filename),\n specifier.replace(packageName, this.options.activeAddons[packageName])\n ),\n };\n }\n\n if (pkg.meta['auto-upgraded']) {\n // auto-upgraded packages can fall back to attempting to find dependencies at\n // runtime. Native v2 packages can only get this behavior in the\n // isExplicitlyExternal case above because they need to explicitly ask for\n // externals.\n return { result: 'external', specifier };\n } else {\n // native v2 packages don't automatically externalize *everything* the way\n // auto-upgraded packages do, but they still externalize known and approved\n // ember virtual packages (like @ember/component)\n if (emberVirtualPackages.has(packageName)) {\n return { result: 'external', specifier };\n }\n }\n\n // non-resolvable imports in dynamic positions become runtime errors, not\n // build-time errors, so we emit the runtime error module here before the\n // stage3 packager has a chance to see the missing module. (Maybe some stage3\n // packagers will have this behavior by default, because it would make sense,\n // but webpack at least does not.)\n if (isDynamic) {\n return { result: 'runtime-failure', specifier };\n }\n\n // this is falling through with the original specifier which was\n // non-resolvable, which will presumably cause a static build error in stage3.\n return { result: 'continue' };\n }\n}\n\nfunction isExplicitlyExternal(specifier: string, fromPkg: V2Package): boolean {\n return Boolean(fromPkg.isV2Addon() && fromPkg.meta['externals'] && fromPkg.meta['externals'].includes(specifier));\n}\n\nfunction isResolvable(packageName: string, fromPkg: V2Package, appRoot: string): false | Package {\n try {\n let dep = PackageCache.shared('embroider-stage3', appRoot).resolve(packageName, fromPkg);\n if (!dep.isEmberPackage() && fromPkg.meta['auto-upgraded'] && !fromPkg.hasDependency('ember-auto-import')) {\n // classic ember addons can only import non-ember dependencies if they\n // have ember-auto-import.\n //\n // whereas native v2 packages can always import any dependency\n return false;\n }\n return dep;\n } catch (err) {\n if (err.code !== 'MODULE_NOT_FOUND') {\n throw err;\n }\n return false;\n }\n}\n\n// we don't want to allow things that resolve only by accident that are likely\n// to break in other setups. For example: import your dependencies'\n// dependencies, or importing your own name from within a monorepo (which will\n// work because of the symlinking) without setting up \"exports\" (which makes\n// your own name reliably resolvable)\nfunction reliablyResolvable(pkg: V2Package, packageName: string) {\n if (pkg.hasDependency(packageName)) {\n return true;\n }\n\n if (pkg.name === packageName && pkg.packageJSON.exports) {\n return true;\n }\n\n if (emberVirtualPeerDeps.has(packageName)) {\n return true;\n }\n\n return false;\n}\n"]}
|
@@ -0,0 +1 @@
|
|
1
|
+
export declare function patch(source: string, templateCompilerPath: string): string;
|
@@ -0,0 +1,176 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.patch = void 0;
|
4
|
+
const core_1 = require("@babel/core");
|
5
|
+
function parseVersion(templateCompilerPath, source) {
|
6
|
+
// ember-template-compiler.js contains a comment that indicates what version it is for
|
7
|
+
// that looks like:
|
8
|
+
/*!
|
9
|
+
* @overview Ember - JavaScript Application Framework
|
10
|
+
* @copyright Copyright 2011-2020 Tilde Inc. and contributors
|
11
|
+
* Portions Copyright 2006-2011 Strobe Inc.
|
12
|
+
* Portions Copyright 2008-2011 Apple Inc. All rights reserved.
|
13
|
+
* @license Licensed under MIT license
|
14
|
+
* See https://raw.github.com/emberjs/ember.js/master/LICENSE
|
15
|
+
* @version 3.25.1
|
16
|
+
*/
|
17
|
+
let version = source.match(/@version\s+([\d\.]+)/);
|
18
|
+
if (!version || !version[1]) {
|
19
|
+
throw new Error(`Could not find version string in \`${templateCompilerPath}\`. Maybe we don't support your ember-source version?`);
|
20
|
+
}
|
21
|
+
let numbers = version[1].split('.');
|
22
|
+
let major = parseInt(numbers[0], 10);
|
23
|
+
let minor = parseInt(numbers[1], 10);
|
24
|
+
let patch = parseInt(numbers[2], 10);
|
25
|
+
return { major, minor, patch };
|
26
|
+
}
|
27
|
+
function emberVersionGte(templateCompilerPath, source, major, minor) {
|
28
|
+
let actual = parseVersion(templateCompilerPath, source);
|
29
|
+
return actual.major > major || (actual.major === major && actual.minor >= minor);
|
30
|
+
}
|
31
|
+
function patch(source, templateCompilerPath) {
|
32
|
+
let version = parseVersion(templateCompilerPath, source);
|
33
|
+
if (emberVersionGte(templateCompilerPath, source, 3, 26) ||
|
34
|
+
(version.major === 3 && version.minor === 25 && version.patch >= 2) ||
|
35
|
+
(version.major === 3 && version.minor === 24 && version.patch >= 3)) {
|
36
|
+
// no modifications are needed after
|
37
|
+
// https://github.com/emberjs/ember.js/pull/19426 and backported to
|
38
|
+
// 3.26.0-beta.3, 3.25.2, 3.24.3
|
39
|
+
return source;
|
40
|
+
}
|
41
|
+
let replacedVar = false;
|
42
|
+
let patchedSource;
|
43
|
+
let needsAngleBracketPrinterFix = emberVersionGte(templateCompilerPath, source, 3, 12) && !emberVersionGte(templateCompilerPath, source, 3, 17);
|
44
|
+
if (needsAngleBracketPrinterFix) {
|
45
|
+
// here we are stripping off the first `var Ember;`. That one small change
|
46
|
+
// lets us crack open the file and get access to its internal loader, because
|
47
|
+
// we can give it our own predefined `Ember` variable instead, which it will
|
48
|
+
// use and put `Ember.__loader` onto.
|
49
|
+
//
|
50
|
+
// on ember 3.12 through 3.16 (which use variants of glimmer-vm 0.38.5) we
|
51
|
+
// also apply a patch to the printer in @glimmer/syntax to fix
|
52
|
+
// https://github.com/glimmerjs/glimmer-vm/pull/941/files because it can
|
53
|
+
// really bork apps under embroider, and we'd like to support at least all
|
54
|
+
// active LTS versions of ember.
|
55
|
+
patchedSource = (0, core_1.transform)(source, {
|
56
|
+
plugins: [
|
57
|
+
function () {
|
58
|
+
return {
|
59
|
+
visitor: {
|
60
|
+
VariableDeclarator(path) {
|
61
|
+
let id = path.node.id;
|
62
|
+
if (id.type === 'Identifier' && id.name === 'Ember' && !replacedVar) {
|
63
|
+
replacedVar = true;
|
64
|
+
path.remove();
|
65
|
+
}
|
66
|
+
},
|
67
|
+
CallExpression: {
|
68
|
+
enter(path, state) {
|
69
|
+
let callee = path.get('callee');
|
70
|
+
if (!callee.isIdentifier() || callee.node.name !== 'define') {
|
71
|
+
return;
|
72
|
+
}
|
73
|
+
let firstArg = path.get('arguments')[0];
|
74
|
+
if (!firstArg.isStringLiteral() || firstArg.node.value !== '@glimmer/syntax') {
|
75
|
+
return;
|
76
|
+
}
|
77
|
+
state.definingGlimmerSyntax = path;
|
78
|
+
},
|
79
|
+
exit(path, state) {
|
80
|
+
if (state.definingGlimmerSyntax === path) {
|
81
|
+
state.definingGlimmerSyntax = false;
|
82
|
+
}
|
83
|
+
},
|
84
|
+
},
|
85
|
+
FunctionDeclaration: {
|
86
|
+
enter(path, state) {
|
87
|
+
if (!state.definingGlimmerSyntax) {
|
88
|
+
return;
|
89
|
+
}
|
90
|
+
let id = path.get('id');
|
91
|
+
if (id.isIdentifier() && id.node.name === 'build') {
|
92
|
+
state.declaringBuildFunction = path;
|
93
|
+
}
|
94
|
+
},
|
95
|
+
exit(path, state) {
|
96
|
+
if (state.declaringBuildFunction === path) {
|
97
|
+
state.declaringBuildFunction = false;
|
98
|
+
}
|
99
|
+
},
|
100
|
+
},
|
101
|
+
SwitchCase: {
|
102
|
+
enter(path, state) {
|
103
|
+
if (!state.definingGlimmerSyntax) {
|
104
|
+
return;
|
105
|
+
}
|
106
|
+
let test = path.get('test');
|
107
|
+
if (test.isStringLiteral() && test.node.value === 'ElementNode') {
|
108
|
+
state.caseElementNode = path;
|
109
|
+
}
|
110
|
+
},
|
111
|
+
exit(path, state) {
|
112
|
+
if (state.caseElementNode === path) {
|
113
|
+
state.caseElementNode = false;
|
114
|
+
}
|
115
|
+
},
|
116
|
+
},
|
117
|
+
IfStatement(path, state) {
|
118
|
+
if (!state.caseElementNode) {
|
119
|
+
return;
|
120
|
+
}
|
121
|
+
let test = path.get('test');
|
122
|
+
// the place we want is the only if with a computed member
|
123
|
+
// expression predicate.
|
124
|
+
if (test.isMemberExpression() && test.node.computed) {
|
125
|
+
path.node.alternate = core_1.types.ifStatement(core_1.types.memberExpression(core_1.types.identifier('ast'), core_1.types.identifier('selfClosing')), core_1.types.blockStatement([
|
126
|
+
core_1.types.expressionStatement(core_1.types.callExpression(core_1.types.memberExpression(core_1.types.identifier('output'), core_1.types.identifier('push')), [
|
127
|
+
core_1.types.stringLiteral(' />'),
|
128
|
+
])),
|
129
|
+
]), path.node.alternate);
|
130
|
+
}
|
131
|
+
},
|
132
|
+
},
|
133
|
+
};
|
134
|
+
},
|
135
|
+
],
|
136
|
+
}).code;
|
137
|
+
}
|
138
|
+
else {
|
139
|
+
// applies to < 3.12 and >= 3.17
|
140
|
+
//
|
141
|
+
// here we are stripping off the first `var Ember;`. That one small change
|
142
|
+
// lets us crack open the file and get access to its internal loader, because
|
143
|
+
// we can give it our own predefined `Ember` variable instead, which it will
|
144
|
+
// use and put `Ember.__loader` onto.
|
145
|
+
patchedSource = (0, core_1.transform)(source, {
|
146
|
+
generatorOpts: {
|
147
|
+
compact: true,
|
148
|
+
},
|
149
|
+
plugins: [
|
150
|
+
function () {
|
151
|
+
return {
|
152
|
+
visitor: {
|
153
|
+
VariableDeclarator(path) {
|
154
|
+
let id = path.node.id;
|
155
|
+
if (id.type === 'Identifier' && id.name === 'Ember' && !replacedVar) {
|
156
|
+
replacedVar = true;
|
157
|
+
path.remove();
|
158
|
+
}
|
159
|
+
},
|
160
|
+
},
|
161
|
+
};
|
162
|
+
},
|
163
|
+
],
|
164
|
+
}).code;
|
165
|
+
}
|
166
|
+
if (!replacedVar) {
|
167
|
+
throw new Error(`didn't find expected source in ${templateCompilerPath}. Maybe we don't support your ember-source version?`);
|
168
|
+
}
|
169
|
+
return `
|
170
|
+
let Ember = {};
|
171
|
+
${patchedSource};
|
172
|
+
module.exports.Ember = Ember;
|
173
|
+
`;
|
174
|
+
}
|
175
|
+
exports.patch = patch;
|
176
|
+
//# sourceMappingURL=patch-template-compiler.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"patch-template-compiler.js","sourceRoot":"","sources":["patch-template-compiler.ts"],"names":[],"mappings":"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","sourcesContent":["import { NodePath } from '@babel/traverse';\nimport { transform, types as t } from '@babel/core';\n\nfunction parseVersion(templateCompilerPath: string, source: string): { major: number; minor: number; patch: number } {\n // ember-template-compiler.js contains a comment that indicates what version it is for\n // that looks like:\n\n /*!\n * @overview Ember - JavaScript Application Framework\n * @copyright Copyright 2011-2020 Tilde Inc. and contributors\n * Portions Copyright 2006-2011 Strobe Inc.\n * Portions Copyright 2008-2011 Apple Inc. All rights reserved.\n * @license Licensed under MIT license\n * See https://raw.github.com/emberjs/ember.js/master/LICENSE\n * @version 3.25.1\n */\n\n let version = source.match(/@version\\s+([\\d\\.]+)/);\n if (!version || !version[1]) {\n throw new Error(\n `Could not find version string in \\`${templateCompilerPath}\\`. Maybe we don't support your ember-source version?`\n );\n }\n\n let numbers = version[1].split('.');\n let major = parseInt(numbers[0], 10);\n let minor = parseInt(numbers[1], 10);\n let patch = parseInt(numbers[2], 10);\n\n return { major, minor, patch };\n}\n\nfunction emberVersionGte(templateCompilerPath: string, source: string, major: number, minor: number): boolean {\n let actual = parseVersion(templateCompilerPath, source);\n\n return actual.major > major || (actual.major === major && actual.minor >= minor);\n}\n\nexport function patch(source: string, templateCompilerPath: string): string {\n let version = parseVersion(templateCompilerPath, source);\n\n if (\n emberVersionGte(templateCompilerPath, source, 3, 26) ||\n (version.major === 3 && version.minor === 25 && version.patch >= 2) ||\n (version.major === 3 && version.minor === 24 && version.patch >= 3)\n ) {\n // no modifications are needed after\n // https://github.com/emberjs/ember.js/pull/19426 and backported to\n // 3.26.0-beta.3, 3.25.2, 3.24.3\n return source;\n }\n\n let replacedVar = false;\n let patchedSource;\n\n let needsAngleBracketPrinterFix =\n emberVersionGte(templateCompilerPath, source, 3, 12) && !emberVersionGte(templateCompilerPath, source, 3, 17);\n\n if (needsAngleBracketPrinterFix) {\n // here we are stripping off the first `var Ember;`. That one small change\n // lets us crack open the file and get access to its internal loader, because\n // we can give it our own predefined `Ember` variable instead, which it will\n // use and put `Ember.__loader` onto.\n //\n // on ember 3.12 through 3.16 (which use variants of glimmer-vm 0.38.5) we\n // also apply a patch to the printer in @glimmer/syntax to fix\n // https://github.com/glimmerjs/glimmer-vm/pull/941/files because it can\n // really bork apps under embroider, and we'd like to support at least all\n // active LTS versions of ember.\n patchedSource = transform(source, {\n plugins: [\n function () {\n return {\n visitor: {\n VariableDeclarator(path: NodePath<t.VariableDeclarator>) {\n let id = path.node.id;\n if (id.type === 'Identifier' && id.name === 'Ember' && !replacedVar) {\n replacedVar = true;\n path.remove();\n }\n },\n CallExpression: {\n enter(path: NodePath<t.CallExpression>, state: BabelState) {\n let callee = path.get('callee');\n if (!callee.isIdentifier() || callee.node.name !== 'define') {\n return;\n }\n let firstArg = path.get('arguments')[0];\n if (!firstArg.isStringLiteral() || firstArg.node.value !== '@glimmer/syntax') {\n return;\n }\n state.definingGlimmerSyntax = path;\n },\n exit(path: NodePath<t.CallExpression>, state: BabelState) {\n if (state.definingGlimmerSyntax === path) {\n state.definingGlimmerSyntax = false;\n }\n },\n },\n FunctionDeclaration: {\n enter(path: NodePath<t.FunctionDeclaration>, state: BabelState) {\n if (!state.definingGlimmerSyntax) {\n return;\n }\n let id = path.get('id');\n if (id.isIdentifier() && id.node.name === 'build') {\n state.declaringBuildFunction = path;\n }\n },\n exit(path: NodePath<t.FunctionDeclaration>, state: BabelState) {\n if (state.declaringBuildFunction === path) {\n state.declaringBuildFunction = false;\n }\n },\n },\n SwitchCase: {\n enter(path: NodePath<t.SwitchCase>, state: BabelState) {\n if (!state.definingGlimmerSyntax) {\n return;\n }\n let test = path.get('test');\n if (test.isStringLiteral() && test.node.value === 'ElementNode') {\n state.caseElementNode = path;\n }\n },\n exit(path: NodePath<t.SwitchCase>, state: BabelState) {\n if (state.caseElementNode === path) {\n state.caseElementNode = false;\n }\n },\n },\n IfStatement(path: NodePath<t.IfStatement>, state: BabelState) {\n if (!state.caseElementNode) {\n return;\n }\n let test = path.get('test');\n // the place we want is the only if with a computed member\n // expression predicate.\n if (test.isMemberExpression() && test.node.computed) {\n path.node.alternate = t.ifStatement(\n t.memberExpression(t.identifier('ast'), t.identifier('selfClosing')),\n t.blockStatement([\n t.expressionStatement(\n t.callExpression(t.memberExpression(t.identifier('output'), t.identifier('push')), [\n t.stringLiteral(' />'),\n ])\n ),\n ]),\n path.node.alternate\n );\n }\n },\n },\n };\n },\n ],\n })!.code!;\n } else {\n // applies to < 3.12 and >= 3.17\n //\n // here we are stripping off the first `var Ember;`. That one small change\n // lets us crack open the file and get access to its internal loader, because\n // we can give it our own predefined `Ember` variable instead, which it will\n // use and put `Ember.__loader` onto.\n patchedSource = transform(source, {\n generatorOpts: {\n compact: true,\n },\n plugins: [\n function () {\n return {\n visitor: {\n VariableDeclarator(path: NodePath<t.VariableDeclarator>) {\n let id = path.node.id;\n if (id.type === 'Identifier' && id.name === 'Ember' && !replacedVar) {\n replacedVar = true;\n path.remove();\n }\n },\n },\n };\n },\n ],\n })!.code!;\n }\n\n if (!replacedVar) {\n throw new Error(\n `didn't find expected source in ${templateCompilerPath}. Maybe we don't support your ember-source version?`\n );\n }\n\n return `\n let Ember = {};\n ${patchedSource};\n module.exports.Ember = Ember;\n `;\n}\n\ninterface BabelState {\n definingGlimmerSyntax: NodePath | false;\n declaringBuildFunction: NodePath | false;\n caseElementNode: NodePath | false;\n}\n"]}
|
@@ -0,0 +1,53 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
|
+
};
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
6
|
+
exports.resolverPlugin = void 0;
|
7
|
+
const unplugin_1 = require("unplugin");
|
8
|
+
const module_resolver_1 = require("./module-resolver");
|
9
|
+
const assert_never_1 = __importDefault(require("assert-never"));
|
10
|
+
exports.resolverPlugin = (0, unplugin_1.createUnplugin)((resolverOptions) => {
|
11
|
+
return {
|
12
|
+
name: 'unplugin-embroider-resolver',
|
13
|
+
async resolveId(id, importer, _options) {
|
14
|
+
if (!importer) {
|
15
|
+
return null;
|
16
|
+
}
|
17
|
+
let resolution = resolverFor(importer, resolverOptions).resolve(id);
|
18
|
+
switch (resolution.result) {
|
19
|
+
case 'external':
|
20
|
+
// according to the docs we should be allowed to return `{ external:
|
21
|
+
// true, id: resolution.specifier }` here and that would take care of
|
22
|
+
// externalizing. But due to https://github.com/unjs/unplugin/issues/238
|
23
|
+
// that doesn't work, so we will generate our own runtime stubs via the
|
24
|
+
// load hook below.
|
25
|
+
return `@embroider/externals/${resolution.specifier}`;
|
26
|
+
case 'continue':
|
27
|
+
// null is the "defer to other plugins and default resolution" outcome
|
28
|
+
return null;
|
29
|
+
case 'redirect-to':
|
30
|
+
return null;
|
31
|
+
default:
|
32
|
+
throw (0, assert_never_1.default)(resolution);
|
33
|
+
}
|
34
|
+
},
|
35
|
+
async load(id) {
|
36
|
+
if (id.startsWith('@embroider/externals/')) {
|
37
|
+
let moduleName = id.slice('@embroider/externals/'.length);
|
38
|
+
return (0, module_resolver_1.externalShim)({ moduleName });
|
39
|
+
}
|
40
|
+
},
|
41
|
+
};
|
42
|
+
});
|
43
|
+
let prev;
|
44
|
+
function resolverFor(importer, resolverOptions) {
|
45
|
+
// as a very simple cache, reuse the same Resolver if we're still working
|
46
|
+
// from the same importer as the last call. We'd expect that is a common
|
47
|
+
// case, and we can avoid re-discovering things like the owning package of
|
48
|
+
// the importer.
|
49
|
+
let resolver = (prev === null || prev === void 0 ? void 0 : prev.importer) === importer ? prev.resolver : new module_resolver_1.Resolver(importer, resolverOptions);
|
50
|
+
prev = { importer, resolver };
|
51
|
+
return resolver;
|
52
|
+
}
|
53
|
+
//# sourceMappingURL=resolver-plugin.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"resolver-plugin.js","sourceRoot":"","sources":["resolver-plugin.ts"],"names":[],"mappings":";;;;;;AAAA,uCAA0C;AAC1C,uDAA6F;AAC7F,gEAAuC;AAI1B,QAAA,cAAc,GAAG,IAAA,yBAAc,EAAC,CAAC,eAAsC,EAAE,EAAE;IACtF,OAAO;QACL,IAAI,EAAE,6BAA6B;QACnC,KAAK,CAAC,SAAS,CACb,EAAU,EACV,QAA4B,EAC5B,QAEC;YAED,IAAI,CAAC,QAAQ,EAAE;gBACb,OAAO,IAAI,CAAC;aACb;YAED,IAAI,UAAU,GAAG,WAAW,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAEpE,QAAQ,UAAU,CAAC,MAAM,EAAE;gBACzB,KAAK,UAAU;oBACb,oEAAoE;oBACpE,qEAAqE;oBACrE,wEAAwE;oBACxE,uEAAuE;oBACvE,mBAAmB;oBACnB,OAAO,wBAAwB,UAAU,CAAC,SAAS,EAAE,CAAC;gBACxD,KAAK,UAAU;oBACb,sEAAsE;oBACtE,OAAO,IAAI,CAAC;gBACd,KAAK,aAAa;oBAChB,OAAO,IAAI,CAAC;gBACd;oBACE,MAAM,IAAA,sBAAW,EAAC,UAAU,CAAC,CAAC;aACjC;QACH,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAU;YACnB,IAAI,EAAE,CAAC,UAAU,CAAC,uBAAuB,CAAC,EAAE;gBAC1C,IAAI,UAAU,GAAG,EAAE,CAAC,KAAK,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAC;gBAC1D,OAAO,IAAA,8BAAY,EAAC,EAAE,UAAU,EAAE,CAAC,CAAC;aACrC;QACH,CAAC;KACF,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,IAAI,IAKS,CAAC;AAEd,SAAS,WAAW,CAAC,QAAgB,EAAE,eAAsC;IAC3E,yEAAyE;IACzE,wEAAwE;IACxE,0EAA0E;IAC1E,gBAAgB;IAChB,IAAI,QAAQ,GAAG,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,QAAQ,MAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,0BAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;IACrG,IAAI,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;IAC9B,OAAO,QAAQ,CAAC;AAClB,CAAC","sourcesContent":["import { createUnplugin } from 'unplugin';\nimport { externalShim, Options as ResolverPluginOptions, Resolver } from './module-resolver';\nimport assertNever from 'assert-never';\n\nexport { ResolverPluginOptions };\n\nexport const resolverPlugin = createUnplugin((resolverOptions: ResolverPluginOptions) => {\n return {\n name: 'unplugin-embroider-resolver',\n async resolveId(\n id: string,\n importer: string | undefined,\n _options: {\n isEntry: boolean;\n }\n ) {\n if (!importer) {\n return null;\n }\n\n let resolution = resolverFor(importer, resolverOptions).resolve(id);\n\n switch (resolution.result) {\n case 'external':\n // according to the docs we should be allowed to return `{ external:\n // true, id: resolution.specifier }` here and that would take care of\n // externalizing. But due to https://github.com/unjs/unplugin/issues/238\n // that doesn't work, so we will generate our own runtime stubs via the\n // load hook below.\n return `@embroider/externals/${resolution.specifier}`;\n case 'continue':\n // null is the \"defer to other plugins and default resolution\" outcome\n return null;\n case 'redirect-to':\n return null;\n default:\n throw assertNever(resolution);\n }\n },\n async load(id: string) {\n if (id.startsWith('@embroider/externals/')) {\n let moduleName = id.slice('@embroider/externals/'.length);\n return externalShim({ moduleName });\n }\n },\n };\n});\n\nlet prev:\n | {\n importer: string;\n resolver: Resolver;\n }\n | undefined;\n\nfunction resolverFor(importer: string, resolverOptions: ResolverPluginOptions): Resolver {\n // as a very simple cache, reuse the same Resolver if we're still working\n // from the same importer as the last call. We'd expect that is a common\n // case, and we can avoid re-discovering things like the owning package of\n // the importer.\n let resolver = prev?.importer === importer ? prev.resolver : new Resolver(importer, resolverOptions);\n prev = { importer, resolver };\n return resolver;\n}\n"]}
|
@@ -0,0 +1,14 @@
|
|
1
|
+
import type { TemplateCompiler } from './template-compiler-common';
|
2
|
+
import { Options } from './babel-plugin-adjust-imports';
|
3
|
+
export interface ResolvedDep {
|
4
|
+
runtimeName: string;
|
5
|
+
path: string;
|
6
|
+
absPath: string;
|
7
|
+
}
|
8
|
+
export interface Resolver {
|
9
|
+
astTransformer(templateCompiler: TemplateCompiler): unknown;
|
10
|
+
dependenciesOf(moduleName: string): ResolvedDep[];
|
11
|
+
absPathToRuntimePath(absPath: string): string;
|
12
|
+
absPathToRuntimeName(absPath: string): string;
|
13
|
+
adjustImportsOptions: Options;
|
14
|
+
}
|
package/src/resolver.js
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"resolver.js","sourceRoot":"","sources":["resolver.ts"],"names":[],"mappings":"","sourcesContent":["import type { TemplateCompiler } from './template-compiler-common';\nimport { Options } from './babel-plugin-adjust-imports';\n\nexport interface ResolvedDep {\n runtimeName: string;\n path: string;\n absPath: string;\n}\n\nexport interface Resolver {\n astTransformer(templateCompiler: TemplateCompiler): unknown;\n dependenciesOf(moduleName: string): ResolvedDep[];\n\n // this takes an absolute path to a file and gives back a path like\n // \"the-package-name/path/to/the-file.js\", while taking into account any\n // backward-compatible runtime name of the package. It's used by the template\n // compiler, because this is the kind of path AST plugins expect to see.\n absPathToRuntimePath(absPath: string): string;\n\n // this takes an absolute path to a file and gives back the runtime name of\n // that module, as it would tradtionally be named within loader.js.\n absPathToRuntimeName(absPath: string): string;\n\n adjustImportsOptions: Options;\n}\n"]}
|