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.
- package/dist/deps/brand/brand.d.ts +5 -0
- package/dist/deps/brand/brand.js +3 -0
- package/dist/deps/brand/index.d.ts +1 -0
- package/dist/deps/brand/index.js +18 -0
- package/dist/deps/build-failed-error/build-failed-error.d.ts +14 -0
- package/dist/deps/build-failed-error/build-failed-error.js +13 -0
- package/dist/deps/build-failed-error/index.d.ts +1 -0
- package/dist/deps/build-failed-error/index.js +18 -0
- package/dist/deps/build-raptor-api/build-raptor-api.d.ts +351 -0
- package/dist/deps/build-raptor-api/build-raptor-api.js +132 -0
- package/dist/deps/build-raptor-api/index.d.ts +2 -0
- package/dist/deps/build-raptor-api/index.js +19 -0
- package/dist/deps/build-raptor-api/step-by-step-processor.d.ts +35 -0
- package/dist/deps/build-raptor-api/step-by-step-processor.js +3 -0
- package/dist/deps/build-raptor-core/breakdown.d.ts +18 -0
- package/dist/deps/build-raptor-core/breakdown.js +99 -0
- package/dist/deps/build-raptor-core/build-raptor-config.d.ts +21 -0
- package/dist/deps/build-raptor-core/build-raptor-config.js +25 -0
- package/dist/deps/build-raptor-core/default-asset-publisher.d.ts +10 -0
- package/dist/deps/build-raptor-core/default-asset-publisher.js +16 -0
- package/dist/deps/build-raptor-core/engine-bootstrapper.d.ts +50 -0
- package/dist/deps/build-raptor-core/engine-bootstrapper.js +200 -0
- package/dist/deps/build-raptor-core/engine-event-scheme.d.ts +20 -0
- package/dist/deps/build-raptor-core/engine-event-scheme.js +3 -0
- package/dist/deps/build-raptor-core/engine.d.ts +66 -0
- package/dist/deps/build-raptor-core/engine.js +285 -0
- package/dist/deps/build-raptor-core/examplify-zod.d.ts +93 -0
- package/dist/deps/build-raptor-core/examplify-zod.js +257 -0
- package/dist/deps/build-raptor-core/execution-plan.d.ts +20 -0
- package/dist/deps/build-raptor-core/execution-plan.js +66 -0
- package/dist/deps/build-raptor-core/execution-record.d.ts +17 -0
- package/dist/deps/build-raptor-core/execution-record.js +3 -0
- package/dist/deps/build-raptor-core/execution-type.d.ts +2 -0
- package/dist/deps/build-raptor-core/execution-type.js +3 -0
- package/dist/deps/build-raptor-core/find-repo-dir.d.ts +1 -0
- package/dist/deps/build-raptor-core/find-repo-dir.js +27 -0
- package/dist/deps/build-raptor-core/fingerprint-ledger.d.ts +33 -0
- package/dist/deps/build-raptor-core/fingerprint-ledger.js +164 -0
- package/dist/deps/build-raptor-core/fingerprint.d.ts +3 -0
- package/dist/deps/build-raptor-core/fingerprint.js +13 -0
- package/dist/deps/build-raptor-core/fingerprinter.d.ts +15 -0
- package/dist/deps/build-raptor-core/fingerprinter.js +122 -0
- package/dist/deps/build-raptor-core/hasher.d.ts +21 -0
- package/dist/deps/build-raptor-core/hasher.js +93 -0
- package/dist/deps/build-raptor-core/index.d.ts +9 -0
- package/dist/deps/build-raptor-core/index.js +26 -0
- package/dist/deps/build-raptor-core/model.d.ts +17 -0
- package/dist/deps/build-raptor-core/model.js +40 -0
- package/dist/deps/build-raptor-core/nop-asset-publisher.d.ts +6 -0
- package/dist/deps/build-raptor-core/nop-asset-publisher.js +12 -0
- package/dist/deps/build-raptor-core/performance-report.d.ts +5 -0
- package/dist/deps/build-raptor-core/performance-report.js +3 -0
- package/dist/deps/build-raptor-core/phase.d.ts +1 -0
- package/dist/deps/build-raptor-core/phase.js +3 -0
- package/dist/deps/build-raptor-core/planner.d.ts +12 -0
- package/dist/deps/build-raptor-core/planner.js +43 -0
- package/dist/deps/build-raptor-core/purger.d.ts +11 -0
- package/dist/deps/build-raptor-core/purger.js +65 -0
- package/dist/deps/build-raptor-core/slot-index.d.ts +6 -0
- package/dist/deps/build-raptor-core/slot-index.js +17 -0
- package/dist/deps/build-raptor-core/step-by-step-transmitter.d.ts +15 -0
- package/dist/deps/build-raptor-core/step-by-step-transmitter.js +94 -0
- package/dist/deps/build-raptor-core/tar-stream.d.ts +20 -0
- package/dist/deps/build-raptor-core/tar-stream.js +194 -0
- package/dist/deps/build-raptor-core/task-executor.d.ts +32 -0
- package/dist/deps/build-raptor-core/task-executor.js +321 -0
- package/dist/deps/build-raptor-core/task-store-cli.d.ts +1 -0
- package/dist/deps/build-raptor-core/task-store-cli.js +61 -0
- package/dist/deps/build-raptor-core/task-store-event.d.ts +17 -0
- package/dist/deps/build-raptor-core/task-store-event.js +3 -0
- package/dist/deps/build-raptor-core/task-store.d.ts +41 -0
- package/dist/deps/build-raptor-core/task-store.js +302 -0
- package/dist/deps/build-raptor-core/task-summary.d.ts +12 -0
- package/dist/deps/build-raptor-core/task-summary.js +3 -0
- package/dist/deps/build-raptor-core/task-tracker.d.ts +23 -0
- package/dist/deps/build-raptor-core/task-tracker.js +97 -0
- package/dist/deps/build-raptor-core/task.d.ts +30 -0
- package/dist/deps/build-raptor-core/task.js +90 -0
- package/dist/deps/build-raptor-core/updatable-task-output-registry.d.ts +13 -0
- package/dist/deps/build-raptor-core/updatable-task-output-registry.js +75 -0
- package/dist/deps/build-raptor-core/validate-task-infos.d.ts +3 -0
- package/dist/deps/build-raptor-core/validate-task-infos.js +53 -0
- package/dist/deps/build-raptor-core-testkit/build-raptor-core-testkit.d.ts +1 -0
- package/dist/deps/build-raptor-core-testkit/build-raptor-core-testkit.js +18 -0
- package/dist/deps/build-raptor-core-testkit/driver.d.ts +119 -0
- package/dist/deps/build-raptor-core-testkit/driver.js +305 -0
- package/dist/deps/build-raptor-core-testkit/index.d.ts +3 -0
- package/dist/deps/build-raptor-core-testkit/index.js +20 -0
- package/dist/deps/build-raptor-core-testkit/repo-protocol-testkit.d.ts +35 -0
- package/dist/deps/build-raptor-core-testkit/repo-protocol-testkit.js +226 -0
- package/dist/deps/build-raptor-core-testkit/simple-node-repo-protocol.d.ts +27 -0
- package/dist/deps/build-raptor-core-testkit/simple-node-repo-protocol.js +140 -0
- package/dist/deps/build-run-id/build-run-id.d.ts +3 -0
- package/dist/deps/build-run-id/build-run-id.js +13 -0
- package/dist/deps/build-run-id/index.d.ts +1 -0
- package/dist/deps/build-run-id/index.js +18 -0
- package/dist/deps/core-types/core-types.d.ts +29 -0
- package/dist/deps/core-types/core-types.js +81 -0
- package/dist/deps/core-types/index.d.ts +1 -0
- package/dist/deps/core-types/index.js +18 -0
- package/dist/deps/logger/index.d.ts +1 -0
- package/dist/deps/logger/index.js +18 -0
- package/dist/deps/logger/logger.d.ts +26 -0
- package/dist/deps/logger/logger.js +152 -0
- package/dist/deps/misc/arrays.d.ts +7 -0
- package/dist/deps/misc/arrays.js +67 -0
- package/dist/deps/misc/camelize-record.d.ts +6 -0
- package/dist/deps/misc/camelize-record.js +16 -0
- package/dist/deps/misc/clean-directory.d.ts +4 -0
- package/dist/deps/misc/clean-directory.js +80 -0
- package/dist/deps/misc/constructs.d.ts +106 -0
- package/dist/deps/misc/constructs.js +131 -0
- package/dist/deps/misc/directory-scanner.d.ts +49 -0
- package/dist/deps/misc/directory-scanner.js +165 -0
- package/dist/deps/misc/executor.d.ts +39 -0
- package/dist/deps/misc/executor.js +59 -0
- package/dist/deps/misc/file-system-storage-client.d.ts +23 -0
- package/dist/deps/misc/file-system-storage-client.js +93 -0
- package/dist/deps/misc/folderify.d.ts +8 -0
- package/dist/deps/misc/folderify.js +86 -0
- package/dist/deps/misc/graph.d.ts +29 -0
- package/dist/deps/misc/graph.js +200 -0
- package/dist/deps/misc/in-memory-storage-client.d.ts +21 -0
- package/dist/deps/misc/in-memory-storage-client.js +75 -0
- package/dist/deps/misc/index.d.ts +20 -0
- package/dist/deps/misc/index.js +37 -0
- package/dist/deps/misc/int.d.ts +10 -0
- package/dist/deps/misc/int.js +29 -0
- package/dist/deps/misc/internal/graph-executor.d.ts +15 -0
- package/dist/deps/misc/internal/graph-executor.js +93 -0
- package/dist/deps/misc/maps.d.ts +29 -0
- package/dist/deps/misc/maps.js +47 -0
- package/dist/deps/misc/misc.d.ts +23 -0
- package/dist/deps/misc/misc.js +94 -0
- package/dist/deps/misc/object-map.d.ts +10 -0
- package/dist/deps/misc/object-map.js +26 -0
- package/dist/deps/misc/promises.d.ts +39 -0
- package/dist/deps/misc/promises.js +78 -0
- package/dist/deps/misc/records.d.ts +11 -0
- package/dist/deps/misc/records.js +40 -0
- package/dist/deps/misc/slurp-dir.d.ts +1 -0
- package/dist/deps/misc/slurp-dir.js +14 -0
- package/dist/deps/misc/storage-client.d.ts +12 -0
- package/dist/deps/misc/storage-client.js +3 -0
- package/dist/deps/misc/stream-to-buffer.d.ts +2 -0
- package/dist/deps/misc/stream-to-buffer.js +26 -0
- package/dist/deps/misc/strings.d.ts +12 -0
- package/dist/deps/misc/strings.js +68 -0
- package/dist/deps/misc/typed-publisher.d.ts +17 -0
- package/dist/deps/misc/typed-publisher.js +65 -0
- package/dist/deps/repo-protocol/index.d.ts +3 -0
- package/dist/deps/repo-protocol/index.js +20 -0
- package/dist/deps/repo-protocol/repo-protocol.d.ts +49 -0
- package/dist/deps/repo-protocol/repo-protocol.js +3 -0
- package/dist/deps/repo-protocol/task-info.d.ts +18 -0
- package/dist/deps/repo-protocol/task-info.js +3 -0
- package/dist/deps/repo-protocol/test-run-summary.d.ts +54 -0
- package/dist/deps/repo-protocol/test-run-summary.js +32 -0
- package/dist/deps/repo-protocol-toolbox/generate-task-infos.d.ts +5 -0
- package/dist/deps/repo-protocol-toolbox/generate-task-infos.js +26 -0
- package/dist/deps/repo-protocol-toolbox/index.d.ts +3 -0
- package/dist/deps/repo-protocol-toolbox/index.js +20 -0
- package/dist/deps/repo-protocol-toolbox/repo-protocol-toolbox.d.ts +10 -0
- package/dist/deps/repo-protocol-toolbox/repo-protocol-toolbox.js +90 -0
- package/dist/deps/repo-protocol-toolbox/task-definition.d.ts +14 -0
- package/dist/deps/repo-protocol-toolbox/task-definition.js +3 -0
- package/dist/deps/reporter-output/index.d.ts +1 -0
- package/dist/deps/reporter-output/index.js +18 -0
- package/dist/deps/reporter-output/reporter-output.d.ts +49 -0
- package/dist/deps/reporter-output/reporter-output.js +25 -0
- package/dist/deps/s3-storage-client/creds.d.ts +4 -0
- package/dist/deps/s3-storage-client/creds.js +3 -0
- package/dist/deps/s3-storage-client/get-s3-storage-client-factory.d.ts +3 -0
- package/dist/deps/s3-storage-client/get-s3-storage-client-factory.js +45 -0
- package/dist/deps/s3-storage-client/index.d.ts +2 -0
- package/dist/deps/s3-storage-client/index.js +19 -0
- package/dist/deps/s3-storage-client/main.d.ts +1 -0
- package/dist/deps/s3-storage-client/main.js +20 -0
- package/dist/deps/s3-storage-client/s3-storage-client.d.ts +25 -0
- package/dist/deps/s3-storage-client/s3-storage-client.js +134 -0
- package/dist/deps/task-name/index.d.ts +1 -0
- package/dist/deps/task-name/index.js +18 -0
- package/dist/deps/task-name/task-name.d.ts +17 -0
- package/dist/deps/task-name/task-name.js +44 -0
- package/dist/deps/unit-metadata/index.d.ts +1 -0
- package/dist/deps/unit-metadata/index.js +18 -0
- package/dist/deps/unit-metadata/unit-metadata.d.ts +14 -0
- package/dist/deps/unit-metadata/unit-metadata.js +32 -0
- package/dist/deps/yarn-repo-protocol/build-task-record.d.ts +61 -0
- package/dist/deps/yarn-repo-protocol/build-task-record.js +29 -0
- package/dist/deps/yarn-repo-protocol/generate-test-run-summary.d.ts +4 -0
- package/dist/deps/yarn-repo-protocol/generate-test-run-summary.js +26 -0
- package/dist/deps/yarn-repo-protocol/index.d.ts +2 -0
- package/dist/deps/yarn-repo-protocol/index.js +19 -0
- package/dist/deps/yarn-repo-protocol/rerun-list.d.ts +12 -0
- package/dist/deps/yarn-repo-protocol/rerun-list.js +6 -0
- package/dist/deps/yarn-repo-protocol/yarn-repo-protocol-config.d.ts +24 -0
- package/dist/deps/yarn-repo-protocol/yarn-repo-protocol-config.js +34 -0
- package/dist/deps/yarn-repo-protocol/yarn-repo-protocol.d.ts +82 -0
- package/dist/deps/yarn-repo-protocol/yarn-repo-protocol.js +1036 -0
- package/dist/src/build-raptor-cli.d.ts +60 -0
- package/dist/src/build-raptor-cli.js +514 -0
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.js +20 -0
- package/dist/src/main.d.ts +2 -0
- package/dist/src/main.js +23 -0
- package/dist/src/register-asset-request.d.ts +18 -0
- package/dist/src/register-asset-request.js +11 -0
- package/dist/src/task-execution-visualizer.d.ts +17 -0
- package/dist/src/task-execution-visualizer.js +116 -0
- package/package.json +17 -14
- package/build-raptor.js +0 -7259
- package/index.d.ts +0 -22
- 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlyZWN0b3J5LXNjYW5uZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZGlyZWN0b3J5LXNjYW5uZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsdUNBQXdCO0FBQ3hCLDhDQUErQjtBQUMvQiwyQ0FBNEI7QUFFNUIsd0JBQXFDO0FBQ3JDLHVDQUF3QztBQXNCeEMsTUFBTSxlQUFlLEdBQXNCLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksRUFBRSxzQkFBc0IsRUFBRSxJQUFJLEVBQUUsQ0FBQTtBQU9sRyx5Q0FBeUM7QUFDekMsTUFBYSxnQkFBZ0I7SUFFM0IsWUFBcUIsT0FBZSxFQUFFLE9BQTRCO1FBQTdDLFlBQU8sR0FBUCxPQUFPLENBQVE7UUFDbEMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUM5QixNQUFNLElBQUksS0FBSyxDQUFDLDBCQUEwQixDQUFDLENBQUE7UUFDN0MsQ0FBQztRQUNELElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUN0QyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sSUFBSSxlQUFlLENBQUE7SUFDM0MsQ0FBQztJQUVELE9BQU8sQ0FBQyxZQUFvQixFQUFFLElBQWM7UUFDMUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDNUIsT0FBTyxJQUFJLENBQUE7UUFDYixDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUE7SUFDbkQsQ0FBQztJQVdELEtBQUssQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUE4RjtRQUM5RyxNQUFNLEVBQUUsR0FBcUIsQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFD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
|
|
@@ -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 {};
|