build-raptor 0.131.0 → 0.133.0

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 (214) hide show
  1. package/dist/deps/brand/brand.d.ts +5 -0
  2. package/dist/deps/brand/brand.js +3 -0
  3. package/dist/deps/brand/index.d.ts +1 -0
  4. package/dist/deps/brand/index.js +18 -0
  5. package/dist/deps/build-failed-error/build-failed-error.d.ts +14 -0
  6. package/dist/deps/build-failed-error/build-failed-error.js +13 -0
  7. package/dist/deps/build-failed-error/index.d.ts +1 -0
  8. package/dist/deps/build-failed-error/index.js +18 -0
  9. package/dist/deps/build-raptor-api/build-raptor-api.d.ts +351 -0
  10. package/dist/deps/build-raptor-api/build-raptor-api.js +132 -0
  11. package/dist/deps/build-raptor-api/index.d.ts +2 -0
  12. package/dist/deps/build-raptor-api/index.js +19 -0
  13. package/dist/deps/build-raptor-api/step-by-step-processor.d.ts +35 -0
  14. package/dist/deps/build-raptor-api/step-by-step-processor.js +3 -0
  15. package/dist/deps/build-raptor-core/breakdown.d.ts +18 -0
  16. package/dist/deps/build-raptor-core/breakdown.js +99 -0
  17. package/dist/deps/build-raptor-core/build-raptor-config.d.ts +21 -0
  18. package/dist/deps/build-raptor-core/build-raptor-config.js +25 -0
  19. package/dist/deps/build-raptor-core/default-asset-publisher.d.ts +10 -0
  20. package/dist/deps/build-raptor-core/default-asset-publisher.js +16 -0
  21. package/dist/deps/build-raptor-core/engine-bootstrapper.d.ts +50 -0
  22. package/dist/deps/build-raptor-core/engine-bootstrapper.js +200 -0
  23. package/dist/deps/build-raptor-core/engine-event-scheme.d.ts +20 -0
  24. package/dist/deps/build-raptor-core/engine-event-scheme.js +3 -0
  25. package/dist/deps/build-raptor-core/engine.d.ts +66 -0
  26. package/dist/deps/build-raptor-core/engine.js +285 -0
  27. package/dist/deps/build-raptor-core/examplify-zod.d.ts +93 -0
  28. package/dist/deps/build-raptor-core/examplify-zod.js +257 -0
  29. package/dist/deps/build-raptor-core/execution-plan.d.ts +20 -0
  30. package/dist/deps/build-raptor-core/execution-plan.js +66 -0
  31. package/dist/deps/build-raptor-core/execution-record.d.ts +17 -0
  32. package/dist/deps/build-raptor-core/execution-record.js +3 -0
  33. package/dist/deps/build-raptor-core/execution-type.d.ts +2 -0
  34. package/dist/deps/build-raptor-core/execution-type.js +3 -0
  35. package/dist/deps/build-raptor-core/find-repo-dir.d.ts +1 -0
  36. package/dist/deps/build-raptor-core/find-repo-dir.js +27 -0
  37. package/dist/deps/build-raptor-core/fingerprint-ledger.d.ts +33 -0
  38. package/dist/deps/build-raptor-core/fingerprint-ledger.js +164 -0
  39. package/dist/deps/build-raptor-core/fingerprint.d.ts +3 -0
  40. package/dist/deps/build-raptor-core/fingerprint.js +13 -0
  41. package/dist/deps/build-raptor-core/fingerprinter.d.ts +15 -0
  42. package/dist/deps/build-raptor-core/fingerprinter.js +122 -0
  43. package/dist/deps/build-raptor-core/hasher.d.ts +21 -0
  44. package/dist/deps/build-raptor-core/hasher.js +93 -0
  45. package/dist/deps/build-raptor-core/index.d.ts +9 -0
  46. package/dist/deps/build-raptor-core/index.js +26 -0
  47. package/dist/deps/build-raptor-core/model.d.ts +17 -0
  48. package/dist/deps/build-raptor-core/model.js +40 -0
  49. package/dist/deps/build-raptor-core/nop-asset-publisher.d.ts +6 -0
  50. package/dist/deps/build-raptor-core/nop-asset-publisher.js +12 -0
  51. package/dist/deps/build-raptor-core/performance-report.d.ts +5 -0
  52. package/dist/deps/build-raptor-core/performance-report.js +3 -0
  53. package/dist/deps/build-raptor-core/phase.d.ts +1 -0
  54. package/dist/deps/build-raptor-core/phase.js +3 -0
  55. package/dist/deps/build-raptor-core/planner.d.ts +12 -0
  56. package/dist/deps/build-raptor-core/planner.js +43 -0
  57. package/dist/deps/build-raptor-core/purger.d.ts +11 -0
  58. package/dist/deps/build-raptor-core/purger.js +65 -0
  59. package/dist/deps/build-raptor-core/slot-index.d.ts +6 -0
  60. package/dist/deps/build-raptor-core/slot-index.js +17 -0
  61. package/dist/deps/build-raptor-core/step-by-step-transmitter.d.ts +15 -0
  62. package/dist/deps/build-raptor-core/step-by-step-transmitter.js +94 -0
  63. package/dist/deps/build-raptor-core/tar-stream.d.ts +20 -0
  64. package/dist/deps/build-raptor-core/tar-stream.js +194 -0
  65. package/dist/deps/build-raptor-core/task-executor.d.ts +32 -0
  66. package/dist/deps/build-raptor-core/task-executor.js +321 -0
  67. package/dist/deps/build-raptor-core/task-store-cli.d.ts +1 -0
  68. package/dist/deps/build-raptor-core/task-store-cli.js +61 -0
  69. package/dist/deps/build-raptor-core/task-store-event.d.ts +17 -0
  70. package/dist/deps/build-raptor-core/task-store-event.js +3 -0
  71. package/dist/deps/build-raptor-core/task-store.d.ts +41 -0
  72. package/dist/deps/build-raptor-core/task-store.js +302 -0
  73. package/dist/deps/build-raptor-core/task-summary.d.ts +12 -0
  74. package/dist/deps/build-raptor-core/task-summary.js +3 -0
  75. package/dist/deps/build-raptor-core/task-tracker.d.ts +23 -0
  76. package/dist/deps/build-raptor-core/task-tracker.js +97 -0
  77. package/dist/deps/build-raptor-core/task.d.ts +30 -0
  78. package/dist/deps/build-raptor-core/task.js +90 -0
  79. package/dist/deps/build-raptor-core/updatable-task-output-registry.d.ts +13 -0
  80. package/dist/deps/build-raptor-core/updatable-task-output-registry.js +75 -0
  81. package/dist/deps/build-raptor-core/validate-task-infos.d.ts +3 -0
  82. package/dist/deps/build-raptor-core/validate-task-infos.js +53 -0
  83. package/dist/deps/build-raptor-core-testkit/build-raptor-core-testkit.d.ts +1 -0
  84. package/dist/deps/build-raptor-core-testkit/build-raptor-core-testkit.js +18 -0
  85. package/dist/deps/build-raptor-core-testkit/driver.d.ts +119 -0
  86. package/dist/deps/build-raptor-core-testkit/driver.js +305 -0
  87. package/dist/deps/build-raptor-core-testkit/index.d.ts +3 -0
  88. package/dist/deps/build-raptor-core-testkit/index.js +20 -0
  89. package/dist/deps/build-raptor-core-testkit/repo-protocol-testkit.d.ts +35 -0
  90. package/dist/deps/build-raptor-core-testkit/repo-protocol-testkit.js +226 -0
  91. package/dist/deps/build-raptor-core-testkit/simple-node-repo-protocol.d.ts +27 -0
  92. package/dist/deps/build-raptor-core-testkit/simple-node-repo-protocol.js +140 -0
  93. package/dist/deps/build-run-id/build-run-id.d.ts +3 -0
  94. package/dist/deps/build-run-id/build-run-id.js +13 -0
  95. package/dist/deps/build-run-id/index.d.ts +1 -0
  96. package/dist/deps/build-run-id/index.js +18 -0
  97. package/dist/deps/core-types/core-types.d.ts +29 -0
  98. package/dist/deps/core-types/core-types.js +81 -0
  99. package/dist/deps/core-types/index.d.ts +1 -0
  100. package/dist/deps/core-types/index.js +18 -0
  101. package/dist/deps/logger/index.d.ts +1 -0
  102. package/dist/deps/logger/index.js +18 -0
  103. package/dist/deps/logger/logger.d.ts +26 -0
  104. package/dist/deps/logger/logger.js +152 -0
  105. package/dist/deps/misc/arrays.d.ts +7 -0
  106. package/dist/deps/misc/arrays.js +67 -0
  107. package/dist/deps/misc/camelize-record.d.ts +6 -0
  108. package/dist/deps/misc/camelize-record.js +16 -0
  109. package/dist/deps/misc/clean-directory.d.ts +4 -0
  110. package/dist/deps/misc/clean-directory.js +80 -0
  111. package/dist/deps/misc/constructs.d.ts +106 -0
  112. package/dist/deps/misc/constructs.js +131 -0
  113. package/dist/deps/misc/directory-scanner.d.ts +49 -0
  114. package/dist/deps/misc/directory-scanner.js +165 -0
  115. package/dist/deps/misc/executor.d.ts +39 -0
  116. package/dist/deps/misc/executor.js +59 -0
  117. package/dist/deps/misc/file-system-storage-client.d.ts +23 -0
  118. package/dist/deps/misc/file-system-storage-client.js +93 -0
  119. package/dist/deps/misc/folderify.d.ts +8 -0
  120. package/dist/deps/misc/folderify.js +86 -0
  121. package/dist/deps/misc/graph.d.ts +29 -0
  122. package/dist/deps/misc/graph.js +200 -0
  123. package/dist/deps/misc/in-memory-storage-client.d.ts +21 -0
  124. package/dist/deps/misc/in-memory-storage-client.js +75 -0
  125. package/dist/deps/misc/index.d.ts +20 -0
  126. package/dist/deps/misc/index.js +37 -0
  127. package/dist/deps/misc/int.d.ts +10 -0
  128. package/dist/deps/misc/int.js +29 -0
  129. package/dist/deps/misc/internal/graph-executor.d.ts +15 -0
  130. package/dist/deps/misc/internal/graph-executor.js +93 -0
  131. package/dist/deps/misc/maps.d.ts +29 -0
  132. package/dist/deps/misc/maps.js +47 -0
  133. package/dist/deps/misc/misc.d.ts +23 -0
  134. package/dist/deps/misc/misc.js +94 -0
  135. package/dist/deps/misc/object-map.d.ts +10 -0
  136. package/dist/deps/misc/object-map.js +26 -0
  137. package/dist/deps/misc/promises.d.ts +39 -0
  138. package/dist/deps/misc/promises.js +78 -0
  139. package/dist/deps/misc/records.d.ts +11 -0
  140. package/dist/deps/misc/records.js +40 -0
  141. package/dist/deps/misc/slurp-dir.d.ts +1 -0
  142. package/dist/deps/misc/slurp-dir.js +14 -0
  143. package/dist/deps/misc/storage-client.d.ts +12 -0
  144. package/dist/deps/misc/storage-client.js +3 -0
  145. package/dist/deps/misc/stream-to-buffer.d.ts +2 -0
  146. package/dist/deps/misc/stream-to-buffer.js +26 -0
  147. package/dist/deps/misc/strings.d.ts +12 -0
  148. package/dist/deps/misc/strings.js +68 -0
  149. package/dist/deps/misc/typed-publisher.d.ts +17 -0
  150. package/dist/deps/misc/typed-publisher.js +65 -0
  151. package/dist/deps/repo-protocol/index.d.ts +3 -0
  152. package/dist/deps/repo-protocol/index.js +20 -0
  153. package/dist/deps/repo-protocol/repo-protocol.d.ts +49 -0
  154. package/dist/deps/repo-protocol/repo-protocol.js +3 -0
  155. package/dist/deps/repo-protocol/task-info.d.ts +18 -0
  156. package/dist/deps/repo-protocol/task-info.js +3 -0
  157. package/dist/deps/repo-protocol/test-run-summary.d.ts +54 -0
  158. package/dist/deps/repo-protocol/test-run-summary.js +32 -0
  159. package/dist/deps/repo-protocol-toolbox/generate-task-infos.d.ts +5 -0
  160. package/dist/deps/repo-protocol-toolbox/generate-task-infos.js +26 -0
  161. package/dist/deps/repo-protocol-toolbox/index.d.ts +3 -0
  162. package/dist/deps/repo-protocol-toolbox/index.js +20 -0
  163. package/dist/deps/repo-protocol-toolbox/repo-protocol-toolbox.d.ts +10 -0
  164. package/dist/deps/repo-protocol-toolbox/repo-protocol-toolbox.js +90 -0
  165. package/dist/deps/repo-protocol-toolbox/task-definition.d.ts +14 -0
  166. package/dist/deps/repo-protocol-toolbox/task-definition.js +3 -0
  167. package/dist/deps/reporter-output/index.d.ts +1 -0
  168. package/dist/deps/reporter-output/index.js +18 -0
  169. package/dist/deps/reporter-output/reporter-output.d.ts +49 -0
  170. package/dist/deps/reporter-output/reporter-output.js +25 -0
  171. package/dist/deps/s3-storage-client/creds.d.ts +4 -0
  172. package/dist/deps/s3-storage-client/creds.js +3 -0
  173. package/dist/deps/s3-storage-client/get-s3-storage-client-factory.d.ts +3 -0
  174. package/dist/deps/s3-storage-client/get-s3-storage-client-factory.js +45 -0
  175. package/dist/deps/s3-storage-client/index.d.ts +2 -0
  176. package/dist/deps/s3-storage-client/index.js +19 -0
  177. package/dist/deps/s3-storage-client/main.d.ts +1 -0
  178. package/dist/deps/s3-storage-client/main.js +20 -0
  179. package/dist/deps/s3-storage-client/s3-storage-client.d.ts +25 -0
  180. package/dist/deps/s3-storage-client/s3-storage-client.js +134 -0
  181. package/dist/deps/task-name/index.d.ts +1 -0
  182. package/dist/deps/task-name/index.js +18 -0
  183. package/dist/deps/task-name/task-name.d.ts +17 -0
  184. package/dist/deps/task-name/task-name.js +44 -0
  185. package/dist/deps/unit-metadata/index.d.ts +1 -0
  186. package/dist/deps/unit-metadata/index.js +18 -0
  187. package/dist/deps/unit-metadata/unit-metadata.d.ts +14 -0
  188. package/dist/deps/unit-metadata/unit-metadata.js +32 -0
  189. package/dist/deps/yarn-repo-protocol/build-task-record.d.ts +61 -0
  190. package/dist/deps/yarn-repo-protocol/build-task-record.js +29 -0
  191. package/dist/deps/yarn-repo-protocol/generate-test-run-summary.d.ts +4 -0
  192. package/dist/deps/yarn-repo-protocol/generate-test-run-summary.js +26 -0
  193. package/dist/deps/yarn-repo-protocol/index.d.ts +2 -0
  194. package/dist/deps/yarn-repo-protocol/index.js +19 -0
  195. package/dist/deps/yarn-repo-protocol/rerun-list.d.ts +12 -0
  196. package/dist/deps/yarn-repo-protocol/rerun-list.js +6 -0
  197. package/dist/deps/yarn-repo-protocol/yarn-repo-protocol-config.d.ts +24 -0
  198. package/dist/deps/yarn-repo-protocol/yarn-repo-protocol-config.js +34 -0
  199. package/dist/deps/yarn-repo-protocol/yarn-repo-protocol.d.ts +82 -0
  200. package/dist/deps/yarn-repo-protocol/yarn-repo-protocol.js +1036 -0
  201. package/dist/src/build-raptor-cli.d.ts +60 -0
  202. package/dist/src/build-raptor-cli.js +514 -0
  203. package/dist/src/index.d.ts +1 -0
  204. package/dist/src/index.js +20 -0
  205. package/dist/src/main.d.ts +2 -0
  206. package/dist/src/main.js +23 -0
  207. package/dist/src/register-asset-request.d.ts +18 -0
  208. package/dist/src/register-asset-request.js +11 -0
  209. package/dist/src/task-execution-visualizer.d.ts +17 -0
  210. package/dist/src/task-execution-visualizer.js +116 -0
  211. package/package.json +17 -14
  212. package/build-raptor.js +0 -7259
  213. package/index.d.ts +0 -22
  214. package/index.js +0 -7231
