packtory 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (143) hide show
  1. package/LICENSE +21 -0
  2. package/artifacts/artifacts-builder.d.ts +20 -0
  3. package/artifacts/artifacts-builder.d.ts.map +1 -0
  4. package/artifacts/artifacts-builder.js +43 -0
  5. package/artifacts/artifacts-builder.js.map +1 -0
  6. package/artifacts/file-manager.d.ts +18 -0
  7. package/artifacts/file-manager.d.ts.map +1 -0
  8. package/artifacts/file-manager.js +35 -0
  9. package/artifacts/file-manager.js.map +1 -0
  10. package/bundler/bundle-build-options.d.ts +19 -0
  11. package/bundler/bundle-build-options.d.ts.map +1 -0
  12. package/bundler/bundle-build-options.js +25 -0
  13. package/bundler/bundle-build-options.js.map +1 -0
  14. package/bundler/bundle-description.d.ts +27 -0
  15. package/bundler/bundle-description.d.ts.map +1 -0
  16. package/bundler/bundler.d.ts +11 -0
  17. package/bundler/bundler.d.ts.map +1 -0
  18. package/bundler/bundler.js +98 -0
  19. package/bundler/bundler.js.map +1 -0
  20. package/bundler/content.js +53 -0
  21. package/bundler/content.js.map +1 -0
  22. package/bundler/substitute-bundles.js +73 -0
  23. package/bundler/substitute-bundles.js.map +1 -0
  24. package/config/additional-files.d.ts +13 -0
  25. package/config/additional-files.d.ts.map +1 -0
  26. package/config/additional-files.js +8 -0
  27. package/config/additional-files.js.map +1 -0
  28. package/config/base-validations.d.ts +5 -0
  29. package/config/base-validations.d.ts.map +1 -0
  30. package/config/base-validations.js +3 -0
  31. package/config/base-validations.js.map +1 -0
  32. package/config/config.d.ts +470 -0
  33. package/config/config.d.ts.map +1 -0
  34. package/config/config.js +65 -0
  35. package/config/config.js.map +1 -0
  36. package/config/entry-point.d.ts +13 -0
  37. package/config/entry-point.d.ts.map +1 -0
  38. package/config/entry-point.js +8 -0
  39. package/config/entry-point.js.map +1 -0
  40. package/config/package-json.d.ts +33 -0
  41. package/config/package-json.d.ts.map +1 -0
  42. package/config/package-json.js +34 -0
  43. package/config/package-json.js.map +1 -0
  44. package/config/registry-settings.d.ts +13 -0
  45. package/config/registry-settings.d.ts.map +1 -0
  46. package/config/registry-settings.js +8 -0
  47. package/config/registry-settings.js.map +1 -0
  48. package/config/validation.d.ts +13 -0
  49. package/config/validation.d.ts.map +1 -0
  50. package/config/validation.js +99 -0
  51. package/config/validation.js.map +1 -0
  52. package/config/versioning-settings.d.ts +23 -0
  53. package/config/versioning-settings.d.ts.map +1 -0
  54. package/config/versioning-settings.js +15 -0
  55. package/config/versioning-settings.js.map +1 -0
  56. package/dependency-scanner/dependency-graph.d.ts +33 -0
  57. package/dependency-scanner/dependency-graph.d.ts.map +1 -0
  58. package/dependency-scanner/dependency-graph.js +60 -0
  59. package/dependency-scanner/dependency-graph.js.map +1 -0
  60. package/dependency-scanner/scanner.d.ts +34 -0
  61. package/dependency-scanner/scanner.d.ts.map +1 -0
  62. package/dependency-scanner/scanner.js +131 -0
  63. package/dependency-scanner/scanner.js.map +1 -0
  64. package/dependency-scanner/source-file-references.js +68 -0
  65. package/dependency-scanner/source-file-references.js.map +1 -0
  66. package/dependency-scanner/source-map-file-locator.d.ts +10 -0
  67. package/dependency-scanner/source-map-file-locator.d.ts.map +1 -0
  68. package/dependency-scanner/source-map-file-locator.js +23 -0
  69. package/dependency-scanner/source-map-file-locator.js.map +1 -0
  70. package/dependency-scanner/typescript-file-host.d.ts +10 -0
  71. package/dependency-scanner/typescript-file-host.d.ts.map +1 -0
  72. package/dependency-scanner/typescript-file-host.js +50 -0
  73. package/dependency-scanner/typescript-file-host.js.map +1 -0
  74. package/dependency-scanner/typescript-project-analyzer.d.ts +23 -0
  75. package/dependency-scanner/typescript-project-analyzer.d.ts.map +1 -0
  76. package/dependency-scanner/typescript-project-analyzer.js +64 -0
  77. package/dependency-scanner/typescript-project-analyzer.js.map +1 -0
  78. package/directed-graph/graph.d.ts +27 -0
  79. package/directed-graph/graph.d.ts.map +1 -0
  80. package/directed-graph/graph.js +183 -0
  81. package/directed-graph/graph.js.map +1 -0
  82. package/file-description/compare.js +18 -0
  83. package/file-description/compare.js.map +1 -0
  84. package/file-description/equal.js +4 -0
  85. package/file-description/equal.js.map +1 -0
  86. package/file-description/file-description.d.ts +5 -0
  87. package/file-description/file-description.d.ts.map +1 -0
  88. package/file-description/sort.js +13 -0
  89. package/file-description/sort.js.map +1 -0
  90. package/package-json.js +33 -0
  91. package/package-json.js.map +1 -0
  92. package/package.json +48 -0
  93. package/packages/bundler/bundler.entry-point.js +21 -0
  94. package/packages/bundler/bundler.entry-point.js.map +1 -0
  95. package/packages/packtory/packtory.entry-point.d.ts +7 -0
  96. package/packages/packtory/packtory.entry-point.d.ts.map +1 -0
  97. package/packages/packtory/packtory.entry-point.js +32 -0
  98. package/packages/packtory/packtory.entry-point.js.map +1 -0
  99. package/packtory/map-config.js +55 -0
  100. package/packtory/map-config.js.map +1 -0
  101. package/packtory/normalize-paths.js +26 -0
  102. package/packtory/normalize-paths.js.map +1 -0
  103. package/packtory/packtory.d.ts +25 -0
  104. package/packtory/packtory.d.ts.map +1 -0
  105. package/packtory/packtory.js +30 -0
  106. package/packtory/packtory.js.map +1 -0
  107. package/packtory/scheduler.d.ts +18 -0
  108. package/packtory/scheduler.d.ts.map +1 -0
  109. package/packtory/scheduler.js +74 -0
  110. package/packtory/scheduler.js.map +1 -0
  111. package/progress/progress-broadcaster.d.ts +40 -0
  112. package/progress/progress-broadcaster.d.ts.map +1 -0
  113. package/progress/progress-broadcaster.js +16 -0
  114. package/progress/progress-broadcaster.js.map +1 -0
  115. package/publisher/extract-package-tarball.js +12 -0
  116. package/publisher/extract-package-tarball.js.map +1 -0
  117. package/publisher/publisher.d.ts +40 -0
  118. package/publisher/publisher.d.ts.map +1 -0
  119. package/publisher/publisher.js +73 -0
  120. package/publisher/publisher.js.map +1 -0
  121. package/publisher/registry-client.d.ts +24 -0
  122. package/publisher/registry-client.d.ts.map +1 -0
  123. package/publisher/registry-client.js +90 -0
  124. package/publisher/registry-client.js.map +1 -0
  125. package/publisher/version.js +35 -0
  126. package/publisher/version.js.map +1 -0
  127. package/readme.md +38 -0
  128. package/source-modifier/import-paths.js +17 -0
  129. package/source-modifier/import-paths.js.map +1 -0
  130. package/tar/extract-tar.js +17 -0
  131. package/tar/extract-tar.js.map +1 -0
  132. package/tar/tarball-builder.d.ts +7 -0
  133. package/tar/tarball-builder.d.ts.map +1 -0
  134. package/tar/tarball-builder.js +35 -0
  135. package/tar/tarball-builder.js.map +1 -0
  136. package/validation/capitalize.js +7 -0
  137. package/validation/capitalize.js.map +1 -0
  138. package/validation/formatting/ast.js +113 -0
  139. package/validation/formatting/ast.js.map +1 -0
  140. package/validation/formatting.js +98 -0
  141. package/validation/formatting.js.map +1 -0
  142. package/validation/validate.js +17 -0
  143. package/validation/validate.js.map +1 -0
