packtory 0.0.87 → 0.0.88

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 (51) hide show
  1. package/dead-code-eliminator/analyzed-bundle.d.ts +1 -0
  2. package/dead-code-eliminator/analyzed-bundle.d.ts.map +1 -1
  3. package/dead-code-eliminator/analyzed-bundle.js.map +1 -1
  4. package/dead-code-eliminator/code-file-analyzer.js +10 -3
  5. package/dead-code-eliminator/code-file-analyzer.js.map +1 -1
  6. package/dead-code-eliminator/dependency-metadata.js +206 -0
  7. package/dead-code-eliminator/dependency-metadata.js.map +1 -0
  8. package/dead-code-eliminator/eliminator.js +5 -294
  9. package/dead-code-eliminator/eliminator.js.map +1 -1
  10. package/dead-code-eliminator/expression-unwrapping.js.map +1 -1
  11. package/dead-code-eliminator/imported-expression-origin.js +23 -11
  12. package/dead-code-eliminator/imported-expression-origin.js.map +1 -1
  13. package/dead-code-eliminator/liveness/asset-side-effects.js +10 -0
  14. package/dead-code-eliminator/liveness/asset-side-effects.js.map +1 -0
  15. package/dead-code-eliminator/liveness/boolean-facts.js +99 -0
  16. package/dead-code-eliminator/liveness/boolean-facts.js.map +1 -0
  17. package/dead-code-eliminator/liveness/external-module-resolution.js +173 -0
  18. package/dead-code-eliminator/liveness/external-module-resolution.js.map +1 -0
  19. package/dead-code-eliminator/liveness/external-purity-summary.js +295 -0
  20. package/dead-code-eliminator/liveness/external-purity-summary.js.map +1 -0
  21. package/dead-code-eliminator/liveness/external-purity.js +40 -0
  22. package/dead-code-eliminator/liveness/external-purity.js.map +1 -0
  23. package/dead-code-eliminator/liveness/module-analysis.js +28 -0
  24. package/dead-code-eliminator/liveness/module-analysis.js.map +1 -0
  25. package/dead-code-eliminator/liveness/resource-retention.js +79 -0
  26. package/dead-code-eliminator/liveness/resource-retention.js.map +1 -0
  27. package/dead-code-eliminator/liveness/runtime-code.js +16 -0
  28. package/dead-code-eliminator/liveness/runtime-code.js.map +1 -0
  29. package/dead-code-eliminator/load-bundle.js +25 -9
  30. package/dead-code-eliminator/load-bundle.js.map +1 -1
  31. package/dead-code-eliminator/pure-expression.js +18 -6
  32. package/dead-code-eliminator/pure-expression.js.map +1 -1
  33. package/dead-code-eliminator/reachability/local-seed-gathering.js +1 -2
  34. package/dead-code-eliminator/reachability/local-seed-gathering.js.map +1 -1
  35. package/dead-code-eliminator/side-effect-classifier.js +23 -10
  36. package/dead-code-eliminator/side-effect-classifier.js.map +1 -1
  37. package/dead-code-eliminator/side-effects-field.js +2 -2
  38. package/dead-code-eliminator/side-effects-field.js.map +1 -1
  39. package/dead-code-eliminator/statement-classifiers.js +2 -7
  40. package/dead-code-eliminator/statement-classifiers.js.map +1 -1
  41. package/dead-code-eliminator/transform/declaration-removal.js +4 -0
  42. package/dead-code-eliminator/transform/declaration-removal.js.map +1 -1
  43. package/package.json +3 -3
  44. package/packages/package-processor.composition.d.ts.map +1 -1
  45. package/packages/package-processor.composition.js +1 -2
  46. package/packages/package-processor.composition.js.map +1 -1
  47. package/packtory/package-processor-build.js +6 -1
  48. package/packtory/package-processor-build.js.map +1 -1
  49. package/packtory/stages/package-analysis-stage.js +27 -0
  50. package/packtory/stages/package-analysis-stage.js.map +1 -1
  51. package/sbom.cdx.json +15 -15