@@ -0,0 +1,165 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.DirectoryScanner = void 0;
37
+ const fs = __importStar(require("fs"));
38
+ const fse = __importStar(require("fs-extra"));
39
+ const path = __importStar(require("path"));
40
+ const _1 = require(".");
41
+ const strings_1 = require("./strings");
42
+ const DEFAULT_OPTIONS = { predicate: () => true, startingPointMustExist: true };
43
+ // TODO(imaman): use RepoRoot, PathInRepo
44
+ class DirectoryScanner {
45
+ constructor(rootDir, options) {
46
+ this.rootDir = rootDir;
47
+ if (!path.isAbsolute(rootDir)) {
48
+ throw new Error(`rootDir must be absolute`);
49
+ }
50
+ this.rootDir = path.normalize(rootDir);
51
+ this.options = options ?? DEFAULT_OPTIONS;
52
+ }
53
+ isValid(relativePath, stat) {
54
+ if (!this.options.predicate) {
55
+ return true;
56
+ }
57
+ return this.options.predicate(relativePath, stat);
58
+ }
59
+ async scanTree(...a) {
60
+ const cb = a.length === 2 ? a[1] : a.length === 3 ? a[2] : (0, _1.shouldNeverHappen)(a);
61
+ const options = a.length === 2 ? DEFAULT_OPTIONS : a.length === 3 ? a[1] : (0, _1.shouldNeverHappen)(a);
62
+ const startingPoint = a.length === 2 ? a[0] : a.length === 3 ? a[0] : (0, _1.shouldNeverHappen)(a);
63
+ await this.scanTreeImpl(startingPoint, options, undefined, cb);
64
+ }
65
+ /**
66
+ * Recursively scans a file tree, returning relative paths to all files.
67
+ * @param startingPoint a relative path to start scanning files at. It is resolved to an absolute path by joining it
68
+ * to the root-dir value passed to the constructor. Trailing path separators are omitted (i.e. `'a/b///'` is
69
+ * equivalent to `'a/b'`).
70
+ * @returns an array of relative paths (relative from the `root` path passed to the constructor)
71
+ */
72
+ async listPaths(startingPoint, options) {
73
+ const ret = [];
74
+ await this.scanTreeImpl(startingPoint, { ...DEFAULT_OPTIONS, ...options }, p => {
75
+ ret.push(p);
76
+ });
77
+ return ret;
78
+ }
79
+ /**
80
+ * Returns relative paths to all files at the file tree rooted at the given directory.
81
+ * @param dir directory to scan files under
82
+ * @returns an array of relative paths (relative to `dir`)
83
+ */
84
+ static async listPaths(dir, options) {
85
+ return await new DirectoryScanner(dir).listPaths('', options);
86
+ }
87
+ async scanTreeImpl(startingPoint, options, pathCallback, cb) {
88
+ const startingPointMustExist = options.startingPointMustExist ?? true;
89
+ if (path.isAbsolute(startingPoint)) {
90
+ throw new Error(`relativePath must be relative`);
91
+ }
92
+ const trimmedStartingPoint = (0, strings_1.trimTrailing)(startingPoint, path.sep);
93
+ const resolvedPath = path.normalize(path.join(this.rootDir, trimmedStartingPoint));
94
+ const exists = await fse.pathExists(resolvedPath);
95
+ if (!exists) {
96
+ if (startingPointMustExist) {
97
+ throw new Error(`Starting point does not exist (${resolvedPath})`);
98
+ }
99
+ return;
100
+ }
101
+ const predicate = (relativePath, stats) => runPred(relativePath, stats, this.options.predicate) && runPred(relativePath, stats, options.predicate);
102
+ await this.scanFileTree(resolvedPath, predicate, pathCallback, cb);
103
+ }
104
+ async scanFileTree(resolvedPath, predicate, pathCallback, cb) {
105
+ const relativePath = path.normalize(path.relative(this.rootDir, resolvedPath));
106
+ const stat = await this.getStat(resolvedPath);
107
+ if (relativePath !== '.' && !predicate(relativePath, stat)) {
108
+ return;
109
+ }
110
+ if (!stat.isDirectory()) {
111
+ if (cb) {
112
+ const content = this.readContent(resolvedPath, stat);
113
+ cb(relativePath, content, stat);
114
+ }
115
+ if (pathCallback) {
116
+ pathCallback(relativePath);
117
+ }
118
+ return;
119
+ }
120
+ const files = await this.readDirSorted(resolvedPath);
121
+ // TODO(imaman): make this loop concurrent. we need to use p-qeueu to avoid too much concurrency.
122
+ for (const file of files) {
123
+ await this.scanFileTree(path.join(resolvedPath, file), predicate, pathCallback, cb);
124
+ }
125
+ }
126
+ readContent(resolvedPath, stat) {
127
+ try {
128
+ if (stat.isSymbolicLink()) {
129
+ return Buffer.from(fs.readlinkSync(resolvedPath));
130
+ }
131
+ return fs.readFileSync(resolvedPath);
132
+ }
133
+ catch (e) {
134
+ throw new Error(`failed to read ${stat.isSymbolicLink() ? 'symbolic link' : 'file'} at ${resolvedPath}: ${e}`);
135
+ }
136
+ }
137
+ // IMPORTANT!
138
+ // It is very hard to properly test this function because it is hard to create a situation in which the underlying
139
+ // readdir() call will actually return a list which is not sortred. On the other hand, we cannot assume that, so
140
+ // we do have to proactively sort the list (but we cannot really write a test that will fail if we drop the line that
141
+ // does the sorting).
142
+ async readDirSorted(resolvedPath) {
143
+ try {
144
+ const ret = await fse.readdir(resolvedPath);
145
+ ret.sort();
146
+ return ret;
147
+ }
148
+ catch (e) {
149
+ throw new Error(`Cannot readdir ${resolvedPath}: ${e}`);
150
+ }
151
+ }
152
+ async getStat(resolvedPath) {
153
+ // This function is mainly for providing a human-readable error message with a menaingful stacktrace (fs-extra uses
154
+ // native calls which do not have a stacktrace).
155
+ try {
156
+ return fs.lstatSync(resolvedPath);
157
+ }
158
+ catch (e) {
159
+ throw new Error(`Cannot stat ${resolvedPath}: ${e}`);
160
+ }
161
+ }
162
+ }
163
+ exports.DirectoryScanner = DirectoryScanner;
164
+ const runPred = (relativePath, stats, p) => (p ? p(relativePath, stats) : true);
165
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlyZWN0b3J5LXNjYW5uZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZGlyZWN0b3J5LXNjYW5uZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsdUNBQXdCO0FBQ3hCLDhDQUErQjtBQUMvQiwyQ0FBNEI7QUFFNUIsd0JBQXFDO0FBQ3JDLHVDQUF3QztBQXNCeEMsTUFBTSxlQUFlLEdBQXNCLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksRUFBRSxzQkFBc0IsRUFBRSxJQUFJLEVBQUUsQ0FBQTtBQU9sRyx5Q0FBeUM7QUFDekMsTUFBYSxnQkFBZ0I7SUFFM0IsWUFBcUIsT0FBZSxFQUFFLE9BQTRCO1FBQTdDLFlBQU8sR0FBUCxPQUFPLENBQVE7UUFDbEMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUM5QixNQUFNLElBQUksS0FBSyxDQUFDLDBCQUEwQixDQUFDLENBQUE7UUFDN0MsQ0FBQztRQUNELElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUN0QyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sSUFBSSxlQUFlLENBQUE7SUFDM0MsQ0FBQztJQUVELE9BQU8sQ0FBQyxZQUFvQixFQUFFLElBQWM7UUFDMUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDNUIsT0FBTyxJQUFJLENBQUE7UUFDYixDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUE7SUFDbkQsQ0FBQztJQVdELEtBQUssQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUE4RjtRQUM5RyxNQUFNLEVBQUUsR0FBcUIsQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBQSxvQkFBaUIsRUFBQyxDQUFDLENBQUMsQ0FBQTtRQUNqRyxNQUFNLE9BQU8sR0FBWSxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFBLG9CQUFpQixFQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ3hHLE1BQU0sYUFBYSxHQUFHLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUEsb0JBQWlCLEVBQUMsQ0FBQyxDQUFDLENBQUE7UUFDMUYsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFBO0lBQ2hFLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxLQUFLLENBQUMsU0FBUyxDQUFDLGFBQTJCLEVBQUUsT0FBMEI7UUFDckUsTUFBTSxHQUFHLEdBQWEsRUFBRSxDQUFBO1FBQ3hCLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLEVBQUUsRUFBRSxHQUFHLGVBQWUsRUFBRSxHQUFHLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFO1lBQzdFLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDYixDQUFDLENBQUMsQ0FBQTtRQUNGLE9BQU8sR0FBRyxDQUFBO0lBQ1osQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxHQUFXLEVBQUUsT0FBMEI7UUFDNUQsT0FBTyxNQUFNLElBQUksZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQTtJQUMvRCxDQUFDO0lBRU8sS0FBSyxDQUFDLFlBQVksQ0FDeEIsYUFBMkIsRUFDM0IsT0FBZ0IsRUFDaEIsWUFBZ0MsRUFDaEMsRUFBcUI7UUFFckIsTUFBTSxzQkFBc0IsR0FBRyxPQUFPLENBQUMsc0JBQXNCLElBQUksSUFBSSxDQUFBO1FBQ3JFLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDO1lBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMsK0JBQStCLENBQUMsQ0FBQTtRQUNsRCxDQUFDO1FBRUQsTUFBTSxvQkFBb0IsR0FBRyxJQUFBLHNCQUFZLEVBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUNsRSxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxvQkFBb0IsQ0FBQyxDQUFDLENBQUE7UUFFbEYsTUFBTSxNQUFNLEdBQUcsTUFBTSxHQUFHLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFBO1FBQ2pELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNaLElBQUksc0JBQXNCLEVBQUUsQ0FBQztnQkFDM0IsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQ0FBa0MsWUFBWSxHQUFHLENBQUMsQ0FBQTtZQUNwRSxDQUFDO1lBQ0QsT0FBTTtRQUNSLENBQUM7UUFDRCxNQUFNLFNBQVMsR0FBRyxDQUFDLFlBQW9CLEVBQUUsS0FBZSxFQUFFLEVBQUUsQ0FDMUQsT0FBTyxDQUFDLFlBQVksRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxPQUFPLENBQUMsWUFBWSxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUE7UUFDekcsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEVBQUUsQ0FBQyxDQUFBO0lBQ3BFLENBQUM7SUFFTyxLQUFLLENBQUMsWUFBWSxDQUN4QixZQUFvQixFQUNwQixTQUFvQixFQUNwQixZQUFnQyxFQUNoQyxFQUFxQjtRQUVyQixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFBO1FBQzlFLE1BQU0sSUFBSSxHQUFhLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQTtRQUN2RCxJQUFJLFlBQVksS0FBSyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDM0QsT0FBTTtRQUNSLENBQUM7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7WUFDeEIsSUFBSSxFQUFFLEVBQUUsQ0FBQztnQkFDUCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsQ0FBQTtnQkFDcEQsRUFBRSxDQUFDLFlBQVksRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUE7WUFDakMsQ0FBQztZQUVELElBQUksWUFBWSxFQUFFLENBQUM7Z0JBQ2pCLFlBQVksQ0FBQyxZQUFZLENBQUMsQ0FBQTtZQUM1QixDQUFDO1lBQ0QsT0FBTTtRQUNSLENBQUM7UUFFRCxNQUFNLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLENBQUE7UUFDcEQsaUdBQWlHO1FBQ2pHLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxFQUFFLENBQUM7WUFDekIsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsRUFBRSxDQUFDLENBQUE7UUFDckYsQ0FBQztJQUNILENBQUM7SUFFTyxXQUFXLENBQUMsWUFBb0IsRUFBRSxJQUFjO1FBQ3RELElBQUksQ0FBQztZQUNILElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUM7Z0JBQzFCLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUE7WUFDbkQsQ0FBQztZQUNELE9BQU8sRUFBRSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsQ0FBQTtRQUN0QyxDQUFDO1FBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNYLE1BQU0sSUFBSSxLQUFLLENBQUMsa0JBQWtCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxNQUFNLE9BQU8sWUFBWSxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUE7UUFDaEgsQ0FBQztJQUNILENBQUM7SUFFRCxhQUFhO0lBQ2Isa0hBQWtIO0lBQ2xILGdIQUFnSDtJQUNoSCxxSEFBcUg7SUFDckgscUJBQXFCO0lBQ2IsS0FBSyxDQUFDLGFBQWEsQ0FBQyxZQUFvQjtRQUM5QyxJQUFJLENBQUM7WUFDSCxNQUFNLEdBQUcsR0FBRyxNQUFNLEdBQUcsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUE7WUFDM0MsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFBO1lBQ1YsT0FBTyxHQUFHLENBQUE7UUFDWixDQUFDO1FBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNYLE1BQU0sSUFBSSxLQUFLLENBQUMsa0JBQWtCLFlBQVksS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBQ3pELENBQUM7SUFDSCxDQUFDO0lBRU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxZQUFvQjtRQUN4QyxtSEFBbUg7UUFDbkgsZ0RBQWdEO1FBQ2hELElBQUksQ0FBQztZQUNILE9BQU8sRUFBRSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQTtRQUNuQyxDQUFDO1FBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNYLE1BQU0sSUFBSSxLQUFLLENBQUMsZUFBZSxZQUFZLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUN0RCxDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBckpELDRDQXFKQztBQUVELE1BQU0sT0FBTyxHQUFHLENBQUMsWUFBb0IsRUFBRSxLQUFlLEVBQUUsQ0FBYSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUEifQ==
@@ -0,0 +1,39 @@
1
+ import PQueue from 'p-queue';
2
+ /**
3
+ * Allows tasks (promises) to be executed with controlled concurrency, providing error-handling ("fail fast"), and notifications
4
+ * that allow consumers to track progress. Uses PQueue as the underlying priority queue.
5
+ *
6
+ * The execution of a task is essentially calling the callback function passed to the copnstructor (`workToDo`), passing
7
+ * to it a `T` value (`T` is a generic type, representing information about a single task).
8
+ *
9
+ * Fail-fast error handling: once a task is rejected, it is guaranteed that no further tasks will be execute. Tasks that
10
+ * started running before the rejection will continue to run. Subsequent calls to `schedule()` are allowed but those
11
+ * scheduled tasks will not be executed.
12
+ *
13
+ * Progress notifications: consumers can use `subscribe()` to register a handler that will be called whenever some
14
+ * progress in made (including progress due to task failures, or tasks that are no-op due to a previous failure).
15
+ */
16
+ export declare class Executor<T> {
17
+ private readonly queue;
18
+ private readonly workToDo;
19
+ private firstError;
20
+ private publisher;
21
+ constructor(queue: PQueue, workToDo: (t: T) => Promise<void>);
22
+ /**
23
+ * Schedules a task to be executed. A task will be executed only if no earlier-executed task has failed.
24
+ * @param task information about the task to execute
25
+ */
26
+ schedule(task: T): void;
27
+ /**
28
+ * Registers handler to be called when any task settles (either succeeds or fails or is no-op due to an earlier
29
+ * failure). Once handler is registered, it is guranateed to be called exactly once for every subsequently scheduled
30
+ * task. A handler is not called for previously executed tasks. Handlers are call
31
+ *
32
+ * @param handler the callback function to register
33
+ */
34
+ subscribe(handler: (arg: {
35
+ lastSettled: T;
36
+ error?: unknown;
37
+ }) => void): void;
38
+ private process;
39
+ }
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Executor = void 0;
4
+ const typed_publisher_1 = require("./typed-publisher");
5
+ /**
6
+ * Allows tasks (promises) to be executed with controlled concurrency, providing error-handling ("fail fast"), and notifications
7
+ * that allow consumers to track progress. Uses PQueue as the underlying priority queue.
8
+ *
9
+ * The execution of a task is essentially calling the callback function passed to the copnstructor (`workToDo`), passing
10
+ * to it a `T` value (`T` is a generic type, representing information about a single task).
11
+ *
12
+ * Fail-fast error handling: once a task is rejected, it is guaranteed that no further tasks will be execute. Tasks that
13
+ * started running before the rejection will continue to run. Subsequent calls to `schedule()` are allowed but those
14
+ * scheduled tasks will not be executed.
15
+ *
16
+ * Progress notifications: consumers can use `subscribe()` to register a handler that will be called whenever some
17
+ * progress in made (including progress due to task failures, or tasks that are no-op due to a previous failure).
18
+ */
19
+ class Executor {
20
+ constructor(queue, workToDo) {
21
+ this.queue = queue;
22
+ this.workToDo = workToDo;
23
+ this.publisher = new typed_publisher_1.TypedPublisher();
24
+ }
25
+ /**
26
+ * Schedules a task to be executed. A task will be executed only if no earlier-executed task has failed.
27
+ * @param task information about the task to execute
28
+ */
29
+ schedule(task) {
30
+ this.queue.add(async () => this.process(task));
31
+ }
32
+ /**
33
+ * Registers handler to be called when any task settles (either succeeds or fails or is no-op due to an earlier
34
+ * failure). Once handler is registered, it is guranateed to be called exactly once for every subsequently scheduled
35
+ * task. A handler is not called for previously executed tasks. Handlers are call
36
+ *
37
+ * @param handler the callback function to register
38
+ */
39
+ subscribe(handler) {
40
+ return this.publisher.on('progressMade', handler);
41
+ }
42
+ async process(task) {
43
+ if (!this.firstError) {
44
+ try {
45
+ await this.workToDo(task);
46
+ }
47
+ catch (e) {
48
+ if (!this.firstError) {
49
+ this.firstError = e;
50
+ }
51
+ }
52
+ }
53
+ // The event that is published intentionally includes an exception, even if it was emitted from the execution of
54
+ // some other vertex. This makes event handling easier on the subscriber side.
55
+ await this.publisher.publish('progressMade', { lastSettled: task, error: this.firstError });
56
+ }
57
+ }
58
+ exports.Executor = Executor;
59
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhlY3V0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZXhlY3V0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUEsdURBQWtEO0FBRWxEOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxNQUFhLFFBQVE7SUFLbkIsWUFBNkIsS0FBYSxFQUFtQixRQUFpQztRQUFqRSxVQUFLLEdBQUwsS0FBSyxDQUFRO1FBQW1CLGFBQVEsR0FBUixRQUFRLENBQXlCO1FBRnRGLGNBQVMsR0FBRyxJQUFJLGdDQUFjLEVBQXlELENBQUE7SUFFRSxDQUFDO0lBRWxHOzs7T0FHRztJQUNILFFBQVEsQ0FBQyxJQUFPO1FBQ2QsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7SUFDaEQsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILFNBQVMsQ0FBQyxPQUEyRDtRQUNuRSxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLGNBQWMsRUFBRSxPQUFPLENBQUMsQ0FBQTtJQUNuRCxDQUFDO0lBRU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFPO1FBQzNCLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDckIsSUFBSSxDQUFDO2dCQUNILE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQTtZQUMzQixDQUFDO1lBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDWCxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO29CQUNyQixJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQTtnQkFDckIsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBRUQsZ0hBQWdIO1FBQ2hILDhFQUE4RTtRQUM5RSxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFBO0lBQzdGLENBQUM7Q0FDRjtBQXpDRCw0QkF5Q0MifQ==
@@ -0,0 +1,23 @@
1
+ import { Key, StorageClient } from './storage-client';
2
+ interface Options {
3
+ /**
4
+ * If defined, cleanup of the directory will be triggered if the toal size (in bytes) of all files in the directory
5
+ * exceeds this value. If undefined, no cleanup will take place.
6
+ */
7
+ triggerCleanupIfByteSizeExceeds?: number;
8
+ }
9
+ export declare class FilesystemStorageClient implements StorageClient {
10
+ private readonly dir;
11
+ private constructor();
12
+ static create(dir: string, options?: Options): Promise<FilesystemStorageClient>;
13
+ private keyToPath;
14
+ private hashToPath;
15
+ putObject(key: Key, content: string | Buffer): Promise<void>;
16
+ putContentAddressable(content: string | Buffer): Promise<string>;
17
+ getContentAddressable(hash: string): Promise<Buffer>;
18
+ getObject(key: Key): Promise<string>;
19
+ getObject(key: Key, type: 'string'): Promise<string>;
20
+ getObject(key: Key, type: 'buffer'): Promise<Buffer>;
21
+ objectExists(key: Key): Promise<boolean>;
22
+ }
23
+ export {};
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.FilesystemStorageClient = void 0;
37
+ const fse = __importStar(require("fs-extra"));
38
+ const path = __importStar(require("path"));
39
+ const _1 = require(".");
40
+ const clean_directory_1 = require("./clean-directory");
41
+ const misc_1 = require("./misc");
42
+ class FilesystemStorageClient {
43
+ constructor(dir) {
44
+ this.dir = dir;
45
+ }
46
+ static async create(dir, options) {
47
+ await fse.ensureDir(dir);
48
+ const { triggerCleanupIfByteSizeExceeds } = options ?? {};
49
+ if (triggerCleanupIfByteSizeExceeds) {
50
+ (0, clean_directory_1.cleanDirectory)(dir, 0.5, triggerCleanupIfByteSizeExceeds);
51
+ }
52
+ return new FilesystemStorageClient(dir);
53
+ }
54
+ keyToPath(key) {
55
+ return this.hashToPath('std', (0, misc_1.computeObjectHash)({ key }));
56
+ }
57
+ hashToPath(middle, s) {
58
+ return path.join(this.dir, `${middle}-${s}`);
59
+ }
60
+ async putObject(key, content) {
61
+ await fse.writeFile(this.keyToPath(key), content);
62
+ }
63
+ async putContentAddressable(content) {
64
+ const ret = (0, misc_1.computeHash)(content);
65
+ const p = this.hashToPath('cas', ret);
66
+ await fse.writeFile(p, content);
67
+ return ret;
68
+ }
69
+ async getContentAddressable(hash) {
70
+ const p = this.hashToPath('cas', hash);
71
+ return await fse.readFile(p);
72
+ }
73
+ async getObject(key, type = 'string') {
74
+ const p = this.keyToPath(key);
75
+ try {
76
+ if (type === 'string') {
77
+ return await fse.readFile(p, 'utf-8');
78
+ }
79
+ if (type === 'buffer') {
80
+ return await fse.readFile(p);
81
+ }
82
+ (0, _1.shouldNeverHappen)(type);
83
+ }
84
+ catch (e) {
85
+ throw new Error(`getObject() failed to read file for key: ${JSON.stringify(key)}: ${e}`);
86
+ }
87
+ }
88
+ async objectExists(key) {
89
+ return await fse.pathExists(this.keyToPath(key));
90
+ }
91
+ }
92
+ exports.FilesystemStorageClient = FilesystemStorageClient;
93
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS1zeXN0ZW0tc3RvcmFnZS1jbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZmlsZS1zeXN0ZW0tc3RvcmFnZS1jbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsOENBQStCO0FBQy9CLDJDQUE0QjtBQUU1Qix3QkFBcUM7QUFDckMsdURBQWtEO0FBQ2xELGlDQUF1RDtBQVd2RCxNQUFhLHVCQUF1QjtJQUNsQyxZQUFxQyxHQUFXO1FBQVgsUUFBRyxHQUFILEdBQUcsQ0FBUTtJQUFHLENBQUM7SUFFcEQsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBVyxFQUFFLE9BQWlCO1FBQ2hELE1BQU0sR0FBRyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUV4QixNQUFNLEVBQUUsK0JBQStCLEVBQUUsR0FBRyxPQUFPLElBQUksRUFBRSxDQUFBO1FBQ3pELElBQUksK0JBQStCLEVBQUUsQ0FBQztZQUNwQyxJQUFBLGdDQUFjLEVBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSwrQkFBK0IsQ0FBQyxDQUFBO1FBQzNELENBQUM7UUFDRCxPQUFPLElBQUksdUJBQXVCLENBQUMsR0FBRyxDQUFDLENBQUE7SUFDekMsQ0FBQztJQUVPLFNBQVMsQ0FBQyxHQUFRO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsSUFBQSx3QkFBaUIsRUFBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQTtJQUMzRCxDQUFDO0lBRU8sVUFBVSxDQUFDLE1BQWMsRUFBRSxDQUFTO1FBQzFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7SUFDOUMsQ0FBQztJQUVELEtBQUssQ0FBQyxTQUFTLENBQUMsR0FBUSxFQUFFLE9BQXdCO1FBQ2hELE1BQU0sR0FBRyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFBO0lBQ25ELENBQUM7SUFFRCxLQUFLLENBQUMscUJBQXFCLENBQUMsT0FBd0I7UUFDbEQsTUFBTSxHQUFHLEdBQUcsSUFBQSxrQkFBVyxFQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQ2hDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFBO1FBQ3JDLE1BQU0sR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUE7UUFDL0IsT0FBTyxHQUFHLENBQUE7SUFDWixDQUFDO0lBRUQsS0FBSyxDQUFDLHFCQUFxQixDQUFDLElBQVk7UUFDdEMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUE7UUFDdEMsT0FBTyxNQUFNLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDOUIsQ0FBQztJQUtELEtBQUssQ0FBQyxTQUFTLENBQUMsR0FBUSxFQUFFLE9BQTRCLFFBQVE7UUFDNUQsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUM3QixJQUFJLENBQUM7WUFDSCxJQUFJLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDdEIsT0FBTyxNQUFNLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFBO1lBQ3ZDLENBQUM7WUFDRCxJQUFJLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDdEIsT0FBTyxNQUFNLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUE7WUFDOUIsQ0FBQztZQUNELElBQUEsb0JBQWlCLEVBQUMsSUFBSSxDQUFDLENBQUE7UUFDekIsQ0FBQztRQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDWCxNQUFNLElBQUksS0FBSyxDQUFDLDRDQUE0QyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUE7UUFDMUYsQ0FBQztJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsWUFBWSxDQUFDLEdBQVE7UUFDekIsT0FBTyxNQUFNLEdBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFBO0lBQ2xELENBQUM7Q0FDRjtBQTFERCwwREEwREMifQ==
@@ -0,0 +1,8 @@
1
+ type Jsonable = {
2
+ [x: string]: string | number | boolean | string[] | number[] | boolean | Jsonable | Jsonable[];
3
+ };
4
+ export type FolderifyRecipe = Record<string, string | Jsonable>;
5
+ export declare function folderify(prefix: string, recipe: FolderifyRecipe): Promise<string>;
6
+ export declare function folderify(recipe: FolderifyRecipe): Promise<string>;
7
+ export declare function writeRecipe(destinationDir: string, recipe: FolderifyRecipe): Promise<void>;
8
+ export {};
@@ -0,0 +1,86 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.folderify = folderify;
37
+ exports.writeRecipe = writeRecipe;
38
+ const fse = __importStar(require("fs-extra"));
39
+ const path = __importStar(require("path"));
40
+ const Tmp = __importStar(require("tmp-promise"));
41
+ const constructs_1 = require("./constructs");
42
+ async function folderify(...args) {
43
+ const recipe = args.length === 2 ? args[1] : args.length === 1 ? args[0] : (0, constructs_1.shouldNeverHappen)(args);
44
+ const prefix = args.length === 2 ? args[0] : args.length === 1 ? '' : (0, constructs_1.shouldNeverHappen)(args);
45
+ const ret = (await Tmp.dir()).path;
46
+ await writeRecipe(path.join(ret, prefix), recipe);
47
+ return ret;
48
+ }
49
+ async function writeRecipe(destinationDir, recipe) {
50
+ const keys = Object.keys(recipe).map(p => path.normalize(p));
51
+ const set = new Set(keys);
52
+ for (const key of keys) {
53
+ if (key === '.') {
54
+ throw new Error(`bad input - the recipe contains a file name which is either empty ('') or a dot ('.')`);
55
+ }
56
+ let curr = key;
57
+ while (true) {
58
+ curr = path.dirname(curr);
59
+ if (curr === '.') {
60
+ break;
61
+ }
62
+ if (set.has(curr)) {
63
+ throw new Error(`bad input - a file (${key}) is nested under another file (${curr})`);
64
+ }
65
+ }
66
+ }
67
+ const createFile = async (relativePath, content) => {
68
+ const file = path.join(destinationDir, relativePath);
69
+ const dir = path.dirname(file);
70
+ await fse.mkdirp(dir);
71
+ try {
72
+ if (typeof content === 'string') {
73
+ await fse.writeFile(file, content);
74
+ }
75
+ else {
76
+ await fse.writeJSON(file, content);
77
+ }
78
+ }
79
+ catch (e) {
80
+ throw new Error(`writeRecipe() failed to write file ${relativePath} under ${destinationDir}: ${e}`);
81
+ }
82
+ };
83
+ // TODO(imaman): Use promises()
84
+ await Promise.all(Object.entries(recipe).map(async ([key, value]) => await createFile(key, value)));
85
+ }
86
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9sZGVyaWZ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2ZvbGRlcmlmeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVdBLDhCQU9DO0FBRUQsa0NBbUNDO0FBdkRELDhDQUErQjtBQUMvQiwyQ0FBNEI7QUFDNUIsaURBQWtDO0FBRWxDLDZDQUFnRDtBQU96QyxLQUFLLFVBQVUsU0FBUyxDQUFDLEdBQUcsSUFBbUQ7SUFDcEYsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBQSw4QkFBaUIsRUFBQyxJQUFJLENBQUMsQ0FBQTtJQUNsRyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFBLDhCQUFpQixFQUFDLElBQUksQ0FBQyxDQUFBO0lBRTdGLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUE7SUFDbEMsTUFBTSxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUE7SUFDakQsT0FBTyxHQUFHLENBQUE7QUFDWixDQUFDO0FBRU0sS0FBSyxVQUFVLFdBQVcsQ0FBQyxjQUFzQixFQUFFLE1BQXVCO0lBQy9FLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQzVELE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxDQUFTLElBQUksQ0FBQyxDQUFBO0lBQ2pDLEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7UUFDdkIsSUFBSSxHQUFHLEtBQUssR0FBRyxFQUFFLENBQUM7WUFDaEIsTUFBTSxJQUFJLEtBQUssQ0FBQyx1RkFBdUYsQ0FBQyxDQUFBO1FBQzFHLENBQUM7UUFDRCxJQUFJLElBQUksR0FBRyxHQUFHLENBQUE7UUFDZCxPQUFPLElBQUksRUFBRSxDQUFDO1lBQ1osSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUE7WUFDekIsSUFBSSxJQUFJLEtBQUssR0FBRyxFQUFFLENBQUM7Z0JBQ2pCLE1BQUs7WUFDUCxDQUFDO1lBRUQsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQ2xCLE1BQU0sSUFBSSxLQUFLLENBQUMsdUJBQXVCLEdBQUcsbUNBQW1DLElBQUksR0FBRyxDQUFDLENBQUE7WUFDdkYsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBQ0QsTUFBTSxVQUFVLEdBQUcsS0FBSyxFQUFFLFlBQW9CLEVBQUUsT0FBMEIsRUFBRSxFQUFFO1FBQzVFLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLFlBQVksQ0FBQyxDQUFBO1FBQ3BELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDOUIsTUFBTSxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQ3JCLElBQUksQ0FBQztZQUNILElBQUksT0FBTyxPQUFPLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQ2hDLE1BQU0sR0FBRyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUE7WUFDcEMsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE1BQU0sR0FBRyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUE7WUFDcEMsQ0FBQztRQUNILENBQUM7UUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ1gsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQ0FBc0MsWUFBWSxVQUFVLGNBQWMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBQ3JHLENBQUM7SUFDSCxDQUFDLENBQUE7SUFDRCwrQkFBK0I7SUFDL0IsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsTUFBTSxVQUFVLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQTtBQUNyRyxDQUFDIn0=
@@ -0,0 +1,29 @@
1
+ import { ObjectMap } from './object-map';
2
+ interface TraverseOptions {
3
+ direction: 'forward' | 'backwards';
4
+ }
5
+ export declare class Graph<V> {
6
+ private readonly vToId;
7
+ private readonly vertexMap;
8
+ constructor(vToId: (v: V) => string);
9
+ copy(): Graph<V>;
10
+ edge(from: V, to: V): void;
11
+ private toVertex;
12
+ vertex(v: V): void;
13
+ remove(v: V): void;
14
+ vertices(): V[];
15
+ outDegree(v: V): number;
16
+ neighborsOf(v: V): V[];
17
+ backNeighborsOf(v: V): V[];
18
+ roots(): V[];
19
+ traverseFrom(startingPoints: V, options?: TraverseOptions): V[];
20
+ traverseFrom(startingPoints: V[], options?: TraverseOptions): V[];
21
+ toJSON(): Record<string, string[]>;
22
+ toString(): string;
23
+ static fromJSON(json: Record<string, string[]>): Graph<string>;
24
+ isCyclic(): boolean;
25
+ execute(concurrency: number, workToDo: (v: V) => Promise<void>, batchScheduler?: BatchScheduler<V>): Promise<void>;
26
+ makeVertexMap<T>(): ObjectMap<V, T>;
27
+ }
28
+ export type BatchScheduler<V> = (batch: V[]) => Graph<V> | undefined;
29
+ export {};