@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.
Files changed (87) 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/esm/utils/getTagProcessor.js +10 -0
  29. package/esm/utils/getTagProcessor.js.map +1 -1
  30. package/esm/utils/removeDangerousCode.js +9 -2
  31. package/esm/utils/removeDangerousCode.js.map +1 -1
  32. package/lib/cache.js +103 -7
  33. package/lib/cache.js.map +1 -1
  34. package/lib/debug/fileReporter.js.map +1 -1
  35. package/lib/module.js +51 -2
  36. package/lib/module.js.map +1 -1
  37. package/lib/plugins/shaker.js +152 -13
  38. package/lib/plugins/shaker.js.map +1 -1
  39. package/lib/shaker.js +58 -26
  40. package/lib/shaker.js.map +1 -1
  41. package/lib/transform/BaseEntrypoint.js +3 -1
  42. package/lib/transform/BaseEntrypoint.js.map +1 -1
  43. package/lib/transform/Entrypoint.js +61 -17
  44. package/lib/transform/Entrypoint.js.map +1 -1
  45. package/lib/transform/EvaluatedEntrypoint.js.map +1 -1
  46. package/lib/transform/barrelManifest.js +300 -0
  47. package/lib/transform/barrelManifest.js.map +1 -0
  48. package/lib/transform/generators/getExports.js +5 -0
  49. package/lib/transform/generators/getExports.js.map +1 -1
  50. package/lib/transform/generators/processEntrypoint.js +27 -1
  51. package/lib/transform/generators/processEntrypoint.js.map +1 -1
  52. package/lib/transform/generators/resolveImports.js +29 -5
  53. package/lib/transform/generators/resolveImports.js.map +1 -1
  54. package/lib/transform/generators/rewriteBarrelImports.js +743 -0
  55. package/lib/transform/generators/rewriteBarrelImports.js.map +1 -0
  56. package/lib/transform/generators/transform.js +158 -22
  57. package/lib/transform/generators/transform.js.map +1 -1
  58. package/lib/transform/types.js.map +1 -1
  59. package/lib/utils/getTagProcessor.js +10 -0
  60. package/lib/utils/getTagProcessor.js.map +1 -1
  61. package/lib/utils/removeDangerousCode.js +9 -2
  62. package/lib/utils/removeDangerousCode.js.map +1 -1
  63. package/package.json +8 -4
  64. package/types/cache.d.ts +16 -2
  65. package/types/cache.js +111 -7
  66. package/types/debug/fileReporter.d.ts +1 -0
  67. package/types/module.d.ts +3 -0
  68. package/types/module.js +57 -2
  69. package/types/plugins/shaker.js +161 -16
  70. package/types/shaker.d.ts +10 -1
  71. package/types/shaker.js +56 -28
  72. package/types/transform/BaseEntrypoint.d.ts +3 -1
  73. package/types/transform/BaseEntrypoint.js +5 -1
  74. package/types/transform/Entrypoint.d.ts +9 -0
  75. package/types/transform/Entrypoint.js +73 -20
  76. package/types/transform/EvaluatedEntrypoint.d.ts +2 -0
  77. package/types/transform/barrelManifest.d.ts +42 -0
  78. package/types/transform/barrelManifest.js +300 -0
  79. package/types/transform/generators/getExports.js +5 -0
  80. package/types/transform/generators/processEntrypoint.js +26 -1
  81. package/types/transform/generators/resolveImports.js +29 -5
  82. package/types/transform/generators/rewriteBarrelImports.d.ts +15 -0
  83. package/types/transform/generators/rewriteBarrelImports.js +815 -0
  84. package/types/transform/generators/transform.js +148 -19
  85. package/types/transform/types.d.ts +2 -0
  86. package/types/utils/getTagProcessor.js +15 -0
  87. 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 (fileEntrypoint && !visitedFiles.has(filename)) {
125
+ if (!visitedFiles.has(filename) && (fileEntrypoint || this.hasCachedDependencies(filename))) {
106
126
  visitedFiles.add(filename);
107
- for (const [, dependency] of fileEntrypoint.dependencies) {
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
- let resolved = this.moduleImpl._resolveFilename(strippedId, {
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