packtory 0.0.87 → 0.0.89
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundle-emitter/registry/package-metadata-fetcher.d.ts.map +1 -1
- package/bundle-emitter/registry/package-metadata-fetcher.js +1 -2
- package/bundle-emitter/registry/package-metadata-fetcher.js.map +1 -1
- package/dead-code-eliminator/analyzed-bundle.d.ts +1 -0
- package/dead-code-eliminator/analyzed-bundle.d.ts.map +1 -1
- package/dead-code-eliminator/analyzed-bundle.js.map +1 -1
- package/dead-code-eliminator/class-purity.js +17 -1
- package/dead-code-eliminator/class-purity.js.map +1 -1
- package/dead-code-eliminator/code-file-analyzer.js +10 -3
- package/dead-code-eliminator/code-file-analyzer.js.map +1 -1
- package/dead-code-eliminator/dependency-metadata.js +206 -0
- package/dead-code-eliminator/dependency-metadata.js.map +1 -0
- package/dead-code-eliminator/eliminator.js +5 -294
- package/dead-code-eliminator/eliminator.js.map +1 -1
- package/dead-code-eliminator/expression-unwrapping.js.map +1 -1
- package/dead-code-eliminator/imported-expression-origin.js +23 -11
- package/dead-code-eliminator/imported-expression-origin.js.map +1 -1
- package/dead-code-eliminator/liveness/asset-side-effects.js +10 -0
- package/dead-code-eliminator/liveness/asset-side-effects.js.map +1 -0
- package/dead-code-eliminator/liveness/boolean-facts.js +99 -0
- package/dead-code-eliminator/liveness/boolean-facts.js.map +1 -0
- package/dead-code-eliminator/liveness/external-module-resolution.js +173 -0
- package/dead-code-eliminator/liveness/external-module-resolution.js.map +1 -0
- package/dead-code-eliminator/liveness/external-purity-summary.js +295 -0
- package/dead-code-eliminator/liveness/external-purity-summary.js.map +1 -0
- package/dead-code-eliminator/liveness/external-purity.js +40 -0
- package/dead-code-eliminator/liveness/external-purity.js.map +1 -0
- package/dead-code-eliminator/liveness/module-analysis.js +28 -0
- package/dead-code-eliminator/liveness/module-analysis.js.map +1 -0
- package/dead-code-eliminator/liveness/resource-retention.js +79 -0
- package/dead-code-eliminator/liveness/resource-retention.js.map +1 -0
- package/dead-code-eliminator/liveness/runtime-code.js +16 -0
- package/dead-code-eliminator/liveness/runtime-code.js.map +1 -0
- package/dead-code-eliminator/load-bundle.js +25 -9
- package/dead-code-eliminator/load-bundle.js.map +1 -1
- package/dead-code-eliminator/pure-expression.js +74 -6
- package/dead-code-eliminator/pure-expression.js.map +1 -1
- package/dead-code-eliminator/reachability/local-seed-gathering.js +1 -2
- package/dead-code-eliminator/reachability/local-seed-gathering.js.map +1 -1
- package/dead-code-eliminator/side-effect-classifier.js +23 -10
- package/dead-code-eliminator/side-effect-classifier.js.map +1 -1
- package/dead-code-eliminator/side-effects-field.js +2 -2
- package/dead-code-eliminator/side-effects-field.js.map +1 -1
- package/dead-code-eliminator/statement-classifiers.js +33 -11
- package/dead-code-eliminator/statement-classifiers.js.map +1 -1
- package/dead-code-eliminator/syntax-kind-sets.js +2 -2
- package/dead-code-eliminator/syntax-kind-sets.js.map +1 -1
- package/dead-code-eliminator/transform/declaration-removal.js +4 -0
- package/dead-code-eliminator/transform/declaration-removal.js.map +1 -1
- package/package.json +4 -3
- package/packages/package-processor.composition.d.ts.map +1 -1
- package/packages/package-processor.composition.js +1 -2
- package/packages/package-processor.composition.js.map +1 -1
- package/packtory/package-processor-build.js +6 -1
- package/packtory/package-processor-build.js.map +1 -1
- package/packtory/packtory-pack.js +15 -5
- package/packtory/packtory-pack.js.map +1 -1
- package/packtory/packtory-results.d.ts +8 -0
- package/packtory/packtory-results.d.ts.map +1 -1
- package/packtory/packtory-results.js +1 -0
- package/packtory/packtory-results.js.map +1 -1
- package/packtory/stages/package-analysis-stage.js +27 -0
- package/packtory/stages/package-analysis-stage.js.map +1 -1
- package/sbom.cdx.json +15 -15
- package/vendor-materializer/vendor-materializer.d.ts +20 -2
- package/vendor-materializer/vendor-materializer.d.ts.map +1 -1
- package/vendor-materializer/vendor-materializer.js +36 -17
- package/vendor-materializer/vendor-materializer.js.map +1 -1
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { ts } from 'ts-morph';
|
|
3
|
+
function isRelativeOrAbsoluteSpecifier(specifier) {
|
|
4
|
+
return specifier.startsWith('.') || path.isAbsolute(specifier);
|
|
5
|
+
}
|
|
6
|
+
function scopedPackageSpecifierFrom(specifier) {
|
|
7
|
+
const [scope, name, ...rest] = specifier.split('/');
|
|
8
|
+
if (name === undefined) {
|
|
9
|
+
return undefined;
|
|
10
|
+
}
|
|
11
|
+
return {
|
|
12
|
+
packageName: `${scope}/${name}`,
|
|
13
|
+
subpath: rest.length === 0 ? '.' : `./${rest.join('/')}`
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
function unscopedPackageSpecifierFrom(specifier) {
|
|
17
|
+
const [packageName = specifier, ...rest] = specifier.split('/');
|
|
18
|
+
return {
|
|
19
|
+
packageName,
|
|
20
|
+
subpath: rest.length === 0 ? '.' : `./${rest.join('/')}`
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
function packageSpecifierFrom(specifier) {
|
|
24
|
+
if (isRelativeOrAbsoluteSpecifier(specifier) || specifier.startsWith('#')) {
|
|
25
|
+
return undefined;
|
|
26
|
+
}
|
|
27
|
+
return specifier.startsWith('@') ? scopedPackageSpecifierFrom(specifier) : unscopedPackageSpecifierFrom(specifier);
|
|
28
|
+
}
|
|
29
|
+
function hostFileExists(sourceFile, filePath) {
|
|
30
|
+
return sourceFile.getProject().getModuleResolutionHost().fileExists(filePath);
|
|
31
|
+
}
|
|
32
|
+
function hostReadFile(sourceFile, filePath) {
|
|
33
|
+
return sourceFile.getProject().getModuleResolutionHost().readFile(filePath);
|
|
34
|
+
}
|
|
35
|
+
function packageLookupDirectories(containingSourceFile) {
|
|
36
|
+
const start = path.resolve(path.dirname(containingSourceFile.getFilePath()));
|
|
37
|
+
const { root } = path.parse(start);
|
|
38
|
+
const directorySegments = path
|
|
39
|
+
.relative(root, start)
|
|
40
|
+
.split(path.sep);
|
|
41
|
+
return Array.from({ length: directorySegments.length + 1 }, function (_unusedValue, ancestorOffset) {
|
|
42
|
+
return path.join(root, ...directorySegments.slice(0, directorySegments.length - ancestorOffset));
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
function packageRootPath(specifier, containingSourceFile) {
|
|
46
|
+
for (const directory of packageLookupDirectories(containingSourceFile)) {
|
|
47
|
+
const packageRoot = path.join(directory, 'node_modules', specifier.packageName);
|
|
48
|
+
if (hostFileExists(containingSourceFile, path.join(packageRoot, 'package.json'))) {
|
|
49
|
+
return packageRoot;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return undefined;
|
|
53
|
+
}
|
|
54
|
+
function isRecord(value) {
|
|
55
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
56
|
+
}
|
|
57
|
+
function stringProperty(record, key) {
|
|
58
|
+
const value = record[key];
|
|
59
|
+
return typeof value === 'string' ? value : undefined;
|
|
60
|
+
}
|
|
61
|
+
function parsePackageManifest(filePath, content) {
|
|
62
|
+
const parsed = ts.parseConfigFileTextToJson(filePath, content);
|
|
63
|
+
return parsed.error === undefined && isRecord(parsed.config) ? parsed.config : undefined;
|
|
64
|
+
}
|
|
65
|
+
function readPackageManifest(packageRoot, containingSourceFile) {
|
|
66
|
+
const filePath = path.join(packageRoot, 'package.json');
|
|
67
|
+
const parsed = parsePackageManifest(filePath, String(hostReadFile(containingSourceFile, filePath)));
|
|
68
|
+
if (parsed === undefined) {
|
|
69
|
+
return undefined;
|
|
70
|
+
}
|
|
71
|
+
return {
|
|
72
|
+
type: stringProperty(parsed, 'type'),
|
|
73
|
+
exports: parsed.exports,
|
|
74
|
+
main: stringProperty(parsed, 'main'),
|
|
75
|
+
module: stringProperty(parsed, 'module')
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
function targetFromConditionArray(value, resolveTarget) {
|
|
79
|
+
if (!Array.isArray(value)) {
|
|
80
|
+
return undefined;
|
|
81
|
+
}
|
|
82
|
+
for (const entry of value) {
|
|
83
|
+
const target = resolveTarget(entry);
|
|
84
|
+
if (target !== undefined) {
|
|
85
|
+
return target;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return undefined;
|
|
89
|
+
}
|
|
90
|
+
function targetFromConditionRecord(value, resolveTarget) {
|
|
91
|
+
if (!isRecord(value)) {
|
|
92
|
+
return undefined;
|
|
93
|
+
}
|
|
94
|
+
return resolveTarget(value.import) ?? resolveTarget(value.default);
|
|
95
|
+
}
|
|
96
|
+
function targetFromCondition(value) {
|
|
97
|
+
if (typeof value === 'string') {
|
|
98
|
+
return value;
|
|
99
|
+
}
|
|
100
|
+
return targetFromConditionArray(value, targetFromCondition) ??
|
|
101
|
+
targetFromConditionRecord(value, targetFromCondition);
|
|
102
|
+
}
|
|
103
|
+
function targetFromRootExports(exportsValue) {
|
|
104
|
+
if (typeof exportsValue === 'string' || Array.isArray(exportsValue)) {
|
|
105
|
+
return targetFromCondition(exportsValue);
|
|
106
|
+
}
|
|
107
|
+
if (!isRecord(exportsValue)) {
|
|
108
|
+
return undefined;
|
|
109
|
+
}
|
|
110
|
+
const rootTarget = exportsValue['.'];
|
|
111
|
+
return targetFromCondition(rootTarget === undefined ? exportsValue : rootTarget);
|
|
112
|
+
}
|
|
113
|
+
function targetFromSubpathExports(exportsValue, subpath) {
|
|
114
|
+
return isRecord(exportsValue) ? targetFromCondition(exportsValue[subpath]) : undefined;
|
|
115
|
+
}
|
|
116
|
+
function targetFromExports(exportsValue, subpath) {
|
|
117
|
+
return subpath === '.'
|
|
118
|
+
? targetFromRootExports(exportsValue)
|
|
119
|
+
: targetFromSubpathExports(exportsValue, subpath);
|
|
120
|
+
}
|
|
121
|
+
function manifestFallbackTarget(manifest) {
|
|
122
|
+
if (manifest.module !== undefined) {
|
|
123
|
+
return manifest.module;
|
|
124
|
+
}
|
|
125
|
+
return manifest.type === 'module' ? manifest.main : undefined;
|
|
126
|
+
}
|
|
127
|
+
function targetIsEsm(resolved, manifest) {
|
|
128
|
+
const extension = path.extname(resolved);
|
|
129
|
+
return extension === '.mjs' || extension === '.js' && manifest.type === 'module';
|
|
130
|
+
}
|
|
131
|
+
function runtimeTargetPath(packageRoot, manifest, specifier) {
|
|
132
|
+
const target = targetFromExports(manifest.exports, specifier.subpath) ?? manifestFallbackTarget(manifest);
|
|
133
|
+
if (target === undefined) {
|
|
134
|
+
return undefined;
|
|
135
|
+
}
|
|
136
|
+
const resolved = path.resolve(packageRoot, target);
|
|
137
|
+
if (!resolved.startsWith(`${path.resolve(packageRoot)}${path.sep}`)) {
|
|
138
|
+
return undefined;
|
|
139
|
+
}
|
|
140
|
+
return targetIsEsm(resolved, manifest) ? resolved : undefined;
|
|
141
|
+
}
|
|
142
|
+
function sourceFileAtPath(project, filePath) {
|
|
143
|
+
return project.getSourceFile(filePath) ?? project.addSourceFileAtPathIfExists(filePath);
|
|
144
|
+
}
|
|
145
|
+
function resolvePackageSourceFile(specifier, containingSourceFile) {
|
|
146
|
+
const packageRoot = packageRootPath(specifier, containingSourceFile);
|
|
147
|
+
if (packageRoot === undefined) {
|
|
148
|
+
return undefined;
|
|
149
|
+
}
|
|
150
|
+
const manifest = readPackageManifest(packageRoot, containingSourceFile);
|
|
151
|
+
const targetPath = manifest === undefined ? undefined : runtimeTargetPath(packageRoot, manifest, specifier);
|
|
152
|
+
return targetPath === undefined ? undefined : sourceFileAtPath(containingSourceFile.getProject(), targetPath);
|
|
153
|
+
}
|
|
154
|
+
function resolveRelativeSourceFile(moduleSpecifier, containingSourceFile) {
|
|
155
|
+
const project = containingSourceFile.getProject();
|
|
156
|
+
const resolved = path.resolve(path.dirname(containingSourceFile.getFilePath()), moduleSpecifier);
|
|
157
|
+
const candidates = [resolved, `${resolved}.mjs`, `${resolved}.js`];
|
|
158
|
+
for (const candidate of candidates) {
|
|
159
|
+
const sourceFile = sourceFileAtPath(project, candidate);
|
|
160
|
+
if (sourceFile !== undefined) {
|
|
161
|
+
return sourceFile;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
return undefined;
|
|
165
|
+
}
|
|
166
|
+
export function resolveModuleSourceFile(moduleSpecifier, containingSourceFile) {
|
|
167
|
+
const specifier = packageSpecifierFrom(moduleSpecifier);
|
|
168
|
+
if (specifier !== undefined) {
|
|
169
|
+
return resolvePackageSourceFile(specifier, containingSourceFile);
|
|
170
|
+
}
|
|
171
|
+
return resolveRelativeSourceFile(moduleSpecifier, containingSourceFile);
|
|
172
|
+
}
|
|
173
|
+
//# sourceMappingURL=external-module-resolution.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"external-module-resolution.js","sourceRoot":"","sources":["../../../../../source/dead-code-eliminator/liveness/external-module-resolution.ts"],"names":[],"mappings":"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"}
|
|
@@ -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
|