@wyw-in-js/transform 1.0.6 → 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.
Files changed (77) hide show
  1. package/esm/cache.js +100 -7
  2. package/esm/cache.js.map +1 -1
  3. package/esm/debug/fileReporter.js.map +1 -1
  4. package/esm/module.js +51 -2
  5. package/esm/module.js.map +1 -1
  6. package/esm/plugins/shaker.js +152 -13
  7. package/esm/plugins/shaker.js.map +1 -1
  8. package/esm/shaker.js +51 -23
  9. package/esm/shaker.js.map +1 -1
  10. package/esm/transform/BaseEntrypoint.js +3 -1
  11. package/esm/transform/BaseEntrypoint.js.map +1 -1
  12. package/esm/transform/Entrypoint.js +60 -17
  13. package/esm/transform/Entrypoint.js.map +1 -1
  14. package/esm/transform/EvaluatedEntrypoint.js.map +1 -1
  15. package/esm/transform/barrelManifest.js +291 -0
  16. package/esm/transform/barrelManifest.js.map +1 -0
  17. package/esm/transform/generators/getExports.js +5 -0
  18. package/esm/transform/generators/getExports.js.map +1 -1
  19. package/esm/transform/generators/processEntrypoint.js +27 -1
  20. package/esm/transform/generators/processEntrypoint.js.map +1 -1
  21. package/esm/transform/generators/resolveImports.js +29 -5
  22. package/esm/transform/generators/resolveImports.js.map +1 -1
  23. package/esm/transform/generators/rewriteBarrelImports.js +733 -0
  24. package/esm/transform/generators/rewriteBarrelImports.js.map +1 -0
  25. package/esm/transform/generators/transform.js +154 -21
  26. package/esm/transform/generators/transform.js.map +1 -1
  27. package/esm/transform/types.js.map +1 -1
  28. package/lib/cache.js +103 -7
  29. package/lib/cache.js.map +1 -1
  30. package/lib/debug/fileReporter.js.map +1 -1
  31. package/lib/module.js +51 -2
  32. package/lib/module.js.map +1 -1
  33. package/lib/plugins/shaker.js +152 -13
  34. package/lib/plugins/shaker.js.map +1 -1
  35. package/lib/shaker.js +58 -26
  36. package/lib/shaker.js.map +1 -1
  37. package/lib/transform/BaseEntrypoint.js +3 -1
  38. package/lib/transform/BaseEntrypoint.js.map +1 -1
  39. package/lib/transform/Entrypoint.js +61 -17
  40. package/lib/transform/Entrypoint.js.map +1 -1
  41. package/lib/transform/EvaluatedEntrypoint.js.map +1 -1
  42. package/lib/transform/barrelManifest.js +300 -0
  43. package/lib/transform/barrelManifest.js.map +1 -0
  44. package/lib/transform/generators/getExports.js +5 -0
  45. package/lib/transform/generators/getExports.js.map +1 -1
  46. package/lib/transform/generators/processEntrypoint.js +27 -1
  47. package/lib/transform/generators/processEntrypoint.js.map +1 -1
  48. package/lib/transform/generators/resolveImports.js +29 -5
  49. package/lib/transform/generators/resolveImports.js.map +1 -1
  50. package/lib/transform/generators/rewriteBarrelImports.js +743 -0
  51. package/lib/transform/generators/rewriteBarrelImports.js.map +1 -0
  52. package/lib/transform/generators/transform.js +158 -22
  53. package/lib/transform/generators/transform.js.map +1 -1
  54. package/lib/transform/types.js.map +1 -1
  55. package/package.json +8 -4
  56. package/types/cache.d.ts +16 -2
  57. package/types/cache.js +111 -7
  58. package/types/debug/fileReporter.d.ts +1 -0
  59. package/types/module.d.ts +3 -0
  60. package/types/module.js +57 -2
  61. package/types/plugins/shaker.js +161 -16
  62. package/types/shaker.d.ts +10 -1
  63. package/types/shaker.js +56 -28
  64. package/types/transform/BaseEntrypoint.d.ts +3 -1
  65. package/types/transform/BaseEntrypoint.js +5 -1
  66. package/types/transform/Entrypoint.d.ts +9 -0
  67. package/types/transform/Entrypoint.js +73 -20
  68. package/types/transform/EvaluatedEntrypoint.d.ts +2 -0
  69. package/types/transform/barrelManifest.d.ts +42 -0
  70. package/types/transform/barrelManifest.js +300 -0
  71. package/types/transform/generators/getExports.js +5 -0
  72. package/types/transform/generators/processEntrypoint.js +26 -1
  73. package/types/transform/generators/resolveImports.js +29 -5
  74. package/types/transform/generators/rewriteBarrelImports.d.ts +15 -0
  75. package/types/transform/generators/rewriteBarrelImports.js +815 -0
  76. package/types/transform/generators/transform.js +148 -19
  77. package/types/transform/types.d.ts +2 -0