@@ -0,0 +1,295 @@
1
+ import { Node as TsMorphNode, SyntaxKind } from 'ts-morph';
2
+ import { unwrapExpression } from "../expression-unwrapping.js";
3
+ import { resolveModuleSourceFile } from "./external-module-resolution.js";
4
+ const noExportEntries = [];
5
+ function isProjectSummaryStore(value) {
6
+ return value instanceof Map;
7
+ }
8
+ function projectSummaryCache(project) {
9
+ const stored = Reflect.get(project, projectSummaryCache.name);
10
+ const cache = isProjectSummaryStore(stored) ? stored : new Map();
11
+ Reflect.set(project, projectSummaryCache.name, cache);
12
+ return cache;
13
+ }
14
+ function kindIsTextOrNumberReturnLeaf(kind) {
15
+ return kind === SyntaxKind.StringLiteral || kind === SyntaxKind.NumericLiteral;
16
+ }
17
+ function kindIsBooleanReturnLeaf(kind) {
18
+ return kind === SyntaxKind.TrueKeyword || kind === SyntaxKind.FalseKeyword;
19
+ }
20
+ function kindIsPureReturnLeaf(kind) {
21
+ return kindIsTextOrNumberReturnLeaf(kind) ||
22
+ kindIsBooleanReturnLeaf(kind) ||
23
+ kind === SyntaxKind.NullKeyword;
24
+ }
25
+ function arrowReturnExpressionFrom(functionLike) {
26
+ const body = functionLike.getBody();
27
+ return TsMorphNode.isExpression(body) ? body : undefined;
28
+ }
29
+ function blockFromFunctionLike(functionLike) {
30
+ return functionLike.getBody()?.asKind(SyntaxKind.Block);
31
+ }
32
+ function blockReturnExpressionFrom(functionLike) {
33
+ const body = blockFromFunctionLike(functionLike);
34
+ if (body === undefined) {
35
+ return undefined;
36
+ }
37
+ const [statement] = body.getStatements();
38
+ return TsMorphNode.isReturnStatement(statement) ? statement.getExpression() : undefined;
39
+ }
40
+ function returnExpressionFrom(functionLike) {
41
+ if (TsMorphNode.isArrowFunction(functionLike)) {
42
+ return arrowReturnExpressionFrom(functionLike);
43
+ }
44
+ return blockReturnExpressionFrom(functionLike);
45
+ }
46
+ function expressionIsPureReturnStructure(expression) {
47
+ return TsMorphNode.isObjectLiteralExpression(expression) ||
48
+ TsMorphNode.isArrayLiteralExpression(expression) ||
49
+ TsMorphNode.isArrowFunction(expression) ||
50
+ TsMorphNode.isFunctionExpression(expression);
51
+ }
52
+ function expressionIsPureReturnValue(expression) {
53
+ const unwrapped = unwrapExpression(expression);
54
+ return kindIsPureReturnLeaf(unwrapped.getKind()) || expressionIsPureReturnStructure(unwrapped);
55
+ }
56
+ function functionLikeIsPureBuilder(functionLike) {
57
+ if (functionLike.getFullText().includes('@__NO_SIDE_EFFECTS__')) {
58
+ return true;
59
+ }
60
+ const expression = returnExpressionFrom(functionLike);
61
+ return expression !== undefined && expressionIsPureReturnValue(expression);
62
+ }
63
+ function callablePurity(functionLike) {
64
+ return functionLikeIsPureBuilder(functionLike) ? 'pure-callable' : 'unknown';
65
+ }
66
+ function propertyInitializerPurity(initializer) {
67
+ if (TsMorphNode.isFunctionExpression(initializer) || TsMorphNode.isArrowFunction(initializer)) {
68
+ return callablePurity(initializer);
69
+ }
70
+ return TsMorphNode.isObjectLiteralExpression(initializer) ? 'pure-object' : 'unknown';
71
+ }
72
+ function supportedObjectProperty(property) {
73
+ if (TsMorphNode.isMethodDeclaration(property) || TsMorphNode.isPropertyAssignment(property)) {
74
+ return property;
75
+ }
76
+ return undefined;
77
+ }
78
+ function propertyPurity(property) {
79
+ if (TsMorphNode.isMethodDeclaration(property)) {
80
+ return callablePurity(property);
81
+ }
82
+ return propertyInitializerPurity(property.getInitializerOrThrow());
83
+ }
84
+ function propertyName(property) {
85
+ const nameNode = property.getNameNode();
86
+ return TsMorphNode.isStringLiteral(nameNode) ? nameNode.getLiteralText() : property.getName();
87
+ }
88
+ function functionLikeReturnObjectEntries(exportName, functionLike, collectObjectEntries) {
89
+ const unwrapped = unwrapExpression(returnExpressionFrom(functionLike));
90
+ return TsMorphNode.isObjectLiteralExpression(unwrapped)
91
+ ? collectObjectEntries(exportName, unwrapped, undefined)
92
+ : noExportEntries;
93
+ }
94
+ function methodReturnObjectEntries(propertyPath, property, collectObjectEntries) {
95
+ return TsMorphNode.isMethodDeclaration(property)
96
+ ? functionLikeReturnObjectEntries(propertyPath, property, collectObjectEntries)
97
+ : noExportEntries;
98
+ }
99
+ function propertyAssignmentReturnObjectEntries(propertyPath, property, collectObjectEntries) {
100
+ if (!TsMorphNode.isPropertyAssignment(property)) {
101
+ return noExportEntries;
102
+ }
103
+ const initializer = property.getInitializerOrThrow();
104
+ return TsMorphNode.isFunctionExpression(initializer) || TsMorphNode.isArrowFunction(initializer)
105
+ ? functionLikeReturnObjectEntries(propertyPath, initializer, collectObjectEntries)
106
+ : noExportEntries;
107
+ }
108
+ function objectPropertyExportEntries(exportName, property, collectObjectEntries) {
109
+ const supportedProperty = supportedObjectProperty(property);
110
+ if (supportedProperty === undefined) {
111
+ return noExportEntries;
112
+ }
113
+ const name = propertyName(supportedProperty);
114
+ const propertyPath = `${exportName}.${name}`;
115
+ return [
116
+ [propertyPath, propertyPurity(supportedProperty)],
117
+ ...methodReturnObjectEntries(propertyPath, supportedProperty, collectObjectEntries),
118
+ ...propertyAssignmentReturnObjectEntries(propertyPath, supportedProperty, collectObjectEntries)
119
+ ];
120
+ }
121
+ function objectLiteralExportEntries(exportName, initializer, selfPurity) {
122
+ const entries = [];
123
+ for (const property of initializer.getProperties()) {
124
+ entries.push(...objectPropertyExportEntries(exportName, property, objectLiteralExportEntries));
125
+ }
126
+ if (selfPurity !== undefined) {
127
+ entries.push([exportName, selfPurity]);
128
+ }
129
+ return entries;
130
+ }
131
+ function variableExportEntries(declaration) {
132
+ const initializer = declaration.getInitializer();
133
+ const name = declaration.getName();
134
+ if (TsMorphNode.isObjectLiteralExpression(initializer)) {
135
+ return objectLiteralExportEntries(name, initializer, 'pure-object');
136
+ }
137
+ if (TsMorphNode.isFunctionExpression(initializer) || TsMorphNode.isArrowFunction(initializer)) {
138
+ return [
139
+ [name, callablePurity(initializer)],
140
+ ...functionLikeReturnObjectEntries(name, initializer, objectLiteralExportEntries)
141
+ ];
142
+ }
143
+ return noExportEntries;
144
+ }
145
+ function addVariableExport(declaration, context) {
146
+ for (const [name, purity] of variableExportEntries(declaration)) {
147
+ context.exportPurities.set(name, purity);
148
+ }
149
+ }
150
+ function mergeExports(context, prefix, source) {
151
+ for (const [key, value] of source) {
152
+ context.exportPurities.set(prefix === '' ? key : `${prefix}.${key}`, value);
153
+ }
154
+ if (prefix !== '') {
155
+ context.exportPurities.set(prefix, 'pure-object');
156
+ }
157
+ }
158
+ function resolvedModuleSummary(context, moduleSpecifier) {
159
+ const target = resolveModuleSourceFile(moduleSpecifier, context.sourceFile);
160
+ return target === undefined ? undefined : context.buildSummary(target);
161
+ }
162
+ function sourceExportPrefix(sourceName) {
163
+ return `${sourceName}.`;
164
+ }
165
+ function importedNamespaceSources(sourceFile) {
166
+ const namespaces = new Map();
167
+ for (const declaration of sourceFile.getImportDeclarations()) {
168
+ const namespace = declaration.getNamespaceImport();
169
+ if (namespace !== undefined) {
170
+ namespaces.set(namespace.getText(), declaration.getModuleSpecifierValue());
171
+ }
172
+ }
173
+ return namespaces;
174
+ }
175
+ function mergeNestedNamedExport(context, sourceName, exportedName, summary) {
176
+ const prefix = sourceExportPrefix(sourceName);
177
+ for (const [key, value] of summary.exports) {
178
+ if (key.startsWith(prefix)) {
179
+ context.exportPurities.set(`${exportedName}.${key.slice(prefix.length)}`, value);
180
+ }
181
+ }
182
+ }
183
+ function mergeNamedExport(context, namedExport, summary) {
184
+ const sourceName = namedExport.getName();
185
+ const exportedName = namedExport.getAliasNode()?.getText() ?? sourceName;
186
+ context.exportPurities.set(exportedName, summary.exports.get(sourceName) ?? 'unknown');
187
+ mergeNestedNamedExport(context, sourceName, exportedName, summary);
188
+ }
189
+ function mergeNamedExports(context, declaration, summary) {
190
+ for (const namedExport of declaration.getNamedExports()) {
191
+ mergeNamedExport(context, namedExport, summary);
192
+ }
193
+ }
194
+ function mergeModuleExportsByKind(context, declaration, summary) {
195
+ if (declaration.getNamedExports().length === 0) {
196
+ mergeExports(context, '', summary.exports);
197
+ return;
198
+ }
199
+ mergeNamedExports(context, declaration, summary);
200
+ }
201
+ function mergeModuleExportDeclaration(context, declaration, moduleSpecifier) {
202
+ const summary = resolvedModuleSummary(context, moduleSpecifier);
203
+ if (summary === undefined) {
204
+ return;
205
+ }
206
+ const namespaceExport = declaration.getNamespaceExport();
207
+ if (namespaceExport !== undefined) {
208
+ mergeExports(context, namespaceExport.getName(), summary.exports);
209
+ return;
210
+ }
211
+ mergeModuleExportsByKind(context, declaration, summary);
212
+ }
213
+ function mergeNamespaceReexport(context, namedExport, namespaceSource) {
214
+ const summary = resolvedModuleSummary(context, namespaceSource);
215
+ if (summary === undefined) {
216
+ return;
217
+ }
218
+ const sourceName = namedExport.getName();
219
+ const exportedName = namedExport.getAliasNode()?.getText() ?? sourceName;
220
+ mergeExports(context, exportedName, summary.exports);
221
+ }
222
+ function mergeLocalExportDeclaration(context, declaration) {
223
+ for (const namedExport of declaration.getNamedExports()) {
224
+ const namespaceSource = context.namespaces.get(namedExport.getName());
225
+ if (namespaceSource !== undefined) {
226
+ mergeNamespaceReexport(context, namedExport, namespaceSource);
227
+ }
228
+ }
229
+ }
230
+ function mergeExportDeclaration(context, declaration) {
231
+ const moduleSpecifier = declaration.getModuleSpecifierValue();
232
+ if (moduleSpecifier !== undefined) {
233
+ mergeModuleExportDeclaration(context, declaration, moduleSpecifier);
234
+ return;
235
+ }
236
+ mergeLocalExportDeclaration(context, declaration);
237
+ }
238
+ function addFunctionExport(statement, context) {
239
+ if (!TsMorphNode.isFunctionDeclaration(statement) || !statement.isExported()) {
240
+ return;
241
+ }
242
+ const name = statement.getName();
243
+ if (name !== undefined) {
244
+ context.exportPurities.set(name, callablePurity(statement));
245
+ }
246
+ }
247
+ function addVariableStatementExports(statement, context) {
248
+ if (!TsMorphNode.isVariableStatement(statement) || !statement.isExported()) {
249
+ return;
250
+ }
251
+ for (const declaration of statement.getDeclarations()) {
252
+ addVariableExport(declaration, context);
253
+ }
254
+ }
255
+ function mergeStatementExports(context, statement) {
256
+ addFunctionExport(statement, context);
257
+ addVariableStatementExports(statement, context);
258
+ if (TsMorphNode.isExportDeclaration(statement)) {
259
+ mergeExportDeclaration(context, statement);
260
+ }
261
+ }
262
+ function summaryContext(sourceFile, exportPurities, buildSummary) {
263
+ return {
264
+ sourceFile,
265
+ namespaces: importedNamespaceSources(sourceFile),
266
+ exportPurities,
267
+ buildSummary
268
+ };
269
+ }
270
+ function createExternalPuritySummary(sourceFile, cache, buildSummary) {
271
+ const exportPurities = new Map();
272
+ const summary = { exports: exportPurities };
273
+ cache.set(sourceFile.getFilePath(), summary);
274
+ const context = summaryContext(sourceFile, exportPurities, buildSummary);
275
+ for (const statement of sourceFile.getStatements()) {
276
+ mergeStatementExports(context, statement);
277
+ }
278
+ return summary;
279
+ }
280
+ function buildExternalPuritySummary(sourceFile) {
281
+ const cache = projectSummaryCache(sourceFile.getProject());
282
+ const cached = cache.get(sourceFile.getFilePath());
283
+ return cached ?? createExternalPuritySummary(sourceFile, cache, buildExternalPuritySummary);
284
+ }
285
+ function exportKey(origin) {
286
+ return origin.path.join('.');
287
+ }
288
+ export function exportPurityForOrigin(origin, containingSourceFile) {
289
+ const sourceFile = resolveModuleSourceFile(origin.from, containingSourceFile);
290
+ if (sourceFile === undefined) {
291
+ return 'unknown';
292
+ }
293
+ return buildExternalPuritySummary(sourceFile).exports.get(exportKey(origin)) ?? 'unknown';
294
+ }
295
+ //# sourceMappingURL=external-purity-summary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"external-purity-summary.js","sourceRoot":"","sources":["../../../../../source/dead-code-eliminator/liveness/external-purity-summary.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import { Node as TsMorphNode } from 'ts-morph';
2
+ import { arePureCallArguments, resolveImportedExpressionPath } from "../imported-expression-origin.js";
3
+ import { exportPurityForOrigin } from "./external-purity-summary.js";
4
+ function originForPureCall(expression, recurse, resolveOrigin) {
5
+ const origin = resolveOrigin(expression.getExpression(), recurse);
6
+ if (origin === undefined || !arePureCallArguments(expression.getArguments(), recurse)) {
7
+ return undefined;
8
+ }
9
+ return exportPurityForOrigin(origin, expression.getSourceFile()) === 'pure-callable'
10
+ ? origin
11
+ : undefined;
12
+ }
13
+ function fluentOriginForCall(expression, recurse, resolveOrigin) {
14
+ if (!TsMorphNode.isCallExpression(expression)) {
15
+ return resolveImportedExpressionPath(expression);
16
+ }
17
+ return originForPureCall(expression, recurse, resolveOrigin);
18
+ }
19
+ function appendOriginPath(origin, segment) {
20
+ return origin === undefined
21
+ ? undefined
22
+ : { from: origin.from, path: [...origin.path, segment] };
23
+ }
24
+ function propertyAccessOrigin(expression, recurse, resolveOrigin) {
25
+ if (!TsMorphNode.isPropertyAccessExpression(expression)) {
26
+ return undefined;
27
+ }
28
+ return appendOriginPath(fluentOriginForCall(expression.getExpression(), recurse, resolveOrigin), expression.getName());
29
+ }
30
+ function externalCalleeOrigin(expression, recurse) {
31
+ const directOrigin = resolveImportedExpressionPath(expression);
32
+ if (directOrigin !== undefined) {
33
+ return directOrigin;
34
+ }
35
+ return propertyAccessOrigin(expression, recurse, externalCalleeOrigin);
36
+ }
37
+ export function externalCallIsPure(expression, recurse) {
38
+ return originForPureCall(expression, recurse, externalCalleeOrigin) !== undefined;
39
+ }
40
+ //# sourceMappingURL=external-purity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"external-purity.js","sourceRoot":"","sources":["../../../../../source/dead-code-eliminator/liveness/external-purity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,IAAI,WAAW,EAAwC,MAAM,UAAU,CAAC;AACrF,OAAO,EACH,oBAAoB,EACpB,6BAA6B,EAGhC,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAOrE,SAAS,iBAAiB,CACtB,UAA0B,EAC1B,OAAgC,EAChC,aAA6B;IAE7B,MAAM,MAAM,GAAG,aAAa,CAAC,UAAU,CAAC,aAAa,EAAE,EAAE,OAAO,CAAC,CAAC;IAClE,IAAI,MAAM,KAAK,SAAS,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC,YAAY,EAAE,EAAE,OAAO,CAAC,EAAE,CAAC;QACpF,OAAO,SAAS,CAAC;IACrB,CAAC;IACD,OAAO,qBAAqB,CAAC,MAAM,EAAE,UAAU,CAAC,aAAa,EAAE,CAAC,KAAK,eAAe;QAChF,CAAC,CAAC,MAAM;QACR,CAAC,CAAC,SAAS,CAAC;AACpB,CAAC;AAED,SAAS,mBAAmB,CACxB,UAAsB,EACtB,OAAgC,EAChC,aAA6B;IAE7B,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5C,OAAO,6BAA6B,CAAC,UAAU,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,iBAAiB,CAAC,UAAU,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC;AACjE,CAAC;AAED,SAAS,gBAAgB,CACrB,MAA4C,EAC5C,OAAe;IAEf,OAAO,MAAM,KAAK,SAAS;QACvB,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,CAAE,GAAG,MAAM,CAAC,IAAI,EAAE,OAAO,CAAE,EAAE,CAAC;AACnE,CAAC;AAED,SAAS,oBAAoB,CACzB,UAAsB,EACtB,OAAgC,EAChC,aAA6B;IAE7B,IAAI,CAAC,WAAW,CAAC,0BAA0B,CAAC,UAAU,CAAC,EAAE,CAAC;QACtD,OAAO,SAAS,CAAC;IACrB,CAAC;IACD,OAAO,gBAAgB,CACnB,mBAAmB,CAAC,UAAU,CAAC,aAAa,EAAE,EAAE,OAAO,EAAE,aAAa,CAAC,EACvE,UAAU,CAAC,OAAO,EAAE,CACvB,CAAC;AACN,CAAC;AAED,SAAS,oBAAoB,CACzB,UAAsB,EACtB,OAAgC;IAEhC,MAAM,YAAY,GAAG,6BAA6B,CAAC,UAAU,CAAC,CAAC;IAC/D,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;QAC7B,OAAO,YAAY,CAAC;IACxB,CAAC;IACD,OAAO,oBAAoB,CAAC,UAAU,EAAE,OAAO,EAAE,oBAAoB,CAAC,CAAC;AAC3E,CAAC;AAED,MAAM,UAAU,kBAAkB,CAC9B,UAA0B,EAC1B,OAAgC;IAEhC,OAAO,iBAAiB,CAAC,UAAU,EAAE,OAAO,EAAE,oBAAoB,CAAC,KAAK,SAAS,CAAC;AACtF,CAAC"}
@@ -0,0 +1,28 @@
1
+ import { classifySideEffects } from "../side-effect-classifier.js";
2
+ import { isDeclarationCodeTargetPath, isRuntimeCodeTargetPath } from "./runtime-code.js";
3
+ function moduleKindForTargetPath(targetFilePath) {
4
+ if (isDeclarationCodeTargetPath(targetFilePath)) {
5
+ return 'declaration';
6
+ }
7
+ if (isRuntimeCodeTargetPath(targetFilePath)) {
8
+ return 'runtime';
9
+ }
10
+ if (targetFilePath.endsWith('.map')) {
11
+ return 'source-map';
12
+ }
13
+ return targetFilePath.includes('.') ? 'asset' : 'other';
14
+ }
15
+ export function buildModuleAnalysis(input) {
16
+ return {
17
+ sourceFilePath: input.sourceFilePath,
18
+ targetFilePath: input.targetFilePath,
19
+ kind: moduleKindForTargetPath(input.targetFilePath),
20
+ declarations: input.bindings.map(function (binding) {
21
+ return { name: binding.name, exported: binding.isExported };
22
+ }),
23
+ effects: input.sourceFile === undefined
24
+ ? []
25
+ : classifySideEffects(input.sourceFile, input.deadCodeElimination)
26
+ };
27
+ }
28
+ //# sourceMappingURL=module-analysis.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module-analysis.js","sourceRoot":"","sources":["../../../../../source/dead-code-eliminator/liveness/module-analysis.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,EAAE,2BAA2B,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAyBzF,SAAS,uBAAuB,CAAC,cAAsB;IACnD,IAAI,2BAA2B,CAAC,cAAc,CAAC,EAAE,CAAC;QAC9C,OAAO,aAAa,CAAC;IACzB,CAAC;IACD,IAAI,uBAAuB,CAAC,cAAc,CAAC,EAAE,CAAC;QAC1C,OAAO,SAAS,CAAC;IACrB,CAAC;IACD,IAAI,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAClC,OAAO,YAAY,CAAC;IACxB,CAAC;IACD,OAAO,cAAc,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAA0B;IAC1D,OAAO;QACH,cAAc,EAAE,KAAK,CAAC,cAAc;QACpC,cAAc,EAAE,KAAK,CAAC,cAAc;QACpC,IAAI,EAAE,uBAAuB,CAAC,KAAK,CAAC,cAAc,CAAC;QACnD,YAAY,EAAE,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,OAAO;YAC9C,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC;QAChE,CAAC,CAAC;QACF,OAAO,EAAE,KAAK,CAAC,UAAU,KAAK,SAAS;YACnC,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,mBAAmB,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,mBAAmB,CAAC;KACzE,CAAC;AACN,CAAC"}
@@ -0,0 +1,79 @@
1
+ import { isDeclarationCodeTargetPath, isRuntimeCodeTargetPath } from "./runtime-code.js";
2
+ function rootSourceFilePaths(bundle) {
3
+ const paths = new Set();
4
+ for (const root of Object.values(bundle.roots)) {
5
+ paths.add(root.js.sourceFilePath);
6
+ if (root.declarationFile !== undefined) {
7
+ paths.add(root.declarationFile.sourceFilePath);
8
+ }
9
+ }
10
+ return paths;
11
+ }
12
+ function resourceHasSurvivingRuntime(resource) {
13
+ return resource.analysis.sideEffectStatements.length > 0 || resource.analysis.survivingBindings.size > 0;
14
+ }
15
+ function shouldSeedResource(resource, rootPaths) {
16
+ const { targetFilePath } = resource.fileDescription;
17
+ return (rootPaths.has(resource.fileDescription.sourceFilePath) ||
18
+ resource.isExplicitlyIncluded ||
19
+ !isRuntimeCodeTargetPath(targetFilePath) && !isDeclarationCodeTargetPath(targetFilePath) ||
20
+ resourceHasSurvivingRuntime(resource));
21
+ }
22
+ function indexResourcesBySourcePath(contents) {
23
+ return new Map(contents.map(function (resource) {
24
+ return [resource.fileDescription.sourceFilePath, resource];
25
+ }));
26
+ }
27
+ function retentionSeeds(contents, rootPaths) {
28
+ return contents
29
+ .filter(function (resource) {
30
+ return shouldSeedResource(resource, rootPaths);
31
+ })
32
+ .map(function (resource) {
33
+ return resource.fileDescription.sourceFilePath;
34
+ });
35
+ }
36
+ function retainedSourcePaths(bundle, contents) {
37
+ const rootPaths = rootSourceFilePaths(bundle);
38
+ const resourcesBySourcePath = indexResourcesBySourcePath(contents);
39
+ const pending = Array.from(retentionSeeds(contents, rootPaths));
40
+ const retained = new Set();
41
+ function retain(sourceFilePath) {
42
+ const resource = resourcesBySourcePath.get(sourceFilePath);
43
+ if (resource !== undefined && !retained.has(sourceFilePath)) {
44
+ retained.add(sourceFilePath);
45
+ pending.push(...resource.directDependencies);
46
+ }
47
+ }
48
+ for (const sourceFilePath of pending) {
49
+ retain(sourceFilePath);
50
+ }
51
+ return retained;
52
+ }
53
+ function isPrunedResource(resource, retained) {
54
+ return !retained.has(resource.fileDescription.sourceFilePath);
55
+ }
56
+ function prunedMapTargetPaths(contents, retained) {
57
+ return new Set(contents
58
+ .filter(function (resource) {
59
+ return isPrunedResource(resource, retained);
60
+ })
61
+ .map(function (resource) {
62
+ return `${resource.fileDescription.targetFilePath}.map`;
63
+ }));
64
+ }
65
+ export function pruneContents(bundle, contents, transformationsEnabled) {
66
+ if (!transformationsEnabled) {
67
+ return contents;
68
+ }
69
+ const retained = retainedSourcePaths(bundle, contents);
70
+ const prunedMapTargets = prunedMapTargetPaths(contents, retained);
71
+ return contents.filter(function (resource) {
72
+ if (resource.isExplicitlyIncluded) {
73
+ return true;
74
+ }
75
+ return (retained.has(resource.fileDescription.sourceFilePath) &&
76
+ !prunedMapTargets.has(resource.fileDescription.targetFilePath));
77
+ });
78
+ }
79
+ //# sourceMappingURL=resource-retention.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resource-retention.js","sourceRoot":"","sources":["../../../../../source/dead-code-eliminator/liveness/resource-retention.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,2BAA2B,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAEzF,SAAS,mBAAmB,CAAC,MAAqC;IAC9D,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QAC7C,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC;QAClC,IAAI,IAAI,CAAC,eAAe,KAAK,SAAS,EAAE,CAAC;YACrC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC;QACnD,CAAC;IACL,CAAC;IACD,OAAO,KAAK,CAAC;AACjB,CAAC;AAED,SAAS,2BAA2B,CAAC,QAAgC;IACjE,OAAO,QAAQ,CAAC,QAAQ,CAAC,oBAAoB,CAAC,MAAM,GAAG,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,iBAAiB,CAAC,IAAI,GAAG,CAAC,CAAC;AAC7G,CAAC;AAED,SAAS,kBAAkB,CAAC,QAAgC,EAAE,SAA8B;IACxF,MAAM,EAAE,cAAc,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;IACpD,OAAO,CACH,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,eAAe,CAAC,cAAc,CAAC;QACtD,QAAQ,CAAC,oBAAoB;QAC7B,CAAC,uBAAuB,CAAC,cAAc,CAAC,IAAI,CAAC,2BAA2B,CAAC,cAAc,CAAC;QACxF,2BAA2B,CAAC,QAAQ,CAAC,CACxC,CAAC;AACN,CAAC;AAED,SAAS,0BAA0B,CAC/B,QAA2C;IAE3C,OAAO,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,QAAQ;QAC1C,OAAO,CAAE,QAAQ,CAAC,eAAe,CAAC,cAAc,EAAE,QAAQ,CAAE,CAAC;IACjE,CAAC,CAAC,CAAC,CAAC;AACR,CAAC;AAED,SAAS,cAAc,CACnB,QAA2C,EAC3C,SAA8B;IAE9B,OAAO,QAAQ;SACV,MAAM,CAAC,UAAU,QAAQ;QACtB,OAAO,kBAAkB,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IACnD,CAAC,CAAC;SACD,GAAG,CAAC,UAAU,QAAQ;QACnB,OAAO,QAAQ,CAAC,eAAe,CAAC,cAAc,CAAC;IACnD,CAAC,CAAC,CAAC;AACX,CAAC;AAED,SAAS,mBAAmB,CACxB,MAAqC,EACrC,QAA2C;IAE3C,MAAM,SAAS,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAC9C,MAAM,qBAAqB,GAAG,0BAA0B,CAAC,QAAQ,CAAC,CAAC;IACnE,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC;IAChE,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IAEnC,SAAS,MAAM,CAAC,cAAsB;QAClC,MAAM,QAAQ,GAAG,qBAAqB,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QAC3D,IAAI,QAAQ,KAAK,SAAS,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC;YAC1D,QAAQ,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;YAC7B,OAAO,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,kBAAkB,CAAC,CAAC;QACjD,CAAC;IACL,CAAC;IAED,KAAK,MAAM,cAAc,IAAI,OAAO,EAAE,CAAC;QACnC,MAAM,CAAC,cAAc,CAAC,CAAC;IAC3B,CAAC;IACD,OAAO,QAAQ,CAAC;AACpB,CAAC;AAED,SAAS,gBAAgB,CAAC,QAAgC,EAAE,QAA6B;IACrF,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC;AAClE,CAAC;AAED,SAAS,oBAAoB,CACzB,QAA2C,EAC3C,QAA6B;IAE7B,OAAO,IAAI,GAAG,CACV,QAAQ;SACH,MAAM,CAAC,UAAU,QAAQ;QACtB,OAAO,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAChD,CAAC,CAAC;SACD,GAAG,CAAC,UAAU,QAAQ;QACnB,OAAO,GAAG,QAAQ,CAAC,eAAe,CAAC,cAAc,MAAM,CAAC;IAC5D,CAAC,CAAC,CACT,CAAC;AACN,CAAC;AAED,MAAM,UAAU,aAAa,CACzB,MAAqC,EACrC,QAA2C,EAC3C,sBAA+B;IAE/B,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAC1B,OAAO,QAAQ,CAAC;IACpB,CAAC;IACD,MAAM,QAAQ,GAAG,mBAAmB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACvD,MAAM,gBAAgB,GAAG,oBAAoB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAClE,OAAO,QAAQ,CAAC,MAAM,CAAC,UAAU,QAAQ;QACrC,IAAI,QAAQ,CAAC,oBAAoB,EAAE,CAAC;YAChC,OAAO,IAAI,CAAC;QAChB,CAAC;QACD,OAAO,CACH,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,eAAe,CAAC,cAAc,CAAC;YACrD,CAAC,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,eAAe,CAAC,cAAc,CAAC,CACjE,CAAC;IACN,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,16 @@
1
+ import path from 'node:path';
2
+ const runtimeCodeExtensions = new Set(['.cjs', '.cts', '.js', '.jsx', '.mjs', '.mts', '.ts', '.tsx']);
3
+ const declarationCodeExtensions = ['.d.ts', '.d.cts', '.d.mts'];
4
+ export function isDeclarationCodeTargetPath(targetFilePath) {
5
+ return declarationCodeExtensions.some(function (extension) {
6
+ return targetFilePath.endsWith(extension);
7
+ });
8
+ }
9
+ export function isRuntimeCodeTargetPath(targetFilePath) {
10
+ return runtimeCodeExtensions.has(path.extname(targetFilePath)) &&
11
+ !isDeclarationCodeTargetPath(targetFilePath);
12
+ }
13
+ export function isCodeTargetPath(targetFilePath) {
14
+ return isRuntimeCodeTargetPath(targetFilePath) || isDeclarationCodeTargetPath(targetFilePath);
15
+ }
16
+ //# sourceMappingURL=runtime-code.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-code.js","sourceRoot":"","sources":["../../../../../source/dead-code-eliminator/liveness/runtime-code.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,qBAAqB,GAAG,IAAI,GAAG,CAAC,CAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAE,CAAC,CAAC;AACxG,MAAM,yBAAyB,GAAG,CAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAE,CAAC;AAElE,MAAM,UAAU,2BAA2B,CAAC,cAAsB;IAC9D,OAAO,yBAAyB,CAAC,IAAI,CAAC,UAAU,SAAS;QACrD,OAAO,cAAc,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;AACP,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,cAAsB;IAC1D,OAAO,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QAC1D,CAAC,2BAA2B,CAAC,cAAc,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,cAAsB;IACnD,OAAO,uBAAuB,CAAC,cAAc,CAAC,IAAI,2BAA2B,CAAC,cAAc,CAAC,CAAC;AAClG,CAAC"}
@@ -1,3 +1,4 @@
1
+ import { declarationCompanionCandidates } from "../common/declaration-companion-paths.js";
1
2
  import { isCodeFile, isDeclarationCodeFile } from "../common/code-files.js";
