@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
@@ -9,8 +9,10 @@ exports.transform = transform;
9
9
  const buildOptions_1 = require("../../options/buildOptions");
10
10
  const dynamic_import_1 = __importDefault(require("../../plugins/dynamic-import"));
11
11
  const preeval_1 = __importDefault(require("../../plugins/preeval"));
12
+ const shaker_1 = require("../../shaker");
12
13
  const TransformMetadata_1 = require("../../utils/TransformMetadata");
13
14
  const getPluginKey_1 = require("../../utils/getPluginKey");
15
+ const rewriteBarrelImports_1 = require("./rewriteBarrelImports");
14
16
  const EMPTY_FILE = '=== empty file ===';
15
17
  const hasKeyInList = (plugin, list) => {
16
18
  const pluginKey = (0, getPluginKey_1.getPluginKey)(plugin);
@@ -41,34 +43,57 @@ function runPreevalStage(babel, evalConfig, pluginOptions, code, originalAst, ev
41
43
  }
42
44
  return result;
43
45
  }
44
- const prepareCode = (services, item, originalAst) => {
45
- const { log, only, loadedAndParsed } = item;
46
+ const isPrevalOnly = (only) => only.length === 1 && only[0] === '__wywPreval';
47
+ const prepareEvaluatorInput = (services, item, originalAst) => {
48
+ const { only, loadedAndParsed, log } = item;
46
49
  if (loadedAndParsed.evaluator === 'ignored') {
47
- log('is ignored');
48
- return [loadedAndParsed.code ?? '', null, null];
50
+ throw new Error(`Cannot prepare ignored entrypoint ${item.name}`);
49
51
  }
50
- const { code, evalConfig, evaluator } = loadedAndParsed;
52
+ const { code, evalConfig } = loadedAndParsed;
51
53
  const { options, babel, eventEmitter } = services;
52
54
  const { pluginOptions } = options;
53
55
  const preevalStageResult = eventEmitter.perf('transform:preeval', () => runPreevalStage(babel, evalConfig, pluginOptions, code, originalAst, eventEmitter));
54
56
  const transformMetadata = (0, TransformMetadata_1.getTransformMetadata)(preevalStageResult.metadata);
55
- if (only.length === 1 && only[0] === '__wywPreval' && !transformMetadata) {
57
+ if (isPrevalOnly(only) && !transformMetadata) {
56
58
  log('[evaluator:end] no metadata');
57
- return [preevalStageResult.code, null, null];
59
+ return {
60
+ kind: 'short-circuit',
61
+ code: preevalStageResult.code,
62
+ };
58
63
  }
59
64
  log('[preeval] metadata %O', transformMetadata);
60
- log('[evaluator:start] using %s', evaluator.name);
61
- log.extend('source')('%s', preevalStageResult.code);
62
- const evaluatorConfig = {
63
- onlyExports: only,
64
- highPriorityPlugins: pluginOptions.highPriorityPlugins,
65
- features: pluginOptions.features,
66
- importOverrides: pluginOptions.importOverrides,
67
- root: options.root,
65
+ return {
66
+ kind: 'continue',
67
+ ast: preevalStageResult.ast,
68
+ code: preevalStageResult.code,
69
+ evalConfig,
70
+ evaluatorConfig: {
71
+ onlyExports: only,
72
+ highPriorityPlugins: pluginOptions.highPriorityPlugins,
73
+ features: pluginOptions.features,
74
+ importOverrides: pluginOptions.importOverrides,
75
+ root: options.root,
76
+ },
77
+ metadata: transformMetadata ?? null,
68
78
  };
69
- const [, transformedCode, imports] = eventEmitter.perf('transform:evaluator', () => evaluator(evalConfig, preevalStageResult.ast, preevalStageResult.code, evaluatorConfig, babel));
79
+ };
80
+ const prepareCode = (services, item, originalAst) => {
81
+ const { log, loadedAndParsed } = item;
82
+ if (loadedAndParsed.evaluator === 'ignored') {
83
+ log('is ignored');
84
+ return [loadedAndParsed.code ?? '', null, null];
85
+ }
86
+ const { evaluator } = loadedAndParsed;
87
+ const { babel, eventEmitter } = services;
88
+ const prepared = prepareEvaluatorInput(services, item, originalAst);
89
+ if (prepared.kind === 'short-circuit') {
90
+ return [prepared.code, null, null];
91
+ }
92
+ log('[evaluator:start] using %s', evaluator.name);
93
+ log.extend('source')('%s', prepared.code);
94
+ const [, transformedCode, imports] = eventEmitter.perf('transform:evaluator', () => evaluator(prepared.evalConfig, prepared.ast, prepared.code, prepared.evaluatorConfig, babel));
70
95
  log('[evaluator:end]');
71
- return [transformedCode, imports, transformMetadata ?? null];
96
+ return [transformedCode, imports, prepared.metadata];
72
97
  };
73
98
  exports.prepareCode = prepareCode;
74
99
  function* internalTransform(prepareFn) {
@@ -119,6 +144,110 @@ function* internalTransform(prepareFn) {
119
144
  * Prepares the code for evaluation. This includes removing dead and potentially unsafe code.
120
145
  * Emits resolveImports and processImports events.
121
146
  */
122
- function transform() {
123
- return internalTransform.call(this, exports.prepareCode);
147
+ function* transform() {
148
+ const { only, loadedAndParsed, log } = this.entrypoint;
149
+ if (loadedAndParsed.evaluator === 'ignored') {
150
+ log('is ignored');
151
+ return {
152
+ code: loadedAndParsed.code ?? '',
153
+ metadata: null,
154
+ };
155
+ }
156
+ if (loadedAndParsed.evaluator !== shaker_1.shaker) {
157
+ return yield* internalTransform.call(this, exports.prepareCode);
158
+ }
159
+ log('>> (%o)', only);
160
+ const prepared = prepareEvaluatorInput(this.services, this.entrypoint, loadedAndParsed.ast);
161
+ if (prepared.kind === 'short-circuit') {
162
+ if (loadedAndParsed.code === prepared.code) {
163
+ log('<< (%o)\n === no changes ===', only);
164
+ }
165
+ else {
166
+ log('<< (%o)', only);
167
+ log.extend('source')('%s', prepared.code || EMPTY_FILE);
168
+ }
169
+ if (prepared.code === '') {
170
+ log('is skipped');
171
+ return {
172
+ code: loadedAndParsed.code ?? '',
173
+ metadata: null,
174
+ };
175
+ }
176
+ return {
177
+ code: prepared.code,
178
+ metadata: null,
179
+ };
180
+ }
181
+ log('[evaluator:start] using %s', loadedAndParsed.evaluator.name);
182
+ log.extend('source')('%s', prepared.code);
183
+ const { babel, eventEmitter } = this.services;
184
+ const [shakenAst, shakenCode, shakenImports] = eventEmitter.perf('transform:evaluator', () => (0, shaker_1.shakeToESM)(prepared.evalConfig, prepared.ast, prepared.code, prepared.evaluatorConfig, babel));
185
+ let nextAst = shakenAst;
186
+ let nextCode = shakenCode;
187
+ let nextResolvedImports = [];
188
+ if (shakenImports !== null && shakenImports.size > 0) {
189
+ const resolvedImports = yield* this.getNext('resolveImports', this.entrypoint, {
190
+ imports: shakenImports,
191
+ phase: 'initial',
192
+ });
193
+ if (resolvedImports.length > 0) {
194
+ const rewritten = yield* rewriteBarrelImports_1.rewriteOptimizedBarrelImports.call(this, shakenAst, shakenCode, resolvedImports);
195
+ nextAst = rewritten.ast;
196
+ nextCode = rewritten.code;
197
+ if (rewritten.optimizedCount > 0) {
198
+ const fullyRewrittenSources = new Set(rewritten.fullyRewrittenSources);
199
+ const partialFallbackSources = new Set(rewritten.partialFallbackSources);
200
+ for (const dependency of resolvedImports) {
201
+ if (dependency.resolved &&
202
+ (fullyRewrittenSources.has(dependency.source) ||
203
+ partialFallbackSources.has(dependency.source))) {
204
+ if (partialFallbackSources.has(dependency.source)) {
205
+ this.entrypoint.addDependency(dependency);
206
+ }
207
+ else {
208
+ this.entrypoint.addInvalidationDependency(dependency);
209
+ }
210
+ this.entrypoint.markInvalidateOnDependencyChange(dependency.resolved);
211
+ }
212
+ }
213
+ nextResolvedImports = yield* this.getNext('resolveImports', this.entrypoint, {
214
+ imports: rewritten.imports,
215
+ phase: 'rewritten',
216
+ preResolved: rewritten.preResolvedImports,
217
+ });
218
+ }
219
+ else {
220
+ nextResolvedImports = resolvedImports;
221
+ }
222
+ }
223
+ }
224
+ if (nextResolvedImports.length !== 0) {
225
+ yield [
226
+ 'processImports',
227
+ this.entrypoint,
228
+ {
229
+ resolved: nextResolvedImports,
230
+ },
231
+ ];
232
+ }
233
+ const [, preparedCode] = eventEmitter.perf('transform:emitCommonJS', () => (0, shaker_1.emitCommonJS)(prepared.evalConfig, nextAst, nextCode, babel));
234
+ log('[evaluator:end]');
235
+ if (loadedAndParsed.code === preparedCode) {
236
+ log('<< (%o)\n === no changes ===', only);
237
+ }
238
+ else {
239
+ log('<< (%o)', only);
240
+ log.extend('source')('%s', preparedCode || EMPTY_FILE);
241
+ }
242
+ if (preparedCode === '') {
243
+ log('is skipped');
244
+ return {
245
+ code: loadedAndParsed.code ?? '',
246
+ metadata: null,
247
+ };
248
+ }
249
+ return {
250
+ code: preparedCode,
251
+ metadata: prepared.metadata,
252
+ };
124
253
  }
@@ -123,6 +123,8 @@ export interface IProcessImportsAction extends IBaseAction<IProcessImportsAction
123
123
  }
124
124
  export interface IResolveImportsAction extends IBaseAction<IResolveImportsAction, IEntrypointDependency[], {
125
125
  imports: Map<string, string[]> | null;
126
+ phase?: 'initial' | 'rewritten';
127
+ preResolved?: IEntrypointDependency[];
126
128
  }> {
127
129
  type: 'resolveImports';
128
130
  }