package/lib/cache.js CHANGED
@@ -14,14 +14,17 @@ function hashContent(content) {
14
14
  return (0, _crypto.createHash)('sha256').update(content).digest('hex');
15
15
  }
16
16
  const cacheLogger = _shared.logger.extend('cache');
17
- const cacheNames = ['entrypoints', 'exports'];
17
+ const cacheNames = ['barrelManifests', 'entrypoints', 'exports'];
18
18
  const loggers = cacheNames.reduce((acc, key) => ({
19
19
  ...acc,
20
20
  [key]: cacheLogger.extend(key)
21
21
  }), {});
22
22
  class TransformCacheCollection {
23
+ barrelManifestDependencies = new Map();
23
24
  contentHashes = new Map();
25
+ exportDependencies = new Map();
24
26
  constructor(caches = {}) {
27
+ this.barrelManifests = caches.barrelManifests || new Map();
25
28
  this.entrypoints = caches.entrypoints || new Map();
26
29
  this.exports = caches.exports || new Map();
27
30
  }
@@ -39,8 +42,10 @@ class TransformCacheCollection {
39
42
  if (value === undefined) {
40
43
  cache.delete(key);
41
44
  this.contentHashes.delete(key);
45
+ this.clearCacheDependencies(cacheName, key);
42
46
  return;
43
47
  }
48
+ this.clearCacheDependencies(cacheName, key);
44
49
  cache.set(key, value);
45
50
  if ('initialCode' in value) {
46
51
  const maybeOriginalCode = value.originalCode;
@@ -62,6 +67,15 @@ class TransformCacheCollection {
62
67
  } catch {
63
68
  this.setContentHash(key, source, hashContent(''));
64
69
  }
70
+ return;
71
+ }
72
+ if (cacheName === 'barrelManifests') {
73
+ try {
74
+ const fileContent = _nodeFs.default.readFileSync((0, _parseRequest.stripQueryAndHash)(key), 'utf8');
75
+ this.setContentHash(key, 'fs', hashContent(fileContent));
76
+ } catch {
77
+ this.setContentHash(key, 'fs', hashContent(''));
78
+ }
65
79
  }
66
80
  }
67
81
  clear(cacheName) {
@@ -74,6 +88,7 @@ class TransformCacheCollection {
74
88
  loggers[cacheName]('clear');
75
89
  const cache = this[cacheName];
76
90
  cache.clear();
91
+ this.clearCacheDependencies(cacheName);
77
92
  }
78
93
  delete(cacheName, key) {
79
94
  this.invalidate(cacheName, key);
@@ -97,25 +112,58 @@ class TransformCacheCollection {
97
112
  }
98
113
  loggers[cacheName]('invalidate', key);
99
114
  cache.delete(key);
115
+ this.clearCacheDependencies(cacheName, key);
100
116
  }
101
117
  invalidateForFile(filename) {
102
118
  cacheNames.forEach(cacheName => {
103
119
  this.invalidate(cacheName, filename);
104
120
  });
105
121
  }
106
- invalidateIfChanged(filename, content, previousVisitedFiles, source = 'loaded') {
122
+ invalidateIfChanged(filename, content, previousVisitedFiles, source = 'loaded', changedFiles = new Set()) {
123
+ if (changedFiles.has(filename)) {
124
+ return true;
125
+ }
107
126
  const visitedFiles = new Set(previousVisitedFiles);
108
127
  const fileEntrypoint = this.get('entrypoints', filename);
128
+ let anyDepChanged = false;
109
129
 
110
130
  // We need to check all dependencies of the file
111
131
  // because they might have changed as well.
112
- if (fileEntrypoint && !visitedFiles.has(filename)) {
132
+ if (!visitedFiles.has(filename) && (fileEntrypoint || this.hasCachedDependencies(filename))) {
113
133
  visitedFiles.add(filename);
114
- for (const [, dependency] of fileEntrypoint.dependencies) {
134
+ const invalidateOnDependencyChange = fileEntrypoint === null || fileEntrypoint === void 0 ? void 0 : fileEntrypoint.invalidateOnDependencyChange;
135
+ const dependenciesToCheck = new Map();
136
+ for (const [key, dependency] of (_fileEntrypoint$depen = fileEntrypoint === null || fileEntrypoint === void 0 ? void 0 : fileEntrypoint.dependencies) !== null && _fileEntrypoint$depen !== void 0 ? _fileEntrypoint$depen : []) {
137
+ var _fileEntrypoint$depen;
138
+ dependenciesToCheck.set(key, dependency);
139
+ }
140
+ for (const [key, dependency] of (_fileEntrypoint$inval = fileEntrypoint === null || fileEntrypoint === void 0 ? void 0 : fileEntrypoint.invalidationDependencies) !== null && _fileEntrypoint$inval !== void 0 ? _fileEntrypoint$inval : []) {
141
+ var _fileEntrypoint$inval;
142
+ if (!dependenciesToCheck.has(key)) {
143
+ dependenciesToCheck.set(key, dependency);
144
+ }
145
+ }
146
+ for (const dependencyFilename of this.getCachedDependencies(filename)) {
147
+ if (![...dependenciesToCheck.values()].some(dependency => dependency.resolved === dependencyFilename)) {
148
+ dependenciesToCheck.set(dependencyFilename, {
149
+ resolved: dependencyFilename
150
+ });
151
+ }
152
+ }
153
+ for (const [, dependency] of dependenciesToCheck) {
115
154
  const dependencyFilename = dependency.resolved;
116
155
  if (dependencyFilename) {
117
156
  const dependencyContent = _nodeFs.default.readFileSync((0, _parseRequest.stripQueryAndHash)(dependencyFilename), 'utf8');
118
- this.invalidateIfChanged(dependencyFilename, dependencyContent, visitedFiles, 'fs');
157
+ const dependencyChanged = this.invalidateIfChanged(dependencyFilename, dependencyContent, visitedFiles, 'fs', changedFiles);
158
+ if (dependencyChanged && invalidateOnDependencyChange !== null && invalidateOnDependencyChange !== void 0 && invalidateOnDependencyChange.has(dependencyFilename)) {
159
+ cacheLogger('dependency affecting output has changed, invalidate all for %s', filename);
160
+ this.invalidateForFile(filename);
161
+ changedFiles.add(filename);
162
+ return true;
163
+ }
164
+ if (dependencyChanged) {
165
+ anyDepChanged = true;
166
+ }
119
167
  }
120
168
  }
121
169
  }
@@ -125,23 +173,71 @@ class TransformCacheCollection {
125
173
  if (previousHash === undefined) {
126
174
  const otherSource = source === 'fs' ? 'loaded' : 'fs';
127
175
  const otherHash = existing === null || existing === void 0 ? void 0 : existing[otherSource];
128
- if (otherHash !== undefined && otherHash !== newHash) {
176
+ if (otherHash !== undefined && otherHash !== newHash || anyDepChanged) {
129
177
  cacheLogger('content has changed, invalidate all for %s', filename);
130
178
  this.setContentHash(filename, source, newHash);
131
179
  this.invalidateForFile(filename);
180
+ changedFiles.add(filename);
132
181
  return true;
133
182
  }
134
183
  this.setContentHash(filename, source, newHash);
184
+ if (anyDepChanged) {
185
+ this.invalidateForFile(filename);
186
+ changedFiles.add(filename);
187
+ return true;
188
+ }
135
189
  return false;
136
190
  }
137
- if (previousHash !== newHash) {
191
+ if (previousHash !== newHash || anyDepChanged) {
138
192
  cacheLogger('content has changed, invalidate all for %s', filename);
139
193
  this.setContentHash(filename, source, newHash);
140
194
  this.invalidateForFile(filename);
195
+ changedFiles.add(filename);
141
196
  return true;
142
197
  }
143
198
  return false;
144
199
  }
200
+ setCacheDependencies(cacheName, key, dependencies) {
201
+ const cache = this.getDependencyCache(cacheName);
202
+ const nextDependencies = new Set([...dependencies].filter(dependency => dependency.length > 0));
203
+ if (nextDependencies.size === 0) {
204
+ cache.delete(key);
205
+ return;
206
+ }
207
+ cache.set(key, nextDependencies);
208
+ }
209
+ clearCacheDependencies(cacheName, key) {
210
+ if (cacheName === 'all') {
211
+ this.barrelManifestDependencies.clear();
212
+ this.exportDependencies.clear();
213
+ return;
214
+ }
215
+ if (cacheName === 'barrelManifests') {
216
+ if (key === undefined) {
217
+ this.barrelManifestDependencies.clear();
218
+ } else {
219
+ this.barrelManifestDependencies.delete(key);
220
+ }
221
+ return;
222
+ }
223
+ if (cacheName === 'exports') {
224
+ if (key === undefined) {
225
+ this.exportDependencies.clear();
226
+ } else {
227
+ this.exportDependencies.delete(key);
228
+ }
229
+ }
230
+ }
231
+ getCachedDependencies(filename) {
232
+ var _this$barrelManifestD, _this$exportDependenc;
233
+ return new Set([...((_this$barrelManifestD = this.barrelManifestDependencies.get(filename)) !== null && _this$barrelManifestD !== void 0 ? _this$barrelManifestD : []), ...((_this$exportDependenc = this.exportDependencies.get(filename)) !== null && _this$exportDependenc !== void 0 ? _this$exportDependenc : [])]);
234
+ }
235
+ getDependencyCache(cacheName) {
236
+ return cacheName === 'barrelManifests' ? this.barrelManifestDependencies : this.exportDependencies;
237
+ }
238
+ hasCachedDependencies(filename) {
239
+ return this.getCachedDependencies(filename).size > 0;
240
+ }
145
241
  setContentHash(filename, source, hash) {
146
242
  const current = this.contentHashes.get(filename);
147
243
  if (current) {
package/lib/cache.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cache.js","names":["_crypto","require","_nodeFs","_interopRequireDefault","_shared","_getFileIdx","_parseRequest","e","__esModule","default","hashContent","content","createHash","update","digest","cacheLogger","logger","extend","cacheNames","loggers","reduce","acc","key","TransformCacheCollection","contentHashes","Map","constructor","caches","entrypoints","exports","add","cacheName","value","cache","getFileIdx","undefined","has","get","delete","set","maybeOriginalCode","originalCode","isLoaded","initialCode","source","resolvedCode","setContentHash","fileContent","fs","readFileSync","stripQueryAndHash","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":["_crypto","require","_nodeFs","_interopRequireDefault","_shared","_getFileIdx","_parseRequest","e","__esModule","default","hashContent","content","createHash","update","digest","cacheLogger","logger","extend","cacheNames","loggers","reduce","acc","key","TransformCacheCollection","barrelManifestDependencies","Map","contentHashes","exportDependencies","constructor","caches","barrelManifests","entrypoints","exports","add","cacheName","value","cache","getFileIdx","undefined","has","get","delete","clearCacheDependencies","set","maybeOriginalCode","originalCode","isLoaded","initialCode","source","resolvedCode","setContentHash","fileContent","fs","readFileSync","stripQueryAndHash","clear","forEach","name","invalidate","res","invalidateForFile","filename","invalidateIfChanged","previousVisitedFiles","changedFiles","Set","visitedFiles","fileEntrypoint","anyDepChanged","hasCachedDependencies","invalidateOnDependencyChange","dependenciesToCheck","dependency","_fileEntrypoint$depen","dependencies","_fileEntrypoint$inval","invalidationDependencies","dependencyFilename","getCachedDependencies","values","some","resolved","dependencyContent","dependencyChanged","existing","previousHash","newHash","otherSource","otherHash","setCacheDependencies","getDependencyCache","nextDependencies","filter","length","size","_this$barrelManifestD","_this$exportDependenc","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":["_fs","require","_path","_interopRequireDefault","_EventEmitter","e","__esModule","default","workingDir","process","cwd","replacer","_key","value","path","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","EventEmitter","dummy","onDone","reportFolder","existsSync","mkdirSync","recursive","Error","actionStream","createWriteStream","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","isOnActionStartArgs","timestamp","idx","entrypointRef","result","id","isAsync","error","finishedAt","onEntrypointEvent","emitterId","event","print","memoryUsage","end","clear","exports"],"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":["_fs","require","_path","_interopRequireDefault","_EventEmitter","e","__esModule","default","workingDir","process","cwd","replacer","_key","value","path","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","EventEmitter","dummy","onDone","reportFolder","existsSync","mkdirSync","recursive","Error","actionStream","createWriteStream","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","isOnActionStartArgs","timestamp","idx","entrypointRef","result","id","isAsync","error","finishedAt","onEntrypointEvent","emitterId","event","print","memoryUsage","end","clear","exports"],"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/lib/module.js CHANGED
@@ -31,6 +31,27 @@ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e
31
31
  *
32
32
  */
33
33
 
34
+ const CJS_DEFAULT_CONDITIONS = ['require', 'node', 'default'];
35
+ function expandConditions(conditionNames) {
36
+ const result = new Set();
37
+ for (const name of conditionNames) {
38
+ if (name === '...') {
39
+ for (const d of CJS_DEFAULT_CONDITIONS) result.add(d);
40
+ } else {
41
+ result.add(name);
42
+ }
43
+ }
44
+ return result;
45
+ }
46
+ function isBarePackageSubpath(id) {
47
+ if (id.startsWith('.') || _path.default.isAbsolute(id)) {
48
+ return false;
49
+ }
50
+ if (id.startsWith('@')) {
51
+ return id.split('/').length > 2;
52
+ }
53
+ return id.includes('/');
54
+ }
34
55
  const DefaultModuleImplementation = exports.DefaultModuleImplementation = _module.default;
35
56
 
36
57
  // Supported node builtins based on the modules polyfilled by webpack
@@ -337,6 +358,29 @@ class Module {
337
358
  }
338
359
  return newEntrypoint;
339
360
  }
361
+ resolveWithConditions(id, parent, conditions) {
362
+ const resolveOptions = conditions ? {
363
+ conditions
364
+ } : undefined;
365
+ const shouldRetryWithExtensions = conditions && _path.default.extname(id) === '' && (id.startsWith('.') || _path.default.isAbsolute(id) || isBarePackageSubpath(id));
366
+ try {
367
+ return this.moduleImpl._resolveFilename(id, parent, false, resolveOptions);
368
+ } catch (e) {
369
+ if (shouldRetryWithExtensions && e instanceof Error && e.code === 'MODULE_NOT_FOUND') {
370
+ // Extensionless subpath requests (e.g. "pkg/src/*" or "./src/*") may
371
+ // resolve to extensionless targets via conditional exports. Retry with
372
+ // each known extension, but never rewrite already explicit specifiers.
373
+ for (const ext of this.extensions) {
374
+ try {
375
+ return this.moduleImpl._resolveFilename(id + ext, parent, false, resolveOptions);
376
+ } catch {
377
+ // try next extension
378
+ }
379
+ }
380
+ }
381
+ throw e;
382
+ }
383
+ }
340
384
  resolveDependency = id => {
341
385
  const cached = this.entrypoint.getDependency(id);
342
386
  (0, _tsInvariant.invariant)(!(cached instanceof Promise), 'Dependency is not resolved yet');
@@ -366,11 +410,16 @@ class Module {
366
410
  filename
367
411
  } = this;
368
412
  const strippedId = (0, _parseRequest.stripQueryAndHash)(id);
369
- let resolved = this.moduleImpl._resolveFilename(strippedId, {
413
+ const parent = {
370
414
  id: filename,
371
415
  filename,
372
416
  paths: this.moduleImpl._nodeModulePaths(_path.default.dirname(filename))
373
- });
417
+ };
418
+ const {
419
+ conditionNames
420
+ } = this.services.options.pluginOptions;
421
+ const conditions = conditionNames !== null && conditionNames !== void 0 && conditionNames.length ? expandConditions(conditionNames) : undefined;
422
+ let resolved = this.resolveWithConditions(strippedId, parent, conditions);
374
423
  const isFileSpecifier = strippedId.startsWith('.') || _path.default.isAbsolute(strippedId);
375
424
  if (isFileSpecifier && _path.default.extname(strippedId) === '' && resolved.endsWith('.cjs') && _fs.default.existsSync(`${resolved.slice(0, -4)}.js`)) {
376
425
  // When both `.cjs` and `.js` exist for an extensionless specifier, the