2
3
  import { getEntryRootIds } from "../package-surface/root-registry.js";
3
4
  import { extractTopLevelBindings } from "./reachability/binding-extractor.js";
@@ -10,7 +11,7 @@ function loadResource(runtimeProject, declarationProject, resource) {
10
11
  return { resource };
11
12
  }
12
13
  const project = projectForResource(runtimeProject, declarationProject, resource);
13
- const sourceFile = project.createSourceFile(resource.fileDescription.sourceFilePath, resource.fileDescription.content);
14
+ const sourceFile = project.createSourceFile(resource.fileDescription.sourceFilePath, resource.fileDescription.content, { overwrite: true });
14
15
  return { resource, sourceFile, bindings: extractTopLevelBindings(sourceFile) };
15
16
  }
16
17
  function buildFileBindings(loaded) {
@@ -26,18 +27,33 @@ function buildFileBindings(loaded) {
26
27
  }
27
28
  return result;
28
29
  }
29
- function entryRootFilePathsFor(bundle) {
30
- const entryRootIds = getEntryRootIds(bundle);
30
+ function substitutionPublicModuleFilePathsFor(substitutionPublicModuleSourceFilePaths) {
31
31
  const paths = new Set();
32
- for (const rootId of entryRootIds) {
33
- const root = bundle.roots[rootId];
34
- if (root === undefined) {
35
- throw new Error(`Bundle "${bundle.name}" is missing root "${rootId}" referenced by its entry surface`);
32
+ for (const sourceFilePath of substitutionPublicModuleSourceFilePaths) {
33
+ paths.add(sourceFilePath);
34
+ for (const companionPath of declarationCompanionCandidates(sourceFilePath)) {
35
+ paths.add(companionPath);
36
36
  }
37
- paths.add(root.js.sourceFilePath);
38
37
  }
39
38
  return paths;
40
39
  }
40
+ function rootFilePathsFor(bundle, rootId) {
41
+ const root = bundle.roots[rootId];
42
+ if (root === undefined) {
43
+ throw new Error(`Bundle "${bundle.name}" is missing root "${rootId}" referenced by its entry surface`);
44
+ }
45
+ return root.declarationFile === undefined
46
+ ? [root.js.sourceFilePath]
47
+ : [root.js.sourceFilePath, root.declarationFile.sourceFilePath];
48
+ }
49
+ function entryRootFilePathsFor(bundle, substitutionPublicModuleSourceFilePaths) {
50
+ return new Set([
51
+ ...Array.from(getEntryRootIds(bundle)).flatMap(function (rootId) {
52
+ return rootFilePathsFor(bundle, rootId);
53
+ }),
54
+ ...substitutionPublicModuleFilePathsFor(substitutionPublicModuleSourceFilePaths)
55
+ ]);
56
+ }
41
57
  export function loadBundle(createProject, input) {
42
58
  const runtimeProject = createProject();
43
59
  const declarationProject = createProject();
@@ -47,7 +63,7 @@ export function loadBundle(createProject, input) {
47
63
  const fileBindings = buildFileBindings(loaded);
48
64
  const reachability = buildReachabilityIndex({
49
65
  files: fileBindings,
50
- entryPointFilePaths: entryRootFilePathsFor(input.bundle),
66
+ entryPointFilePaths: entryRootFilePathsFor(input.bundle, input.substitutionPublicModuleSourceFilePaths),
51
67
  deadCodeElimination: input.deadCodeElimination
52
68
  });
53
69
  return { input, loaded, fileBindings, reachability };
@@ -1 +1 @@
1
- {"version":3,"file":"load-bundle.js","sourceRoot":"","sources":["../../../../source/dead-code-eliminator/load-bundle.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"load-bundle.js","sourceRoot":"","sources":["../../../../source/dead-code-eliminator/load-bundle.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import { Node as TsMorphNode, SyntaxKind } from 'ts-morph';
2
2
  import { unwrapExpression } from "./expression-unwrapping.js";
3
3
  import { arePureCallArguments, resolveImportedExpressionOrigin } from "./imported-expression-origin.js";
4
+ import { externalCallIsPure } from "./liveness/external-purity.js";
4
5
  import { allowedBinaryOperators, allowedPrefixUnaryOperators, inherentlyPurePropertyKinds, pureLeafKinds } from "./syntax-kind-sets.js";
5
6
  function isPureArrayElement(element, recurse) {
6
7
  if (TsMorphNode.isOmittedExpression(element)) {
@@ -25,18 +26,29 @@ function isPureBuiltinCallExpression(callTarget, expression, recurse) {
25
26
  ? arePureCallArguments(expression.getArguments(), recurse)
26
27
  : false;
27
28
  }
29
+ function hasPureAnnotation(expression) {
30
+ const text = expression.getFullText();
31
+ return text.includes('@__PURE__') || text.includes('#__PURE__');
32
+ }
33
+ function pureAnnotationMakesCallPure(expression, recurse) {
34
+ return hasPureAnnotation(expression) && arePureCallArguments(expression.getArguments(), recurse);
35
+ }
28
36
  function isPureCallExpression(expression, recurse, settings) {
29
37
  const callTarget = unwrapExpression(expression.getExpression());
30
- return (isPureBuiltinCallExpression(callTarget, expression, recurse) ||
38
+ return (pureAnnotationMakesCallPure(expression, recurse) ||
39
+ isPureBuiltinCallExpression(callTarget, expression, recurse) ||
40
+ externalCallIsPure(expression, recurse) ||
31
41
  resolveImportedExpressionOrigin(expression, recurse, settings) !== undefined);
32
42
  }
43
+ function constructorNameIsTrusted(constructorExpression, settings) {
44
+ return TsMorphNode.isIdentifier(constructorExpression) &&
45
+ settings?.pureConstructors?.includes(constructorExpression.getText()) === true;
46
+ }
33
47
  function isPureNewExpression(expression, recurse, settings) {
34
48
  const constructorExpression = unwrapExpression(expression.getExpression());
35
- const pureConstructors = settings?.pureConstructors;
36
- return (TsMorphNode.isIdentifier(constructorExpression) &&
37
- pureConstructors !== undefined &&
38
- pureConstructors.includes(constructorExpression.getText()) &&
39
- arePureCallArguments(expression.getArguments(), recurse));
49
+ const trustedConstructorCall = constructorNameIsTrusted(constructorExpression, settings) &&
50
+ arePureCallArguments(expression.getArguments(), recurse);
51
+ return pureAnnotationMakesCallPure(expression, recurse) || trustedConstructorCall;
40
52
  }
41
53
  function templateExpressionIsPure(expression, recurse) {
42
54
  return expression