@wyw-in-js/transform 1.0.5 → 1.0.7
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/esm/cache.js +100 -7
- package/esm/cache.js.map +1 -1
- package/esm/debug/fileReporter.js.map +1 -1
- package/esm/module.js +51 -2
- package/esm/module.js.map +1 -1
- package/esm/plugins/shaker.js +152 -13
- package/esm/plugins/shaker.js.map +1 -1
- package/esm/shaker.js +51 -23
- package/esm/shaker.js.map +1 -1
- package/esm/transform/BaseEntrypoint.js +3 -1
- package/esm/transform/BaseEntrypoint.js.map +1 -1
- package/esm/transform/Entrypoint.js +60 -17
- package/esm/transform/Entrypoint.js.map +1 -1
- package/esm/transform/EvaluatedEntrypoint.js.map +1 -1
- package/esm/transform/barrelManifest.js +291 -0
- package/esm/transform/barrelManifest.js.map +1 -0
- package/esm/transform/generators/getExports.js +5 -0
- package/esm/transform/generators/getExports.js.map +1 -1
- package/esm/transform/generators/processEntrypoint.js +27 -1
- package/esm/transform/generators/processEntrypoint.js.map +1 -1
- package/esm/transform/generators/resolveImports.js +29 -5
- package/esm/transform/generators/resolveImports.js.map +1 -1
- package/esm/transform/generators/rewriteBarrelImports.js +733 -0
- package/esm/transform/generators/rewriteBarrelImports.js.map +1 -0
- package/esm/transform/generators/transform.js +154 -21
- package/esm/transform/generators/transform.js.map +1 -1
- package/esm/transform/types.js.map +1 -1
- package/esm/utils/getTagProcessor.js +10 -0
- package/esm/utils/getTagProcessor.js.map +1 -1
- package/esm/utils/removeDangerousCode.js +9 -2
- package/esm/utils/removeDangerousCode.js.map +1 -1
- package/lib/cache.js +103 -7
- package/lib/cache.js.map +1 -1
- package/lib/debug/fileReporter.js.map +1 -1
- package/lib/module.js +51 -2
- package/lib/module.js.map +1 -1
- package/lib/plugins/shaker.js +152 -13
- package/lib/plugins/shaker.js.map +1 -1
- package/lib/shaker.js +58 -26
- package/lib/shaker.js.map +1 -1
- package/lib/transform/BaseEntrypoint.js +3 -1
- package/lib/transform/BaseEntrypoint.js.map +1 -1
- package/lib/transform/Entrypoint.js +61 -17
- package/lib/transform/Entrypoint.js.map +1 -1
- package/lib/transform/EvaluatedEntrypoint.js.map +1 -1
- package/lib/transform/barrelManifest.js +300 -0
- package/lib/transform/barrelManifest.js.map +1 -0
- package/lib/transform/generators/getExports.js +5 -0
- package/lib/transform/generators/getExports.js.map +1 -1
- package/lib/transform/generators/processEntrypoint.js +27 -1
- package/lib/transform/generators/processEntrypoint.js.map +1 -1
- package/lib/transform/generators/resolveImports.js +29 -5
- package/lib/transform/generators/resolveImports.js.map +1 -1
- package/lib/transform/generators/rewriteBarrelImports.js +743 -0
- package/lib/transform/generators/rewriteBarrelImports.js.map +1 -0
- package/lib/transform/generators/transform.js +158 -22
- package/lib/transform/generators/transform.js.map +1 -1
- package/lib/transform/types.js.map +1 -1
- package/lib/utils/getTagProcessor.js +10 -0
- package/lib/utils/getTagProcessor.js.map +1 -1
- package/lib/utils/removeDangerousCode.js +9 -2
- package/lib/utils/removeDangerousCode.js.map +1 -1
- package/package.json +8 -4
- package/types/cache.d.ts +16 -2
- package/types/cache.js +111 -7
- package/types/debug/fileReporter.d.ts +1 -0
- package/types/module.d.ts +3 -0
- package/types/module.js +57 -2
- package/types/plugins/shaker.js +161 -16
- package/types/shaker.d.ts +10 -1
- package/types/shaker.js +56 -28
- package/types/transform/BaseEntrypoint.d.ts +3 -1
- package/types/transform/BaseEntrypoint.js +5 -1
- package/types/transform/Entrypoint.d.ts +9 -0
- package/types/transform/Entrypoint.js +73 -20
- package/types/transform/EvaluatedEntrypoint.d.ts +2 -0
- package/types/transform/barrelManifest.d.ts +42 -0
- package/types/transform/barrelManifest.js +300 -0
- package/types/transform/generators/getExports.js +5 -0
- package/types/transform/generators/processEntrypoint.js +26 -1
- package/types/transform/generators/resolveImports.js +29 -5
- package/types/transform/generators/rewriteBarrelImports.d.ts +15 -0
- package/types/transform/generators/rewriteBarrelImports.js +815 -0
- package/types/transform/generators/transform.js +148 -19
- package/types/transform/types.d.ts +2 -0
- package/types/utils/getTagProcessor.js +15 -0
- package/types/utils/removeDangerousCode.js +7 -1
package/esm/cache.js
CHANGED
|
@@ -7,14 +7,17 @@ function hashContent(content) {
|
|
|
7
7
|
return createHash('sha256').update(content).digest('hex');
|
|
8
8
|
}
|
|
9
9
|
const cacheLogger = logger.extend('cache');
|
|
10
|
-
const cacheNames = ['entrypoints', 'exports'];
|
|
10
|
+
const cacheNames = ['barrelManifests', 'entrypoints', 'exports'];
|
|
11
11
|
const loggers = cacheNames.reduce((acc, key) => ({
|
|
12
12
|
...acc,
|
|
13
13
|
[key]: cacheLogger.extend(key)
|
|
14
14
|
}), {});
|
|
15
15
|
export class TransformCacheCollection {
|
|
16
|
+
barrelManifestDependencies = new Map();
|
|
16
17
|
contentHashes = new Map();
|
|
18
|
+
exportDependencies = new Map();
|
|
17
19
|
constructor(caches = {}) {
|
|
20
|
+
this.barrelManifests = caches.barrelManifests || new Map();
|
|
18
21
|
this.entrypoints = caches.entrypoints || new Map();
|
|
19
22
|
this.exports = caches.exports || new Map();
|
|
20
23
|
}
|
|
@@ -32,8 +35,10 @@ export class TransformCacheCollection {
|
|
|
32
35
|
if (value === undefined) {
|
|
33
36
|
cache.delete(key);
|
|
34
37
|
this.contentHashes.delete(key);
|
|
38
|
+
this.clearCacheDependencies(cacheName, key);
|
|
35
39
|
return;
|
|
36
40
|
}
|
|
41
|
+
this.clearCacheDependencies(cacheName, key);
|
|
37
42
|
cache.set(key, value);
|
|
38
43
|
if ('initialCode' in value) {
|
|
39
44
|
const maybeOriginalCode = value.originalCode;
|
|
@@ -55,6 +60,15 @@ export class TransformCacheCollection {
|
|
|
55
60
|
} catch {
|
|
56
61
|
this.setContentHash(key, source, hashContent(''));
|
|
57
62
|
}
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
if (cacheName === 'barrelManifests') {
|
|
66
|
+
try {
|
|
67
|
+
const fileContent = fs.readFileSync(stripQueryAndHash(key), 'utf8');
|
|
68
|
+
this.setContentHash(key, 'fs', hashContent(fileContent));
|
|
69
|
+
} catch {
|
|
70
|
+
this.setContentHash(key, 'fs', hashContent(''));
|
|
71
|
+
}
|
|
58
72
|
}
|
|
59
73
|
}
|
|
60
74
|
clear(cacheName) {
|
|
@@ -67,6 +81,7 @@ export class TransformCacheCollection {
|
|
|
67
81
|
loggers[cacheName]('clear');
|
|
68
82
|
const cache = this[cacheName];
|
|
69
83
|
cache.clear();
|
|
84
|
+
this.clearCacheDependencies(cacheName);
|
|
70
85
|
}
|
|
71
86
|
delete(cacheName, key) {
|
|
72
87
|
this.invalidate(cacheName, key);
|
|
@@ -90,25 +105,56 @@ export class TransformCacheCollection {
|
|
|
90
105
|
}
|
|
91
106
|
loggers[cacheName]('invalidate', key);
|
|
92
107
|
cache.delete(key);
|
|
108
|
+
this.clearCacheDependencies(cacheName, key);
|
|
93
109
|
}
|
|
94
110
|
invalidateForFile(filename) {
|
|
95
111
|
cacheNames.forEach(cacheName => {
|
|
96
112
|
this.invalidate(cacheName, filename);
|
|
97
113
|
});
|
|
98
114
|
}
|
|
99
|
-
invalidateIfChanged(filename, content, previousVisitedFiles, source = 'loaded') {
|
|
115
|
+
invalidateIfChanged(filename, content, previousVisitedFiles, source = 'loaded', changedFiles = new Set()) {
|
|
116
|
+
if (changedFiles.has(filename)) {
|
|
117
|
+
return true;
|
|
118
|
+
}
|
|
100
119
|
const visitedFiles = new Set(previousVisitedFiles);
|
|
101
120
|
const fileEntrypoint = this.get('entrypoints', filename);
|
|
121
|
+
let anyDepChanged = false;
|
|
102
122
|
|
|
103
123
|
// We need to check all dependencies of the file
|
|
104
124
|
// because they might have changed as well.
|
|
105
|
-
if (
|
|
125
|
+
if (!visitedFiles.has(filename) && (fileEntrypoint || this.hasCachedDependencies(filename))) {
|
|
106
126
|
visitedFiles.add(filename);
|
|
107
|
-
|
|
127
|
+
const invalidateOnDependencyChange = fileEntrypoint?.invalidateOnDependencyChange;
|
|
128
|
+
const dependenciesToCheck = new Map();
|
|
129
|
+
for (const [key, dependency] of fileEntrypoint?.dependencies ?? []) {
|
|
130
|
+
dependenciesToCheck.set(key, dependency);
|
|
131
|
+
}
|
|
132
|
+
for (const [key, dependency] of fileEntrypoint?.invalidationDependencies ?? []) {
|
|
133
|
+
if (!dependenciesToCheck.has(key)) {
|
|
134
|
+
dependenciesToCheck.set(key, dependency);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
for (const dependencyFilename of this.getCachedDependencies(filename)) {
|
|
138
|
+
if (![...dependenciesToCheck.values()].some(dependency => dependency.resolved === dependencyFilename)) {
|
|
139
|
+
dependenciesToCheck.set(dependencyFilename, {
|
|
140
|
+
resolved: dependencyFilename
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
for (const [, dependency] of dependenciesToCheck) {
|
|
108
145
|
const dependencyFilename = dependency.resolved;
|
|
109
146
|
if (dependencyFilename) {
|
|
110
147
|
const dependencyContent = fs.readFileSync(stripQueryAndHash(dependencyFilename), 'utf8');
|
|
111
|
-
this.invalidateIfChanged(dependencyFilename, dependencyContent, visitedFiles, 'fs');
|
|
148
|
+
const dependencyChanged = this.invalidateIfChanged(dependencyFilename, dependencyContent, visitedFiles, 'fs', changedFiles);
|
|
149
|
+
if (dependencyChanged && invalidateOnDependencyChange?.has(dependencyFilename)) {
|
|
150
|
+
cacheLogger('dependency affecting output has changed, invalidate all for %s', filename);
|
|
151
|
+
this.invalidateForFile(filename);
|
|
152
|
+
changedFiles.add(filename);
|
|
153
|
+
return true;
|
|
154
|
+
}
|
|
155
|
+
if (dependencyChanged) {
|
|
156
|
+
anyDepChanged = true;
|
|
157
|
+
}
|
|
112
158
|
}
|
|
113
159
|
}
|
|
114
160
|
}
|
|
@@ -118,23 +164,70 @@ export class TransformCacheCollection {
|
|
|
118
164
|
if (previousHash === undefined) {
|
|
119
165
|
const otherSource = source === 'fs' ? 'loaded' : 'fs';
|
|
120
166
|
const otherHash = existing?.[otherSource];
|
|
121
|
-
if (otherHash !== undefined && otherHash !== newHash) {
|
|
167
|
+
if (otherHash !== undefined && otherHash !== newHash || anyDepChanged) {
|
|
122
168
|
cacheLogger('content has changed, invalidate all for %s', filename);
|
|
123
169
|
this.setContentHash(filename, source, newHash);
|
|
124
170
|
this.invalidateForFile(filename);
|
|
171
|
+
changedFiles.add(filename);
|
|
125
172
|
return true;
|
|
126
173
|
}
|
|
127
174
|
this.setContentHash(filename, source, newHash);
|
|
175
|
+
if (anyDepChanged) {
|
|
176
|
+
this.invalidateForFile(filename);
|
|
177
|
+
changedFiles.add(filename);
|
|
178
|
+
return true;
|
|
179
|
+
}
|
|
128
180
|
return false;
|
|
129
181
|
}
|
|
130
|
-
if (previousHash !== newHash) {
|
|
182
|
+
if (previousHash !== newHash || anyDepChanged) {
|
|
131
183
|
cacheLogger('content has changed, invalidate all for %s', filename);
|
|
132
184
|
this.setContentHash(filename, source, newHash);
|
|
133
185
|
this.invalidateForFile(filename);
|
|
186
|
+
changedFiles.add(filename);
|
|
134
187
|
return true;
|
|
135
188
|
}
|
|
136
189
|
return false;
|
|
137
190
|
}
|
|
191
|
+
setCacheDependencies(cacheName, key, dependencies) {
|
|
192
|
+
const cache = this.getDependencyCache(cacheName);
|
|
193
|
+
const nextDependencies = new Set([...dependencies].filter(dependency => dependency.length > 0));
|
|
194
|
+
if (nextDependencies.size === 0) {
|
|
195
|
+
cache.delete(key);
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
cache.set(key, nextDependencies);
|
|
199
|
+
}
|
|
200
|
+
clearCacheDependencies(cacheName, key) {
|
|
201
|
+
if (cacheName === 'all') {
|
|
202
|
+
this.barrelManifestDependencies.clear();
|
|
203
|
+
this.exportDependencies.clear();
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
if (cacheName === 'barrelManifests') {
|
|
207
|
+
if (key === undefined) {
|
|
208
|
+
this.barrelManifestDependencies.clear();
|
|
209
|
+
} else {
|
|
210
|
+
this.barrelManifestDependencies.delete(key);
|
|
211
|
+
}
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
if (cacheName === 'exports') {
|
|
215
|
+
if (key === undefined) {
|
|
216
|
+
this.exportDependencies.clear();
|
|
217
|
+
} else {
|
|
218
|
+
this.exportDependencies.delete(key);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
getCachedDependencies(filename) {
|
|
223
|
+
return new Set([...(this.barrelManifestDependencies.get(filename) ?? []), ...(this.exportDependencies.get(filename) ?? [])]);
|
|
224
|
+
}
|
|
225
|
+
getDependencyCache(cacheName) {
|
|
226
|
+
return cacheName === 'barrelManifests' ? this.barrelManifestDependencies : this.exportDependencies;
|
|
227
|
+
}
|
|
228
|
+
hasCachedDependencies(filename) {
|
|
229
|
+
return this.getCachedDependencies(filename).size > 0;
|
|
230
|
+
}
|
|
138
231
|
setContentHash(filename, source, hash) {
|
|
139
232
|
const current = this.contentHashes.get(filename);
|
|
140
233
|
if (current) {
|
package/esm/cache.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache.js","names":["createHash","fs","logger","getFileIdx","stripQueryAndHash","hashContent","content","update","digest","cacheLogger","extend","cacheNames","loggers","reduce","acc","key","TransformCacheCollection","contentHashes","Map","constructor","caches","entrypoints","exports","add","cacheName","value","cache","undefined","has","get","delete","set","maybeOriginalCode","originalCode","isLoaded","initialCode","source","resolvedCode","setContentHash","fileContent","readFileSync","clear","forEach","name","invalidate","res","invalidateForFile","filename","invalidateIfChanged","previousVisitedFiles","visitedFiles","Set","fileEntrypoint","dependency","dependencies","dependencyFilename","resolved","dependencyContent","existing","previousHash","newHash","otherSource","otherHash","hash","current"],"sources":["../src/cache.ts"],"sourcesContent":["import { createHash } from 'crypto';\nimport fs from 'node:fs';\nimport { logger } from '@wyw-in-js/shared';\n\nimport type { Entrypoint } from './transform/Entrypoint';\nimport type { IEvaluatedEntrypoint } from './transform/EvaluatedEntrypoint';\nimport { getFileIdx } from './utils/getFileIdx';\nimport { stripQueryAndHash } from './utils/parseRequest';\n\nfunction hashContent(content: string) {\n return createHash('sha256').update(content).digest('hex');\n}\n\ninterface IBaseCachedEntrypoint {\n dependencies: Map<string, { resolved: string | null }>;\n initialCode?: string;\n}\n\ninterface ICaches<TEntrypoint extends IBaseCachedEntrypoint> {\n entrypoints: Map<string, TEntrypoint>;\n exports: Map<string, string[]>;\n}\n\ntype MapValue<T> = T extends Map<string, infer V> ? V : never;\n\nconst cacheLogger = logger.extend('cache');\n\nconst cacheNames = ['entrypoints', 'exports'] as const;\ntype CacheNames = (typeof cacheNames)[number];\n\nconst loggers = cacheNames.reduce(\n (acc, key) => ({\n ...acc,\n [key]: cacheLogger.extend(key),\n }),\n {} as Record<CacheNames, typeof logger>\n);\n\nexport class TransformCacheCollection<\n TEntrypoint extends IBaseCachedEntrypoint = Entrypoint | IEvaluatedEntrypoint,\n> {\n public readonly entrypoints: Map<string, TEntrypoint>;\n\n public readonly exports: Map<string, string[]>;\n\n private contentHashes = new Map<string, { fs?: string; loaded?: string }>();\n\n constructor(caches: Partial<ICaches<TEntrypoint>> = {}) {\n this.entrypoints = caches.entrypoints || new Map();\n this.exports = caches.exports || new Map();\n }\n\n public add<\n TCache extends CacheNames,\n TValue extends MapValue<ICaches<TEntrypoint>[TCache]>,\n >(cacheName: TCache, key: string, value: TValue): void {\n const cache = this[cacheName] as Map<string, TValue>;\n loggers[cacheName]('%s:add %s %f', getFileIdx(key), key, () => {\n if (value === undefined) {\n return cache.has(key) ? 'removed' : 'noop';\n }\n\n if (!cache.has(key)) {\n return 'added';\n }\n\n return cache.get(key) === value ? 'unchanged' : 'updated';\n });\n\n if (value === undefined) {\n cache.delete(key);\n this.contentHashes.delete(key);\n return;\n }\n\n cache.set(key, value);\n\n if ('initialCode' in value) {\n const maybeOriginalCode = (value as unknown as { originalCode?: unknown })\n .originalCode;\n const isLoaded = typeof value.initialCode === 'string';\n const source = isLoaded ? 'loaded' : 'fs';\n\n let resolvedCode: string | undefined;\n if (isLoaded) {\n resolvedCode = value.initialCode;\n } else if (typeof maybeOriginalCode === 'string') {\n resolvedCode = maybeOriginalCode;\n }\n\n if (resolvedCode !== undefined) {\n this.setContentHash(key, source, hashContent(resolvedCode));\n return;\n }\n\n try {\n const fileContent = fs.readFileSync(stripQueryAndHash(key), 'utf8');\n this.setContentHash(key, source, hashContent(fileContent));\n } catch {\n this.setContentHash(key, source, hashContent(''));\n }\n }\n }\n\n public clear(cacheName: CacheNames | 'all'): void {\n if (cacheName === 'all') {\n cacheNames.forEach((name) => {\n this.clear(name);\n });\n\n return;\n }\n\n loggers[cacheName]('clear');\n const cache = this[cacheName] as Map<string, unknown>;\n\n cache.clear();\n }\n\n public delete(cacheName: CacheNames, key: string): void {\n this.invalidate(cacheName, key);\n }\n\n public get<\n TCache extends CacheNames,\n TValue extends MapValue<ICaches<TEntrypoint>[TCache]>,\n >(cacheName: TCache, key: string): TValue | undefined {\n const cache = this[cacheName] as Map<string, TValue>;\n\n const res = cache.get(key);\n loggers[cacheName]('get', key, res === undefined ? 'miss' : 'hit');\n return res;\n }\n\n public has(cacheName: CacheNames, key: string): boolean {\n const cache = this[cacheName] as Map<string, unknown>;\n\n const res = cache.has(key);\n loggers[cacheName]('has', key, res);\n return res;\n }\n\n public invalidate(cacheName: CacheNames, key: string): void {\n const cache = this[cacheName] as Map<string, unknown>;\n if (!cache.has(key)) {\n return;\n }\n\n loggers[cacheName]('invalidate', key);\n\n cache.delete(key);\n }\n\n public invalidateForFile(filename: string) {\n cacheNames.forEach((cacheName) => {\n this.invalidate(cacheName, filename);\n });\n }\n\n public invalidateIfChanged(\n filename: string,\n content: string,\n previousVisitedFiles?: Set<string>,\n source: 'fs' | 'loaded' = 'loaded'\n ) {\n const visitedFiles = new Set(previousVisitedFiles);\n const fileEntrypoint = this.get('entrypoints', filename);\n\n // We need to check all dependencies of the file\n // because they might have changed as well.\n if (fileEntrypoint && !visitedFiles.has(filename)) {\n visitedFiles.add(filename);\n\n for (const [, dependency] of fileEntrypoint.dependencies) {\n const dependencyFilename = dependency.resolved;\n\n if (dependencyFilename) {\n const dependencyContent = fs.readFileSync(\n stripQueryAndHash(dependencyFilename),\n 'utf8'\n );\n this.invalidateIfChanged(\n dependencyFilename,\n dependencyContent,\n visitedFiles,\n 'fs'\n );\n }\n }\n }\n\n const existing = this.contentHashes.get(filename);\n const previousHash = existing?.[source];\n const newHash = hashContent(content);\n\n if (previousHash === undefined) {\n const otherSource = source === 'fs' ? 'loaded' : 'fs';\n const otherHash = existing?.[otherSource];\n\n if (otherHash !== undefined && otherHash !== newHash) {\n cacheLogger('content has changed, invalidate all for %s', filename);\n this.setContentHash(filename, source, newHash);\n this.invalidateForFile(filename);\n\n return true;\n }\n\n this.setContentHash(filename, source, newHash);\n return false;\n }\n\n if (previousHash !== newHash) {\n cacheLogger('content has changed, invalidate all for %s', filename);\n this.setContentHash(filename, source, newHash);\n this.invalidateForFile(filename);\n\n return true;\n }\n\n return false;\n }\n\n private setContentHash(\n filename: string,\n source: 'fs' | 'loaded',\n hash: string\n ) {\n const current = this.contentHashes.get(filename);\n if (current) {\n current[source] = hash;\n return;\n }\n\n this.contentHashes.set(filename, { [source]: hash });\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"cache.js","names":["createHash","fs","logger","getFileIdx","stripQueryAndHash","hashContent","content","update","digest","cacheLogger","extend","cacheNames","loggers","reduce","acc","key","TransformCacheCollection","barrelManifestDependencies","Map","contentHashes","exportDependencies","constructor","caches","barrelManifests","entrypoints","exports","add","cacheName","value","cache","undefined","has","get","delete","clearCacheDependencies","set","maybeOriginalCode","originalCode","isLoaded","initialCode","source","resolvedCode","setContentHash","fileContent","readFileSync","clear","forEach","name","invalidate","res","invalidateForFile","filename","invalidateIfChanged","previousVisitedFiles","changedFiles","Set","visitedFiles","fileEntrypoint","anyDepChanged","hasCachedDependencies","invalidateOnDependencyChange","dependenciesToCheck","dependency","dependencies","invalidationDependencies","dependencyFilename","getCachedDependencies","values","some","resolved","dependencyContent","dependencyChanged","existing","previousHash","newHash","otherSource","otherHash","setCacheDependencies","getDependencyCache","nextDependencies","filter","length","size","hash","current"],"sources":["../src/cache.ts"],"sourcesContent":["import { createHash } from 'crypto';\nimport fs from 'node:fs';\nimport { logger } from '@wyw-in-js/shared';\n\nimport type { BarrelManifestCacheEntry } from './transform/barrelManifest';\nimport type { Entrypoint } from './transform/Entrypoint';\nimport type { IEvaluatedEntrypoint } from './transform/EvaluatedEntrypoint';\nimport { getFileIdx } from './utils/getFileIdx';\nimport { stripQueryAndHash } from './utils/parseRequest';\n\nfunction hashContent(content: string) {\n return createHash('sha256').update(content).digest('hex');\n}\n\ninterface IBaseCachedEntrypoint {\n dependencies: Map<string, { resolved: string | null }>;\n initialCode?: string;\n invalidateOnDependencyChange?: Set<string>;\n invalidationDependencies?: Map<string, { resolved: string | null }>;\n}\n\ninterface ICaches<TEntrypoint extends IBaseCachedEntrypoint> {\n barrelManifests: Map<string, BarrelManifestCacheEntry>;\n entrypoints: Map<string, TEntrypoint>;\n exports: Map<string, string[]>;\n}\n\ntype MapValue<T> = T extends Map<string, infer V> ? V : never;\n\nconst cacheLogger = logger.extend('cache');\n\nconst cacheNames = ['barrelManifests', 'entrypoints', 'exports'] as const;\ntype CacheNames = (typeof cacheNames)[number];\n\nconst loggers = cacheNames.reduce(\n (acc, key) => ({\n ...acc,\n [key]: cacheLogger.extend(key),\n }),\n {} as Record<CacheNames, typeof logger>\n);\n\nexport class TransformCacheCollection<\n TEntrypoint extends IBaseCachedEntrypoint = Entrypoint | IEvaluatedEntrypoint,\n> {\n public readonly barrelManifests: Map<string, BarrelManifestCacheEntry>;\n\n public readonly entrypoints: Map<string, TEntrypoint>;\n\n public readonly exports: Map<string, string[]>;\n\n private readonly barrelManifestDependencies = new Map<string, Set<string>>();\n\n private contentHashes = new Map<string, { fs?: string; loaded?: string }>();\n\n private readonly exportDependencies = new Map<string, Set<string>>();\n\n constructor(caches: Partial<ICaches<TEntrypoint>> = {}) {\n this.barrelManifests = caches.barrelManifests || new Map();\n this.entrypoints = caches.entrypoints || new Map();\n this.exports = caches.exports || new Map();\n }\n\n public add<\n TCache extends CacheNames,\n TValue extends MapValue<ICaches<TEntrypoint>[TCache]>,\n >(cacheName: TCache, key: string, value: TValue): void {\n const cache = this[cacheName] as Map<string, TValue>;\n loggers[cacheName]('%s:add %s %f', getFileIdx(key), key, () => {\n if (value === undefined) {\n return cache.has(key) ? 'removed' : 'noop';\n }\n\n if (!cache.has(key)) {\n return 'added';\n }\n\n return cache.get(key) === value ? 'unchanged' : 'updated';\n });\n\n if (value === undefined) {\n cache.delete(key);\n this.contentHashes.delete(key);\n this.clearCacheDependencies(cacheName, key);\n return;\n }\n\n this.clearCacheDependencies(cacheName, key);\n cache.set(key, value);\n\n if ('initialCode' in value) {\n const maybeOriginalCode = (value as unknown as { originalCode?: unknown })\n .originalCode;\n const isLoaded = typeof value.initialCode === 'string';\n const source = isLoaded ? 'loaded' : 'fs';\n\n let resolvedCode: string | undefined;\n if (isLoaded) {\n resolvedCode = value.initialCode;\n } else if (typeof maybeOriginalCode === 'string') {\n resolvedCode = maybeOriginalCode;\n }\n\n if (resolvedCode !== undefined) {\n this.setContentHash(key, source, hashContent(resolvedCode));\n return;\n }\n\n try {\n const fileContent = fs.readFileSync(stripQueryAndHash(key), 'utf8');\n this.setContentHash(key, source, hashContent(fileContent));\n } catch {\n this.setContentHash(key, source, hashContent(''));\n }\n\n return;\n }\n\n if (cacheName === 'barrelManifests') {\n try {\n const fileContent = fs.readFileSync(stripQueryAndHash(key), 'utf8');\n this.setContentHash(key, 'fs', hashContent(fileContent));\n } catch {\n this.setContentHash(key, 'fs', hashContent(''));\n }\n }\n }\n\n public clear(cacheName: CacheNames | 'all'): void {\n if (cacheName === 'all') {\n cacheNames.forEach((name) => {\n this.clear(name);\n });\n\n return;\n }\n\n loggers[cacheName]('clear');\n const cache = this[cacheName] as Map<string, unknown>;\n\n cache.clear();\n this.clearCacheDependencies(cacheName);\n }\n\n public delete(cacheName: CacheNames, key: string): void {\n this.invalidate(cacheName, key);\n }\n\n public get<\n TCache extends CacheNames,\n TValue extends MapValue<ICaches<TEntrypoint>[TCache]>,\n >(cacheName: TCache, key: string): TValue | undefined {\n const cache = this[cacheName] as Map<string, TValue>;\n\n const res = cache.get(key);\n loggers[cacheName]('get', key, res === undefined ? 'miss' : 'hit');\n return res;\n }\n\n public has(cacheName: CacheNames, key: string): boolean {\n const cache = this[cacheName] as Map<string, unknown>;\n\n const res = cache.has(key);\n loggers[cacheName]('has', key, res);\n return res;\n }\n\n public invalidate(cacheName: CacheNames, key: string): void {\n const cache = this[cacheName] as Map<string, unknown>;\n if (!cache.has(key)) {\n return;\n }\n\n loggers[cacheName]('invalidate', key);\n\n cache.delete(key);\n this.clearCacheDependencies(cacheName, key);\n }\n\n public invalidateForFile(filename: string) {\n cacheNames.forEach((cacheName) => {\n this.invalidate(cacheName, filename);\n });\n }\n\n public invalidateIfChanged(\n filename: string,\n content: string,\n previousVisitedFiles?: Set<string>,\n source: 'fs' | 'loaded' = 'loaded',\n changedFiles = new Set<string>()\n ) {\n if (changedFiles.has(filename)) {\n return true;\n }\n\n const visitedFiles = new Set(previousVisitedFiles);\n const fileEntrypoint = this.get('entrypoints', filename);\n let anyDepChanged = false;\n\n // We need to check all dependencies of the file\n // because they might have changed as well.\n if (\n !visitedFiles.has(filename) &&\n (fileEntrypoint || this.hasCachedDependencies(filename))\n ) {\n visitedFiles.add(filename);\n const invalidateOnDependencyChange =\n fileEntrypoint?.invalidateOnDependencyChange;\n\n const dependenciesToCheck = new Map<\n string,\n { resolved: string | null }\n >();\n\n for (const [key, dependency] of fileEntrypoint?.dependencies ?? []) {\n dependenciesToCheck.set(key, dependency);\n }\n\n for (const [\n key,\n dependency,\n ] of fileEntrypoint?.invalidationDependencies ?? []) {\n if (!dependenciesToCheck.has(key)) {\n dependenciesToCheck.set(key, dependency);\n }\n }\n\n for (const dependencyFilename of this.getCachedDependencies(filename)) {\n if (\n ![...dependenciesToCheck.values()].some(\n (dependency) => dependency.resolved === dependencyFilename\n )\n ) {\n dependenciesToCheck.set(dependencyFilename, {\n resolved: dependencyFilename,\n });\n }\n }\n\n for (const [, dependency] of dependenciesToCheck) {\n const dependencyFilename = dependency.resolved;\n\n if (dependencyFilename) {\n const dependencyContent = fs.readFileSync(\n stripQueryAndHash(dependencyFilename),\n 'utf8'\n );\n const dependencyChanged = this.invalidateIfChanged(\n dependencyFilename,\n dependencyContent,\n visitedFiles,\n 'fs',\n changedFiles\n );\n\n if (\n dependencyChanged &&\n invalidateOnDependencyChange?.has(dependencyFilename)\n ) {\n cacheLogger(\n 'dependency affecting output has changed, invalidate all for %s',\n filename\n );\n this.invalidateForFile(filename);\n changedFiles.add(filename);\n\n return true;\n }\n\n if (dependencyChanged) {\n anyDepChanged = true;\n }\n }\n }\n }\n\n const existing = this.contentHashes.get(filename);\n const previousHash = existing?.[source];\n const newHash = hashContent(content);\n\n if (previousHash === undefined) {\n const otherSource = source === 'fs' ? 'loaded' : 'fs';\n const otherHash = existing?.[otherSource];\n\n if ((otherHash !== undefined && otherHash !== newHash) || anyDepChanged) {\n cacheLogger('content has changed, invalidate all for %s', filename);\n this.setContentHash(filename, source, newHash);\n this.invalidateForFile(filename);\n changedFiles.add(filename);\n\n return true;\n }\n\n this.setContentHash(filename, source, newHash);\n if (anyDepChanged) {\n this.invalidateForFile(filename);\n changedFiles.add(filename);\n return true;\n }\n return false;\n }\n\n if (previousHash !== newHash || anyDepChanged) {\n cacheLogger('content has changed, invalidate all for %s', filename);\n this.setContentHash(filename, source, newHash);\n this.invalidateForFile(filename);\n changedFiles.add(filename);\n\n return true;\n }\n\n return false;\n }\n\n public setCacheDependencies(\n cacheName: 'barrelManifests' | 'exports',\n key: string,\n dependencies: Iterable<string>\n ): void {\n const cache = this.getDependencyCache(cacheName);\n const nextDependencies = new Set(\n [...dependencies].filter((dependency) => dependency.length > 0)\n );\n\n if (nextDependencies.size === 0) {\n cache.delete(key);\n return;\n }\n\n cache.set(key, nextDependencies);\n }\n\n private clearCacheDependencies(cacheName: CacheNames | 'all', key?: string) {\n if (cacheName === 'all') {\n this.barrelManifestDependencies.clear();\n this.exportDependencies.clear();\n return;\n }\n\n if (cacheName === 'barrelManifests') {\n if (key === undefined) {\n this.barrelManifestDependencies.clear();\n } else {\n this.barrelManifestDependencies.delete(key);\n }\n return;\n }\n\n if (cacheName === 'exports') {\n if (key === undefined) {\n this.exportDependencies.clear();\n } else {\n this.exportDependencies.delete(key);\n }\n }\n }\n\n private getCachedDependencies(filename: string): Set<string> {\n return new Set([\n ...(this.barrelManifestDependencies.get(filename) ?? []),\n ...(this.exportDependencies.get(filename) ?? []),\n ]);\n }\n\n private getDependencyCache(cacheName: 'barrelManifests' | 'exports') {\n return cacheName === 'barrelManifests'\n ? this.barrelManifestDependencies\n : this.exportDependencies;\n }\n\n private hasCachedDependencies(filename: string): boolean {\n return this.getCachedDependencies(filename).size > 0;\n }\n\n private setContentHash(\n filename: string,\n source: 'fs' | 'loaded',\n hash: string\n ) {\n const current = this.contentHashes.get(filename);\n if (current) {\n current[source] = hash;\n return;\n }\n\n this.contentHashes.set(filename, { [source]: hash });\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fileReporter.js","names":["createWriteStream","existsSync","mkdirSync","path","EventEmitter","isOnActionStartArgs","workingDir","process","cwd","replacer","_key","value","isAbsolute","relative","Map","Array","from","entries","reduce","obj","k","v","key","printTimings","timings","startedAt","sourceRoot","size","console","log","performance","now","toFixed","forEach","label","byLabel","array","sort","a","b","localeCompare","time","name","startsWith","writeJSONl","stream","data","write","JSON","stringify","createFileReporter","options","dir","emitter","dummy","onDone","reportFolder","recursive","Error","actionStream","join","dependenciesStream","entrypointStream","addTiming","has","set","forLabel","get","Math","round","processDependencyEvent","file","only","imports","fileIdx","processSingleEvent","meta","type","startTimes","onEvent","Object","startTime","String","actionId","onAction","args","timestamp","idx","entrypointRef","result","id","isAsync","error","finishedAt","onEntrypointEvent","emitterId","event","print","memoryUsage","end","clear"],"sources":["../../src/debug/fileReporter.ts"],"sourcesContent":["/* eslint-disable no-console */\nimport { createWriteStream, existsSync, mkdirSync } from 'fs';\nimport path from 'path';\n\nimport type {\n OnAction,\n OnEvent,\n OnActionFinishArgs,\n OnActionStartArgs,\n OnEntrypointEvent,\n} from '../utils/EventEmitter';\nimport { EventEmitter, isOnActionStartArgs } from '../utils/EventEmitter';\n\ntype Timings = Map<string, Map<string, number>>;\n\nexport interface IFileReporterOptions {\n dir?: string;\n print?: boolean;\n}\n\nexport interface IProcessedEvent {\n file: string;\n fileIdx: string;\n imports: { from: string; what: string[] }[];\n only: string[];\n type: 'dependency';\n}\n\nexport interface IQueueActionEvent {\n action: string;\n args?: string[];\n datetime: Date;\n file: string;\n queueIdx: string;\n type: 'queue-action';\n}\n\nconst workingDir = process.cwd();\n\nfunction replacer(_key: string, value: unknown): unknown {\n if (typeof value === 'string' && path.isAbsolute(value)) {\n return path.relative(workingDir, value);\n }\n\n if (value instanceof Map) {\n return Array.from(value.entries()).reduce((obj, [k, v]) => {\n const key = replacer(k, k) as string;\n return {\n ...obj,\n [key]: replacer(key, v),\n };\n }, {});\n }\n\n return value;\n}\n\nfunction printTimings(timings: Timings, startedAt: number, sourceRoot: string) {\n if (timings.size === 0) {\n return;\n }\n\n console.log(`\\nTimings:`);\n console.log(` Total: ${(performance.now() - startedAt).toFixed()}ms`);\n\n Array.from(timings.entries()).forEach(([label, byLabel]) => {\n console.log(`\\n By ${label}:`);\n\n const array = Array.from(byLabel.entries());\n // array.sort(([, a], [, b]) => b - a);\n array\n .sort(([a], [b]) => a.localeCompare(b))\n .forEach(([value, time]) => {\n const name = value.startsWith(sourceRoot)\n ? path.relative(sourceRoot, value)\n : value;\n console.log(` ${name}: ${time}ms`);\n });\n });\n}\n\nconst writeJSONl = (stream: NodeJS.WritableStream, data: unknown) => {\n stream.write(`${JSON.stringify(data, replacer)}\\n`);\n};\n\nexport const createFileReporter = (\n options: IFileReporterOptions | false = false\n) => {\n if (!options || !options.dir) {\n return {\n emitter: EventEmitter.dummy,\n onDone: () => {},\n };\n }\n\n const reportFolder = existsSync(options.dir)\n ? options.dir\n : mkdirSync(options.dir, {\n recursive: true,\n });\n\n if (!reportFolder) {\n throw new Error(`Could not create directory ${options.dir}`);\n }\n\n const actionStream = createWriteStream(\n path.join(options.dir, 'actions.jsonl')\n );\n\n const dependenciesStream = createWriteStream(\n path.join(options.dir, 'dependencies.jsonl')\n );\n\n const entrypointStream = createWriteStream(\n path.join(options.dir, 'entrypoints.jsonl')\n );\n\n const startedAt = performance.now();\n const timings: Timings = new Map();\n const addTiming = (label: string, key: string, value: number) => {\n if (!timings.has(label)) {\n timings.set(label, new Map());\n }\n\n const forLabel = timings.get(label)!;\n forLabel.set(key, Math.round((forLabel.get(key) || 0) + value));\n };\n\n const processDependencyEvent = ({\n file,\n only,\n imports,\n fileIdx,\n }: IProcessedEvent) => {\n writeJSONl(dependenciesStream, {\n file,\n only,\n imports,\n fileIdx,\n });\n };\n\n const processSingleEvent = (\n meta: Record<string, unknown> | IProcessedEvent | IQueueActionEvent\n ) => {\n if (meta.type === 'dependency') {\n processDependencyEvent(meta as IProcessedEvent);\n }\n };\n\n const startTimes = new Map<string, number>();\n\n const onEvent: OnEvent = (meta, type) => {\n if (type === 'single') {\n processSingleEvent(meta);\n return;\n }\n\n if (type === 'start') {\n Object.entries(meta).forEach(([label, value]) => {\n startTimes.set(`${label}\\0${value}`, performance.now());\n });\n } else {\n Object.entries(meta).forEach(([label, value]) => {\n const startTime = startTimes.get(`${label}\\0${value}`);\n if (startTime) {\n addTiming(label, String(value), performance.now() - startTime);\n }\n });\n }\n };\n\n let actionId = 0;\n const onAction: OnAction = (\n ...args: OnActionStartArgs | OnActionFinishArgs\n ) => {\n if (isOnActionStartArgs(args)) {\n const [, timestamp, type, idx, entrypointRef] = args;\n writeJSONl(actionStream, {\n actionId,\n entrypointRef,\n idx,\n startedAt: timestamp,\n type,\n });\n\n // eslint-disable-next-line no-plusplus\n return actionId++;\n }\n\n const [result, timestamp, id, isAsync, error] = args;\n writeJSONl(actionStream, {\n actionId: id,\n error,\n finishedAt: timestamp,\n isAsync,\n result: `${result}ed`,\n });\n\n return id;\n };\n\n const onEntrypointEvent: OnEntrypointEvent = (\n emitterId,\n timestamp,\n event\n ) => {\n entrypointStream.write(\n `${JSON.stringify([emitterId, timestamp, event])}\\n`\n );\n };\n\n const emitter = new EventEmitter(onEvent, onAction, onEntrypointEvent);\n\n return {\n emitter,\n onDone: (sourceRoot: string) => {\n if (options.print) {\n printTimings(timings, startedAt, sourceRoot);\n\n console.log('\\nMemory usage:', process.memoryUsage());\n }\n\n actionStream.end();\n dependenciesStream.end();\n timings.clear();\n },\n };\n};\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"fileReporter.js","names":["createWriteStream","existsSync","mkdirSync","path","EventEmitter","isOnActionStartArgs","workingDir","process","cwd","replacer","_key","value","isAbsolute","relative","Map","Array","from","entries","reduce","obj","k","v","key","printTimings","timings","startedAt","sourceRoot","size","console","log","performance","now","toFixed","forEach","label","byLabel","array","sort","a","b","localeCompare","time","name","startsWith","writeJSONl","stream","data","write","JSON","stringify","createFileReporter","options","dir","emitter","dummy","onDone","reportFolder","recursive","Error","actionStream","join","dependenciesStream","entrypointStream","addTiming","has","set","forLabel","get","Math","round","processDependencyEvent","file","only","imports","fileIdx","processSingleEvent","meta","type","startTimes","onEvent","Object","startTime","String","actionId","onAction","args","timestamp","idx","entrypointRef","result","id","isAsync","error","finishedAt","onEntrypointEvent","emitterId","event","print","memoryUsage","end","clear"],"sources":["../../src/debug/fileReporter.ts"],"sourcesContent":["/* eslint-disable no-console */\nimport { createWriteStream, existsSync, mkdirSync } from 'fs';\nimport path from 'path';\n\nimport type {\n OnAction,\n OnEvent,\n OnActionFinishArgs,\n OnActionStartArgs,\n OnEntrypointEvent,\n} from '../utils/EventEmitter';\nimport { EventEmitter, isOnActionStartArgs } from '../utils/EventEmitter';\n\ntype Timings = Map<string, Map<string, number>>;\n\nexport interface IFileReporterOptions {\n dir?: string;\n print?: boolean;\n}\n\nexport interface IProcessedEvent {\n file: string;\n fileIdx: string;\n imports: { from: string; what: string[] }[];\n only: string[];\n phase?: 'initial' | 'rewritten';\n type: 'dependency';\n}\n\nexport interface IQueueActionEvent {\n action: string;\n args?: string[];\n datetime: Date;\n file: string;\n queueIdx: string;\n type: 'queue-action';\n}\n\nconst workingDir = process.cwd();\n\nfunction replacer(_key: string, value: unknown): unknown {\n if (typeof value === 'string' && path.isAbsolute(value)) {\n return path.relative(workingDir, value);\n }\n\n if (value instanceof Map) {\n return Array.from(value.entries()).reduce((obj, [k, v]) => {\n const key = replacer(k, k) as string;\n return {\n ...obj,\n [key]: replacer(key, v),\n };\n }, {});\n }\n\n return value;\n}\n\nfunction printTimings(timings: Timings, startedAt: number, sourceRoot: string) {\n if (timings.size === 0) {\n return;\n }\n\n console.log(`\\nTimings:`);\n console.log(` Total: ${(performance.now() - startedAt).toFixed()}ms`);\n\n Array.from(timings.entries()).forEach(([label, byLabel]) => {\n console.log(`\\n By ${label}:`);\n\n const array = Array.from(byLabel.entries());\n // array.sort(([, a], [, b]) => b - a);\n array\n .sort(([a], [b]) => a.localeCompare(b))\n .forEach(([value, time]) => {\n const name = value.startsWith(sourceRoot)\n ? path.relative(sourceRoot, value)\n : value;\n console.log(` ${name}: ${time}ms`);\n });\n });\n}\n\nconst writeJSONl = (stream: NodeJS.WritableStream, data: unknown) => {\n stream.write(`${JSON.stringify(data, replacer)}\\n`);\n};\n\nexport const createFileReporter = (\n options: IFileReporterOptions | false = false\n) => {\n if (!options || !options.dir) {\n return {\n emitter: EventEmitter.dummy,\n onDone: () => {},\n };\n }\n\n const reportFolder = existsSync(options.dir)\n ? options.dir\n : mkdirSync(options.dir, {\n recursive: true,\n });\n\n if (!reportFolder) {\n throw new Error(`Could not create directory ${options.dir}`);\n }\n\n const actionStream = createWriteStream(\n path.join(options.dir, 'actions.jsonl')\n );\n\n const dependenciesStream = createWriteStream(\n path.join(options.dir, 'dependencies.jsonl')\n );\n\n const entrypointStream = createWriteStream(\n path.join(options.dir, 'entrypoints.jsonl')\n );\n\n const startedAt = performance.now();\n const timings: Timings = new Map();\n const addTiming = (label: string, key: string, value: number) => {\n if (!timings.has(label)) {\n timings.set(label, new Map());\n }\n\n const forLabel = timings.get(label)!;\n forLabel.set(key, Math.round((forLabel.get(key) || 0) + value));\n };\n\n const processDependencyEvent = ({\n file,\n only,\n imports,\n fileIdx,\n }: IProcessedEvent) => {\n writeJSONl(dependenciesStream, {\n file,\n only,\n imports,\n fileIdx,\n });\n };\n\n const processSingleEvent = (\n meta: Record<string, unknown> | IProcessedEvent | IQueueActionEvent\n ) => {\n if (meta.type === 'dependency') {\n processDependencyEvent(meta as IProcessedEvent);\n }\n };\n\n const startTimes = new Map<string, number>();\n\n const onEvent: OnEvent = (meta, type) => {\n if (type === 'single') {\n processSingleEvent(meta);\n return;\n }\n\n if (type === 'start') {\n Object.entries(meta).forEach(([label, value]) => {\n startTimes.set(`${label}\\0${value}`, performance.now());\n });\n } else {\n Object.entries(meta).forEach(([label, value]) => {\n const startTime = startTimes.get(`${label}\\0${value}`);\n if (startTime) {\n addTiming(label, String(value), performance.now() - startTime);\n }\n });\n }\n };\n\n let actionId = 0;\n const onAction: OnAction = (\n ...args: OnActionStartArgs | OnActionFinishArgs\n ) => {\n if (isOnActionStartArgs(args)) {\n const [, timestamp, type, idx, entrypointRef] = args;\n writeJSONl(actionStream, {\n actionId,\n entrypointRef,\n idx,\n startedAt: timestamp,\n type,\n });\n\n // eslint-disable-next-line no-plusplus\n return actionId++;\n }\n\n const [result, timestamp, id, isAsync, error] = args;\n writeJSONl(actionStream, {\n actionId: id,\n error,\n finishedAt: timestamp,\n isAsync,\n result: `${result}ed`,\n });\n\n return id;\n };\n\n const onEntrypointEvent: OnEntrypointEvent = (\n emitterId,\n timestamp,\n event\n ) => {\n entrypointStream.write(\n `${JSON.stringify([emitterId, timestamp, event])}\\n`\n );\n };\n\n const emitter = new EventEmitter(onEvent, onAction, onEntrypointEvent);\n\n return {\n emitter,\n onDone: (sourceRoot: string) => {\n if (options.print) {\n printTimings(timings, startedAt, sourceRoot);\n\n console.log('\\nMemory usage:', process.memoryUsage());\n }\n\n actionStream.end();\n dependenciesStream.end();\n timings.clear();\n },\n };\n};\n"],"mappings":"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","ignoreList":[]}
|
package/esm/module.js
CHANGED
|
@@ -24,6 +24,27 @@ import { isUnprocessedEntrypointError } from './transform/actions/UnprocessedEnt
|
|
|
24
24
|
import { applyImportOverrideToOnly, getImportOverride, resolveMockSpecifier, toImportKey } from './utils/importOverrides';
|
|
25
25
|
import { parseRequest, stripQueryAndHash } from './utils/parseRequest';
|
|
26
26
|
import { createVmContext } from './vm/createVmContext';
|
|
27
|
+
const CJS_DEFAULT_CONDITIONS = ['require', 'node', 'default'];
|
|
28
|
+
function expandConditions(conditionNames) {
|
|
29
|
+
const result = new Set();
|
|
30
|
+
for (const name of conditionNames) {
|
|
31
|
+
if (name === '...') {
|
|
32
|
+
for (const d of CJS_DEFAULT_CONDITIONS) result.add(d);
|
|
33
|
+
} else {
|
|
34
|
+
result.add(name);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return result;
|
|
38
|
+
}
|
|
39
|
+
function isBarePackageSubpath(id) {
|
|
40
|
+
if (id.startsWith('.') || path.isAbsolute(id)) {
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
if (id.startsWith('@')) {
|
|
44
|
+
return id.split('/').length > 2;
|
|
45
|
+
}
|
|
46
|
+
return id.includes('/');
|
|
47
|
+
}
|
|
27
48
|
export const DefaultModuleImplementation = NativeModule;
|
|
28
49
|
|
|
29
50
|
// Supported node builtins based on the modules polyfilled by webpack
|
|
@@ -327,6 +348,29 @@ export class Module {
|
|
|
327
348
|
}
|
|
328
349
|
return newEntrypoint;
|
|
329
350
|
}
|
|
351
|
+
resolveWithConditions(id, parent, conditions) {
|
|
352
|
+
const resolveOptions = conditions ? {
|
|
353
|
+
conditions
|
|
354
|
+
} : undefined;
|
|
355
|
+
const shouldRetryWithExtensions = conditions && path.extname(id) === '' && (id.startsWith('.') || path.isAbsolute(id) || isBarePackageSubpath(id));
|
|
356
|
+
try {
|
|
357
|
+
return this.moduleImpl._resolveFilename(id, parent, false, resolveOptions);
|
|
358
|
+
} catch (e) {
|
|
359
|
+
if (shouldRetryWithExtensions && e instanceof Error && e.code === 'MODULE_NOT_FOUND') {
|
|
360
|
+
// Extensionless subpath requests (e.g. "pkg/src/*" or "./src/*") may
|
|
361
|
+
// resolve to extensionless targets via conditional exports. Retry with
|
|
362
|
+
// each known extension, but never rewrite already explicit specifiers.
|
|
363
|
+
for (const ext of this.extensions) {
|
|
364
|
+
try {
|
|
365
|
+
return this.moduleImpl._resolveFilename(id + ext, parent, false, resolveOptions);
|
|
366
|
+
} catch {
|
|
367
|
+
// try next extension
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
throw e;
|
|
372
|
+
}
|
|
373
|
+
}
|
|
330
374
|
resolveDependency = id => {
|
|
331
375
|
const cached = this.entrypoint.getDependency(id);
|
|
332
376
|
invariant(!(cached instanceof Promise), 'Dependency is not resolved yet');
|
|
@@ -355,11 +399,16 @@ export class Module {
|
|
|
355
399
|
filename
|
|
356
400
|
} = this;
|
|
357
401
|
const strippedId = stripQueryAndHash(id);
|
|
358
|
-
|
|
402
|
+
const parent = {
|
|
359
403
|
id: filename,
|
|
360
404
|
filename,
|
|
361
405
|
paths: this.moduleImpl._nodeModulePaths(path.dirname(filename))
|
|
362
|
-
}
|
|
406
|
+
};
|
|
407
|
+
const {
|
|
408
|
+
conditionNames
|
|
409
|
+
} = this.services.options.pluginOptions;
|
|
410
|
+
const conditions = conditionNames?.length ? expandConditions(conditionNames) : undefined;
|
|
411
|
+
let resolved = this.resolveWithConditions(strippedId, parent, conditions);
|
|
363
412
|
const isFileSpecifier = strippedId.startsWith('.') || path.isAbsolute(strippedId);
|
|
364
413
|
if (isFileSpecifier && path.extname(strippedId) === '' && resolved.endsWith('.cjs') && fs.existsSync(`${resolved.slice(0, -4)}.js`)) {
|
|
365
414
|
// When both `.cjs` and `.js` exist for an extensionless specifier, the
|