@@ -0,0 +1,50 @@
1
+ const declarationFileExtensions = new Set(['.d.ts', '.d.cts', '.d.mts']);
2
+ function isDeclarationFile(filePath) {
3
+ const lowerCasedFilePath = filePath.toLowerCase();
4
+ for (const declarationFileExtension of declarationFileExtensions) {
5
+ if (lowerCasedFilePath.endsWith(declarationFileExtension)) {
6
+ return true;
7
+ }
8
+ }
9
+ return false;
10
+ }
11
+ function isTypesRootFolder(directoryPath) {
12
+ return directoryPath.endsWith('/node_modules/@types') || directoryPath.includes('/node_modules/@types/');
13
+ }
14
+ export function createFileSystemAdapters(dependencies) {
15
+ const { fileSystemHost } = dependencies;
16
+ const fileSystemHostFilteringDeclarationFiles = Object.create(fileSystemHost);
17
+ fileSystemHostFilteringDeclarationFiles.fileExists = async (filePath) => {
18
+ if (isDeclarationFile(filePath)) {
19
+ return false;
20
+ }
21
+ return fileSystemHost.fileExists(filePath);
22
+ };
23
+ // eslint-disable-next-line node/no-sync -- we need to provide this method to match the expected interface
24
+ fileSystemHostFilteringDeclarationFiles.fileExistsSync = (filePath) => {
25
+ if (isDeclarationFile(filePath)) {
26
+ return false;
27
+ }
28
+ // eslint-disable-next-line node/no-sync -- we need to provide this method to match the expected interface
29
+ return fileSystemHost.fileExistsSync(filePath);
30
+ };
31
+ fileSystemHostFilteringDeclarationFiles.directoryExists = async (directoryPath) => {
32
+ if (isTypesRootFolder(directoryPath)) {
33
+ return false;
34
+ }
35
+ return fileSystemHost.directoryExists(directoryPath);
36
+ };
37
+ // eslint-disable-next-line node/no-sync -- we need to provide this method to match the expected interface
38
+ fileSystemHostFilteringDeclarationFiles.directoryExistsSync = (directoryPath) => {
39
+ if (isTypesRootFolder(directoryPath)) {
40
+ return false;
41
+ }
42
+ // eslint-disable-next-line node/no-sync -- we need to provide this method to match the expected interface
43
+ return fileSystemHost.directoryExistsSync(directoryPath);
44
+ };
45
+ return {
46
+ fileSystemHostWithoutFilter: fileSystemHost,
47
+ fileSystemHostFilteringDeclarationFiles
48
+ };
49
+ }
50
+ //# sourceMappingURL=typescript-file-host.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typescript-file-host.js","sourceRoot":"","sources":["../../../../source/dependency-scanner/typescript-file-host.ts"],"names":[],"mappings":"AAEA,MAAM,yBAAyB,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;AAEzE,SAAS,iBAAiB,CAAC,QAAgB;IACvC,MAAM,kBAAkB,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;IAElD,KAAK,MAAM,wBAAwB,IAAI,yBAAyB,EAAE,CAAC;QAC/D,IAAI,kBAAkB,CAAC,QAAQ,CAAC,wBAAwB,CAAC,EAAE,CAAC;YACxD,OAAO,IAAI,CAAC;QAChB,CAAC;IACL,CAAC;IAED,OAAO,KAAK,CAAC;AACjB,CAAC;AAED,SAAS,iBAAiB,CAAC,aAAqB;IAC5C,OAAO,aAAa,CAAC,QAAQ,CAAC,sBAAsB,CAAC,IAAI,aAAa,CAAC,QAAQ,CAAC,uBAAuB,CAAC,CAAC;AAC7G,CAAC;AAWD,MAAM,UAAU,wBAAwB,CAAC,YAA4C;IACjF,MAAM,EAAE,cAAc,EAAE,GAAG,YAAY,CAAC;IAExC,MAAM,uCAAuC,GAAG,MAAM,CAAC,MAAM,CAAC,cAAc,CAAmB,CAAC;IAEhG,uCAAuC,CAAC,UAAU,GAAG,KAAK,EAAE,QAAQ,EAAE,EAAE;QACpE,IAAI,iBAAiB,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC9B,OAAO,KAAK,CAAC;QACjB,CAAC;QAED,OAAO,cAAc,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IAC/C,CAAC,CAAC;IAEF,0GAA0G;IAC1G,uCAAuC,CAAC,cAAc,GAAG,CAAC,QAAQ,EAAE,EAAE;QAClE,IAAI,iBAAiB,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC9B,OAAO,KAAK,CAAC;QACjB,CAAC;QAED,0GAA0G;QAC1G,OAAO,cAAc,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;IACnD,CAAC,CAAC;IAEF,uCAAuC,CAAC,eAAe,GAAG,KAAK,EAAE,aAAa,EAAE,EAAE;QAC9E,IAAI,iBAAiB,CAAC,aAAa,CAAC,EAAE,CAAC;YACnC,OAAO,KAAK,CAAC;QACjB,CAAC;QAED,OAAO,cAAc,CAAC,eAAe,CAAC,aAAa,CAAC,CAAC;IACzD,CAAC,CAAC;IAEF,0GAA0G;IAC1G,uCAAuC,CAAC,mBAAmB,GAAG,CAAC,aAAa,EAAE,EAAE;QAC5E,IAAI,iBAAiB,CAAC,aAAa,CAAC,EAAE,CAAC;YACnC,OAAO,KAAK,CAAC;QACjB,CAAC;QAED,0GAA0G;QAC1G,OAAO,cAAc,CAAC,mBAAmB,CAAC,aAAa,CAAC,CAAC;IAC7D,CAAC,CAAC;IAEF,OAAO;QACH,2BAA2B,EAAE,cAAc;QAC3C,uCAAuC;KAC1C,CAAC;AACN,CAAC"}
@@ -0,0 +1,23 @@
1
+ import { type Project as _Project, type SourceFile } from 'ts-morph';
2
+ import type { FileSystemAdapters } from './typescript-file-host.js';
3
+ export type ModuleResolution = 'common-js' | 'module';
4
+ export type TypescriptProjectAnalyzerDependencies = {
5
+ readonly Project: typeof _Project;
6
+ readonly fileSystemAdapters: FileSystemAdapters;
7
+ getReferencedSourceFiles(sourceFile: Readonly<SourceFile>): readonly Readonly<SourceFile>[];
8
+ };
9
+ export type AnalyzationOptions = {
10
+ readonly moduleResolution: ModuleResolution;
11
+ readonly failOnCompileErrors: boolean;
12
+ readonly resolveDeclarationFiles: boolean;
13
+ };
14
+ export type TypescriptProject = {
15
+ getReferencedSourceFilePaths(containingSourceFilePath: string): readonly string[];
16
+ getSourceFile(filePath: string): Readonly<SourceFile>;
17
+ };
18
+ export type TypescriptProjectAnalyzer = {
19
+ analyzeProject(folder: string, options: AnalyzationOptions): TypescriptProject;
20
+ };
21
+ export declare function getSourcePathFromSourceFile(sourceFile: Readonly<SourceFile>): string;
22
+ export declare function createTypescriptProjectAnalyzer(dependencies: TypescriptProjectAnalyzerDependencies): TypescriptProjectAnalyzer;
23
+ //# sourceMappingURL=typescript-project-analyzer.d.ts.map
@@ -0,0 +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,CAAC;AAClB,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAEpE,MAAM,MAAM,gBAAgB,GAAG,WAAW,GAAG,QAAQ,CAAC;AAEtD,MAAM,MAAM,qCAAqC,GAAG;IAChD,QAAQ,CAAC,OAAO,EAAE,OAAO,QAAQ,CAAC;IAClC,QAAQ,CAAC,kBAAkB,EAAE,kBAAkB,CAAC;IAChD,wBAAwB,CAAC,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC,GAAG,SAAS,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;CAC/F,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC7B,QAAQ,CAAC,gBAAgB,EAAE,gBAAgB,CAAC;IAC5C,QAAQ,CAAC,mBAAmB,EAAE,OAAO,CAAC;IACtC,QAAQ,CAAC,uBAAuB,EAAE,OAAO,CAAC;CAC7C,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC5B,4BAA4B,CAAC,wBAAwB,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAAC;IAClF,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;CACzD,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACpC,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,kBAAkB,GAAG,iBAAiB,CAAC;CAClF,CAAC;AAEF,wBAAgB,2BAA2B,CAAC,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC,GAAG,MAAM,CAIpF;AAwBD,wBAAgB,+BAA+B,CAC3C,YAAY,EAAE,qCAAqC,GACpD,yBAAyB,CAkD3B"}
@@ -0,0 +1,64 @@
1
+ import path from 'node:path';
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 { moduleResolution, 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: moduleResolution === 'module' ? ModuleKind.Node16 : ModuleKind.CommonJS
18
+ };
19
+ if (!resolveDeclarationFiles) {
20
+ compilerOptions.types = [];
21
+ compilerOptions.typeRoots = [];
22
+ }
23
+ return compilerOptions;
24
+ }
25
+ export function createTypescriptProjectAnalyzer(dependencies) {
26
+ const { fileSystemAdapters, Project, getReferencedSourceFiles } = dependencies;
27
+ return {
28
+ analyzeProject(folder, options) {
29
+ const project = new Project({
30
+ compilerOptions: analyzationOptionsToCompilerOptions(options),
31
+ fileSystem: options.resolveDeclarationFiles
32
+ ? fileSystemAdapters.fileSystemHostWithoutFilter
33
+ : fileSystemAdapters.fileSystemHostFilteringDeclarationFiles
34
+ });
35
+ const fileExtension = options.resolveDeclarationFiles ? '.d.ts' : '.js';
36
+ const filesPattern = path.join(folder, `**/*${fileExtension}`);
37
+ project.addSourceFilesAtPaths([filesPattern]);
38
+ if (options.failOnCompileErrors) {
39
+ const diagnostics = project.getPreEmitDiagnostics();
40
+ if (diagnostics.length > 0) {
41
+ throw new Error('Failed to analyze source files');
42
+ }
43
+ }
44
+ return {
45
+ getReferencedSourceFilePaths(containingSourceFilePath) {
46
+ const currentSourceFile = project.getSourceFile(containingSourceFilePath);
47
+ if (currentSourceFile === undefined) {
48
+ return [];
49
+ }
50
+ const referencedSourceFilePaths = getReferencedSourceFiles(currentSourceFile).map(getSourcePathFromSourceFile);
51
+ return referencedSourceFilePaths;
52
+ },
53
+ getSourceFile(filePath) {
54
+ const sourceFile = project.getSourceFile(filePath);
55
+ if (sourceFile === undefined) {
56
+ throw new Error(`Failed to find source file for "${filePath}"`);
57
+ }
58
+ return sourceFile;
59
+ }
60
+ };
61
+ }
62
+ };
63
+ }
64
+ //# sourceMappingURL=typescript-project-analyzer.js.map
@@ -0,0 +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,CAAC;AAC7B,OAAO,EACH,UAAU,EAGV,oBAAoB,EAEvB,MAAM,UAAU,CAAC;AA0BlB,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,gBAAgB,EAAE,uBAAuB,EAAE,GAAG,OAAO,CAAC;IAE9D,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,gBAAgB,KAAK,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,QAAQ;KAClF,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,OAAO,CAAC,uBAAuB;oBACvC,CAAC,CAAC,kBAAkB,CAAC,2BAA2B;oBAChD,CAAC,CAAC,kBAAkB,CAAC,uCAAuC;aACnE,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,IAAI,OAAO,CAAC,mBAAmB,EAAE,CAAC;gBAC9B,MAAM,WAAW,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC;gBAEpD,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACzB,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;gBACtD,CAAC;YACL,CAAC;YAED,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,aAAa,CAAC,QAAQ;oBAClB,MAAM,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;oBAEnD,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;wBAC3B,MAAM,IAAI,KAAK,CAAC,mCAAmC,QAAQ,GAAG,CAAC,CAAC;oBACpE,CAAC;oBAED,OAAO,UAAU,CAAC;gBACtB,CAAC;aACJ,CAAC;QACN,CAAC;KACJ,CAAC;AACN,CAAC"}
@@ -0,0 +1,27 @@
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
+ export 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
+ };
25
+ export declare function createDirectedGraph<TId extends GraphNodeId, TData>(): DirectedGraph<TId, TData>;
26
+ export {};
27
+ //# sourceMappingURL=graph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../../../../source/directed-graph/graph.ts"],"names":[],"mappings":"AAAA,KAAK,WAAW,GAAG,MAAM,GAAG,MAAM,CAAC;AAEnC,KAAK,SAAS,CAAC,GAAG,SAAS,WAAW,EAAE,KAAK,IAAI;IAC7C,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC;IACjB,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IACrB,QAAQ,CAAC,eAAe,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;IACnC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;CAClC,CAAC;AAEF,MAAM,MAAM,SAAS,CAAC,GAAG,SAAS,WAAW,IAAI;IAC7C,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC;IACnB,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC;CACpB,CAAC;AAEF,KAAK,OAAO,CAAC,GAAG,SAAS,WAAW,EAAE,KAAK,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,KAAK,IAAI,CAAC;AAE/F,MAAM,MAAM,aAAa,CAAC,GAAG,SAAS,WAAW,EAAE,KAAK,IAAI;IACxD,OAAO,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,GAAG,IAAI,CAAC;IACpC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC;IAC9C,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC;IACjD,OAAO,CAAC,EAAE,EAAE,GAAG,GAAG,OAAO,CAAC;IAC1B,aAAa,CAAC,IAAI,EAAE,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC;IACvD,uBAAuB,CAAC,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,IAAI,CAAC;IAC1E,YAAY,IAAI,SAAS,CAAC,SAAS,GAAG,EAAE,CAAC,EAAE,CAAC;IAC5C,QAAQ,IAAI,OAAO,CAAC;IACpB,yBAAyB,IAAI,SAAS,CAAC,SAAS,GAAG,EAAE,CAAC,EAAE,CAAC;IACzD,OAAO,IAAI,aAAa,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;CACxC,CAAC;AA6DF,wBAAgB,mBAAmB,CAAC,GAAG,SAAS,WAAW,EAAE,KAAK,KAAK,aAAa,CAAC,GAAG,EAAE,KAAK,CAAC,CAqM/F"}
@@ -0,0 +1,183 @@
1
+ function addAdjacentNodeId(node, idToAdd) {
2
+ return {
3
+ id: node.id,
4
+ data: node.data,
5
+ incomingEdges: node.incomingEdges,
6
+ adjacentNodeIds: new Set([...node.adjacentNodeIds, idToAdd])
7
+ };
8
+ }
9
+ function removeAdjacentNodeId(node, idToRemove) {
10
+ const adjacentNodeIds = new Set(node.adjacentNodeIds);
11
+ adjacentNodeIds.delete(idToRemove);
12
+ return {
13
+ id: node.id,
14
+ data: node.data,
15
+ incomingEdges: node.incomingEdges,
16
+ adjacentNodeIds
17
+ };
18
+ }
19
+ function increaseIncomingEdges(node) {
20
+ return {
21
+ id: node.id,
22
+ data: node.data,
23
+ adjacentNodeIds: node.adjacentNodeIds,
24
+ incomingEdges: node.incomingEdges + 1
25
+ };
26
+ }
27
+ function decreaseIncomingEdges(node) {
28
+ return {
29
+ id: node.id,
30
+ data: node.data,
31
+ adjacentNodeIds: node.adjacentNodeIds,
32
+ incomingEdges: node.incomingEdges - 1
33
+ };
34
+ }
35
+ function getNonVisitedAdjacentIds(node, visited) {
36
+ return Array.from(node.adjacentNodeIds).filter((id) => {
37
+ return !visited.has(id);
38
+ });
39
+ }
40
+ export function createDirectedGraph() {
41
+ const nodes = new Map();
42
+ function getNode(id) {
43
+ const node = nodes.get(id);
44
+ if (node === undefined) {
45
+ throw new Error(`Node with id "${id}" does not exist`);
46
+ }
47
+ return node;
48
+ }
49
+ function getIncomingEdgesPerNode() {
50
+ const incomingEdgesPerNode = new Map();
51
+ for (const node of nodes.values()) {
52
+ incomingEdgesPerNode.set(node.id, node.incomingEdges);
53
+ }
54
+ return incomingEdgesPerNode;
55
+ }
56
+ function decreaseIncomingEdgesPerNodeForAdjacentNodes(incomingEdgesPerNode, ids) {
57
+ const newIncomingEdgesPerNode = new Map(incomingEdgesPerNode);
58
+ for (const id of ids) {
59
+ const node = getNode(id);
60
+ for (const adjacentNodeId of node.adjacentNodeIds) {
61
+ const degree = newIncomingEdgesPerNode.get(adjacentNodeId) ?? 0;
62
+ newIncomingEdgesPerNode.set(adjacentNodeId, degree - 1);
63
+ }
64
+ }
65
+ return newIncomingEdgesPerNode;
66
+ }
67
+ function detectCyclesForNode(baseNode, visitedIds) {
68
+ const newVisitedIds = [...visitedIds, baseNode.id];
69
+ if (visitedIds.includes(baseNode.id)) {
70
+ return [newVisitedIds];
71
+ }
72
+ const cycles = [];
73
+ for (const id of baseNode.adjacentNodeIds) {
74
+ const cyclesInAdjacentNode = detectCyclesForNode(getNode(id), newVisitedIds);
75
+ cycles.push(...cyclesInAdjacentNode);
76
+ }
77
+ return cycles;
78
+ }
79
+ function detectCycles() {
80
+ const cycles = [];
81
+ const idsWithinCycles = new Set();
82
+ for (const baseNode of nodes.values()) {
83
+ if (!idsWithinCycles.has(baseNode.id)) {
84
+ const cyclesForNode = detectCyclesForNode(baseNode, []);
85
+ if (cyclesForNode.length > 0) {
86
+ cycles.push(...cyclesForNode);
87
+ for (const id of cyclesForNode.flat()) {
88
+ idsWithinCycles.add(id);
89
+ }
90
+ }
91
+ }
92
+ }
93
+ return cycles;
94
+ }
95
+ function isCyclic() {
96
+ const cycles = detectCycles();
97
+ return cycles.length > 0;
98
+ }
99
+ function recursivelyGetTopologicalGenerations(alreadyDiscovered, incomingEdgesPerNode) {
100
+ const currentGeneration = [];
101
+ for (const node of nodes.values()) {
102
+ if (!alreadyDiscovered.has(node.id) && incomingEdgesPerNode.get(node.id) === 0) {
103
+ currentGeneration.push(node.id);
104
+ }
105
+ }
106
+ if (currentGeneration.length > 0) {
107
+ const newIncomingEdgesPerNode = decreaseIncomingEdgesPerNodeForAdjacentNodes(incomingEdgesPerNode, currentGeneration);
108
+ const currentlyDiscovered = new Set([...alreadyDiscovered, ...currentGeneration]);
109
+ const generations = recursivelyGetTopologicalGenerations(currentlyDiscovered, newIncomingEdgesPerNode);
110
+ return [currentGeneration, ...generations];
111
+ }
112
+ return [];
113
+ }
114
+ return {
115
+ addNode(id, data) {
116
+ if (nodes.has(id)) {
117
+ throw new Error(`Node with id "${id}" already exists`);
118
+ }
119
+ nodes.set(id, { id, data, adjacentNodeIds: new Set(), incomingEdges: 0 });
120
+ },
121
+ hasNode(id) {
122
+ return nodes.has(id);
123
+ },
124
+ hasConnection(edge) {
125
+ const fromNode = getNode(edge.from);
126
+ return fromNode.adjacentNodeIds.has(edge.to);
127
+ },
128
+ connect(edge) {
129
+ const fromNode = getNode(edge.from);
130
+ const toNode = getNode(edge.to);
131
+ if (fromNode.adjacentNodeIds.has(toNode.id)) {
132
+ throw new Error(`Edge from "${edge.from}" to "${toNode.id}" already exists`);
133
+ }
134
+ nodes.set(edge.from, addAdjacentNodeId(fromNode, toNode.id));
135
+ nodes.set(edge.to, increaseIncomingEdges(getNode(edge.to)));
136
+ },
137
+ disconnect(edge) {
138
+ const fromNode = getNode(edge.from);
139
+ const toNode = getNode(edge.to);
140
+ if (!fromNode.adjacentNodeIds.has(toNode.id)) {
141
+ throw new Error(`Edge from "${edge.from}" to "${toNode.id}" does not exist`);
142
+ }
143
+ nodes.set(edge.from, removeAdjacentNodeId(fromNode, toNode.id));
144
+ nodes.set(edge.to, decreaseIncomingEdges(toNode));
145
+ },
146
+ visitBreadthFirstSearch(startId, visitor) {
147
+ const startNode = getNode(startId);
148
+ const queue = [startNode];
149
+ const visited = new Set();
150
+ for (let head = queue.shift(); head !== undefined; head = queue.shift()) {
151
+ visited.add(head.id);
152
+ visitor(head);
153
+ const nonVisitedAdjacentIds = getNonVisitedAdjacentIds(head, visited);
154
+ for (const id of nonVisitedAdjacentIds) {
155
+ const adjacentNode = getNode(id);
156
+ queue.push(adjacentNode);
157
+ }
158
+ }
159
+ },
160
+ detectCycles,
161
+ isCyclic,
162
+ getTopologicalGenerations() {
163
+ if (isCyclic()) {
164
+ throw new Error('Failed to determine topological generations, current graph is cyclic');
165
+ }
166
+ const incomingEdgesPerNode = getIncomingEdgesPerNode();
167
+ return recursivelyGetTopologicalGenerations(new Set(), incomingEdgesPerNode);
168
+ },
169
+ reverse() {
170
+ const reversedGraph = createDirectedGraph();
171
+ for (const node of nodes.values()) {
172
+ reversedGraph.addNode(node.id, node.data);
173
+ }
174
+ for (const node of nodes.values()) {
175
+ for (const adjacentNodeId of node.adjacentNodeIds) {
176
+ reversedGraph.connect({ from: adjacentNodeId, to: node.id });
177
+ }
178
+ }
179
+ return reversedGraph;
180
+ }
181
+ };
182
+ }
183
+ //# sourceMappingURL=graph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.js","sourceRoot":"","sources":["../../../../source/directed-graph/graph.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { areFileDescriptionEqual } from './equal.js';
2
+ import { sortByFilePath } from './sort.js';
3
+ export function compareFileDescriptions(fileDescriptionsA, fileDescriptionsB) {
4
+ if (fileDescriptionsA.length !== fileDescriptionsB.length) {
5
+ return { status: 'not-equal' };
6
+ }
7
+ const sortedFileDescriptionsA = sortByFilePath(fileDescriptionsA);
8
+ const sortedFileDescriptionsB = sortByFilePath(fileDescriptionsB);
9
+ const areAllFileDescriptionsEqual = sortedFileDescriptionsA.every((fileDescriptionA, index) => {
10
+ const fileDescriptionB = sortedFileDescriptionsB[index];
11
+ return fileDescriptionB !== undefined && areFileDescriptionEqual(fileDescriptionA, fileDescriptionB);
12
+ });
13
+ if (areAllFileDescriptionsEqual) {
14
+ return { status: 'equal' };
15
+ }
16
+ return { status: 'not-equal' };
17
+ }
18
+ //# sourceMappingURL=compare.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compare.js","sourceRoot":"","sources":["../../../../source/file-description/compare.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAErD,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAM3C,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,uBAAuB,GAAG,cAAc,CAAC,iBAAiB,CAAC,CAAC;IAClE,MAAM,uBAAuB,GAAG,cAAc,CAAC,iBAAiB,CAAC,CAAC;IAClE,MAAM,2BAA2B,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC,gBAAgB,EAAE,KAAK,EAAE,EAAE;QAC1F,MAAM,gBAAgB,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC;QACxD,OAAO,gBAAgB,KAAK,SAAS,IAAI,uBAAuB,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,CAAC;IACzG,CAAC,CAAC,CAAC;IAEH,IAAI,2BAA2B,EAAE,CAAC;QAC9B,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IAC/B,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;AACnC,CAAC"}
@@ -0,0 +1,4 @@
1
+ export function areFileDescriptionEqual(first, second) {
2
+ return first.filePath === second.filePath && first.content === second.content;
3
+ }
4
+ //# sourceMappingURL=equal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"equal.js","sourceRoot":"","sources":["../../../../source/file-description/equal.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,uBAAuB,CAAC,KAAsB,EAAE,MAAuB;IACnF,OAAO,KAAK,CAAC,QAAQ,KAAK,MAAM,CAAC,QAAQ,IAAI,KAAK,CAAC,OAAO,KAAK,MAAM,CAAC,OAAO,CAAC;AAClF,CAAC"}
@@ -0,0 +1,5 @@
1
+ export type FileDescription = {
2
+ readonly filePath: string;
3
+ readonly content: string;
4
+ };
5
+ //# sourceMappingURL=file-description.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-description.d.ts","sourceRoot":"","sources":["../../../../source/file-description/file-description.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,eAAe,GAAG;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC5B,CAAC"}
@@ -0,0 +1,13 @@
1
+ function compareFilePath(first, second) {
2
+ if (first.filePath < second.filePath) {
3
+ return -1;
4
+ }
5
+ if (first.filePath > second.filePath) {
6
+ return 1;
7
+ }
8
+ return 0;
9
+ }
10
+ export function sortByFilePath(fileDescriptions) {
11
+ return Array.from(fileDescriptions).sort(compareFilePath);
12
+ }
13
+ //# sourceMappingURL=sort.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sort.js","sourceRoot":"","sources":["../../../../source/file-description/sort.ts"],"names":[],"mappings":"AAOA,SAAS,eAAe,CAAC,KAAsB,EAAE,MAAuB;IACpE,IAAI,KAAK,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;QACnC,OAAO,CAAC,CAAC,CAAC;IACd,CAAC;IACD,IAAI,KAAK,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;QACnC,OAAO,CAAC,CAAC;IACb,CAAC;IACD,OAAO,CAAC,CAAC;AACb,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,gBAA4C;IACvE,OAAO,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;AAC9D,CAAC"}
@@ -0,0 +1,33 @@
1
+ const indentationSize = 4;
2
+ function compareEntryKeys(entryA, entryB) {
3
+ const [keyA] = entryA;
4
+ const [keyB] = entryB;
5
+ if (keyA < keyB) {
6
+ return -1;
7
+ }
8
+ if (keyA > keyB) {
9
+ return 1;
10
+ }
11
+ return 0;
12
+ }
13
+ function isRecord(value) {
14
+ return typeof value === 'object' && value !== null;
15
+ }
16
+ function deepSort(value, visitedObjects) {
17
+ if (visitedObjects.includes(value)) {
18
+ throw new Error('Circular structures are not supported');
19
+ }
20
+ if (isRecord(value)) {
21
+ const entries = Object.entries(value);
22
+ entries.sort(compareEntryKeys);
23
+ return Object.fromEntries(entries.map(([propertyName, propertyValue]) => {
24
+ return [propertyName, deepSort(propertyValue, [...visitedObjects, value])];
25
+ }));
26
+ }
27
+ return value;
28
+ }
29
+ export function serializePackageJson(data) {
30
+ const sortedData = deepSort(data, []);
31
+ return JSON.stringify(sortedData, null, indentationSize);
32
+ }
33
+ //# sourceMappingURL=package-json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-json.js","sourceRoot":"","sources":["../../../source/package-json.ts"],"names":[],"mappings":"AAEA,MAAM,eAAe,GAAG,CAAC,CAAC;AAO1B,SAAS,gBAAgB,CAAC,MAA0B,EAAE,MAA0B;IAC5E,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;IACtB,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;IAEtB,IAAI,IAAI,GAAG,IAAI,EAAE,CAAC;QACd,OAAO,CAAC,CAAC,CAAC;IACd,CAAC;IACD,IAAI,IAAI,GAAG,IAAI,EAAE,CAAC;QACd,OAAO,CAAC,CAAC;IACb,CAAC;IAED,OAAO,CAAC,CAAC;AACb,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC5B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC;AACvD,CAAC;AAED,SAAS,QAAQ,CAAI,KAAQ,EAAE,cAAkC;IAC7D,IAAI,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC7D,CAAC;IAED,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAClB,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACtC,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAE/B,OAAO,MAAM,CAAC,WAAW,CACrB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,EAAE,aAAa,CAAC,EAAE,EAAE;YAC1C,OAAO,CAAC,YAAY,EAAE,QAAQ,CAAC,aAAa,EAAE,CAAC,GAAG,cAAc,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;QAC/E,CAAC,CAAC,CACA,CAAC;IACX,CAAC;IAED,OAAO,KAAK,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,IAA2B;IAC5D,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACtC,OAAO,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,eAAe,CAAC,CAAC;AAC7D,CAAC"}
package/package.json ADDED
@@ -0,0 +1,48 @@
1
+ {
2
+ "author": "Mathias Schreck <schreck.mathias@gmail.com>",
3
+ "contributors": {
4
+ "0": "Christian Rackerseder <github@echooff.de>"
5
+ },
6
+ "dependencies": {
7
+ "@effect/schema": "0.60.4",
8
+ "@ts-morph/common": "0.22.0",
9
+ "@types/libnpmpublish": "4.0.3",
10
+ "@types/npm-registry-fetch": "8.0.4",
11
+ "effect": "2.1.1",
12
+ "libnpmpublish": "9.0.0",
13
+ "mitt": "3.0.1",
14
+ "npm-registry-fetch": "16.0.0",
15
+ "semver": "7.5.4",
16
+ "ssri": "10.0.5",
17
+ "tar-stream": "3.1.6",
18
+ "true-myth": "7.1.0",
19
+ "ts-morph": "19.0.0",
20
+ "type-fest": "4.3.1"
21
+ },
22
+ "description": "Enable customized npm package bundling and publishing using packtory’s versatile API.",
23
+ "engines": {
24
+ "node": "^20"
25
+ },
26
+ "keywords": {
27
+ "0": "bundler",
28
+ "1": "bundling",
29
+ "2": "npm",
30
+ "3": "publish",
31
+ "4": "modules",
32
+ "5": "versioning",
33
+ "6": "monorepo",
34
+ "7": "publishing",
35
+ "8": "package",
36
+ "9": "packaging"
37
+ },
38
+ "license": "MIT",
39
+ "main": "packages/packtory/packtory.entry-point.js",
40
+ "name": "packtory",
41
+ "repository": {
42
+ "type": "git",
43
+ "url": "git+ssh://git@github.com/enormora/packtory.git"
44
+ },
45
+ "type": "module",
46
+ "types": "packages/packtory/packtory.entry-point.d.ts",
47
+ "version": "0.0.1"
48
+ }
@@ -0,0 +1,21 @@
1
+ import fs from 'node:fs';
2
+ import { Project } from 'ts-morph';
3
+ import { RealFileSystemHost } from '@ts-morph/common';
4
+ import { createBundler } from '../../bundler/bundler.js';
5
+ import { createDependencyScanner } from '../../dependency-scanner/scanner.js';
6
+ import { createSourceMapFileLocator } from '../../dependency-scanner/source-map-file-locator.js';
7
+ import { createTypescriptProjectAnalyzer } from '../../dependency-scanner/typescript-project-analyzer.js';
8
+ import { getReferencedSourceFiles } from '../../dependency-scanner/source-file-references.js';
9
+ import { createFileManager } from '../../artifacts/file-manager.js';
10
+ import { createFileSystemAdapters } from '../../dependency-scanner/typescript-file-host.js';
11
+ const fileManager = createFileManager({ hostFileSystem: fs.promises });
12
+ const sourceMapFileLocator = createSourceMapFileLocator({ fileManager });
13
+ const fileSystemAdapters = createFileSystemAdapters({ fileSystemHost: new RealFileSystemHost() });
14
+ const typescriptProjectAnalyzer = createTypescriptProjectAnalyzer({
15
+ Project,
16
+ getReferencedSourceFiles,
17
+ fileSystemAdapters
18
+ });
19
+ const dependencyScanner = createDependencyScanner({ sourceMapFileLocator, typescriptProjectAnalyzer });
20
+ export const bundler = createBundler({ dependencyScanner });
21
+ //# sourceMappingURL=bundler.entry-point.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundler.entry-point.js","sourceRoot":"","sources":["../../../../../source/packages/bundler/bundler.entry-point.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACnC,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,uBAAuB,EAAE,MAAM,qCAAqC,CAAC;AAC9E,OAAO,EAAE,0BAA0B,EAAE,MAAM,qDAAqD,CAAC;AACjG,OAAO,EAAE,+BAA+B,EAAE,MAAM,yDAAyD,CAAC;AAC1G,OAAO,EAAE,wBAAwB,EAAE,MAAM,oDAAoD,CAAC;AAC9F,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAAE,wBAAwB,EAAE,MAAM,kDAAkD,CAAC;AAE5F,MAAM,WAAW,GAAG,iBAAiB,CAAC,EAAE,cAAc,EAAE,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;AACvE,MAAM,oBAAoB,GAAG,0BAA0B,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC;AACzE,MAAM,kBAAkB,GAAG,wBAAwB,CAAC,EAAE,cAAc,EAAE,IAAI,kBAAkB,EAAE,EAAE,CAAC,CAAC;AAClG,MAAM,yBAAyB,GAAG,+BAA+B,CAAC;IAC9D,OAAO;IACP,wBAAwB;IACxB,kBAAkB;CACrB,CAAC,CAAC;AACH,MAAM,iBAAiB,GAAG,uBAAuB,CAAC,EAAE,oBAAoB,EAAE,yBAAyB,EAAE,CAAC,CAAC;AACvG,MAAM,CAAC,MAAM,OAAO,GAAG,aAAa,CAAC,EAAE,iBAAiB,EAAE,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ export declare const buildAndPublishAll: (config: unknown, options: {
2
+ readonly dryRun: boolean;
3
+ }) => Promise<import("../../packtory/packtory.js").PublishAllResult>;
4
+ export declare const progressBroadcastConsumer: import("../../progress/progress-broadcaster.js").ProgressBroadcastConsumer;
5
+ export type { PacktoryConfig } from '../../config/config.js';
6
+ export type { PublishAllResult } from '../../packtory/packtory.js';
7
+ //# sourceMappingURL=packtory.entry-point.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"packtory.entry-point.d.ts","sourceRoot":"","sources":["../../../../../source/packages/packtory/packtory.entry-point.ts"],"names":[],"mappings":"AAgCA,eAAO,MAAQ,kBAAkB;;oEAAa,CAAC;AAC/C,eAAO,MAAM,yBAAyB,4EAA+B,CAAC;AAEtE,YAAY,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,YAAY,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC"}
@@ -0,0 +1,32 @@
1
+ import fs from 'node:fs';
2
+ import npmFetch from 'npm-registry-fetch';
3
+ import { publish } from 'libnpmpublish';
4
+ import { createFileManager } from '../../artifacts/file-manager.js';
5
+ import { createPublisher } from '../../publisher/publisher.js';
6
+ import { bundler } from '../bundler/bundler.entry-point.js';
7
+ import { createRegistryClient } from '../../publisher/registry-client.js';
8
+ import { createArtifactsBuilder } from '../../artifacts/artifacts-builder.js';
9
+ import { createProgressBroadcaster } from '../../progress/progress-broadcaster.js';
10
+ import { createScheduler } from '../../packtory/scheduler.js';
11
+ import { createPacktory } from '../../packtory/packtory.js';
12
+ import { createTarballBuilder } from '../../tar/tarball-builder.js';
13
+ const fileManager = createFileManager({ hostFileSystem: fs.promises });
14
+ const registryClient = createRegistryClient({ npmFetch, publish });
15
+ const artifactsBuilder = createArtifactsBuilder({ fileManager, tarballBuilder: createTarballBuilder() });
16
+ const progressBroadcaster = createProgressBroadcaster();
17
+ const publisher = createPublisher({
18
+ progressBroadcaster: progressBroadcaster.provider,
19
+ bundler,
20
+ registryClient,
21
+ artifactsBuilder
22
+ });
23
+ const scheduler = createScheduler({
24
+ progressBroadcastProvider: progressBroadcaster.provider
25
+ });
26
+ const packtory = createPacktory({
27
+ scheduler,
28
+ publisher
29
+ });
30
+ export const { buildAndPublishAll } = packtory;
31
+ export const progressBroadcastConsumer = progressBroadcaster.consumer;
32
+ //# sourceMappingURL=packtory.entry-point.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"packtory.entry-point.js","sourceRoot":"","sources":["../../../../../source/packages/packtory/packtory.entry-point.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,QAAQ,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,OAAO,EAAE,MAAM,mCAAmC,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAC1E,OAAO,EAAE,sBAAsB,EAAE,MAAM,sCAAsC,CAAC;AAC9E,OAAO,EAAE,yBAAyB,EAAE,MAAM,wCAAwC,CAAC;AACnF,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAEpE,MAAM,WAAW,GAAG,iBAAiB,CAAC,EAAE,cAAc,EAAE,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;AACvE,MAAM,cAAc,GAAG,oBAAoB,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;AACnE,MAAM,gBAAgB,GAAG,sBAAsB,CAAC,EAAE,WAAW,EAAE,cAAc,EAAE,oBAAoB,EAAE,EAAE,CAAC,CAAC;AACzG,MAAM,mBAAmB,GAAG,yBAAyB,EAAE,CAAC;AACxD,MAAM,SAAS,GAAG,eAAe,CAAC;IAC9B,mBAAmB,EAAE,mBAAmB,CAAC,QAAQ;IACjD,OAAO;IACP,cAAc;IACd,gBAAgB;CACnB,CAAC,CAAC;AACH,MAAM,SAAS,GAAG,eAAe,CAAC;IAC9B,yBAAyB,EAAE,mBAAmB,CAAC,QAAQ;CAC1D,CAAC,CAAC;AAEH,MAAM,QAAQ,GAAG,cAAc,CAAC;IAC5B,SAAS;IACT,SAAS;CACZ,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,EAAE,kBAAkB,EAAE,GAAG,QAAQ,CAAC;AAC/C,MAAM,CAAC,MAAM,yBAAyB,GAAG,mBAAmB,CAAC,QAAQ,CAAC"}