packtory 0.0.9 → 0.0.10
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/artifacts/artifacts-builder.js +0 -75
- package/artifacts/artifacts-builder.js.map +1 -1
- package/bundle-emitter/emitter.js +0 -34
- package/bundle-emitter/emitter.js.map +1 -1
- package/bundle-emitter/extract-package-tarball.js +0 -11
- package/bundle-emitter/extract-package-tarball.js.map +1 -1
- package/bundle-emitter/registry-client.js +0 -261
- package/bundle-emitter/registry-client.js.map +1 -1
- package/bundle-emitter/repository-url-normalizer.js +0 -36
- package/bundle-emitter/repository-url-normalizer.js.map +1 -1
- package/checks/check-runner.js +0 -5
- package/checks/check-runner.js.map +1 -1
- package/checks/rule.js +0 -8
- package/checks/rule.js.map +1 -1
- package/checks/rules/max-bundle-size.js +0 -35
- package/checks/rules/max-bundle-size.js.map +1 -1
- package/checks/rules/no-dev-dependency-imports.js +0 -28
- package/checks/rules/no-dev-dependency-imports.js.map +1 -1
- package/checks/rules/no-duplicated-files.js +0 -107
- package/checks/rules/no-duplicated-files.js.map +1 -1
- package/checks/rules/no-side-effects.js +0 -42
- package/checks/rules/no-side-effects.js.map +1 -1
- package/checks/rules/no-unused-bundle-dependencies.js +0 -24
- package/checks/rules/no-unused-bundle-dependencies.js.map +1 -1
- package/checks/rules/registry.js +0 -9
- package/checks/rules/registry.js.map +1 -1
- package/checks/rules/required-files.js +0 -31
- package/checks/rules/required-files.js.map +1 -1
- package/checks/rules/unique-target-paths.js +0 -25
- package/checks/rules/unique-target-paths.js.map +1 -1
- package/config/additional-files.js +0 -4
- package/config/additional-files.js.map +1 -1
- package/config/automatic-versioning-settings.js +0 -4
- package/config/automatic-versioning-settings.js.map +1 -1
- package/config/config.js +0 -2
- package/config/config.js.map +1 -1
- package/config/dead-code-elimination-settings.d.ts +6 -0
- package/config/dead-code-elimination-settings.d.ts.map +1 -1
- package/config/dead-code-elimination-settings.js +1 -3
- package/config/dead-code-elimination-settings.js.map +1 -1
- package/config/dependency-policy.js +0 -3
- package/config/dependency-policy.js.map +1 -1
- package/config/main-package-json-schema.js +0 -1
- package/config/main-package-json-schema.js.map +1 -1
- package/config/manual-versioning-settings.js +0 -4
- package/config/manual-versioning-settings.js.map +1 -1
- package/config/package-config.js +0 -6
- package/config/package-config.js.map +1 -1
- package/config/package-interface.d.ts +2 -0
- package/config/package-interface.d.ts.map +1 -1
- package/config/package-interface.js +0 -23
- package/config/package-interface.js.map +1 -1
- package/config/package-json.d.ts +0 -1
- package/config/package-json.d.ts.map +1 -1
- package/config/package-json.js +0 -16
- package/config/package-json.js.map +1 -1
- package/config/packtory-config-schema.js +0 -3
- package/config/packtory-config-schema.js.map +1 -1
- package/config/publish-settings.js +0 -22
- package/config/publish-settings.js.map +1 -1
- package/config/registry-settings.d.ts +0 -20
- package/config/registry-settings.d.ts.map +1 -1
- package/config/registry-settings.js +0 -38
- package/config/registry-settings.js.map +1 -1
- package/config/root.js +0 -4
- package/config/root.js.map +1 -1
- package/config/sbom-settings.js +0 -3
- package/config/sbom-settings.js.map +1 -1
- package/config/validation.d.ts.map +1 -1
- package/config/validation.js +0 -232
- package/config/validation.js.map +1 -1
- package/config/versioning-settings.js +0 -1
- package/config/versioning-settings.js.map +1 -1
- package/dead-code-eliminator/analyzed-bundle.d.ts +2 -0
- package/dead-code-eliminator/analyzed-bundle.d.ts.map +1 -1
- package/dead-code-eliminator/analyzed-bundle.js +0 -7
- package/dead-code-eliminator/analyzed-bundle.js.map +1 -1
- package/dead-code-eliminator/eliminator.js +3 -2
- package/dead-code-eliminator/eliminator.js.map +1 -1
- package/dead-code-eliminator/load-bundle.js +7 -6
- package/dead-code-eliminator/load-bundle.js.map +1 -1
- package/dead-code-eliminator/reachability/impure-statements.js +2 -2
- package/dead-code-eliminator/reachability/impure-statements.js.map +1 -1
- package/dead-code-eliminator/reachability/reachability.js +3 -3
- package/dead-code-eliminator/reachability/reachability.js.map +1 -1
- package/dead-code-eliminator/side-effect-classifier.js +141 -24
- package/dead-code-eliminator/side-effect-classifier.js.map +1 -1
- package/dependency-scanner/dependency-graph.d.ts +0 -2
- package/dependency-scanner/dependency-graph.d.ts.map +1 -1
- package/dependency-scanner/dependency-graph.js +0 -73
- package/dependency-scanner/dependency-graph.js.map +1 -1
- package/dependency-scanner/external-dependencies.d.ts +0 -1
- package/dependency-scanner/external-dependencies.d.ts.map +1 -1
- package/dependency-scanner/external-dependencies.js +0 -16
- package/dependency-scanner/external-dependencies.js.map +1 -1
- package/dependency-scanner/scanner.js +0 -69
- package/dependency-scanner/scanner.js.map +1 -1
- package/dependency-scanner/source-file-references.js +0 -26
- package/dependency-scanner/source-file-references.js.map +1 -1
- package/dependency-scanner/source-map-file-locator.js +0 -27
- package/dependency-scanner/source-map-file-locator.js.map +1 -1
- package/dependency-scanner/typescript-file-host.js +0 -114
- package/dependency-scanner/typescript-file-host.js.map +1 -1
- package/dependency-scanner/typescript-project-analyzer.d.ts +0 -1
- package/dependency-scanner/typescript-project-analyzer.d.ts.map +1 -1
- package/dependency-scanner/typescript-project-analyzer.js +0 -52
- package/dependency-scanner/typescript-project-analyzer.js.map +1 -1
- package/directed-graph/graph.d.ts +0 -1
- package/directed-graph/graph.d.ts.map +1 -1
- package/directed-graph/graph.js +0 -229
- package/directed-graph/graph.js.map +1 -1
- package/file-manager/compare.js +0 -17
- package/file-manager/compare.js.map +1 -1
- package/file-manager/equal.js +0 -5
- package/file-manager/equal.js.map +1 -1
- package/file-manager/file-manager.js +0 -52
- package/file-manager/file-manager.js.map +1 -1
- package/file-manager/permissions.js +0 -26
- package/file-manager/permissions.js.map +1 -1
- package/linker/linker.js +0 -23
- package/linker/linker.js.map +1 -1
- package/linker/resource-graph.js +0 -25
- package/linker/resource-graph.js.map +1 -1
- package/linker/source-modifier/import-paths.js +0 -22
- package/linker/source-modifier/import-paths.js.map +1 -1
- package/linker/substitute-bundles.js +0 -79
- package/linker/substitute-bundles.js.map +1 -1
- package/linker/substituted-resource-graph.js +0 -72
- package/linker/substituted-resource-graph.js.map +1 -1
- package/package-surface/modules.js +12 -230
- package/package-surface/modules.js.map +1 -1
- package/package-surface/surface.d.ts +0 -2
- package/package-surface/surface.d.ts.map +1 -1
- package/package-surface/surface.js +0 -15
- package/package-surface/surface.js.map +1 -1
- package/package.json +41 -3
- package/packtory/map-config.js +0 -14
- package/packtory/map-config.js.map +1 -1
- package/packtory/normalize-paths.js +0 -24
- package/packtory/normalize-paths.js.map +1 -1
- package/packtory/package-processor-build.js +0 -72
- package/packtory/package-processor-build.js.map +1 -1
- package/packtory/package-processor-publish.d.ts +0 -11
- package/packtory/package-processor-publish.d.ts.map +1 -1
- package/packtory/package-processor-publish.js +0 -133
- package/packtory/package-processor-publish.js.map +1 -1
- package/packtory/package-processor.js +0 -8
- package/packtory/package-processor.js.map +1 -1
- package/packtory/packtory-resolve.js +16 -9
- package/packtory/packtory-resolve.js.map +1 -1
- package/packtory/packtory-results.js +0 -15
- package/packtory/packtory-results.js.map +1 -1
- package/packtory/prepare-package-options.d.ts +2 -14
- package/packtory/prepare-package-options.d.ts.map +1 -1
- package/packtory/prepare-package-options.js +1 -118
- package/packtory/prepare-package-options.js.map +1 -1
- package/packtory/resolved-package.js +0 -31
- package/packtory/resolved-package.js.map +1 -1
- package/progress/progress-broadcaster.js +0 -45
- package/progress/progress-broadcaster.js.map +1 -1
- package/report/artifact-entry-merger.js +0 -20
- package/report/artifact-entry-merger.js.map +1 -1
- package/report/inspectors.js +0 -73
- package/report/inspectors.js.map +1 -1
- package/report/report-aggregator.js +0 -185
- package/report/report-aggregator.js.map +1 -1
- package/resource-resolver/content.js +0 -53
- package/resource-resolver/content.js.map +1 -1
- package/resource-resolver/resource-resolve-options.js +0 -12
- package/resource-resolver/resource-resolve-options.js.map +1 -1
- package/resource-resolver/resource-resolver.js +0 -78
- package/resource-resolver/resource-resolver.js.map +1 -1
- package/sbom/extract-license.js +0 -10
- package/sbom/extract-license.js.map +1 -1
- package/sbom/license-resolver.js +0 -19
- package/sbom/license-resolver.js.map +1 -1
- package/sbom/sbom-file.js +0 -54
- package/sbom/sbom-file.js.map +1 -1
- package/sbom/sbom-serializer.js +0 -9
- package/sbom/sbom-serializer.js.map +1 -1
- package/sbom.cdx.json +390 -0
- package/tar/extract-tar.js +0 -38
- package/tar/extract-tar.js.map +1 -1
- package/version-manager/manager.js +0 -46
- package/version-manager/manager.js.map +1 -1
- package/version-manager/manifest/builder.js +0 -56
- package/version-manager/manifest/builder.js.map +1 -1
- package/version-manager/manifest/serialize.js +0 -46
- package/version-manager/manifest/serialize.js.map +1 -1
- package/version-manager/manifest/sort-values.js +0 -16
- package/version-manager/manifest/sort-values.js.map +1 -1
- package/version-manager/specifier-classifier.js +0 -33
- package/version-manager/specifier-classifier.js.map +1 -1
- package/version-manager/specifier-errors.js +0 -43
- package/version-manager/specifier-errors.js.map +1 -1
- package/version-manager/versioned-bundle-dependencies.js +0 -107
- package/version-manager/versioned-bundle-dependencies.js.map +1 -1
- package/version-manager/versioned-bundle-imports.d.ts +0 -1
- package/version-manager/versioned-bundle-imports.d.ts.map +1 -1
- package/version-manager/versioned-bundle-imports.js +0 -72
- package/version-manager/versioned-bundle-imports.js.map +1 -1
- package/version-manager/versioned-bundle.d.ts +0 -1
- package/version-manager/versioned-bundle.d.ts.map +1 -1
- package/version-manager/versioned-bundle.js +0 -60
- package/version-manager/versioned-bundle.js.map +1 -1
|
@@ -1,35 +1,4 @@
|
|
|
1
1
|
import { Result } from 'true-myth';
|
|
2
2
|
import { mapToObj } from 'remeda';
|
|
3
3
|
import { runChecks } from "../checks/check-runner.js";
|
|
4
|
-
export function createResolvedPackage(name, analyzedBundle, resolveOptions) {
|
|
5
|
-
return { name, analyzedBundle, resolveOptions };
|
|
6
|
-
}
|
|
7
|
-
export function buildChecksResult(validated, resolvedPackages) {
|
|
8
|
-
const { packtoryConfig: config } = validated;
|
|
9
|
-
const perPackageSettings = new Map(config.packages.map((packageConfig) => {
|
|
10
|
-
return [packageConfig.name, packageConfig.checks];
|
|
11
|
-
}));
|
|
12
|
-
const commonMainPackageJson = config.commonPackageSettings?.mainPackageJson;
|
|
13
|
-
const effectivePackageConfigs = mapToObj(config.packages, (packageConfig) => {
|
|
14
|
-
return [
|
|
15
|
-
packageConfig.name,
|
|
16
|
-
{
|
|
17
|
-
...packageConfig,
|
|
18
|
-
mainPackageJson: packageConfig.mainPackageJson ?? commonMainPackageJson
|
|
19
|
-
}
|
|
20
|
-
];
|
|
21
|
-
});
|
|
22
|
-
const checkIssues = runChecks({
|
|
23
|
-
settings: config.checks ?? {},
|
|
24
|
-
perPackageSettings,
|
|
25
|
-
packageConfigs: effectivePackageConfigs,
|
|
26
|
-
bundles: resolvedPackages.map((resolvedPackage) => {
|
|
27
|
-
return resolvedPackage.analyzedBundle;
|
|
28
|
-
})
|
|
29
|
-
});
|
|
30
|
-
if (checkIssues.length > 0) {
|
|
31
|
-
return Result.err({ type: 'checks', issues: checkIssues });
|
|
32
|
-
}
|
|
33
|
-
return Result.ok(resolvedPackages);
|
|
34
|
-
}
|
|
35
4
|
//# sourceMappingURL=resolved-package.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolved-package.js","sourceRoot":"","sources":["../../../../source/packtory/resolved-package.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW
|
|
1
|
+
{"version":3,"file":"resolved-package.js","sourceRoot":"","sources":["../../../../source/packtory/resolved-package.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B"}
|
|
@@ -1,46 +1 @@
|
|
|
1
|
-
function createListenerRegistry() {
|
|
2
|
-
return {
|
|
3
|
-
scheduled: new Set(),
|
|
4
|
-
resolving: new Set(),
|
|
5
|
-
linking: new Set(),
|
|
6
|
-
building: new Set(),
|
|
7
|
-
rebuilding: new Set(),
|
|
8
|
-
publishing: new Set(),
|
|
9
|
-
done: new Set(),
|
|
10
|
-
error: new Set(),
|
|
11
|
-
inputsResolved: new Set(),
|
|
12
|
-
effectiveConfigResolved: new Set(),
|
|
13
|
-
scanCompleted: new Set(),
|
|
14
|
-
linkingCompleted: new Set(),
|
|
15
|
-
eliminationCompleted: new Set(),
|
|
16
|
-
versionDetermined: new Set(),
|
|
17
|
-
packageJsonAssembled: new Set(),
|
|
18
|
-
artifactsCollected: new Set(),
|
|
19
|
-
stageTimed: new Set(),
|
|
20
|
-
packageFailed: new Set()
|
|
21
|
-
};
|
|
22
|
-
}
|
|
23
|
-
export function createProgressBroadcaster() {
|
|
24
|
-
const listeners = createListenerRegistry();
|
|
25
|
-
return {
|
|
26
|
-
provider: {
|
|
27
|
-
emit: (eventName, payload) => {
|
|
28
|
-
listeners[eventName].forEach((listener) => {
|
|
29
|
-
listener(payload);
|
|
30
|
-
});
|
|
31
|
-
},
|
|
32
|
-
hasSubscribers: (eventName) => {
|
|
33
|
-
return listeners[eventName].size > 0;
|
|
34
|
-
}
|
|
35
|
-
},
|
|
36
|
-
consumer: {
|
|
37
|
-
on: (eventName, listener) => {
|
|
38
|
-
listeners[eventName].add(listener);
|
|
39
|
-
},
|
|
40
|
-
off: (eventName, listener) => {
|
|
41
|
-
listeners[eventName].delete(listener);
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
};
|
|
45
|
-
}
|
|
46
1
|
//# sourceMappingURL=progress-broadcaster.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"progress-broadcaster.js","sourceRoot":"","sources":["../../../../source/progress/progress-broadcaster.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"progress-broadcaster.js","sourceRoot":"","sources":["../../../../source/progress/progress-broadcaster.ts"],"names":[],"mappings":""}
|
|
@@ -1,22 +1,2 @@
|
|
|
1
1
|
// eslint-disable-next-line max-statements -- artifact entry merging intentionally reconciles rewrite and DCE state in one pass
|
|
2
|
-
export function mergeArtifactEntry(entry, rewrittenSourcePaths, transformedSourcePaths) {
|
|
3
|
-
if (entry.sourcePath === undefined) {
|
|
4
|
-
return entry;
|
|
5
|
-
}
|
|
6
|
-
const badgeSet = new Set(entry.badges);
|
|
7
|
-
let { status } = entry;
|
|
8
|
-
if (rewrittenSourcePaths.has(entry.sourcePath)) {
|
|
9
|
-
badgeSet.add('import-path-rewrite');
|
|
10
|
-
status = 'changed';
|
|
11
|
-
}
|
|
12
|
-
if (transformedSourcePaths.has(entry.sourcePath)) {
|
|
13
|
-
badgeSet.add('dead-code-elimination');
|
|
14
|
-
status = 'changed';
|
|
15
|
-
}
|
|
16
|
-
return {
|
|
17
|
-
...entry,
|
|
18
|
-
status,
|
|
19
|
-
badges: Array.from(badgeSet)
|
|
20
|
-
};
|
|
21
|
-
}
|
|
22
2
|
//# sourceMappingURL=artifact-entry-merger.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"artifact-entry-merger.js","sourceRoot":"","sources":["../../../../source/report/artifact-entry-merger.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"artifact-entry-merger.js","sourceRoot":"","sources":["../../../../source/report/artifact-entry-merger.ts"],"names":[],"mappings":""}
|
package/report/inspectors.js
CHANGED
|
@@ -1,74 +1 @@
|
|
|
1
|
-
function inferArtifactKind(filePath) {
|
|
2
|
-
if (filePath === 'package.json' || filePath.endsWith('/package.json')) {
|
|
3
|
-
return 'manifest';
|
|
4
|
-
}
|
|
5
|
-
if (filePath.endsWith('.sbom.json') || filePath.endsWith('.cdx.json')) {
|
|
6
|
-
return 'sbom';
|
|
7
|
-
}
|
|
8
|
-
if (/\.(?:cjs|d\.[cm]ts|jsx?|map|mjs|tsx?)$/.test(filePath)) {
|
|
9
|
-
return 'source';
|
|
10
|
-
}
|
|
11
|
-
return 'additional';
|
|
12
|
-
}
|
|
13
|
-
export function inspectArtifactSizes(contents) {
|
|
14
|
-
return contents.map((entry) => {
|
|
15
|
-
const sourcePath = 'sourceFilePath' in entry ? entry.sourceFilePath : undefined;
|
|
16
|
-
const rewritten = entry.isSubstituted === true;
|
|
17
|
-
let status = 'unchanged';
|
|
18
|
-
if (sourcePath === undefined) {
|
|
19
|
-
status = 'generated';
|
|
20
|
-
}
|
|
21
|
-
else if (rewritten) {
|
|
22
|
-
status = 'changed';
|
|
23
|
-
}
|
|
24
|
-
return {
|
|
25
|
-
path: entry.filePath,
|
|
26
|
-
sizeBytes: Buffer.byteLength(entry.content),
|
|
27
|
-
kind: inferArtifactKind(entry.filePath),
|
|
28
|
-
...(sourcePath === undefined ? {} : { sourcePath }),
|
|
29
|
-
status,
|
|
30
|
-
badges: rewritten ? ['import-path-rewrite'] : []
|
|
31
|
-
};
|
|
32
|
-
});
|
|
33
|
-
}
|
|
34
|
-
export function inspectScanResults(bundle) {
|
|
35
|
-
const included = bundle.contents.map((entry) => {
|
|
36
|
-
return { path: entry.fileDescription.sourceFilePath, reason: 'reachable-from-entry' };
|
|
37
|
-
});
|
|
38
|
-
const excluded = Array.from(bundle.externalDependencies.keys(), (specifier) => {
|
|
39
|
-
return { specifier, reason: 'external-module' };
|
|
40
|
-
});
|
|
41
|
-
return { included, excluded };
|
|
42
|
-
}
|
|
43
|
-
export function inspectLinkerRewrites(bundle) {
|
|
44
|
-
const linkedBundleNames = Array.from(bundle.linkedBundleDependencies.keys());
|
|
45
|
-
return bundle.contents.flatMap((resource) => {
|
|
46
|
-
if (!resource.isSubstituted) {
|
|
47
|
-
return [];
|
|
48
|
-
}
|
|
49
|
-
return linkedBundleNames.map((targetBundle) => {
|
|
50
|
-
return {
|
|
51
|
-
file: resource.fileDescription.sourceFilePath,
|
|
52
|
-
fromSpecifier: resource.fileDescription.sourceFilePath,
|
|
53
|
-
toSpecifier: targetBundle,
|
|
54
|
-
targetBundle
|
|
55
|
-
};
|
|
56
|
-
});
|
|
57
|
-
});
|
|
58
|
-
}
|
|
59
|
-
export function inspectPackageJsonProvenance(assembled, mainPackageJson, additionalAttributes) {
|
|
60
|
-
const result = {};
|
|
61
|
-
for (const key of Object.keys(assembled)) {
|
|
62
|
-
if (additionalAttributes !== undefined && key in additionalAttributes) {
|
|
63
|
-
result[key] = { source: 'additionalAttributes' };
|
|
64
|
-
}
|
|
65
|
-
else if (key in mainPackageJson) {
|
|
66
|
-
result[key] = { source: 'mainPackageJson' };
|
|
67
|
-
}
|
|
68
|
-
else {
|
|
69
|
-
result[key] = { source: 'derived' };
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
return result;
|
|
73
|
-
}
|
|
74
1
|
//# sourceMappingURL=inspectors.js.map
|
package/report/inspectors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inspectors.js","sourceRoot":"","sources":["../../../../source/report/inspectors.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"inspectors.js","sourceRoot":"","sources":["../../../../source/report/inspectors.ts"],"names":[],"mappings":""}
|
|
@@ -1,187 +1,2 @@
|
|
|
1
1
|
import { mergeArtifactEntry } from "./artifact-entry-merger.js";
|
|
2
|
-
function materializeInputs(entry) {
|
|
3
|
-
const base = {
|
|
4
|
-
roots: entry.roots ?? {},
|
|
5
|
-
siblingVersions: entry.siblingVersions ?? {},
|
|
6
|
-
sourceFileCount: entry.sourceFileCount ?? 0
|
|
7
|
-
};
|
|
8
|
-
if (entry.effectiveConfig === undefined) {
|
|
9
|
-
return base;
|
|
10
|
-
}
|
|
11
|
-
return { ...base, effectiveConfig: entry.effectiveConfig };
|
|
12
|
-
}
|
|
13
|
-
function buildInputs(entry) {
|
|
14
|
-
if (entry.roots === undefined && entry.effectiveConfig === undefined) {
|
|
15
|
-
return undefined;
|
|
16
|
-
}
|
|
17
|
-
return materializeInputs(entry);
|
|
18
|
-
}
|
|
19
|
-
function mergeArtifactEntries(entries, rewrittenSourcePaths, transformedSourcePaths) {
|
|
20
|
-
return entries.map((entry) => {
|
|
21
|
-
return mergeArtifactEntry(entry, rewrittenSourcePaths, transformedSourcePaths);
|
|
22
|
-
});
|
|
23
|
-
}
|
|
24
|
-
function buildOutputs(entry) {
|
|
25
|
-
if (entry.outputs === undefined) {
|
|
26
|
-
return undefined;
|
|
27
|
-
}
|
|
28
|
-
const rewrittenSourcePaths = new Set(entry.decisions.linker?.rewrites.map((rewrite) => {
|
|
29
|
-
return rewrite.file;
|
|
30
|
-
}));
|
|
31
|
-
const transformedSourcePaths = new Set(entry.decisions.deadCodeElimination?.files
|
|
32
|
-
.filter((file) => {
|
|
33
|
-
return file.decision === 'transformed';
|
|
34
|
-
})
|
|
35
|
-
.map((file) => {
|
|
36
|
-
return file.path;
|
|
37
|
-
}));
|
|
38
|
-
return {
|
|
39
|
-
tarball: {
|
|
40
|
-
totalBytes: entry.outputs.tarball.totalBytes,
|
|
41
|
-
entries: mergeArtifactEntries(entry.outputs.tarball.entries, rewrittenSourcePaths, transformedSourcePaths)
|
|
42
|
-
}
|
|
43
|
-
};
|
|
44
|
-
}
|
|
45
|
-
function toPackageReport(entry) {
|
|
46
|
-
const inputs = buildInputs(entry);
|
|
47
|
-
const outputs = buildOutputs(entry);
|
|
48
|
-
return {
|
|
49
|
-
decisions: entry.decisions,
|
|
50
|
-
timings: entry.timings,
|
|
51
|
-
...(inputs === undefined ? {} : { inputs }),
|
|
52
|
-
...(outputs === undefined ? {} : { outputs }),
|
|
53
|
-
...(entry.eliminatedSourceFiles === undefined ? {} : { eliminatedSourceFiles: entry.eliminatedSourceFiles }),
|
|
54
|
-
...(entry.failure === undefined ? {} : { failure: entry.failure })
|
|
55
|
-
};
|
|
56
|
-
}
|
|
57
|
-
function getOrCreate(state, packageName) {
|
|
58
|
-
let entry = state.packages.get(packageName);
|
|
59
|
-
if (entry === undefined) {
|
|
60
|
-
entry = { decisions: {}, timings: {} };
|
|
61
|
-
state.packages.set(packageName, entry);
|
|
62
|
-
}
|
|
63
|
-
return entry;
|
|
64
|
-
}
|
|
65
|
-
function registerInputHandlers(state, subscribe) {
|
|
66
|
-
subscribe('inputsResolved', (payload) => {
|
|
67
|
-
const entry = getOrCreate(state, payload.packageName);
|
|
68
|
-
entry.roots = payload.roots;
|
|
69
|
-
entry.siblingVersions = payload.siblingVersions;
|
|
70
|
-
entry.sourceFileCount = payload.sourceFileCount;
|
|
71
|
-
});
|
|
72
|
-
subscribe('effectiveConfigResolved', (payload) => {
|
|
73
|
-
getOrCreate(state, payload.packageName).effectiveConfig = payload.config;
|
|
74
|
-
});
|
|
75
|
-
}
|
|
76
|
-
function registerDecisionHandlers(state, subscribe) {
|
|
77
|
-
subscribe('versionDetermined', (payload) => {
|
|
78
|
-
getOrCreate(state, payload.packageName).decisions.version = {
|
|
79
|
-
previousVersion: payload.previousVersion,
|
|
80
|
-
chosenVersion: payload.chosenVersion,
|
|
81
|
-
trigger: payload.trigger
|
|
82
|
-
};
|
|
83
|
-
});
|
|
84
|
-
subscribe('packageJsonAssembled', (payload) => {
|
|
85
|
-
getOrCreate(state, payload.packageName).decisions.packageJson = payload.fields;
|
|
86
|
-
});
|
|
87
|
-
subscribe('scanCompleted', (payload) => {
|
|
88
|
-
getOrCreate(state, payload.packageName).decisions.dependencyScan = {
|
|
89
|
-
included: payload.included,
|
|
90
|
-
excluded: payload.excluded
|
|
91
|
-
};
|
|
92
|
-
});
|
|
93
|
-
subscribe('linkingCompleted', (payload) => {
|
|
94
|
-
getOrCreate(state, payload.packageName).decisions.linker = { rewrites: payload.rewrites };
|
|
95
|
-
});
|
|
96
|
-
subscribe('eliminationCompleted', (payload) => {
|
|
97
|
-
for (const bundle of payload.perBundle) {
|
|
98
|
-
const keptOrChanged = bundle.files.filter((file) => {
|
|
99
|
-
return file.decision !== 'eliminated';
|
|
100
|
-
});
|
|
101
|
-
const eliminatedSourceFiles = bundle.files
|
|
102
|
-
.filter((file) => {
|
|
103
|
-
return file.decision === 'eliminated';
|
|
104
|
-
})
|
|
105
|
-
.map((file) => {
|
|
106
|
-
return {
|
|
107
|
-
path: file.path,
|
|
108
|
-
reason: file.reason,
|
|
109
|
-
sourceBytes: file.sourceBytes,
|
|
110
|
-
...(file.outputBytes === undefined ? {} : { outputBytes: file.outputBytes })
|
|
111
|
-
};
|
|
112
|
-
});
|
|
113
|
-
getOrCreate(state, bundle.packageName).decisions.deadCodeElimination = {
|
|
114
|
-
files: keptOrChanged,
|
|
115
|
-
symbols: bundle.droppedSymbols,
|
|
116
|
-
seeds: bundle.seeds
|
|
117
|
-
};
|
|
118
|
-
if (eliminatedSourceFiles.length > 0) {
|
|
119
|
-
getOrCreate(state, bundle.packageName).eliminatedSourceFiles = eliminatedSourceFiles;
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
});
|
|
123
|
-
}
|
|
124
|
-
function registerOutcomeHandlers(state, subscribe) {
|
|
125
|
-
subscribe('stageTimed', (payload) => {
|
|
126
|
-
getOrCreate(state, payload.packageName).timings[payload.stage] = payload.durationMs;
|
|
127
|
-
});
|
|
128
|
-
subscribe('packageFailed', (payload) => {
|
|
129
|
-
getOrCreate(state, payload.packageName).failure = {
|
|
130
|
-
stage: payload.stage,
|
|
131
|
-
message: payload.message
|
|
132
|
-
};
|
|
133
|
-
});
|
|
134
|
-
subscribe('artifactsCollected', (payload) => {
|
|
135
|
-
const totalBytes = payload.entries.reduce((sum, item) => {
|
|
136
|
-
return sum + item.sizeBytes;
|
|
137
|
-
}, 0);
|
|
138
|
-
getOrCreate(state, payload.packageName).outputs = {
|
|
139
|
-
tarball: { entries: payload.entries, totalBytes }
|
|
140
|
-
};
|
|
141
|
-
});
|
|
142
|
-
}
|
|
143
|
-
function registerSubscribers(state, consumer) {
|
|
144
|
-
const subscribe = (eventName, handler) => {
|
|
145
|
-
consumer.on(eventName, handler);
|
|
146
|
-
state.disposers.push(() => {
|
|
147
|
-
consumer.off(eventName, handler);
|
|
148
|
-
});
|
|
149
|
-
};
|
|
150
|
-
registerInputHandlers(state, subscribe);
|
|
151
|
-
registerDecisionHandlers(state, subscribe);
|
|
152
|
-
registerOutcomeHandlers(state, subscribe);
|
|
153
|
-
}
|
|
154
|
-
function materialize(state) {
|
|
155
|
-
const packageReports = {};
|
|
156
|
-
for (const [name, entry] of state.packages.entries()) {
|
|
157
|
-
packageReports[name] = toPackageReport(entry);
|
|
158
|
-
}
|
|
159
|
-
return {
|
|
160
|
-
schemaVersion: 1,
|
|
161
|
-
generatedAt: new Date().toISOString(),
|
|
162
|
-
packages: packageReports,
|
|
163
|
-
aggregate: { crossBundleLinks: [] }
|
|
164
|
-
};
|
|
165
|
-
}
|
|
166
|
-
export function createReportAggregator(consumer) {
|
|
167
|
-
const state = { packages: new Map(), disposers: [] };
|
|
168
|
-
registerSubscribers(state, consumer);
|
|
169
|
-
const memo = [];
|
|
170
|
-
return {
|
|
171
|
-
unsubscribe() {
|
|
172
|
-
for (const dispose of state.disposers) {
|
|
173
|
-
dispose();
|
|
174
|
-
}
|
|
175
|
-
},
|
|
176
|
-
build() {
|
|
177
|
-
const [cached] = memo;
|
|
178
|
-
if (cached !== undefined) {
|
|
179
|
-
return cached;
|
|
180
|
-
}
|
|
181
|
-
const fresh = materialize(state);
|
|
182
|
-
memo.push(fresh);
|
|
183
|
-
return fresh;
|
|
184
|
-
}
|
|
185
|
-
};
|
|
186
|
-
}
|
|
187
2
|
//# sourceMappingURL=report-aggregator.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"report-aggregator.js","sourceRoot":"","sources":["../../../../source/report/report-aggregator.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B
|
|
1
|
+
{"version":3,"file":"report-aggregator.js","sourceRoot":"","sources":["../../../../source/report/report-aggregator.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B"}
|
|
@@ -1,56 +1,3 @@
|
|
|
1
1
|
import path from 'node:path';
|
|
2
2
|
import { isCodeFile } from "../common/code-files.js";
|
|
3
|
-
function prependSourcesFolderIfNecessary(sourcesFolder, filePath) {
|
|
4
|
-
if (!path.isAbsolute(filePath)) {
|
|
5
|
-
return path.join(sourcesFolder, filePath);
|
|
6
|
-
}
|
|
7
|
-
return filePath;
|
|
8
|
-
}
|
|
9
|
-
function rejectCodeFile(targetFilePath) {
|
|
10
|
-
if (isCodeFile(targetFilePath)) {
|
|
11
|
-
throw new Error([
|
|
12
|
-
`additionalFiles must not include code files; received "${targetFilePath}".`,
|
|
13
|
-
'Code that should ship in the bundle must be reachable from a root so',
|
|
14
|
-
'dependency, side-effect and dead-code analyses can run on it.',
|
|
15
|
-
'If you intend to ship code as a static asset (e.g. a template),',
|
|
16
|
-
'use a non-code extension like .txt.'
|
|
17
|
-
].join(' '));
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
export function combineAllBundleFiles(sourcesFolder, localDependencies, additionalFiles) {
|
|
21
|
-
const resolvedLocalFiles = localDependencies.map((localFile) => {
|
|
22
|
-
const targetFilePath = path.relative(sourcesFolder, localFile.filePath);
|
|
23
|
-
return {
|
|
24
|
-
sourceFilePath: localFile.filePath,
|
|
25
|
-
targetFilePath,
|
|
26
|
-
directDependencies: localFile.directDependencies,
|
|
27
|
-
project: localFile.project,
|
|
28
|
-
isExplicitlyIncluded: false
|
|
29
|
-
};
|
|
30
|
-
});
|
|
31
|
-
const additionalContents = additionalFiles.map((additionalFile) => {
|
|
32
|
-
if (typeof additionalFile === 'string') {
|
|
33
|
-
rejectCodeFile(additionalFile);
|
|
34
|
-
const sourceFilePath = path.join(sourcesFolder, additionalFile);
|
|
35
|
-
const targetFilePath = additionalFile;
|
|
36
|
-
return {
|
|
37
|
-
sourceFilePath,
|
|
38
|
-
targetFilePath,
|
|
39
|
-
directDependencies: new Set(),
|
|
40
|
-
isExplicitlyIncluded: true
|
|
41
|
-
};
|
|
42
|
-
}
|
|
43
|
-
if (path.isAbsolute(additionalFile.targetFilePath)) {
|
|
44
|
-
throw new Error('The targetFilePath must be relative');
|
|
45
|
-
}
|
|
46
|
-
rejectCodeFile(additionalFile.targetFilePath);
|
|
47
|
-
return {
|
|
48
|
-
sourceFilePath: prependSourcesFolderIfNecessary(sourcesFolder, additionalFile.sourceFilePath),
|
|
49
|
-
targetFilePath: additionalFile.targetFilePath,
|
|
50
|
-
directDependencies: new Set(),
|
|
51
|
-
isExplicitlyIncluded: true
|
|
52
|
-
};
|
|
53
|
-
});
|
|
54
|
-
return [...resolvedLocalFiles, ...additionalContents];
|
|
55
|
-
}
|
|
56
3
|
//# sourceMappingURL=content.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"content.js","sourceRoot":"","sources":["../../../../source/resource-resolver/content.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW
|
|
1
|
+
{"version":3,"file":"content.js","sourceRoot":"","sources":["../../../../source/resource-resolver/content.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW;AAE5B,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB"}
|
|
@@ -1,14 +1,2 @@
|
|
|
1
1
|
import { implicitPackageSurface } from "../package-surface/surface.js";
|
|
2
|
-
export function resolveRootsAndSurface(options) {
|
|
3
|
-
const rootEntries = Object.entries(options.roots);
|
|
4
|
-
const [firstRootEntry] = rootEntries;
|
|
5
|
-
if (firstRootEntry === undefined) {
|
|
6
|
-
throw new Error(`Package "${options.name}" must define at least one root`);
|
|
7
|
-
}
|
|
8
|
-
const [firstRootId] = firstRootEntry;
|
|
9
|
-
return {
|
|
10
|
-
roots: options.roots,
|
|
11
|
-
surface: options.surface ?? implicitPackageSurface(firstRootId)
|
|
12
|
-
};
|
|
13
|
-
}
|
|
14
2
|
//# sourceMappingURL=resource-resolve-options.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resource-resolve-options.js","sourceRoot":"","sources":["../../../../source/resource-resolver/resource-resolve-options.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,sBAAsB,EAAuB,MAAM,+BAA+B
|
|
1
|
+
{"version":3,"file":"resource-resolve-options.js","sourceRoot":"","sources":["../../../../source/resource-resolver/resource-resolve-options.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,sBAAsB,EAAuB,MAAM,+BAA+B"}
|
|
@@ -1,82 +1,4 @@
|
|
|
1
1
|
import { mergeDependencyFiles } from "../dependency-scanner/dependency-graph.js";
|
|
2
2
|
import { resolveRootsAndSurface } from "./resource-resolve-options.js";
|
|
3
3
|
import { combineAllBundleFiles } from "./content.js";
|
|
4
|
-
export function createResourceResolver(dependencies) {
|
|
5
|
-
const { dependencyScanner, fileManager } = dependencies;
|
|
6
|
-
async function resolveDependenciesForAllRoots(options) {
|
|
7
|
-
const { roots } = resolveRootsAndSurface(options);
|
|
8
|
-
const { sourcesFolder, includeSourceMapFiles, mainPackageJson } = options;
|
|
9
|
-
let dependencyFiles = { externalDependencies: new Map(), localFiles: [] };
|
|
10
|
-
for (const root of Object.values(roots)) {
|
|
11
|
-
const jsDependencyGraph = await dependencyScanner.scan(root.js, sourcesFolder, {
|
|
12
|
-
includeSourceMapFiles,
|
|
13
|
-
resolveDeclarationFiles: false,
|
|
14
|
-
mainPackageJson
|
|
15
|
-
});
|
|
16
|
-
dependencyFiles = mergeDependencyFiles(dependencyFiles, jsDependencyGraph.flatten(root.js));
|
|
17
|
-
if (root.declarationFile !== undefined) {
|
|
18
|
-
const declarationDependencyGraph = await dependencyScanner.scan(root.declarationFile, sourcesFolder, {
|
|
19
|
-
includeSourceMapFiles,
|
|
20
|
-
resolveDeclarationFiles: true,
|
|
21
|
-
mainPackageJson
|
|
22
|
-
});
|
|
23
|
-
dependencyFiles = mergeDependencyFiles(dependencyFiles, declarationDependencyGraph.flatten(root.declarationFile));
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
return dependencyFiles;
|
|
27
|
-
}
|
|
28
|
-
function findFileDescriptionBySourcePath(filePath, resources) {
|
|
29
|
-
const matchingResource = resources.find((resource) => {
|
|
30
|
-
return resource.fileDescription.sourceFilePath === filePath;
|
|
31
|
-
});
|
|
32
|
-
if (matchingResource === undefined) {
|
|
33
|
-
return undefined;
|
|
34
|
-
}
|
|
35
|
-
return matchingResource.fileDescription;
|
|
36
|
-
}
|
|
37
|
-
function requireFileDescriptionBySourcePath(filePath, resources) {
|
|
38
|
-
const fileDescription = findFileDescriptionBySourcePath(filePath, resources);
|
|
39
|
-
if (fileDescription === undefined) {
|
|
40
|
-
throw new Error(`Failed to resolve resource for root ${filePath}`);
|
|
41
|
-
}
|
|
42
|
-
return fileDescription;
|
|
43
|
-
}
|
|
44
|
-
function resolveDeclarationFileResource(declarationFilePath, contents) {
|
|
45
|
-
return contents.find((resource) => {
|
|
46
|
-
return resource.fileDescription.sourceFilePath === declarationFilePath;
|
|
47
|
-
})?.fileDescription;
|
|
48
|
-
}
|
|
49
|
-
function buildResolvedRoots(normalized, contents) {
|
|
50
|
-
const resolvedRoots = {};
|
|
51
|
-
for (const [rootId, root] of Object.entries(normalized.roots)) {
|
|
52
|
-
const jsResource = requireFileDescriptionBySourcePath(root.js, contents);
|
|
53
|
-
const declarationFile = resolveDeclarationFileResource(root.declarationFile, contents);
|
|
54
|
-
resolvedRoots[rootId] = { js: jsResource, declarationFile };
|
|
55
|
-
}
|
|
56
|
-
return resolvedRoots;
|
|
57
|
-
}
|
|
58
|
-
return {
|
|
59
|
-
async resolve(options) {
|
|
60
|
-
const normalized = resolveRootsAndSurface(options);
|
|
61
|
-
const resolvedDependencies = await resolveDependenciesForAllRoots(options);
|
|
62
|
-
const bundleFiles = combineAllBundleFiles(options.sourcesFolder, resolvedDependencies.localFiles, options.additionalFiles);
|
|
63
|
-
const contents = await Promise.all(bundleFiles.map(async (bundleFile) => {
|
|
64
|
-
const fileDescription = await fileManager.getTransferableFileDescriptionFromPath(bundleFile.sourceFilePath, bundleFile.targetFilePath);
|
|
65
|
-
return {
|
|
66
|
-
fileDescription,
|
|
67
|
-
directDependencies: bundleFile.directDependencies,
|
|
68
|
-
project: bundleFile.project,
|
|
69
|
-
isExplicitlyIncluded: bundleFile.isExplicitlyIncluded
|
|
70
|
-
};
|
|
71
|
-
}));
|
|
72
|
-
return {
|
|
73
|
-
contents,
|
|
74
|
-
name: options.name,
|
|
75
|
-
surface: normalized.surface,
|
|
76
|
-
externalDependencies: resolvedDependencies.externalDependencies,
|
|
77
|
-
roots: buildResolvedRoots(normalized, contents)
|
|
78
|
-
};
|
|
79
|
-
}
|
|
80
|
-
};
|
|
81
|
-
}
|
|
82
4
|
//# sourceMappingURL=resource-resolver.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resource-resolver.js","sourceRoot":"","sources":["../../../../source/resource-resolver/resource-resolver.ts"],"names":[],"mappings":"AACA,OAAO,EAAwB,oBAAoB,EAAE,MAAM,2CAA2C
|
|
1
|
+
{"version":3,"file":"resource-resolver.js","sourceRoot":"","sources":["../../../../source/resource-resolver/resource-resolver.ts"],"names":[],"mappings":"AACA,OAAO,EAAwB,oBAAoB,EAAE,MAAM,2CAA2C;AAItG,OAAO,EAAE,sBAAsB,EAA+B,MAAM,+BAA+B;AACnG,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc"}
|
package/sbom/extract-license.js
CHANGED
|
@@ -1,12 +1,2 @@
|
|
|
1
1
|
import { isPlainObject } from 'remeda';
|
|
2
|
-
export function extractLicenseFromManifest(packageJson) {
|
|
3
|
-
if (!isPlainObject(packageJson)) {
|
|
4
|
-
return undefined;
|
|
5
|
-
}
|
|
6
|
-
const { license } = packageJson;
|
|
7
|
-
if (typeof license === 'string' && license.length > 0) {
|
|
8
|
-
return license;
|
|
9
|
-
}
|
|
10
|
-
return undefined;
|
|
11
|
-
}
|
|
12
2
|
//# sourceMappingURL=extract-license.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extract-license.js","sourceRoot":"","sources":["../../../../source/sbom/extract-license.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ
|
|
1
|
+
{"version":3,"file":"extract-license.js","sourceRoot":"","sources":["../../../../source/sbom/extract-license.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ"}
|
package/sbom/license-resolver.js
CHANGED
|
@@ -1,22 +1,3 @@
|
|
|
1
1
|
import path from 'node:path';
|
|
2
2
|
import { extractLicenseFromManifest } from "./extract-license.js";
|
|
3
|
-
export function createLicenseResolver(dependencies) {
|
|
4
|
-
const { fileManager } = dependencies;
|
|
5
|
-
function buildMissingDependencyMessage(dependencyName) {
|
|
6
|
-
const intro = `Dependency "${dependencyName}" is declared in the published manifest`;
|
|
7
|
-
return `${intro} but is not installed in node_modules`;
|
|
8
|
-
}
|
|
9
|
-
return {
|
|
10
|
-
async resolveLicense({ projectFolder, dependencyName }) {
|
|
11
|
-
const packageJsonPath = path.join(projectFolder, 'node_modules', dependencyName, 'package.json');
|
|
12
|
-
const readability = await fileManager.checkReadability(packageJsonPath);
|
|
13
|
-
if (!readability.isReadable) {
|
|
14
|
-
throw new Error(buildMissingDependencyMessage(dependencyName));
|
|
15
|
-
}
|
|
16
|
-
const content = await fileManager.readFile(packageJsonPath);
|
|
17
|
-
const parsed = JSON.parse(content);
|
|
18
|
-
return extractLicenseFromManifest(parsed);
|
|
19
|
-
}
|
|
20
|
-
};
|
|
21
|
-
}
|
|
22
3
|
//# sourceMappingURL=license-resolver.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"license-resolver.js","sourceRoot":"","sources":["../../../../source/sbom/license-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW
|
|
1
|
+
{"version":3,"file":"license-resolver.js","sourceRoot":"","sources":["../../../../source/sbom/license-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW;AAE5B,OAAO,EAAE,0BAA0B,EAAE,MAAM,sBAAsB"}
|