@embroider/vite 0.2.1 → 0.2.2-unstable.aaeb674
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/index.d.ts +4 -1
- package/index.mjs +4 -1
- package/package.json +25 -11
- package/src/assets.d.ts +2 -0
- package/src/assets.js +87 -0
- package/src/assets.js.map +1 -0
- package/src/build.d.ts +3 -0
- package/src/build.js +60 -0
- package/src/build.js.map +1 -0
- package/src/content-for.d.ts +2 -0
- package/src/content-for.js +19 -0
- package/src/content-for.js.map +1 -0
- package/src/esbuild-request.d.ts +30 -0
- package/src/esbuild-request.js +162 -0
- package/src/esbuild-request.js.map +1 -0
- package/src/esbuild-resolver.d.ts +2 -0
- package/src/esbuild-resolver.js +150 -0
- package/src/esbuild-resolver.js.map +1 -0
- package/src/hbs.js +62 -89
- package/src/hbs.js.map +1 -1
- package/src/optimize-deps.js +6 -4
- package/src/optimize-deps.js.map +1 -1
- package/src/request.d.ts +14 -2
- package/src/request.js +74 -18
- package/src/request.js.map +1 -1
- package/src/resolver.js +145 -41
- package/src/resolver.js.map +1 -1
- package/src/scripts.js +17 -37
- package/src/scripts.js.map +1 -1
- package/src/template-tag.js +7 -37
- package/src/template-tag.js.map +1 -1
- package/src/addons.d.ts +0 -1
- package/src/addons.js +0 -23
- package/src/addons.js.map +0 -1
package/src/resolver.js
CHANGED
|
@@ -1,65 +1,169 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
};
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
const
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
1
|
+
import core from '@embroider/core';
|
|
2
|
+
const { virtualContent, ResolverLoader, explicitRelative, cleanUrl, tmpdir } = core;
|
|
3
|
+
import { RollupModuleRequest, virtualPrefix } from './request.js';
|
|
4
|
+
import { assertNever } from 'assert-never';
|
|
5
|
+
import makeDebug from 'debug';
|
|
6
|
+
import { resolve, join } from 'path';
|
|
7
|
+
import { writeStatus } from './esbuild-request.js';
|
|
8
|
+
import { externalName } from '@embroider/reverse-exports';
|
|
9
|
+
import fs from 'fs-extra';
|
|
10
|
+
import { createHash } from 'crypto';
|
|
11
|
+
const { ensureSymlinkSync, outputJSONSync } = fs;
|
|
12
|
+
const debug = makeDebug('embroider:vite');
|
|
13
|
+
export function resolver() {
|
|
14
|
+
const resolverLoader = new ResolverLoader(process.cwd());
|
|
15
|
+
let server;
|
|
16
|
+
const virtualDeps = new Map();
|
|
17
|
+
const notViteDeps = new Set();
|
|
15
18
|
return {
|
|
16
19
|
name: 'embroider-resolver',
|
|
17
20
|
enforce: 'pre',
|
|
21
|
+
configureServer(s) {
|
|
22
|
+
server = s;
|
|
23
|
+
server.watcher.on('all', (_eventName, path) => {
|
|
24
|
+
for (let [id, watches] of virtualDeps) {
|
|
25
|
+
for (let watch of watches) {
|
|
26
|
+
if (path.startsWith(watch)) {
|
|
27
|
+
debug('Invalidate %s because %s', id, path);
|
|
28
|
+
server.moduleGraph.onFileChange(id);
|
|
29
|
+
let m = server.moduleGraph.getModuleById(id);
|
|
30
|
+
if (m) {
|
|
31
|
+
server.reloadModule(m);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
},
|
|
18
38
|
async resolveId(source, importer, options) {
|
|
19
|
-
|
|
39
|
+
var _a;
|
|
40
|
+
if ((_a = options.custom) === null || _a === void 0 ? void 0 : _a.depScan) {
|
|
41
|
+
return await observeDepScan(this, source, importer, options);
|
|
42
|
+
}
|
|
43
|
+
let request = RollupModuleRequest.from(this, source, importer, options.custom);
|
|
20
44
|
if (!request) {
|
|
21
45
|
// fallthrough to other rollup plugins
|
|
22
46
|
return null;
|
|
23
47
|
}
|
|
24
|
-
let resolution = await resolver.resolve(request
|
|
48
|
+
let resolution = await resolverLoader.resolver.resolve(request);
|
|
25
49
|
switch (resolution.type) {
|
|
26
50
|
case 'found':
|
|
51
|
+
if (resolution.isVirtual) {
|
|
52
|
+
return resolution.result;
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
return await maybeCaptureNewOptimizedDep(this, resolverLoader.resolver, resolution.result, notViteDeps);
|
|
56
|
+
}
|
|
57
|
+
case 'ignored':
|
|
27
58
|
return resolution.result;
|
|
28
59
|
case 'not_found':
|
|
29
60
|
return null;
|
|
30
61
|
default:
|
|
31
|
-
throw (
|
|
62
|
+
throw assertNever(resolution);
|
|
32
63
|
}
|
|
33
64
|
},
|
|
34
65
|
load(id) {
|
|
35
|
-
if (id.startsWith(
|
|
36
|
-
|
|
66
|
+
if (id.startsWith(virtualPrefix)) {
|
|
67
|
+
let { pathname } = new URL(id, 'http://example.com');
|
|
68
|
+
let { src, watches } = virtualContent(pathname.slice(virtualPrefix.length + 1), resolverLoader.resolver);
|
|
69
|
+
virtualDeps.set(id, watches);
|
|
70
|
+
server === null || server === void 0 ? void 0 : server.watcher.add(watches);
|
|
71
|
+
return src;
|
|
37
72
|
}
|
|
38
73
|
},
|
|
74
|
+
buildEnd() {
|
|
75
|
+
this.emitFile({
|
|
76
|
+
type: 'asset',
|
|
77
|
+
fileName: '@embroider/virtual/vendor.js',
|
|
78
|
+
source: virtualContent(resolve(resolverLoader.resolver.options.engines[0].root, '-embroider-vendor.js'), resolverLoader.resolver).src,
|
|
79
|
+
});
|
|
80
|
+
this.emitFile({
|
|
81
|
+
type: 'asset',
|
|
82
|
+
fileName: '@embroider/virtual/test-support.js',
|
|
83
|
+
source: virtualContent(resolve(resolverLoader.resolver.options.engines[0].root, '-embroider-test-support.js'), resolverLoader.resolver).src,
|
|
84
|
+
});
|
|
85
|
+
},
|
|
39
86
|
};
|
|
40
87
|
}
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
88
|
+
// During depscan, we have a wildly different job than during normal
|
|
89
|
+
// usage. Embroider's esbuild resolver plugin replaces this rollup
|
|
90
|
+
// resolver plugin for actually doing resolving, so we don't do any of
|
|
91
|
+
// that. But we are still well-positioned to observe what vite's rollup
|
|
92
|
+
// resolver plugin is doing, and that is important because vite's
|
|
93
|
+
// esbuild depscan plugin will always obscure the results before
|
|
94
|
+
// embroider's esbuild resolver plugin can see them. It obscures the
|
|
95
|
+
// results by marking *both* "not found" and "this is a third-party
|
|
96
|
+
// package" as "external: true". We really care about the difference
|
|
97
|
+
// between the two, since we have fallback behaviors that should apply
|
|
98
|
+
// to "not found" that should not apply to successfully discovered
|
|
99
|
+
// third-party packages.
|
|
100
|
+
async function observeDepScan(context, source, importer, options) {
|
|
101
|
+
let result = await context.resolve(source, importer, {
|
|
102
|
+
...options,
|
|
103
|
+
skipSelf: true,
|
|
104
|
+
});
|
|
105
|
+
writeStatus(source, result ? 'found' : 'not_found');
|
|
106
|
+
return result;
|
|
107
|
+
}
|
|
108
|
+
function idFromResult(result) {
|
|
109
|
+
if (!result) {
|
|
110
|
+
return undefined;
|
|
111
|
+
}
|
|
112
|
+
if (typeof result === 'string') {
|
|
113
|
+
return cleanUrl(result);
|
|
114
|
+
}
|
|
115
|
+
return cleanUrl(result.id);
|
|
116
|
+
}
|
|
117
|
+
function hashed(path) {
|
|
118
|
+
let h = createHash('sha1');
|
|
119
|
+
return h.update(path).digest('hex').slice(0, 8);
|
|
120
|
+
}
|
|
121
|
+
async function maybeCaptureNewOptimizedDep(context, resolver, result, notViteDeps) {
|
|
122
|
+
let foundFile = idFromResult(result);
|
|
123
|
+
if (!foundFile) {
|
|
124
|
+
return result;
|
|
125
|
+
}
|
|
126
|
+
if (foundFile.startsWith(join(resolver.packageCache.appRoot, 'node_modules', '.vite'))) {
|
|
127
|
+
debug('maybeCaptureNewOptimizedDep: %s already in vite deps', foundFile);
|
|
128
|
+
return result;
|
|
129
|
+
}
|
|
130
|
+
let pkg = resolver.packageCache.ownerOfFile(foundFile);
|
|
131
|
+
if (!(pkg === null || pkg === void 0 ? void 0 : pkg.isV2Addon())) {
|
|
132
|
+
debug('maybeCaptureNewOptimizedDep: %s not in v2 addon', foundFile);
|
|
133
|
+
return result;
|
|
134
|
+
}
|
|
135
|
+
let target = externalName(pkg.packageJSON, explicitRelative(pkg.root, foundFile));
|
|
136
|
+
if (!target) {
|
|
137
|
+
debug('maybeCaptureNewOptimizedDep: %s is not exported', foundFile);
|
|
138
|
+
return result;
|
|
139
|
+
}
|
|
140
|
+
if (notViteDeps.has(foundFile)) {
|
|
141
|
+
debug('maybeCaptureNewOptimizedDep: already attmpted %s', foundFile);
|
|
142
|
+
return result;
|
|
143
|
+
}
|
|
144
|
+
debug('maybeCaptureNewOptimizedDep: doing re-resolve for %s ', foundFile);
|
|
145
|
+
let jumpRoot = join(tmpdir, 'embroider-vite-jump', hashed(pkg.root));
|
|
146
|
+
let fromFile = join(jumpRoot, 'package.json');
|
|
147
|
+
outputJSONSync(fromFile, {
|
|
148
|
+
name: 'jump-root',
|
|
149
|
+
});
|
|
150
|
+
ensureSymlinkSync(pkg.root, join(jumpRoot, 'node_modules', pkg.name));
|
|
151
|
+
let newResult = await context.resolve(target, fromFile);
|
|
152
|
+
if (newResult) {
|
|
153
|
+
if (idFromResult(newResult) === foundFile) {
|
|
154
|
+
// This case is normal. For example, people could be using
|
|
155
|
+
// `optimizeDeps.exclude` or they might be working in a monorepo where an
|
|
156
|
+
// addon is not in node_modules. In both cases vite will decide not to
|
|
157
|
+
// optimize the file, even though we gave it a chance to.
|
|
158
|
+
//
|
|
159
|
+
// We cache that result so we don't keep trying.
|
|
160
|
+
debug('maybeCaptureNewOptimizedDep: %s did not become an optimized dep', foundFile);
|
|
161
|
+
notViteDeps.add(foundFile);
|
|
62
162
|
}
|
|
63
|
-
|
|
163
|
+
return newResult;
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
return result;
|
|
167
|
+
}
|
|
64
168
|
}
|
|
65
169
|
//# sourceMappingURL=resolver.js.map
|
package/src/resolver.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolver.js","sourceRoot":"","sources":["resolver.ts"],"names":[],"mappings":";;;;;AASA,4BA6BC;AApCD,+BAA4B;AAE5B,0CAAsF;AACtF,uCAAwC;AACxC,uCAA+D;AAC/D,gEAAuC;AAEvC,SAAgB,QAAQ;IACtB,IAAI,eAAe,GAAoB,IAAA,uBAAY,EAAC,IAAA,WAAI,EAAC,IAAA,gCAAyB,EAAC,OAAO,CAAC,GAAG,EAAE,CAAC,EAAE,eAAe,CAAC,CAAC,CAAC;IACrH,IAAI,QAAQ,GAAG,IAAI,eAAQ,CAAC,eAAe,CAAC,CAAC;IAE7C,OAAO;QACL,IAAI,EAAE,oBAAoB;QAC1B,OAAO,EAAE,KAAK;QACd,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO;YACvC,IAAI,OAAO,GAAG,6BAAmB,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;YACzE,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,sCAAsC;gBACtC,OAAO,IAAI,CAAC;YACd,CAAC;YACD,IAAI,UAAU,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC;YACvE,QAAQ,UAAU,CAAC,IAAI,EAAE,CAAC;gBACxB,KAAK,OAAO;oBACV,OAAO,UAAU,CAAC,MAAM,CAAC;gBAC3B,KAAK,WAAW;oBACd,OAAO,IAAI,CAAC;gBACd;oBACE,MAAM,IAAA,sBAAW,EAAC,UAAU,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;QACD,IAAI,CAAC,EAAE;YACL,IAAI,EAAE,CAAC,UAAU,CAAC,uBAAa,CAAC,EAAE,CAAC;gBACjC,OAAO,IAAA,qBAAc,EAAC,EAAE,CAAC,KAAK,CAAC,uBAAa,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,CAAC;YAClE,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,OAAsB;IAC5C,OAAO,KAAK,EAAE,OAA4B,EAAE,EAAE;QAC5C,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;YACtB,OAAO;gBACL,IAAI,EAAE,OAAO;gBACb,MAAM,EAAE,EAAE,EAAE,EAAE,OAAO,CAAC,SAAS,EAAE,UAAU,EAAE,OAAO,CAAC,QAAQ,EAAE;aAChE,CAAC;QACJ,CAAC;QACD,IAAI,MAAM,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,QAAQ,EAAE;YACtE,QAAQ,EAAE,IAAI;YACd,MAAM,EAAE;gBACN,SAAS,EAAE;oBACT,IAAI,EAAE,OAAO,CAAC,IAAI;iBACnB;aACF;SACF,CAAC,CAAC;QACH,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QACnC,CAAC;aAAM,CAAC;YACN,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC;QAC/C,CAAC;IACH,CAAC,CAAC;AACJ,CAAC","sourcesContent":["import type { PluginContext, ResolveIdResult } from 'rollup';\nimport type { Plugin } from 'vite';\nimport { join } from 'path';\nimport type { Resolution, ResolverFunction, ResolverOptions } from '@embroider/core';\nimport { Resolver, locateEmbroiderWorkingDir, virtualContent } from '@embroider/core';\nimport { readJSONSync } from 'fs-extra';\nimport { RollupModuleRequest, virtualPrefix } from './request';\nimport assertNever from 'assert-never';\n\nexport function resolver(): Plugin {\n let resolverOptions: ResolverOptions = readJSONSync(join(locateEmbroiderWorkingDir(process.cwd()), 'resolver.json'));\n let resolver = new Resolver(resolverOptions);\n\n return {\n name: 'embroider-resolver',\n enforce: 'pre',\n async resolveId(source, importer, options) {\n let request = RollupModuleRequest.from(source, importer, options.custom);\n if (!request) {\n // fallthrough to other rollup plugins\n return null;\n }\n let resolution = await resolver.resolve(request, defaultResolve(this));\n switch (resolution.type) {\n case 'found':\n return resolution.result;\n case 'not_found':\n return null;\n default:\n throw assertNever(resolution);\n }\n },\n load(id) {\n if (id.startsWith(virtualPrefix)) {\n return virtualContent(id.slice(virtualPrefix.length), resolver);\n }\n },\n };\n}\n\nfunction defaultResolve(context: PluginContext): ResolverFunction<RollupModuleRequest, Resolution<ResolveIdResult>> {\n return async (request: RollupModuleRequest) => {\n if (request.isVirtual) {\n return {\n type: 'found',\n result: { id: request.specifier, resolvedBy: request.fromFile },\n };\n }\n let result = await context.resolve(request.specifier, request.fromFile, {\n skipSelf: true,\n custom: {\n embroider: {\n meta: request.meta,\n },\n },\n });\n if (result) {\n return { type: 'found', result };\n } else {\n return { type: 'not_found', err: undefined };\n }\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"resolver.js","sourceRoot":"","sources":["resolver.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Plugin, ViteDevServer } from 'vite';\nimport core, { type Resolver } from '@embroider/core';\nconst { virtualContent, ResolverLoader, explicitRelative, cleanUrl, tmpdir } = core;\nimport { RollupModuleRequest, virtualPrefix } from './request.js';\nimport { assertNever } from 'assert-never';\nimport makeDebug from 'debug';\nimport { resolve, join } from 'path';\nimport { writeStatus } from './esbuild-request.js';\nimport type { PluginContext, ResolveIdResult } from 'rollup';\nimport { externalName } from '@embroider/reverse-exports';\nimport fs from 'fs-extra';\nimport { createHash } from 'crypto';\n\nconst { ensureSymlinkSync, outputJSONSync } = fs;\n\nconst debug = makeDebug('embroider:vite');\n\nexport function resolver(): Plugin {\n const resolverLoader = new ResolverLoader(process.cwd());\n let server: ViteDevServer;\n const virtualDeps: Map<string, string[]> = new Map();\n const notViteDeps = new Set<string>();\n\n return {\n name: 'embroider-resolver',\n enforce: 'pre',\n\n configureServer(s) {\n server = s;\n server.watcher.on('all', (_eventName, path) => {\n for (let [id, watches] of virtualDeps) {\n for (let watch of watches) {\n if (path.startsWith(watch)) {\n debug('Invalidate %s because %s', id, path);\n server.moduleGraph.onFileChange(id);\n let m = server.moduleGraph.getModuleById(id);\n if (m) {\n server.reloadModule(m);\n }\n }\n }\n }\n });\n },\n\n async resolveId(source, importer, options) {\n if (options.custom?.depScan) {\n return await observeDepScan(this, source, importer, options);\n }\n\n let request = RollupModuleRequest.from(this, source, importer, options.custom);\n if (!request) {\n // fallthrough to other rollup plugins\n return null;\n }\n let resolution = await resolverLoader.resolver.resolve(request);\n switch (resolution.type) {\n case 'found':\n if (resolution.isVirtual) {\n return resolution.result;\n } else {\n return await maybeCaptureNewOptimizedDep(this, resolverLoader.resolver, resolution.result, notViteDeps);\n }\n case 'ignored':\n return resolution.result;\n case 'not_found':\n return null;\n default:\n throw assertNever(resolution);\n }\n },\n load(id) {\n if (id.startsWith(virtualPrefix)) {\n let { pathname } = new URL(id, 'http://example.com');\n let { src, watches } = virtualContent(pathname.slice(virtualPrefix.length + 1), resolverLoader.resolver);\n virtualDeps.set(id, watches);\n server?.watcher.add(watches);\n return src;\n }\n },\n buildEnd() {\n this.emitFile({\n type: 'asset',\n fileName: '@embroider/virtual/vendor.js',\n source: virtualContent(\n resolve(resolverLoader.resolver.options.engines[0].root, '-embroider-vendor.js'),\n resolverLoader.resolver\n ).src,\n });\n this.emitFile({\n type: 'asset',\n fileName: '@embroider/virtual/test-support.js',\n source: virtualContent(\n resolve(resolverLoader.resolver.options.engines[0].root, '-embroider-test-support.js'),\n resolverLoader.resolver\n ).src,\n });\n },\n };\n}\n\n// During depscan, we have a wildly different job than during normal\n// usage. Embroider's esbuild resolver plugin replaces this rollup\n// resolver plugin for actually doing resolving, so we don't do any of\n// that. But we are still well-positioned to observe what vite's rollup\n// resolver plugin is doing, and that is important because vite's\n// esbuild depscan plugin will always obscure the results before\n// embroider's esbuild resolver plugin can see them. It obscures the\n// results by marking *both* \"not found\" and \"this is a third-party\n// package\" as \"external: true\". We really care about the difference\n// between the two, since we have fallback behaviors that should apply\n// to \"not found\" that should not apply to successfully discovered\n// third-party packages.\nasync function observeDepScan(context: PluginContext, source: string, importer: string | undefined, options: any) {\n let result = await context.resolve(source, importer, {\n ...options,\n skipSelf: true,\n });\n writeStatus(source, result ? 'found' : 'not_found');\n return result;\n}\n\nfunction idFromResult(result: ResolveIdResult): string | undefined {\n if (!result) {\n return undefined;\n }\n if (typeof result === 'string') {\n return cleanUrl(result);\n }\n return cleanUrl(result.id);\n}\n\nfunction hashed(path: string): string {\n let h = createHash('sha1');\n return h.update(path).digest('hex').slice(0, 8);\n}\n\nasync function maybeCaptureNewOptimizedDep(\n context: PluginContext,\n resolver: Resolver,\n result: ResolveIdResult,\n notViteDeps: Set<string>\n): Promise<ResolveIdResult> {\n let foundFile = idFromResult(result);\n if (!foundFile) {\n return result;\n }\n if (foundFile.startsWith(join(resolver.packageCache.appRoot, 'node_modules', '.vite'))) {\n debug('maybeCaptureNewOptimizedDep: %s already in vite deps', foundFile);\n return result;\n }\n let pkg = resolver.packageCache.ownerOfFile(foundFile);\n if (!pkg?.isV2Addon()) {\n debug('maybeCaptureNewOptimizedDep: %s not in v2 addon', foundFile);\n return result;\n }\n let target = externalName(pkg.packageJSON, explicitRelative(pkg.root, foundFile));\n if (!target) {\n debug('maybeCaptureNewOptimizedDep: %s is not exported', foundFile);\n return result;\n }\n\n if (notViteDeps.has(foundFile)) {\n debug('maybeCaptureNewOptimizedDep: already attmpted %s', foundFile);\n return result;\n }\n\n debug('maybeCaptureNewOptimizedDep: doing re-resolve for %s ', foundFile);\n\n let jumpRoot = join(tmpdir, 'embroider-vite-jump', hashed(pkg.root));\n let fromFile = join(jumpRoot, 'package.json');\n outputJSONSync(fromFile, {\n name: 'jump-root',\n });\n ensureSymlinkSync(pkg.root, join(jumpRoot, 'node_modules', pkg.name));\n let newResult = await context.resolve(target, fromFile);\n if (newResult) {\n if (idFromResult(newResult) === foundFile) {\n // This case is normal. For example, people could be using\n // `optimizeDeps.exclude` or they might be working in a monorepo where an\n // addon is not in node_modules. In both cases vite will decide not to\n // optimize the file, even though we gave it a chance to.\n //\n // We cache that result so we don't keep trying.\n debug('maybeCaptureNewOptimizedDep: %s did not become an optimized dep', foundFile);\n notViteDeps.add(foundFile);\n }\n\n return newResult;\n } else {\n return result;\n }\n}\n"]}
|
package/src/scripts.js
CHANGED
|
@@ -1,34 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
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
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
-
if (mod && mod.__esModule) return mod;
|
|
20
|
-
var result = {};
|
|
21
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
-
__setModuleDefault(result, mod);
|
|
23
|
-
return result;
|
|
24
|
-
};
|
|
25
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
-
exports.scripts = scripts;
|
|
27
|
-
const jsdom_1 = require("jsdom");
|
|
28
|
-
const fs_extra_1 = require("fs-extra");
|
|
29
|
-
const path_1 = require("path");
|
|
1
|
+
import { JSDOM } from 'jsdom';
|
|
2
|
+
import fs from 'fs-extra';
|
|
3
|
+
const { readFileSync, readJSONSync, existsSync } = fs;
|
|
4
|
+
import { dirname, posix, resolve } from 'path';
|
|
30
5
|
const defaults = ['/assets/vendor.js', '/assets/test-support.js'];
|
|
31
|
-
function scripts(params) {
|
|
6
|
+
export function scripts(params) {
|
|
32
7
|
var _a;
|
|
33
8
|
let optimizer;
|
|
34
9
|
// configured names are always interpreted as origin-absolute URLs.
|
|
@@ -71,19 +46,24 @@ class ScriptOptimizer {
|
|
|
71
46
|
this.emitted = new Map();
|
|
72
47
|
}
|
|
73
48
|
async optimizedScript(script) {
|
|
49
|
+
let fullName = resolve(this.rootDir, script.slice(1));
|
|
50
|
+
if (!existsSync(fullName)) {
|
|
51
|
+
// in prod builds, test-support.js isn't going to exist (for example)
|
|
52
|
+
return [];
|
|
53
|
+
}
|
|
74
54
|
// loading these lazily here so they never load in non-production builds.
|
|
75
55
|
// The node cache will ensures we only load them once.
|
|
76
|
-
const [Terser, srcURL] = await Promise.all([
|
|
77
|
-
let inCode =
|
|
56
|
+
const [Terser, srcURL] = await Promise.all([import('terser'), import('source-map-url')]);
|
|
57
|
+
let inCode = readFileSync(fullName, 'utf8');
|
|
78
58
|
let terserOpts = {};
|
|
79
59
|
let fileRelativeSourceMapURL;
|
|
80
60
|
let appRelativeSourceMapURL;
|
|
81
61
|
if (srcURL.default.existsIn(inCode)) {
|
|
82
62
|
fileRelativeSourceMapURL = srcURL.default.getFrom(inCode);
|
|
83
|
-
appRelativeSourceMapURL =
|
|
63
|
+
appRelativeSourceMapURL = posix.join(dirname(script.slice(1)), fileRelativeSourceMapURL);
|
|
84
64
|
let content;
|
|
85
65
|
try {
|
|
86
|
-
content =
|
|
66
|
+
content = readJSONSync(resolve(this.rootDir, appRelativeSourceMapURL));
|
|
87
67
|
}
|
|
88
68
|
catch (err) {
|
|
89
69
|
// the script refers to a sourcemap that doesn't exist, so we just leave
|
|
@@ -93,7 +73,7 @@ class ScriptOptimizer {
|
|
|
93
73
|
terserOpts.sourceMap = { content, url: fileRelativeSourceMapURL };
|
|
94
74
|
}
|
|
95
75
|
}
|
|
96
|
-
let { code: outCode, map: outMap } = await Terser.
|
|
76
|
+
let { code: outCode, map: outMap } = await Terser.minify(inCode, terserOpts);
|
|
97
77
|
let finalFilename = await this.getFingerprintedFilename(script, outCode);
|
|
98
78
|
let emit = [];
|
|
99
79
|
emit.push({
|
|
@@ -112,7 +92,7 @@ class ScriptOptimizer {
|
|
|
112
92
|
return emit;
|
|
113
93
|
}
|
|
114
94
|
async getFingerprintedFilename(filename, content) {
|
|
115
|
-
let crypto = await
|
|
95
|
+
let crypto = await import('crypto');
|
|
116
96
|
let md5 = crypto.createHash('md5');
|
|
117
97
|
md5.update(content);
|
|
118
98
|
let hash = md5.digest('hex');
|
|
@@ -123,7 +103,7 @@ class ScriptOptimizer {
|
|
|
123
103
|
transformHTML(htmlIn) {
|
|
124
104
|
var _a;
|
|
125
105
|
if (((_a = this.transformState) === null || _a === void 0 ? void 0 : _a.htmlIn) !== htmlIn) {
|
|
126
|
-
let parsed = new
|
|
106
|
+
let parsed = new JSDOM(htmlIn);
|
|
127
107
|
let scriptTags = [...parsed.window.document.querySelectorAll('script')];
|
|
128
108
|
for (let scriptTag of scriptTags) {
|
|
129
109
|
if (scriptTag.type !== 'module') {
|
package/src/scripts.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scripts.js","sourceRoot":"","sources":["scripts.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"scripts.js","sourceRoot":"","sources":["scripts.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Plugin } from 'vite';\nimport type { EmittedFile } from 'rollup';\nimport { JSDOM } from 'jsdom';\nimport fs from 'fs-extra';\nconst { readFileSync, readJSONSync, existsSync } = fs;\nimport { dirname, posix, resolve } from 'path';\n\n// This is a type-only import, so it gets compiled away. At runtime, we load\n// terser lazily so it's only loaded for production builds that use it. Don't\n// add any non-type-only imports here.\nimport type { MinifyOptions } from 'terser';\n\nconst defaults = ['/assets/vendor.js', '/assets/test-support.js'];\n\nexport function scripts(params?: { include?: string[]; exclude?: string[] }): Plugin {\n let optimizer: ScriptOptimizer;\n\n // configured names are always interpreted as origin-absolute URLs.\n let names = (params?.include ?? defaults)\n .filter(name => !params?.exclude?.includes(name))\n .map(name => {\n if (name.startsWith('/')) {\n return name;\n } else {\n return '/' + name;\n }\n });\n\n return {\n name: 'embroider-scripts',\n enforce: 'pre',\n\n configResolved(resolvedConfig) {\n optimizer = new ScriptOptimizer(resolvedConfig.root);\n },\n\n async generateBundle() {\n // this hook only runs in `vite build`\n for (let name of names) {\n for (let file of await optimizer.optimizedScript(name)) {\n this.emitFile(file);\n }\n }\n },\n\n transformIndexHtml(htmlIn, context) {\n // we don't do anything in `vite dev`, we only need to work in `vite\n // build`\n if (!context.server) {\n return optimizer.transformHTML(htmlIn);\n }\n },\n };\n}\n\nclass ScriptOptimizer {\n private emitted = new Map<string, string>();\n private transformState:\n | {\n htmlIn: string;\n htmlOut: string;\n parsed: JSDOM;\n }\n | undefined;\n\n constructor(private rootDir: string) {}\n\n async optimizedScript(script: string): Promise<EmittedFile[]> {\n let fullName = resolve(this.rootDir, script.slice(1));\n if (!existsSync(fullName)) {\n // in prod builds, test-support.js isn't going to exist (for example)\n return [];\n }\n\n // loading these lazily here so they never load in non-production builds.\n // The node cache will ensures we only load them once.\n const [Terser, srcURL] = await Promise.all([import('terser'), import('source-map-url')]);\n\n let inCode = readFileSync(fullName, 'utf8');\n let terserOpts: MinifyOptions = {};\n let fileRelativeSourceMapURL;\n let appRelativeSourceMapURL;\n if (srcURL.default.existsIn(inCode)) {\n fileRelativeSourceMapURL = srcURL.default.getFrom(inCode)!;\n appRelativeSourceMapURL = posix.join(dirname(script.slice(1)), fileRelativeSourceMapURL);\n let content;\n try {\n content = readJSONSync(resolve(this.rootDir, appRelativeSourceMapURL));\n } catch (err) {\n // the script refers to a sourcemap that doesn't exist, so we just leave\n // the map out.\n }\n if (content) {\n terserOpts.sourceMap = { content, url: fileRelativeSourceMapURL };\n }\n }\n let { code: outCode, map: outMap } = await Terser.minify(inCode, terserOpts);\n let finalFilename = await this.getFingerprintedFilename(script, outCode!);\n let emit: EmittedFile[] = [];\n emit.push({\n type: 'asset',\n fileName: finalFilename.slice(1),\n source: outCode!,\n });\n this.emitted.set(script, finalFilename);\n if (appRelativeSourceMapURL && outMap) {\n emit.push({\n type: 'asset',\n fileName: appRelativeSourceMapURL,\n source: JSON.stringify(outMap, null, 2),\n });\n }\n return emit;\n }\n\n async getFingerprintedFilename(filename: string, content: string): Promise<string> {\n let crypto = await import('crypto');\n let md5 = crypto.createHash('md5');\n md5.update(content);\n let hash = md5.digest('hex');\n let fileParts = filename.split('.');\n fileParts.splice(fileParts.length - 1, 0, hash);\n return fileParts.join('.');\n }\n\n transformHTML(htmlIn: string) {\n if (this.transformState?.htmlIn !== htmlIn) {\n let parsed = new JSDOM(htmlIn);\n let scriptTags = [...parsed.window.document.querySelectorAll('script')] as HTMLScriptElement[];\n for (let scriptTag of scriptTags) {\n if (scriptTag.type !== 'module') {\n let fingerprinted = this.emitted.get(scriptTag.src);\n if (fingerprinted) {\n scriptTag.src = fingerprinted;\n }\n }\n }\n let htmlOut = parsed.serialize();\n this.transformState = { htmlIn, parsed, htmlOut };\n }\n return this.transformState.htmlOut;\n }\n}\n"]}
|
package/src/template-tag.js
CHANGED
|
@@ -1,46 +1,16 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
const content_tag_1 = require("content-tag");
|
|
7
|
-
const gjsFilter = (0, pluginutils_1.createFilter)('**/*.gjs');
|
|
8
|
-
function templateTag({ inline_source_map } = { inline_source_map: false }) {
|
|
9
|
-
let preprocessor = new content_tag_1.Preprocessor();
|
|
10
|
-
function candidates(id) {
|
|
11
|
-
return [id + '.gjs'];
|
|
12
|
-
}
|
|
1
|
+
import { createFilter } from '@rollup/pluginutils';
|
|
2
|
+
import { Preprocessor } from 'content-tag';
|
|
3
|
+
const gjsFilter = createFilter('**/*.{gjs,gts}?(\\?)*');
|
|
4
|
+
export function templateTag({ inline_source_map } = { inline_source_map: false }) {
|
|
5
|
+
let preprocessor = new Preprocessor();
|
|
13
6
|
return {
|
|
14
7
|
name: 'embroider-template-tag',
|
|
15
8
|
enforce: 'pre',
|
|
16
|
-
|
|
17
|
-
let resolution = await this.resolve(id, importer, {
|
|
18
|
-
skipSelf: true,
|
|
19
|
-
});
|
|
20
|
-
if (resolution) {
|
|
21
|
-
return resolution;
|
|
22
|
-
}
|
|
23
|
-
for (let candidate of candidates(id)) {
|
|
24
|
-
resolution = await this.resolve(candidate, importer, {
|
|
25
|
-
skipSelf: true,
|
|
26
|
-
custom: {
|
|
27
|
-
embroider: {
|
|
28
|
-
enableCustomResolver: false,
|
|
29
|
-
},
|
|
30
|
-
},
|
|
31
|
-
});
|
|
32
|
-
if (resolution) {
|
|
33
|
-
return {
|
|
34
|
-
id: resolution.id,
|
|
35
|
-
};
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
},
|
|
39
|
-
load(id) {
|
|
9
|
+
transform(code, id) {
|
|
40
10
|
if (!gjsFilter(id)) {
|
|
41
11
|
return null;
|
|
42
12
|
}
|
|
43
|
-
return preprocessor.process(
|
|
13
|
+
return preprocessor.process(code, {
|
|
44
14
|
filename: id,
|
|
45
15
|
inline_source_map: inline_source_map,
|
|
46
16
|
});
|
package/src/template-tag.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"template-tag.js","sourceRoot":"","sources":["template-tag.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"template-tag.js","sourceRoot":"","sources":["template-tag.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,SAAS,GAAG,YAAY,CAAC,uBAAuB,CAAC,CAAC;AAExD,MAAM,UAAU,WAAW,CAAC,EAAE,iBAAiB,EAAE,GAAG,EAAE,iBAAiB,EAAE,KAAK,EAAE;IAC9E,IAAI,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC;IAEtC,OAAO;QACL,IAAI,EAAE,wBAAwB;QAC9B,OAAO,EAAE,KAAK;QAEd,SAAS,CAAC,IAAY,EAAE,EAAU;YAChC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC;gBACnB,OAAO,IAAI,CAAC;YACd,CAAC;YACD,OAAO,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE;gBAChC,QAAQ,EAAE,EAAE;gBACZ,iBAAiB,EAAE,iBAAiB;aACrC,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC","sourcesContent":["import { createFilter } from '@rollup/pluginutils';\nimport type { Plugin } from 'vite';\nimport { Preprocessor } from 'content-tag';\n\nconst gjsFilter = createFilter('**/*.{gjs,gts}?(\\\\?)*');\n\nexport function templateTag({ inline_source_map } = { inline_source_map: false }): Plugin {\n let preprocessor = new Preprocessor();\n\n return {\n name: 'embroider-template-tag',\n enforce: 'pre',\n\n transform(code: string, id: string) {\n if (!gjsFilter(id)) {\n return null;\n }\n return preprocessor.process(code, {\n filename: id,\n inline_source_map: inline_source_map,\n });\n },\n };\n}\n"]}
|
package/src/addons.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare function addons(root: string): string[];
|
package/src/addons.js
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.addons = addons;
|
|
4
|
-
const core_1 = require("@embroider/core");
|
|
5
|
-
function addons(root) {
|
|
6
|
-
let rloader = new core_1.ResolverLoader(root);
|
|
7
|
-
let { options } = rloader.resolver;
|
|
8
|
-
let names = new Set();
|
|
9
|
-
for (let from of Object.keys(options.renameModules)) {
|
|
10
|
-
let pName = (0, core_1.packageName)(from);
|
|
11
|
-
if (pName) {
|
|
12
|
-
names.add(pName);
|
|
13
|
-
}
|
|
14
|
-
}
|
|
15
|
-
for (let from of Object.keys(options.renamePackages)) {
|
|
16
|
-
names.add(from);
|
|
17
|
-
}
|
|
18
|
-
for (let name of Object.keys(options.activeAddons)) {
|
|
19
|
-
names.add(name);
|
|
20
|
-
}
|
|
21
|
-
return [...names];
|
|
22
|
-
}
|
|
23
|
-
//# sourceMappingURL=addons.js.map
|
package/src/addons.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"addons.js","sourceRoot":"","sources":["addons.ts"],"names":[],"mappings":";;AAEA,wBAiBC;AAnBD,0CAA8D;AAE9D,SAAgB,MAAM,CAAC,IAAY;IACjC,IAAI,OAAO,GAAG,IAAI,qBAAc,CAAC,IAAI,CAAC,CAAC;IACvC,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC;IACnC,IAAI,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAC9B,KAAK,IAAI,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;QACpD,IAAI,KAAK,GAAG,IAAA,kBAAW,EAAC,IAAI,CAAC,CAAC;QAC9B,IAAI,KAAK,EAAE,CAAC;YACV,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;IACD,KAAK,IAAI,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC;QACrD,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAClB,CAAC;IACD,KAAK,IAAI,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;QACnD,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC;AACpB,CAAC","sourcesContent":["import { ResolverLoader, packageName } from '@embroider/core';\n\nexport function addons(root: string): string[] {\n let rloader = new ResolverLoader(root);\n let { options } = rloader.resolver;\n let names = new Set<string>();\n for (let from of Object.keys(options.renameModules)) {\n let pName = packageName(from);\n if (pName) {\n names.add(pName);\n }\n }\n for (let from of Object.keys(options.renamePackages)) {\n names.add(from);\n }\n for (let name of Object.keys(options.activeAddons)) {\n names.add(name);\n }\n return [...names];\n}\n"]}
|