packtory 0.0.10 → 0.0.12
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.d.ts +0 -14
- package/artifacts/artifacts-builder.d.ts.map +1 -1
- package/artifacts/artifacts-builder.js +75 -0
- package/artifacts/artifacts-builder.js.map +1 -1
- package/bundle-emitter/emitter.d.ts +0 -30
- package/bundle-emitter/emitter.d.ts.map +1 -1
- package/bundle-emitter/emitter.js +34 -0
- package/bundle-emitter/emitter.js.map +1 -1
- package/bundle-emitter/extract-package-tarball.js +11 -0
- package/bundle-emitter/extract-package-tarball.js.map +1 -1
- package/bundle-emitter/registry-client.d.ts +0 -21
- package/bundle-emitter/registry-client.d.ts.map +1 -1
- package/bundle-emitter/registry-client.js +261 -0
- package/bundle-emitter/registry-client.js.map +1 -1
- package/bundle-emitter/repository-url-normalizer.js +36 -0
- package/bundle-emitter/repository-url-normalizer.js.map +1 -1
- package/checks/check-runner.js +5 -0
- package/checks/check-runner.js.map +1 -1
- package/checks/rule.js +8 -0
- package/checks/rule.js.map +1 -1
- package/checks/rules/max-bundle-size.js +35 -0
- package/checks/rules/max-bundle-size.js.map +1 -1
- package/checks/rules/no-dev-dependency-imports.js +28 -0
- package/checks/rules/no-dev-dependency-imports.js.map +1 -1
- package/checks/rules/no-duplicated-files.js +107 -0
- package/checks/rules/no-duplicated-files.js.map +1 -1
- package/checks/rules/no-side-effects.js +42 -0
- package/checks/rules/no-side-effects.js.map +1 -1
- package/checks/rules/no-unused-bundle-dependencies.js +24 -0
- package/checks/rules/no-unused-bundle-dependencies.js.map +1 -1
- package/checks/rules/registry.js +9 -0
- package/checks/rules/registry.js.map +1 -1
- package/checks/rules/required-files.js +31 -0
- package/checks/rules/required-files.js.map +1 -1
- package/checks/rules/unique-target-paths.js +25 -0
- package/checks/rules/unique-target-paths.js.map +1 -1
- package/common/clock.d.ts +0 -6
- package/common/clock.d.ts.map +1 -1
- package/common/code-files.js +4 -0
- package/common/code-files.js.map +1 -1
- package/config/additional-files.js +4 -0
- package/config/additional-files.js.map +1 -1
- package/config/automatic-versioning-settings.js +4 -0
- package/config/automatic-versioning-settings.js.map +1 -1
- package/config/config.js +2 -0
- package/config/config.js.map +1 -1
- package/config/dead-code-elimination-settings.d.ts +0 -1
- package/config/dead-code-elimination-settings.d.ts.map +1 -1
- package/config/dead-code-elimination-settings.js +19 -0
- package/config/dead-code-elimination-settings.js.map +1 -1
- package/config/dependency-policy.js +3 -0
- package/config/dependency-policy.js.map +1 -1
- package/config/main-package-json-schema.js +1 -0
- package/config/main-package-json-schema.js.map +1 -1
- package/config/manual-versioning-settings.js +4 -0
- package/config/manual-versioning-settings.js.map +1 -1
- package/config/package-config.js +6 -0
- package/config/package-config.js.map +1 -1
- package/config/package-interface.js +26 -0
- 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 +16 -0
- package/config/package-json.js.map +1 -1
- package/config/packtory-config-schema.js +3 -0
- package/config/packtory-config-schema.js.map +1 -1
- package/config/publish-settings.js +22 -0
- package/config/publish-settings.js.map +1 -1
- package/config/registry-settings.d.ts +0 -18
- package/config/registry-settings.d.ts.map +1 -1
- package/config/registry-settings.js +38 -0
- package/config/registry-settings.js.map +1 -1
- package/config/root.js +4 -0
- package/config/root.js.map +1 -1
- package/config/sbom-settings.js +3 -0
- package/config/sbom-settings.js.map +1 -1
- package/config/validation.d.ts +0 -18
- package/config/validation.d.ts.map +1 -1
- package/config/validation.js +254 -0
- package/config/validation.js.map +1 -1
- package/config/versioning-settings.js +1 -0
- package/config/versioning-settings.js.map +1 -1
- package/dead-code-eliminator/analyzed-bundle.d.ts +0 -9
- package/dead-code-eliminator/analyzed-bundle.d.ts.map +1 -1
- package/dead-code-eliminator/analyzed-bundle.js +7 -0
- package/dead-code-eliminator/analyzed-bundle.js.map +1 -1
- package/dead-code-eliminator/eliminator.js +12 -1
- package/dead-code-eliminator/eliminator.js.map +1 -1
- package/dead-code-eliminator/load-bundle.js +10 -5
- package/dead-code-eliminator/load-bundle.js.map +1 -1
- package/dead-code-eliminator/reachability/binding-extractor.js +20 -7
- package/dead-code-eliminator/reachability/binding-extractor.js.map +1 -1
- package/dead-code-eliminator/reachability/reachability.js +10 -1
- package/dead-code-eliminator/reachability/reachability.js.map +1 -1
- package/dead-code-eliminator/transform/declaration-remover.js +3 -2
- package/dead-code-eliminator/transform/declaration-remover.js.map +1 -1
- package/dead-code-eliminator/variable-declaration-bindings.js +34 -0
- package/dead-code-eliminator/variable-declaration-bindings.js.map +1 -0
- package/dependency-scanner/dependency-graph.d.ts +0 -27
- package/dependency-scanner/dependency-graph.d.ts.map +1 -1
- package/dependency-scanner/dependency-graph.js +73 -0
- package/dependency-scanner/dependency-graph.js.map +1 -1
- package/dependency-scanner/external-dependencies.js +16 -0
- package/dependency-scanner/external-dependencies.js.map +1 -1
- package/dependency-scanner/scanner.d.ts +0 -13
- package/dependency-scanner/scanner.d.ts.map +1 -1
- package/dependency-scanner/scanner.js +69 -0
- package/dependency-scanner/scanner.js.map +1 -1
- package/dependency-scanner/source-file-references.js +26 -0
- package/dependency-scanner/source-file-references.js.map +1 -1
- package/dependency-scanner/source-map-file-locator.d.ts +0 -7
- package/dependency-scanner/source-map-file-locator.d.ts.map +1 -1
- package/dependency-scanner/source-map-file-locator.js +27 -0
- package/dependency-scanner/source-map-file-locator.js.map +1 -1
- package/dependency-scanner/typescript-file-host.d.ts +0 -9
- package/dependency-scanner/typescript-file-host.d.ts.map +1 -1
- package/dependency-scanner/typescript-file-host.js +114 -0
- package/dependency-scanner/typescript-file-host.js.map +1 -1
- package/dependency-scanner/typescript-project-analyzer.d.ts +0 -17
- package/dependency-scanner/typescript-project-analyzer.d.ts.map +1 -1
- package/dependency-scanner/typescript-project-analyzer.js +52 -0
- package/dependency-scanner/typescript-project-analyzer.js.map +1 -1
- package/directed-graph/graph.d.ts +0 -26
- package/directed-graph/graph.d.ts.map +1 -1
- package/directed-graph/graph.js +229 -0
- package/directed-graph/graph.js.map +1 -1
- package/file-manager/compare.js +17 -0
- package/file-manager/compare.js.map +1 -1
- package/file-manager/equal.js +5 -0
- package/file-manager/equal.js.map +1 -1
- package/file-manager/file-manager.d.ts +0 -15
- package/file-manager/file-manager.d.ts.map +1 -1
- package/file-manager/file-manager.js +52 -0
- package/file-manager/file-manager.js.map +1 -1
- package/file-manager/permissions.js +26 -0
- package/file-manager/permissions.js.map +1 -1
- package/linker/linker.d.ts +0 -8
- package/linker/linker.d.ts.map +1 -1
- package/linker/linker.js +23 -0
- package/linker/linker.js.map +1 -1
- package/linker/resource-graph.js +25 -0
- package/linker/resource-graph.js.map +1 -1
- package/linker/source-modifier/import-paths.js +22 -0
- package/linker/source-modifier/import-paths.js.map +1 -1
- package/linker/substitute-bundles.js +84 -0
- package/linker/substitute-bundles.js.map +1 -1
- package/linker/substituted-resource-graph.js +72 -0
- package/linker/substituted-resource-graph.js.map +1 -1
- package/package-surface/modules.js +232 -5
- package/package-surface/modules.js.map +1 -1
- package/package-surface/surface.d.ts +0 -1
- package/package-surface/surface.d.ts.map +1 -1
- package/package-surface/surface.js +15 -0
- package/package-surface/surface.js.map +1 -1
- package/package.json +1 -1
- package/packtory/map-config.d.ts +0 -10
- package/packtory/map-config.d.ts.map +1 -1
- package/packtory/map-config.js +14 -0
- package/packtory/map-config.js.map +1 -1
- package/packtory/normalize-paths.js +24 -0
- package/packtory/normalize-paths.js.map +1 -1
- package/packtory/package-processor-build.js +72 -0
- package/packtory/package-processor-build.js.map +1 -1
- package/packtory/package-processor-publish.d.ts +0 -5
- package/packtory/package-processor-publish.d.ts.map +1 -1
- package/packtory/package-processor-publish.js +133 -0
- package/packtory/package-processor-publish.js.map +1 -1
- package/packtory/package-processor.d.ts +0 -17
- package/packtory/package-processor.d.ts.map +1 -1
- package/packtory/package-processor.js +8 -0
- package/packtory/package-processor.js.map +1 -1
- package/packtory/packtory-results.d.ts +0 -10
- package/packtory/packtory-results.d.ts.map +1 -1
- package/packtory/packtory-results.js +15 -0
- package/packtory/packtory-results.js.map +1 -1
- package/packtory/packtory.d.ts +0 -8
- package/packtory/packtory.d.ts.map +1 -1
- package/packtory/prepare-package-options.d.ts +0 -2
- package/packtory/prepare-package-options.d.ts.map +1 -1
- package/packtory/prepare-package-options.js +122 -0
- package/packtory/prepare-package-options.js.map +1 -1
- package/packtory/resolved-package.d.ts +0 -2
- package/packtory/resolved-package.d.ts.map +1 -1
- package/packtory/resolved-package.js +31 -0
- package/packtory/resolved-package.js.map +1 -1
- package/packtory/scheduler.d.ts +0 -37
- package/packtory/scheduler.d.ts.map +1 -1
- package/progress/progress-broadcaster.d.ts +0 -13
- package/progress/progress-broadcaster.d.ts.map +1 -1
- package/progress/progress-broadcaster.js +45 -0
- package/progress/progress-broadcaster.js.map +1 -1
- package/report/artifact-entry-merger.js +20 -0
- package/report/artifact-entry-merger.js.map +1 -1
- package/report/inspectors.js +73 -0
- package/report/inspectors.js.map +1 -1
- package/report/report-aggregator.d.ts +0 -5
- package/report/report-aggregator.d.ts.map +1 -1
- package/report/report-aggregator.js +185 -0
- package/report/report-aggregator.js.map +1 -1
- package/resource-resolver/content.js +53 -0
- package/resource-resolver/content.js.map +1 -1
- package/resource-resolver/resolved-bundle.d.ts +0 -10
- package/resource-resolver/resolved-bundle.d.ts.map +1 -1
- package/resource-resolver/resource-resolve-options.d.ts +0 -4
- package/resource-resolver/resource-resolve-options.d.ts.map +1 -1
- package/resource-resolver/resource-resolve-options.js +12 -0
- package/resource-resolver/resource-resolve-options.js.map +1 -1
- package/resource-resolver/resource-resolver.d.ts +0 -8
- package/resource-resolver/resource-resolver.d.ts.map +1 -1
- package/resource-resolver/resource-resolver.js +78 -0
- package/resource-resolver/resource-resolver.js.map +1 -1
- package/sbom/extract-license.js +10 -0
- package/sbom/extract-license.js.map +1 -1
- package/sbom/license-resolver.d.ts +0 -11
- package/sbom/license-resolver.d.ts.map +1 -1
- package/sbom/license-resolver.js +19 -0
- package/sbom/license-resolver.js.map +1 -1
- package/sbom/sbom-file.d.ts +0 -12
- package/sbom/sbom-file.d.ts.map +1 -1
- package/sbom/sbom-file.js +54 -0
- package/sbom/sbom-file.js.map +1 -1
- package/sbom/sbom-serializer.d.ts +0 -4
- package/sbom/sbom-serializer.d.ts.map +1 -1
- package/sbom/sbom-serializer.js +9 -0
- package/sbom/sbom-serializer.js.map +1 -1
- package/tar/extract-tar.js +38 -0
- package/tar/extract-tar.js.map +1 -1
- package/tar/tarball-builder.d.ts +0 -4
- package/tar/tarball-builder.d.ts.map +1 -1
- package/version-manager/manager.d.ts +0 -4
- package/version-manager/manager.d.ts.map +1 -1
- package/version-manager/manager.js +46 -0
- package/version-manager/manager.js.map +1 -1
- package/version-manager/manifest/builder.js +56 -0
- package/version-manager/manifest/builder.js.map +1 -1
- package/version-manager/manifest/serialize.js +46 -0
- package/version-manager/manifest/serialize.js.map +1 -1
- package/version-manager/manifest/sort-values.js +16 -0
- package/version-manager/manifest/sort-values.js.map +1 -1
- package/version-manager/specifier-classifier.js +33 -0
- package/version-manager/specifier-classifier.js.map +1 -1
- package/version-manager/specifier-errors.js +43 -0
- package/version-manager/specifier-errors.js.map +1 -1
- package/version-manager/versioned-bundle-dependencies.js +107 -0
- package/version-manager/versioned-bundle-dependencies.js.map +1 -1
- package/version-manager/versioned-bundle-imports.js +72 -0
- package/version-manager/versioned-bundle-imports.js.map +1 -1
- package/version-manager/versioned-bundle.js +60 -0
- package/version-manager/versioned-bundle.js.map +1 -1
- package/sbom.cdx.json +0 -390
|
@@ -1,3 +1,30 @@
|
|
|
1
1
|
import path from 'node:path';
|
|
2
2
|
import { Maybe } from 'true-myth';
|
|
3
|
+
function getSourceMappingUrl(fileContent) {
|
|
4
|
+
for (const line of fileContent.split('\n')) {
|
|
5
|
+
if (line.startsWith('//# sourceMappingURL=')) {
|
|
6
|
+
const sourceMappingUrl = line.slice('//# sourceMappingURL='.length);
|
|
7
|
+
return sourceMappingUrl === '' ? undefined : sourceMappingUrl;
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
return undefined;
|
|
11
|
+
}
|
|
12
|
+
export function createSourceMapFileLocator(dependencies) {
|
|
13
|
+
const { fileManager } = dependencies;
|
|
14
|
+
return {
|
|
15
|
+
async locate(sourceFile) {
|
|
16
|
+
const fileContent = await fileManager.readFile(sourceFile);
|
|
17
|
+
const sourceMappingUrl = getSourceMappingUrl(fileContent);
|
|
18
|
+
if (sourceMappingUrl !== undefined) {
|
|
19
|
+
const folder = path.dirname(sourceFile);
|
|
20
|
+
const sourceMappingFile = path.join(folder, sourceMappingUrl);
|
|
21
|
+
const { isReadable } = await fileManager.checkReadability(sourceMappingFile);
|
|
22
|
+
if (isReadable) {
|
|
23
|
+
return Maybe.just(sourceMappingFile);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return Maybe.nothing();
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
}
|
|
3
30
|
//# sourceMappingURL=source-map-file-locator.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"source-map-file-locator.js","sourceRoot":"","sources":["../../../../source/dependency-scanner/source-map-file-locator.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW;
|
|
1
|
+
{"version":3,"file":"source-map-file-locator.js","sourceRoot":"","sources":["../../../../source/dependency-scanner/source-map-file-locator.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAWlC,SAAS,mBAAmB,CAAC,WAAmB;IAC5C,KAAK,MAAM,IAAI,IAAI,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACzC,IAAI,IAAI,CAAC,UAAU,CAAC,uBAAuB,CAAC,EAAE,CAAC;YAC3C,MAAM,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAC;YACpE,OAAO,gBAAgB,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,gBAAgB,CAAC;QAClE,CAAC;IACL,CAAC;IAED,OAAO,SAAS,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,0BAA0B,CACtC,YAAwD;IAExD,MAAM,EAAE,WAAW,EAAE,GAAG,YAAY,CAAC;IAErC,OAAO;QACH,KAAK,CAAC,MAAM,CAAC,UAAU;YACnB,MAAM,WAAW,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;YAC3D,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,WAAW,CAAC,CAAC;YAE1D,IAAI,gBAAgB,KAAK,SAAS,EAAE,CAAC;gBACjC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;gBACxC,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;gBAC9D,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,WAAW,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,CAAC;gBAE7E,IAAI,UAAU,EAAE,CAAC;oBACb,OAAO,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;gBACzC,CAAC;YACL,CAAC;YAED,OAAO,KAAK,CAAC,OAAO,EAAE,CAAC;QAC3B,CAAC;KACJ,CAAC;AACN,CAAC"}
|
|
@@ -1,12 +1,3 @@
|
|
|
1
1
|
import type { FileSystemHost } from 'ts-morph';
|
|
2
2
|
import type { MainPackageJson } from '../config/package-json.ts';
|
|
3
|
-
export type FileSystemAdaptersDependencies = {
|
|
4
|
-
fileSystemHost: FileSystemHost;
|
|
5
|
-
};
|
|
6
|
-
export type FileSystemAdapters = {
|
|
7
|
-
fileSystemHostWithoutFilter: FileSystemHost;
|
|
8
|
-
fileSystemHostFilteringDeclarationFiles: FileSystemHost;
|
|
9
|
-
withVirtualPackageJson: (fileSystemHost: FileSystemHost, folder: string, mainPackageJson: MainPackageJson) => FileSystemHost;
|
|
10
|
-
};
|
|
11
|
-
export declare function createFileSystemAdapters(dependencies: FileSystemAdaptersDependencies): FileSystemAdapters;
|
|
12
3
|
//# sourceMappingURL=typescript-file-host.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"typescript-file-host.d.ts","sourceRoot":"","sources":["../../../../source/dependency-scanner/typescript-file-host.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU
|
|
1
|
+
{"version":3,"file":"typescript-file-host.d.ts","sourceRoot":"","sources":["../../../../source/dependency-scanner/typescript-file-host.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU;AAC9C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B"}
|
|
@@ -1,2 +1,116 @@
|
|
|
1
1
|
import path from 'node:path';
|
|
2
|
+
function isDeclarationFile(filePath) {
|
|
3
|
+
const lowerCasedFilePath = filePath.toLowerCase();
|
|
4
|
+
return (lowerCasedFilePath.endsWith('.d.ts') ||
|
|
5
|
+
lowerCasedFilePath.endsWith('.d.cts') ||
|
|
6
|
+
lowerCasedFilePath.endsWith('.d.mts'));
|
|
7
|
+
}
|
|
8
|
+
function isTypesRootFolder(directoryPath) {
|
|
9
|
+
return directoryPath.endsWith('/node_modules/@types') || directoryPath.includes('/node_modules/@types/');
|
|
10
|
+
}
|
|
11
|
+
const syncMethodNames = {
|
|
12
|
+
fileExists: 'fileExistsSync',
|
|
13
|
+
directoryExists: 'directoryExistsSync',
|
|
14
|
+
readFile: 'readFileSync'
|
|
15
|
+
};
|
|
16
|
+
function bindRequiredMethod(object, methodName, expectedResultDescription, validateResult) {
|
|
17
|
+
const method = Reflect.get(object, methodName);
|
|
18
|
+
if (typeof method !== 'function') {
|
|
19
|
+
throw new TypeError(`Expected ${methodName} to be a function`);
|
|
20
|
+
}
|
|
21
|
+
return (filePath) => {
|
|
22
|
+
const result = Reflect.apply(method, object, [filePath]);
|
|
23
|
+
if (!validateResult(result)) {
|
|
24
|
+
throw new TypeError(`Expected ${methodName} to return ${expectedResultDescription}`);
|
|
25
|
+
}
|
|
26
|
+
return result;
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
function isBoolean(value) {
|
|
30
|
+
return typeof value === 'boolean';
|
|
31
|
+
}
|
|
32
|
+
function isString(value) {
|
|
33
|
+
return typeof value === 'string';
|
|
34
|
+
}
|
|
35
|
+
const packageJsonIndentationSpaces = 2;
|
|
36
|
+
function serializeMainPackageJson(mainPackageJson) {
|
|
37
|
+
return JSON.stringify(mainPackageJson, null, packageJsonIndentationSpaces);
|
|
38
|
+
}
|
|
39
|
+
function createVirtualPackageJsonHost(fileSystemHost, folder, mainPackageJson) {
|
|
40
|
+
const packageJsonPath = path.resolve(folder, 'package.json');
|
|
41
|
+
const serializedPackageJson = serializeMainPackageJson(mainPackageJson);
|
|
42
|
+
const fileExistsSync = bindRequiredMethod(fileSystemHost, syncMethodNames.fileExists, 'a boolean', isBoolean);
|
|
43
|
+
const readFileSync = bindRequiredMethod(fileSystemHost, syncMethodNames.readFile, 'a string', isString);
|
|
44
|
+
const virtualFileSystemHost = {
|
|
45
|
+
...fileSystemHost,
|
|
46
|
+
fileExists: async (filePath) => {
|
|
47
|
+
if (path.resolve(filePath) === packageJsonPath) {
|
|
48
|
+
return true;
|
|
49
|
+
}
|
|
50
|
+
return fileSystemHost.fileExists(filePath);
|
|
51
|
+
},
|
|
52
|
+
[syncMethodNames.fileExists]: (filePath) => {
|
|
53
|
+
if (path.resolve(filePath) === packageJsonPath) {
|
|
54
|
+
return true;
|
|
55
|
+
}
|
|
56
|
+
// eslint-disable-next-line node/no-sync -- the ts-morph host interface requires this synchronous method
|
|
57
|
+
return fileExistsSync(filePath);
|
|
58
|
+
},
|
|
59
|
+
readFile: async (filePath, encoding) => {
|
|
60
|
+
if (path.resolve(filePath) === packageJsonPath) {
|
|
61
|
+
return serializedPackageJson;
|
|
62
|
+
}
|
|
63
|
+
return fileSystemHost.readFile(filePath, encoding);
|
|
64
|
+
},
|
|
65
|
+
[syncMethodNames.readFile]: (filePath) => {
|
|
66
|
+
if (path.resolve(filePath) === packageJsonPath) {
|
|
67
|
+
return serializedPackageJson;
|
|
68
|
+
}
|
|
69
|
+
// eslint-disable-next-line node/no-sync -- the ts-morph host interface requires this synchronous method
|
|
70
|
+
return readFileSync(filePath);
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
Object.setPrototypeOf(virtualFileSystemHost, fileSystemHost);
|
|
74
|
+
return virtualFileSystemHost;
|
|
75
|
+
}
|
|
76
|
+
export function createFileSystemAdapters(dependencies) {
|
|
77
|
+
const { fileSystemHost } = dependencies;
|
|
78
|
+
const fileExistsSync = bindRequiredMethod(fileSystemHost, syncMethodNames.fileExists, 'a boolean', isBoolean);
|
|
79
|
+
const directoryExistsSync = bindRequiredMethod(fileSystemHost, syncMethodNames.directoryExists, 'a boolean', isBoolean);
|
|
80
|
+
const fileSystemHostFilteringDeclarationFiles = {
|
|
81
|
+
...fileSystemHost,
|
|
82
|
+
fileExists: async (filePath) => {
|
|
83
|
+
if (isDeclarationFile(filePath)) {
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
return fileSystemHost.fileExists(filePath);
|
|
87
|
+
},
|
|
88
|
+
[syncMethodNames.fileExists]: (filePath) => {
|
|
89
|
+
if (isDeclarationFile(filePath)) {
|
|
90
|
+
return false;
|
|
91
|
+
}
|
|
92
|
+
// eslint-disable-next-line node/no-sync -- the ts-morph host interface requires this synchronous method
|
|
93
|
+
return fileExistsSync(filePath);
|
|
94
|
+
},
|
|
95
|
+
directoryExists: async (directoryPath) => {
|
|
96
|
+
if (isTypesRootFolder(directoryPath)) {
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
99
|
+
return fileSystemHost.directoryExists(directoryPath);
|
|
100
|
+
},
|
|
101
|
+
[syncMethodNames.directoryExists]: (directoryPath) => {
|
|
102
|
+
if (isTypesRootFolder(directoryPath)) {
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
105
|
+
// eslint-disable-next-line node/no-sync -- the ts-morph host interface requires this synchronous method
|
|
106
|
+
return directoryExistsSync(directoryPath);
|
|
107
|
+
}
|
|
108
|
+
};
|
|
109
|
+
Object.setPrototypeOf(fileSystemHostFilteringDeclarationFiles, fileSystemHost);
|
|
110
|
+
return {
|
|
111
|
+
fileSystemHostWithoutFilter: fileSystemHost,
|
|
112
|
+
fileSystemHostFilteringDeclarationFiles,
|
|
113
|
+
withVirtualPackageJson: createVirtualPackageJsonHost
|
|
114
|
+
};
|
|
115
|
+
}
|
|
2
116
|
//# sourceMappingURL=typescript-file-host.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"typescript-file-host.js","sourceRoot":"","sources":["../../../../source/dependency-scanner/typescript-file-host.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW"}
|
|
1
|
+
{"version":3,"file":"typescript-file-host.js","sourceRoot":"","sources":["../../../../source/dependency-scanner/typescript-file-host.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,22 +1,5 @@
|
|
|
1
1
|
import { type Project as _Project, type SourceFile } from 'ts-morph';
|
|
2
2
|
import type { MainPackageJson } from '../config/package-json.ts';
|
|
3
3
|
import type { FileSystemAdapters } from './typescript-file-host.ts';
|
|
4
|
-
export type TypescriptProjectAnalyzerDependencies = {
|
|
5
|
-
readonly Project: typeof _Project;
|
|
6
|
-
readonly fileSystemAdapters: FileSystemAdapters;
|
|
7
|
-
getReferencedSourceFiles: (sourceFile: Readonly<SourceFile>) => readonly Readonly<SourceFile>[];
|
|
8
|
-
};
|
|
9
|
-
type AnalyzationOptions = {
|
|
10
|
-
readonly resolveDeclarationFiles: boolean;
|
|
11
|
-
readonly mainPackageJson: MainPackageJson;
|
|
12
|
-
};
|
|
13
|
-
export type TypescriptProject = {
|
|
14
|
-
getReferencedSourceFilePaths: (containingSourceFilePath: string) => readonly string[];
|
|
15
|
-
getProject: () => _Project;
|
|
16
|
-
};
|
|
17
|
-
export type TypescriptProjectAnalyzer = {
|
|
18
|
-
analyzeProject: (folder: string, options: AnalyzationOptions) => TypescriptProject;
|
|
19
|
-
};
|
|
20
|
-
export declare function createTypescriptProjectAnalyzer(dependencies: TypescriptProjectAnalyzerDependencies): TypescriptProjectAnalyzer;
|
|
21
4
|
export {};
|
|
22
5
|
//# sourceMappingURL=typescript-project-analyzer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"typescript-project-analyzer.d.ts","sourceRoot":"","sources":["../../../../source/dependency-scanner/typescript-project-analyzer.ts"],"names":[],"mappings":"AACA,OAAO,EAEH,KAAK,OAAO,IAAI,QAAQ,EACxB,KAAK,UAAU,EAGlB,MAAM,UAAU;AACjB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B;AAChE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B
|
|
1
|
+
{"version":3,"file":"typescript-project-analyzer.d.ts","sourceRoot":"","sources":["../../../../source/dependency-scanner/typescript-project-analyzer.ts"],"names":[],"mappings":"AACA,OAAO,EAEH,KAAK,OAAO,IAAI,QAAQ,EACxB,KAAK,UAAU,EAGlB,MAAM,UAAU;AACjB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B;AAChE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B"}
|
|
@@ -1,3 +1,55 @@
|
|
|
1
1
|
import path from 'node:path';
|
|
2
2
|
import { ModuleKind, ModuleResolutionKind } from 'ts-morph';
|
|
3
|
+
export function getSourcePathFromSourceFile(sourceFile) {
|
|
4
|
+
const filePath = sourceFile.getFilePath();
|
|
5
|
+
return filePath;
|
|
6
|
+
}
|
|
7
|
+
function analyzationOptionsToCompilerOptions(options) {
|
|
8
|
+
const { resolveDeclarationFiles } = options;
|
|
9
|
+
const compilerOptions = {
|
|
10
|
+
moduleResolution: ModuleResolutionKind.Node16,
|
|
11
|
+
esModuleInterop: true,
|
|
12
|
+
maxNodeModuleJsDepth: 1,
|
|
13
|
+
noEmit: true,
|
|
14
|
+
allowJs: true,
|
|
15
|
+
noLib: true,
|
|
16
|
+
skipLibCheck: true,
|
|
17
|
+
module: ModuleKind.Node16,
|
|
18
|
+
resolvePackageJsonImports: true
|
|
19
|
+
};
|
|
20
|
+
if (!resolveDeclarationFiles) {
|
|
21
|
+
compilerOptions.types = [];
|
|
22
|
+
compilerOptions.typeRoots = [];
|
|
23
|
+
}
|
|
24
|
+
return compilerOptions;
|
|
25
|
+
}
|
|
26
|
+
export function createTypescriptProjectAnalyzer(dependencies) {
|
|
27
|
+
const { fileSystemAdapters, Project, getReferencedSourceFiles } = dependencies;
|
|
28
|
+
return {
|
|
29
|
+
analyzeProject(folder, options) {
|
|
30
|
+
const project = new Project({
|
|
31
|
+
compilerOptions: analyzationOptionsToCompilerOptions(options),
|
|
32
|
+
fileSystem: fileSystemAdapters.withVirtualPackageJson(options.resolveDeclarationFiles
|
|
33
|
+
? fileSystemAdapters.fileSystemHostWithoutFilter
|
|
34
|
+
: fileSystemAdapters.fileSystemHostFilteringDeclarationFiles, folder, options.mainPackageJson)
|
|
35
|
+
});
|
|
36
|
+
const fileExtension = options.resolveDeclarationFiles ? '.d.ts' : '.js';
|
|
37
|
+
const filesPattern = path.join(folder, `**/*${fileExtension}`);
|
|
38
|
+
project.addSourceFilesAtPaths([filesPattern]);
|
|
39
|
+
return {
|
|
40
|
+
getReferencedSourceFilePaths(containingSourceFilePath) {
|
|
41
|
+
const currentSourceFile = project.getSourceFile(containingSourceFilePath);
|
|
42
|
+
if (currentSourceFile === undefined) {
|
|
43
|
+
return [];
|
|
44
|
+
}
|
|
45
|
+
const referencedSourceFilePaths = getReferencedSourceFiles(currentSourceFile).map(getSourcePathFromSourceFile);
|
|
46
|
+
return referencedSourceFilePaths;
|
|
47
|
+
},
|
|
48
|
+
getProject() {
|
|
49
|
+
return project;
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
}
|
|
3
55
|
//# sourceMappingURL=typescript-project-analyzer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"typescript-project-analyzer.js","sourceRoot":"","sources":["../../../../source/dependency-scanner/typescript-project-analyzer.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW;
|
|
1
|
+
{"version":3,"file":"typescript-project-analyzer.js","sourceRoot":"","sources":["../../../../source/dependency-scanner/typescript-project-analyzer.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EACH,UAAU,EAGV,oBAAoB,EAEvB,MAAM,UAAU,CAAC;AAwBlB,MAAM,UAAU,2BAA2B,CAAC,UAAgC;IACxE,MAAM,QAAQ,GAAG,UAAU,CAAC,WAAW,EAAE,CAAC;IAE1C,OAAO,QAAQ,CAAC;AACpB,CAAC;AAED,SAAS,mCAAmC,CAAC,OAA2B;IACpE,MAAM,EAAE,uBAAuB,EAAE,GAAG,OAAO,CAAC;IAE5C,MAAM,eAAe,GAAoB;QACrC,gBAAgB,EAAE,oBAAoB,CAAC,MAAM;QAC7C,eAAe,EAAE,IAAI;QACrB,oBAAoB,EAAE,CAAC;QACvB,MAAM,EAAE,IAAI;QACZ,OAAO,EAAE,IAAI;QACb,KAAK,EAAE,IAAI;QACX,YAAY,EAAE,IAAI;QAClB,MAAM,EAAE,UAAU,CAAC,MAAM;QACzB,yBAAyB,EAAE,IAAI;KAClC,CAAC;IAEF,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAC3B,eAAe,CAAC,KAAK,GAAG,EAAE,CAAC;QAC3B,eAAe,CAAC,SAAS,GAAG,EAAE,CAAC;IACnC,CAAC;IAED,OAAO,eAAe,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,+BAA+B,CAC3C,YAAmD;IAEnD,MAAM,EAAE,kBAAkB,EAAE,OAAO,EAAE,wBAAwB,EAAE,GAAG,YAAY,CAAC;IAE/E,OAAO;QACH,cAAc,CAAC,MAAM,EAAE,OAAO;YAC1B,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC;gBACxB,eAAe,EAAE,mCAAmC,CAAC,OAAO,CAAC;gBAC7D,UAAU,EAAE,kBAAkB,CAAC,sBAAsB,CACjD,OAAO,CAAC,uBAAuB;oBAC3B,CAAC,CAAC,kBAAkB,CAAC,2BAA2B;oBAChD,CAAC,CAAC,kBAAkB,CAAC,uCAAuC,EAChE,MAAM,EACN,OAAO,CAAC,eAAe,CAC1B;aACJ,CAAC,CAAC;YAEH,MAAM,aAAa,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;YACxE,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,aAAa,EAAE,CAAC,CAAC;YAC/D,OAAO,CAAC,qBAAqB,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC;YAE9C,OAAO;gBACH,4BAA4B,CAAC,wBAAwB;oBACjD,MAAM,iBAAiB,GAAG,OAAO,CAAC,aAAa,CAAC,wBAAwB,CAAC,CAAC;oBAE1E,IAAI,iBAAiB,KAAK,SAAS,EAAE,CAAC;wBAClC,OAAO,EAAE,CAAC;oBACd,CAAC;oBAED,MAAM,yBAAyB,GAC3B,wBAAwB,CAAC,iBAAiB,CAAC,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;oBAEjF,OAAO,yBAAyB,CAAC;gBACrC,CAAC;gBAED,UAAU;oBACN,OAAO,OAAO,CAAC;gBACnB,CAAC;aACJ,CAAC;QACN,CAAC;KACJ,CAAC;AACN,CAAC"}
|
|
@@ -1,28 +1,2 @@
|
|
|
1
|
-
type GraphNodeId = number | string;
|
|
2
|
-
type GraphNode<TId extends GraphNodeId, TData> = {
|
|
3
|
-
readonly id: TId;
|
|
4
|
-
readonly data: TData;
|
|
5
|
-
readonly adjacentNodeIds: Set<TId>;
|
|
6
|
-
readonly incomingEdges: number;
|
|
7
|
-
};
|
|
8
|
-
type GraphEdge<TId extends GraphNodeId> = {
|
|
9
|
-
readonly from: TId;
|
|
10
|
-
readonly to: TId;
|
|
11
|
-
};
|
|
12
|
-
type Visitor<TId extends GraphNodeId, TData> = (node: Readonly<GraphNode<TId, TData>>) => void;
|
|
13
|
-
export type DirectedGraph<TId extends GraphNodeId, TData> = {
|
|
14
|
-
addNode: (id: TId, data: TData) => void;
|
|
15
|
-
connect: (edge: Readonly<GraphEdge<TId>>) => void;
|
|
16
|
-
disconnect: (edge: Readonly<GraphEdge<TId>>) => void;
|
|
17
|
-
hasNode: (id: TId) => boolean;
|
|
18
|
-
hasConnection: (edge: Readonly<GraphEdge<TId>>) => boolean;
|
|
19
|
-
visitBreadthFirstSearch: (startId: TId, visitor: Visitor<TId, TData>) => void;
|
|
20
|
-
detectCycles: () => readonly (readonly TId[])[];
|
|
21
|
-
isCyclic: () => boolean;
|
|
22
|
-
getTopologicalGenerations: () => readonly (readonly TId[])[];
|
|
23
|
-
reverse: () => DirectedGraph<TId, TData>;
|
|
24
|
-
getAdjacentIds: (id: TId) => ReadonlySet<TId>;
|
|
25
|
-
traverse: (visitor: Visitor<TId, TData>) => void;
|
|
26
|
-
};
|
|
27
1
|
export {};
|
|
28
2
|
//# sourceMappingURL=graph.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../../../../source/directed-graph/graph.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../../../../source/directed-graph/graph.ts"],"names":[],"mappings":""}
|
package/directed-graph/graph.js
CHANGED
|
@@ -1 +1,230 @@
|
|
|
1
|
+
const breadthFirstTraversalBudgetExceededErrorMessage = 'Breadth-first traversal exceeded the maximum iteration budget';
|
|
2
|
+
function addAdjacentNodeId(node, idToAdd) {
|
|
3
|
+
return {
|
|
4
|
+
id: node.id,
|
|
5
|
+
data: node.data,
|
|
6
|
+
incomingEdges: node.incomingEdges,
|
|
7
|
+
adjacentNodeIds: new Set([...node.adjacentNodeIds, idToAdd])
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
function removeAdjacentNodeId(node, idToRemove) {
|
|
11
|
+
const adjacentNodeIds = new Set(node.adjacentNodeIds);
|
|
12
|
+
adjacentNodeIds.delete(idToRemove);
|
|
13
|
+
return {
|
|
14
|
+
id: node.id,
|
|
15
|
+
data: node.data,
|
|
16
|
+
incomingEdges: node.incomingEdges,
|
|
17
|
+
adjacentNodeIds
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
function withAdjustedIncomingEdges(node, delta) {
|
|
21
|
+
return {
|
|
22
|
+
id: node.id,
|
|
23
|
+
data: node.data,
|
|
24
|
+
adjacentNodeIds: node.adjacentNodeIds,
|
|
25
|
+
incomingEdges: node.incomingEdges + delta
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
function increaseIncomingEdges(node) {
|
|
29
|
+
return withAdjustedIncomingEdges(node, 1);
|
|
30
|
+
}
|
|
31
|
+
function decreaseIncomingEdges(node) {
|
|
32
|
+
return withAdjustedIncomingEdges(node, -1);
|
|
33
|
+
}
|
|
34
|
+
function getNonVisitedAdjacentIds(node) {
|
|
35
|
+
return Array.from(node.adjacentNodeIds);
|
|
36
|
+
}
|
|
37
|
+
export function createDirectedGraph() {
|
|
38
|
+
const nodes = new Map();
|
|
39
|
+
function getNode(id) {
|
|
40
|
+
const node = nodes.get(id);
|
|
41
|
+
if (node === undefined) {
|
|
42
|
+
throw new Error(`Node with id "${id}" does not exist`);
|
|
43
|
+
}
|
|
44
|
+
return node;
|
|
45
|
+
}
|
|
46
|
+
function getIncomingEdgesPerNode() {
|
|
47
|
+
const incomingEdgesPerNode = new Map();
|
|
48
|
+
for (const node of nodes.values()) {
|
|
49
|
+
incomingEdgesPerNode.set(node.id, node.incomingEdges);
|
|
50
|
+
}
|
|
51
|
+
return incomingEdgesPerNode;
|
|
52
|
+
}
|
|
53
|
+
function decreaseIncomingEdgesPerNodeForAdjacentNodes(incomingEdgesPerNode, ids) {
|
|
54
|
+
const newIncomingEdgesPerNode = new Map(incomingEdgesPerNode);
|
|
55
|
+
for (const id of ids) {
|
|
56
|
+
const node = getNode(id);
|
|
57
|
+
for (const adjacentNodeId of node.adjacentNodeIds) {
|
|
58
|
+
const degree = Number(newIncomingEdgesPerNode.get(adjacentNodeId));
|
|
59
|
+
newIncomingEdgesPerNode.set(adjacentNodeId, degree - 1);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return newIncomingEdgesPerNode;
|
|
63
|
+
}
|
|
64
|
+
function getTraversalBudget() {
|
|
65
|
+
let edgeCount = 0;
|
|
66
|
+
for (const node of nodes.values()) {
|
|
67
|
+
edgeCount += node.adjacentNodeIds.size;
|
|
68
|
+
}
|
|
69
|
+
return nodes.size + edgeCount + 1;
|
|
70
|
+
}
|
|
71
|
+
function detectCyclesForNode(baseNode, visitedIds) {
|
|
72
|
+
if (visitedIds.length === nodes.size + 1) {
|
|
73
|
+
throw new Error('Cycle detection exceeded the maximum traversal depth');
|
|
74
|
+
}
|
|
75
|
+
const newVisitedIds = [...visitedIds, baseNode.id];
|
|
76
|
+
const cycles = [];
|
|
77
|
+
for (const id of baseNode.adjacentNodeIds) {
|
|
78
|
+
if (newVisitedIds.includes(id)) {
|
|
79
|
+
cycles.push([...newVisitedIds, id]);
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
const cyclesInAdjacentNode = detectCyclesForNode(getNode(id), newVisitedIds);
|
|
83
|
+
cycles.push(...cyclesInAdjacentNode);
|
|
84
|
+
}
|
|
85
|
+
return cycles;
|
|
86
|
+
}
|
|
87
|
+
function collectCurrentGeneration(alreadyDiscovered, incomingEdgesPerNode) {
|
|
88
|
+
const currentGeneration = [];
|
|
89
|
+
for (const node of nodes.values()) {
|
|
90
|
+
if (!alreadyDiscovered.has(node.id) && incomingEdgesPerNode.get(node.id) === 0) {
|
|
91
|
+
currentGeneration.push(node.id);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return currentGeneration;
|
|
95
|
+
}
|
|
96
|
+
function detectCycles() {
|
|
97
|
+
const cycles = [];
|
|
98
|
+
const idsWithinCycles = new Set();
|
|
99
|
+
for (const baseNode of nodes.values()) {
|
|
100
|
+
if (!idsWithinCycles.has(baseNode.id)) {
|
|
101
|
+
const cyclesForNode = detectCyclesForNode(baseNode, []);
|
|
102
|
+
cycles.push(...cyclesForNode);
|
|
103
|
+
for (const id of cyclesForNode.flat()) {
|
|
104
|
+
idsWithinCycles.add(id);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return cycles;
|
|
109
|
+
}
|
|
110
|
+
function isCyclic() {
|
|
111
|
+
const cycles = detectCycles();
|
|
112
|
+
return cycles.length > 0;
|
|
113
|
+
}
|
|
114
|
+
function visitBreadthFirstSearch(startId, visitor) {
|
|
115
|
+
const startNode = getNode(startId);
|
|
116
|
+
const queue = [startNode];
|
|
117
|
+
const visited = new Set();
|
|
118
|
+
const traversalBudget = getTraversalBudget();
|
|
119
|
+
for (let nextNodeIndex = 0; nextNodeIndex < traversalBudget; nextNodeIndex += 1) {
|
|
120
|
+
const head = queue[nextNodeIndex];
|
|
121
|
+
if (head === undefined) {
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
if (visited.has(head.id)) {
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
visited.add(head.id);
|
|
128
|
+
visitor(head);
|
|
129
|
+
const nonVisitedAdjacentIds = getNonVisitedAdjacentIds(head);
|
|
130
|
+
for (const id of nonVisitedAdjacentIds) {
|
|
131
|
+
const adjacentNode = getNode(id);
|
|
132
|
+
queue.push(adjacentNode);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
throw new Error(breadthFirstTraversalBudgetExceededErrorMessage);
|
|
136
|
+
}
|
|
137
|
+
function hasNode(id) {
|
|
138
|
+
return nodes.has(id);
|
|
139
|
+
}
|
|
140
|
+
function getAdjacentIds(id) {
|
|
141
|
+
const node = getNode(id);
|
|
142
|
+
return node.adjacentNodeIds;
|
|
143
|
+
}
|
|
144
|
+
function addNode(id, data) {
|
|
145
|
+
if (nodes.has(id)) {
|
|
146
|
+
throw new Error(`Node with id "${id}" already exists`);
|
|
147
|
+
}
|
|
148
|
+
nodes.set(id, { id, data, adjacentNodeIds: new Set(), incomingEdges: 0 });
|
|
149
|
+
}
|
|
150
|
+
function hasConnection(edge) {
|
|
151
|
+
const fromNode = getNode(edge.from);
|
|
152
|
+
return fromNode.adjacentNodeIds.has(edge.to);
|
|
153
|
+
}
|
|
154
|
+
function connect(edge) {
|
|
155
|
+
const fromNode = getNode(edge.from);
|
|
156
|
+
const toNode = getNode(edge.to);
|
|
157
|
+
if (fromNode.adjacentNodeIds.has(toNode.id)) {
|
|
158
|
+
throw new Error(`Edge from "${edge.from}" to "${toNode.id}" already exists`);
|
|
159
|
+
}
|
|
160
|
+
nodes.set(edge.from, addAdjacentNodeId(fromNode, toNode.id));
|
|
161
|
+
nodes.set(edge.to, increaseIncomingEdges(getNode(edge.to)));
|
|
162
|
+
}
|
|
163
|
+
function disconnect(edge) {
|
|
164
|
+
const fromNode = getNode(edge.from);
|
|
165
|
+
const toNode = getNode(edge.to);
|
|
166
|
+
if (!fromNode.adjacentNodeIds.has(toNode.id)) {
|
|
167
|
+
throw new Error(`Edge from "${edge.from}" to "${toNode.id}" does not exist`);
|
|
168
|
+
}
|
|
169
|
+
nodes.set(edge.from, removeAdjacentNodeId(fromNode, toNode.id));
|
|
170
|
+
nodes.set(edge.to, decreaseIncomingEdges(toNode));
|
|
171
|
+
}
|
|
172
|
+
function traverse(visitor) {
|
|
173
|
+
for (const [nodeId, node] of nodes) {
|
|
174
|
+
if (node.incomingEdges === 0) {
|
|
175
|
+
visitBreadthFirstSearch(nodeId, visitor);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
function getTopologicalGenerations() {
|
|
180
|
+
if (isCyclic()) {
|
|
181
|
+
throw new Error('Failed to determine topological generations, current graph is cyclic');
|
|
182
|
+
}
|
|
183
|
+
const generations = [];
|
|
184
|
+
let alreadyDiscovered = new Set();
|
|
185
|
+
let incomingEdgesPerNode = getIncomingEdgesPerNode();
|
|
186
|
+
const generationAttempts = Array.from({ length: nodes.size + 1 }, (_unusedEntry, index) => {
|
|
187
|
+
return index + 1;
|
|
188
|
+
});
|
|
189
|
+
let exhaustedAttempts = 0;
|
|
190
|
+
for (const attempt of generationAttempts) {
|
|
191
|
+
exhaustedAttempts = attempt;
|
|
192
|
+
const currentGeneration = collectCurrentGeneration(alreadyDiscovered, incomingEdgesPerNode);
|
|
193
|
+
if (currentGeneration.length === 0) {
|
|
194
|
+
return generations;
|
|
195
|
+
}
|
|
196
|
+
const currentlyDiscovered = new Set([...alreadyDiscovered, ...currentGeneration]);
|
|
197
|
+
generations.push(Array.from(currentGeneration));
|
|
198
|
+
alreadyDiscovered = currentlyDiscovered;
|
|
199
|
+
incomingEdgesPerNode = decreaseIncomingEdgesPerNodeForAdjacentNodes(incomingEdgesPerNode, Array.from(currentGeneration));
|
|
200
|
+
}
|
|
201
|
+
throw new Error(`Topological generation discovery did not make progress after ${exhaustedAttempts} attempts`);
|
|
202
|
+
}
|
|
203
|
+
function reverse() {
|
|
204
|
+
const reversedGraph = createDirectedGraph();
|
|
205
|
+
for (const node of nodes.values()) {
|
|
206
|
+
reversedGraph.addNode(node.id, node.data);
|
|
207
|
+
}
|
|
208
|
+
for (const node of nodes.values()) {
|
|
209
|
+
for (const adjacentNodeId of node.adjacentNodeIds) {
|
|
210
|
+
reversedGraph.connect({ from: adjacentNodeId, to: node.id });
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
return reversedGraph;
|
|
214
|
+
}
|
|
215
|
+
return {
|
|
216
|
+
addNode,
|
|
217
|
+
getAdjacentIds,
|
|
218
|
+
hasNode,
|
|
219
|
+
hasConnection,
|
|
220
|
+
connect,
|
|
221
|
+
disconnect,
|
|
222
|
+
visitBreadthFirstSearch,
|
|
223
|
+
traverse,
|
|
224
|
+
detectCycles,
|
|
225
|
+
isCyclic,
|
|
226
|
+
getTopologicalGenerations,
|
|
227
|
+
reverse
|
|
228
|
+
};
|
|
229
|
+
}
|
|
1
230
|
//# sourceMappingURL=graph.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"graph.js","sourceRoot":"","sources":["../../../../source/directed-graph/graph.ts"],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"graph.js","sourceRoot":"","sources":["../../../../source/directed-graph/graph.ts"],"names":[],"mappings":"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"}
|
package/file-manager/compare.js
CHANGED
|
@@ -1,3 +1,20 @@
|
|
|
1
1
|
import { sortBy } from 'remeda';
|
|
2
2
|
import { areFileDescriptionEqual } from "./equal.js";
|
|
3
|
+
export function compareFileDescriptions(fileDescriptionsA, fileDescriptionsB) {
|
|
4
|
+
if (fileDescriptionsA.length !== fileDescriptionsB.length) {
|
|
5
|
+
return { status: 'not-equal' };
|
|
6
|
+
}
|
|
7
|
+
const byFilePath = (fileDescription) => {
|
|
8
|
+
return fileDescription.filePath;
|
|
9
|
+
};
|
|
10
|
+
const sortedFileDescriptionsA = sortBy(fileDescriptionsA, byFilePath);
|
|
11
|
+
const sortedFileDescriptionsB = sortBy(fileDescriptionsB, byFilePath);
|
|
12
|
+
for (const [index, fileDescriptionA] of sortedFileDescriptionsA.entries()) {
|
|
13
|
+
const fileDescriptionB = sortedFileDescriptionsB[index];
|
|
14
|
+
if (fileDescriptionB === undefined || !areFileDescriptionEqual(fileDescriptionA, fileDescriptionB)) {
|
|
15
|
+
return { status: 'not-equal' };
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
return { status: 'equal' };
|
|
19
|
+
}
|
|
3
20
|
//# sourceMappingURL=compare.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compare.js","sourceRoot":"","sources":["../../../../source/file-manager/compare.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ;
|
|
1
|
+
{"version":3,"file":"compare.js","sourceRoot":"","sources":["../../../../source/file-manager/compare.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAOrD,MAAM,UAAU,uBAAuB,CACnC,iBAA6C,EAC7C,iBAA6C;IAE7C,IAAI,iBAAiB,CAAC,MAAM,KAAK,iBAAiB,CAAC,MAAM,EAAE,CAAC;QACxD,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IACnC,CAAC;IAED,MAAM,UAAU,GAAG,CAAC,eAAgC,EAAU,EAAE;QAC5D,OAAO,eAAe,CAAC,QAAQ,CAAC;IACpC,CAAC,CAAC;IACF,MAAM,uBAAuB,GAAG,MAAM,CAAC,iBAAiB,EAAE,UAAU,CAAC,CAAC;IACtE,MAAM,uBAAuB,GAAG,MAAM,CAAC,iBAAiB,EAAE,UAAU,CAAC,CAAC;IAEtE,KAAK,MAAM,CAAC,KAAK,EAAE,gBAAgB,CAAC,IAAI,uBAAuB,CAAC,OAAO,EAAE,EAAE,CAAC;QACxE,MAAM,gBAAgB,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC;QAExD,IAAI,gBAAgB,KAAK,SAAS,IAAI,CAAC,uBAAuB,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,EAAE,CAAC;YACjG,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;QACnC,CAAC;IACL,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;AAC/B,CAAC"}
|
package/file-manager/equal.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"equal.js","sourceRoot":"","sources":["../../../../source/file-manager/equal.ts"],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"equal.js","sourceRoot":"","sources":["../../../../source/file-manager/equal.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,uBAAuB,CAAC,KAAsB,EAAE,MAAuB;IACnF,OAAO,CACH,KAAK,CAAC,QAAQ,KAAK,MAAM,CAAC,QAAQ;QAClC,KAAK,CAAC,OAAO,KAAK,MAAM,CAAC,OAAO;QAChC,KAAK,CAAC,YAAY,KAAK,MAAM,CAAC,YAAY,CAC7C,CAAC;AACN,CAAC"}
|
|
@@ -1,19 +1,4 @@
|
|
|
1
1
|
import fs from 'node:fs';
|
|
2
2
|
import type { TransferableFileDescription } from './file-description.ts';
|
|
3
|
-
export type FileManagerDependencies = {
|
|
4
|
-
readonly hostFileSystem: typeof fs.promises;
|
|
5
|
-
};
|
|
6
|
-
type FileOrFolderReadability = {
|
|
7
|
-
readonly isReadable: boolean;
|
|
8
|
-
};
|
|
9
|
-
export type FileManager = {
|
|
10
|
-
checkReadability: (fileOrFolderPath: string) => Promise<FileOrFolderReadability>;
|
|
11
|
-
readFile: (filePath: string) => Promise<string>;
|
|
12
|
-
writeFile: (filePath: string, content: string) => Promise<void>;
|
|
13
|
-
setExecutable: (filePath: string, executable: boolean) => Promise<void>;
|
|
14
|
-
copyFile: (from: string, to: string) => Promise<void>;
|
|
15
|
-
getTransferableFileDescriptionFromPath: (sourceFilePath: string, targetFilePath: string) => Promise<TransferableFileDescription>;
|
|
16
|
-
};
|
|
17
|
-
export declare function createFileManager(dependencies: FileManagerDependencies): FileManager;
|
|
18
3
|
export {};
|
|
19
4
|
//# sourceMappingURL=file-manager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-manager.d.ts","sourceRoot":"","sources":["../../../../source/file-manager/file-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS
|
|
1
|
+
{"version":3,"file":"file-manager.d.ts","sourceRoot":"","sources":["../../../../source/file-manager/file-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS;AAExB,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,uBAAuB"}
|