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,285 @@
|
|
|
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
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.Engine = void 0;
|
|
40
|
+
const build_failed_error_1 = require("build-failed-error");
|
|
41
|
+
const child_process_1 = __importDefault(require("child_process"));
|
|
42
|
+
const core_types_1 = require("core-types");
|
|
43
|
+
const fs = __importStar(require("fs"));
|
|
44
|
+
const fse = __importStar(require("fs-extra"));
|
|
45
|
+
const ignore_1 = __importDefault(require("ignore"));
|
|
46
|
+
const misc_1 = require("misc");
|
|
47
|
+
const path = __importStar(require("path"));
|
|
48
|
+
const task_name_1 = require("task-name");
|
|
49
|
+
const fingerprint_ledger_1 = require("./fingerprint-ledger");
|
|
50
|
+
const fingerprinter_1 = require("./fingerprinter");
|
|
51
|
+
const model_1 = require("./model");
|
|
52
|
+
const planner_1 = require("./planner");
|
|
53
|
+
const purger_1 = require("./purger");
|
|
54
|
+
const task_executor_1 = require("./task-executor");
|
|
55
|
+
const task_tracker_1 = require("./task-tracker");
|
|
56
|
+
class Engine {
|
|
57
|
+
/**
|
|
58
|
+
*
|
|
59
|
+
* @param logger
|
|
60
|
+
* @param rootDir
|
|
61
|
+
* @param repoProtocol
|
|
62
|
+
* @param taskStore
|
|
63
|
+
* @param taskOutputDir
|
|
64
|
+
* @param command the task kind to run. An empty string means "all tasks".
|
|
65
|
+
* @param units the units whose tasks are to be run. An empty array means "all units".
|
|
66
|
+
* @param goals list of output locations. The tasks that produce these outputs will be added to "tasks to run".
|
|
67
|
+
* @param eventPublisher
|
|
68
|
+
* @param steps
|
|
69
|
+
* @param options
|
|
70
|
+
*/
|
|
71
|
+
constructor(logger, rootDir, repoProtocol, taskStore, taskOutputDir, selector, eventPublisher, steps, options) {
|
|
72
|
+
this.logger = logger;
|
|
73
|
+
this.rootDir = rootDir;
|
|
74
|
+
this.repoProtocol = repoProtocol;
|
|
75
|
+
this.taskStore = taskStore;
|
|
76
|
+
this.taskOutputDir = taskOutputDir;
|
|
77
|
+
this.selector = selector;
|
|
78
|
+
this.eventPublisher = eventPublisher;
|
|
79
|
+
this.steps = steps;
|
|
80
|
+
const userDirAbsolute = path.isAbsolute(options.userDir)
|
|
81
|
+
? options.userDir
|
|
82
|
+
: this.rootDir.resolve((0, core_types_1.PathInRepo)(options.userDir));
|
|
83
|
+
const userDir = this.rootDir.unresolve(userDirAbsolute);
|
|
84
|
+
this.options = {
|
|
85
|
+
checkGitIgnore: options.checkGitIgnore ?? true,
|
|
86
|
+
concurrency: options.concurrency,
|
|
87
|
+
buildRaptorDir: options.buildRaptorDir,
|
|
88
|
+
fingerprintLedger: options.fingerprintLedger ?? false,
|
|
89
|
+
testCaching: options.testCaching ?? true,
|
|
90
|
+
commitHash: options.commitHash,
|
|
91
|
+
config: options.config,
|
|
92
|
+
userDir,
|
|
93
|
+
toRun: options.toRun ? { args: options.toRun.args, program: userDir.to(options.toRun.program) } : undefined,
|
|
94
|
+
};
|
|
95
|
+
this.goals = [...selector.goals, options.toRun?.program].flatMap(g => (g ? [g] : [])).map(g => userDir.to(g));
|
|
96
|
+
this.logger.info(`this.goals=${JSON.stringify(this.goals)}`);
|
|
97
|
+
const ledgerFile = path.join(this.options.buildRaptorDir, 'fingerprint-ledger.json');
|
|
98
|
+
this.eventPublisher.on('taskStore', e => {
|
|
99
|
+
const step = e.opcode === 'RECORDED'
|
|
100
|
+
? 'TASK_STORE_PUT'
|
|
101
|
+
: e.opcode === 'RESTORED'
|
|
102
|
+
? 'TASK_STORE_GET'
|
|
103
|
+
: (0, misc_1.shouldNeverHappen)(e.opcode);
|
|
104
|
+
const { taskKind, unitId } = (0, task_name_1.TaskName)().undo(e.taskName);
|
|
105
|
+
this.steps.transmit({
|
|
106
|
+
blobId: e.blobId,
|
|
107
|
+
taskName: e.taskName,
|
|
108
|
+
taskKind,
|
|
109
|
+
unitId,
|
|
110
|
+
step,
|
|
111
|
+
fingerprint: e.fingerprint,
|
|
112
|
+
files: e.files,
|
|
113
|
+
});
|
|
114
|
+
});
|
|
115
|
+
this.eventPublisher.on('testEnded', e => {
|
|
116
|
+
this.steps.transmit({
|
|
117
|
+
step: 'TEST_ENDED',
|
|
118
|
+
taskName: e.taskName,
|
|
119
|
+
fileName: e.fileName,
|
|
120
|
+
testPath: e.testPath,
|
|
121
|
+
verdict: e.verdict,
|
|
122
|
+
durationMillis: e.durationMillis,
|
|
123
|
+
});
|
|
124
|
+
});
|
|
125
|
+
this.eventPublisher.on('assetPublished', e => {
|
|
126
|
+
if (!this.tracker) {
|
|
127
|
+
throw new Error(`tracker is not set`);
|
|
128
|
+
}
|
|
129
|
+
const task = this.tracker?.getTask(e.taskName) ?? (0, misc_1.failMe)(`Task not found (task name=${e.taskName})`);
|
|
130
|
+
const { unitId } = (0, task_name_1.TaskName)().undo(e.taskName);
|
|
131
|
+
this.steps.transmit({
|
|
132
|
+
step: 'ASSET_PUBLISHED',
|
|
133
|
+
labels: [...task.labels],
|
|
134
|
+
taskName: e.taskName,
|
|
135
|
+
unitId,
|
|
136
|
+
fingerprint: task.getFingerprint(),
|
|
137
|
+
casAddress: e.casAddress,
|
|
138
|
+
file: e.file,
|
|
139
|
+
});
|
|
140
|
+
});
|
|
141
|
+
this.eventPublisher.on('publicFiles', e => {
|
|
142
|
+
if (Object.keys(e.publicFiles).length === 0) {
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
this.steps.transmit({
|
|
146
|
+
step: 'PUBLIC_FILES',
|
|
147
|
+
taskName: e.taskName,
|
|
148
|
+
publicFiles: e.publicFiles,
|
|
149
|
+
});
|
|
150
|
+
});
|
|
151
|
+
this.fingerprintLedger = this.options.fingerprintLedger
|
|
152
|
+
? new fingerprint_ledger_1.PersistedFingerprintLedger(logger, ledgerFile)
|
|
153
|
+
: new fingerprint_ledger_1.NopFingerprintLedger();
|
|
154
|
+
this.purger = new purger_1.Purger(this.logger, this.rootDir);
|
|
155
|
+
}
|
|
156
|
+
async run(buildRunId) {
|
|
157
|
+
this.steps.transmit({ step: 'BUILD_RUN_STARTED', buildRunId, commitHash: this.options.commitHash });
|
|
158
|
+
fs.writeFileSync(path.join(this.options.buildRaptorDir, 'build-run-id'), buildRunId);
|
|
159
|
+
await this.fingerprintLedger.updateRun(buildRunId);
|
|
160
|
+
await this.repoProtocol.initialize(this.rootDir, this.eventPublisher, this.options.config.outDirName, this.options.config.repoProtocol);
|
|
161
|
+
try {
|
|
162
|
+
const model = await this.loadModel(buildRunId);
|
|
163
|
+
const taskList = await this.repoProtocol.getTasks();
|
|
164
|
+
this.logger.info(`catalog=\n${JSON.stringify(taskList, null, 2)}`);
|
|
165
|
+
const plan = await new planner_1.Planner(this.logger).computePlan(taskList, model);
|
|
166
|
+
const startingPoints = plan.apply(this.selector.units, this.goals, this.selector.labels);
|
|
167
|
+
if (startingPoints.length === 0) {
|
|
168
|
+
throw new build_failed_error_1.BuildFailedError(`No task that matches the given goals/labels was found`);
|
|
169
|
+
}
|
|
170
|
+
this.steps.transmit({ step: 'PLAN_PREPARED', taskNames: plan.tasks().map(at => at.name) });
|
|
171
|
+
const ret = await this.executePlan(plan, model);
|
|
172
|
+
this.steps.transmit({ step: 'BUILD_RUN_ENDED' });
|
|
173
|
+
await Promise.all([this.fingerprintLedger.close(), this.steps.close()]);
|
|
174
|
+
return ret;
|
|
175
|
+
}
|
|
176
|
+
finally {
|
|
177
|
+
await this.repoProtocol.close();
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
async executePlan(plan, model) {
|
|
181
|
+
this.logger.info(`plan.taskGraph=${plan.taskGraph}`);
|
|
182
|
+
const taskTracker = new task_tracker_1.TaskTracker(plan);
|
|
183
|
+
this.tracker = taskTracker;
|
|
184
|
+
const taskExecutor = new task_executor_1.TaskExecutor(model, taskTracker, this.logger, this.repoProtocol, this.taskStore, this.taskOutputDir, this.eventPublisher, this.fingerprintLedger, this.purger, this.options.testCaching, this.options.config.verbosePrintTasks);
|
|
185
|
+
const workFunction = async (tn) => {
|
|
186
|
+
try {
|
|
187
|
+
const deps = this.options.config.tightFingerprints
|
|
188
|
+
? taskTracker.getTask(tn).taskInfo.deps ?? []
|
|
189
|
+
: plan.taskGraph.neighborsOf(tn);
|
|
190
|
+
await taskExecutor.executeTask(tn, deps);
|
|
191
|
+
const task = taskTracker.getTask(tn);
|
|
192
|
+
const rec = task.record;
|
|
193
|
+
this.steps.transmit({
|
|
194
|
+
step: 'TASK_ENDED',
|
|
195
|
+
taskName: tn,
|
|
196
|
+
executionType: rec.executionType,
|
|
197
|
+
verdict: (0, misc_1.switchOn)(rec.verdict, {
|
|
198
|
+
UNKNOWN: () => 'UNKNOWN',
|
|
199
|
+
CRASH: () => 'CRASH',
|
|
200
|
+
FAIL: () => 'FAIL',
|
|
201
|
+
OK: () => 'OK',
|
|
202
|
+
}),
|
|
203
|
+
durationMillis: task.getDurationMillis(),
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
catch (e) {
|
|
207
|
+
const task = taskTracker.getTask(tn);
|
|
208
|
+
const rec = task.record;
|
|
209
|
+
this.logger.info(`crashed while running ${tn}`);
|
|
210
|
+
this.steps.transmit({
|
|
211
|
+
step: 'TASK_ENDED',
|
|
212
|
+
taskName: tn,
|
|
213
|
+
executionType: rec.executionType,
|
|
214
|
+
verdict: 'CRASH',
|
|
215
|
+
durationMillis: task.getDurationMillis(),
|
|
216
|
+
});
|
|
217
|
+
throw e;
|
|
218
|
+
}
|
|
219
|
+
finally {
|
|
220
|
+
taskTracker.changeStatus(tn, 'DONE');
|
|
221
|
+
}
|
|
222
|
+
};
|
|
223
|
+
await plan.taskGraph.execute(this.options.concurrency, workFunction);
|
|
224
|
+
return taskTracker;
|
|
225
|
+
}
|
|
226
|
+
async executeProgram() {
|
|
227
|
+
if (!this.options.toRun) {
|
|
228
|
+
this.logger.info(`no program to execute`);
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
this.logger.info(`about to execute ${JSON.stringify(this.options.toRun)}`);
|
|
232
|
+
const resolved = this.rootDir.resolve(this.options.toRun.program);
|
|
233
|
+
const cwd = this.rootDir.resolve(this.options.userDir);
|
|
234
|
+
const spawnResult = child_process_1.default.spawnSync(resolved, this.options.toRun.args, {
|
|
235
|
+
cwd,
|
|
236
|
+
stdio: 'inherit',
|
|
237
|
+
shell: false,
|
|
238
|
+
});
|
|
239
|
+
if (spawnResult.error) {
|
|
240
|
+
throw new build_failed_error_1.BuildFailedError(`could not execute ${this.options.toRun.program}: ${spawnResult.error}`, 'program');
|
|
241
|
+
}
|
|
242
|
+
if (spawnResult.status === 0) {
|
|
243
|
+
return;
|
|
244
|
+
}
|
|
245
|
+
throw new build_failed_error_1.BuildFailedError(`execution of ${this.options.toRun.program} exited with status=${spawnResult.status}, signal=${spawnResult.signal}`, 'program');
|
|
246
|
+
}
|
|
247
|
+
async loadModel(buildRunId) {
|
|
248
|
+
const gitIgnorePath = this.rootDir.resolve((0, core_types_1.PathInRepo)('.gitignore'));
|
|
249
|
+
const ig = (0, ignore_1.default)();
|
|
250
|
+
if (await fse.pathExists(gitIgnorePath)) {
|
|
251
|
+
const gitIgnoreContent = await fse.readFile(gitIgnorePath, 'utf8');
|
|
252
|
+
const lines = gitIgnoreContent.split('\n');
|
|
253
|
+
this.logger.info(`Found a .gitignore file:\n${JSON.stringify(lines, null, 2)}`);
|
|
254
|
+
ig.add(lines);
|
|
255
|
+
}
|
|
256
|
+
if (this.options.checkGitIgnore) {
|
|
257
|
+
const d = '.build-raptor';
|
|
258
|
+
const ignoresBuildRaptorDir = ig.ignores(d);
|
|
259
|
+
if (!ignoresBuildRaptorDir) {
|
|
260
|
+
throw new build_failed_error_1.BuildFailedError(`the ${d} directory should be .gitignore-d`);
|
|
261
|
+
}
|
|
262
|
+
const outDirName = this.options.config.outDirName;
|
|
263
|
+
if (outDirName && !ig.ignores(outDirName)) {
|
|
264
|
+
throw new build_failed_error_1.BuildFailedError(`the out dir (${outDirName}) should be .gitignore-d`);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
const [graph, units] = await Promise.all([this.repoProtocol.getGraph(), this.repoProtocol.getUnits()]);
|
|
268
|
+
if (graph.isCyclic()) {
|
|
269
|
+
throw new build_failed_error_1.BuildFailedError(`Cyclic dependency detected in ${graph}`);
|
|
270
|
+
}
|
|
271
|
+
this.logger.info(`unit graph=\n${graph}`);
|
|
272
|
+
const scanner = new misc_1.DirectoryScanner(this.rootDir.resolve(), { predicate: ig.createFilter() });
|
|
273
|
+
const fingerprinter = new fingerprinter_1.Fingerprinter(scanner, this.logger, this.options.config.fingerprintSeed, async (h, c) => {
|
|
274
|
+
if (c) {
|
|
275
|
+
this.fingerprintLedger.updateFile(h, c);
|
|
276
|
+
}
|
|
277
|
+
else {
|
|
278
|
+
this.fingerprintLedger.updateDirectory(h);
|
|
279
|
+
}
|
|
280
|
+
});
|
|
281
|
+
return new model_1.Model(this.rootDir, graph, units, buildRunId, fingerprinter);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
exports.Engine = Engine;
|
|
285
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5naW5lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2VuZ2luZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwyREFBcUQ7QUFFckQsa0VBQXlDO0FBQ3pDLDJDQUFpRDtBQUNqRCx1Q0FBd0I7QUFDeEIsOENBQStCO0FBQy9CLG9EQUEyQjtBQUUzQiwrQkFBaUc7QUFDakcsMkNBQTRCO0FBRTVCLHlDQUFvQztBQU1wQyw2REFBdUY7QUFDdkYsbURBQStDO0FBQy9DLG1DQUErQjtBQUMvQix1Q0FBbUM7QUFDbkMscUNBQWlDO0FBRWpDLG1EQUE4QztBQUU5QyxpREFBNEM7QUFrQzVDLE1BQWEsTUFBTTtJQU9qQjs7Ozs7Ozs7Ozs7OztPQWFHO0lBQ0gsWUFDbUIsTUFBYyxFQUNkLE9BQWlCLEVBQ2pCLFlBQTBCLEVBQzFCLFNBQW9CLEVBQ3BCLGFBQXFCLEVBQ3JCLFFBQXNCLEVBQ3RCLGNBQWlELEVBQ2pELEtBQTRCLEVBQzdDLE9BQXNCO1FBUkwsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLFlBQU8sR0FBUCxPQUFPLENBQVU7UUFDakIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsY0FBUyxHQUFULFNBQVMsQ0FBVztRQUNwQixrQkFBYSxHQUFiLGFBQWEsQ0FBUTtRQUNyQixhQUFRLEdBQVIsUUFBUSxDQUFjO1FBQ3RCLG1CQUFjLEdBQWQsY0FBYyxDQUFtQztRQUNqRCxVQUFLLEdBQUwsS0FBSyxDQUF1QjtRQUc3QyxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUM7WUFDdEQsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPO1lBQ2pCLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFBLHVCQUFVLEVBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUE7UUFD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
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
/**
|
|
3
|
+
* Generates a formatted example from a Zod schema with default values and descriptions.
|
|
4
|
+
*
|
|
5
|
+
* Converts any supported Zod schema into a human-readable example showing the data
|
|
6
|
+
* structure with defaults. Useful for generating annotated configuration files that
|
|
7
|
+
* serve as both documentation and a working starting point.
|
|
8
|
+
*
|
|
9
|
+
* **Note**: Output is formatted for readability and is not valid JSON (contains
|
|
10
|
+
* inline comments and trailing commas).
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```ts
|
|
14
|
+
* const schema = z.object({
|
|
15
|
+
* port: z.number().default(3000).describe('Server port'),
|
|
16
|
+
* host: z.string().optional()
|
|
17
|
+
* })
|
|
18
|
+
*
|
|
19
|
+
* console.log(examplifyZod(schema))
|
|
20
|
+
* // Output:
|
|
21
|
+
* {
|
|
22
|
+
* // Server port
|
|
23
|
+
* // port: 3000,
|
|
24
|
+
*
|
|
25
|
+
* // host: "",
|
|
26
|
+
* }
|
|
27
|
+
*
|
|
28
|
+
* console.log(examplifyZod(schema, { comment: false }))
|
|
29
|
+
* // Output:
|
|
30
|
+
* {
|
|
31
|
+
* // Server port
|
|
32
|
+
* port: 3000,
|
|
33
|
+
*
|
|
34
|
+
* // host: "",
|
|
35
|
+
* }
|
|
36
|
+
* ```
|
|
37
|
+
*
|
|
38
|
+
* @param input - Any Zod schema (object, primitive, array, union, etc.)
|
|
39
|
+
* @param options - Formatting options (see {@link ExamplifyZodOptions})
|
|
40
|
+
* @returns A formatted string example matching the schema structure with defaults populated
|
|
41
|
+
*
|
|
42
|
+
* @remarks
|
|
43
|
+
* ### Default Values
|
|
44
|
+
* - **Primitives**: Use type defaults: `0`, `""`, `false`
|
|
45
|
+
* - **Arrays**: Always shown as an empty array `[]`
|
|
46
|
+
* - **Objects**: Empty object `{}`
|
|
47
|
+
* - **With `.default()`**: Uses the specified default value
|
|
48
|
+
*
|
|
49
|
+
* ### Nullable/Optional Handling
|
|
50
|
+
* These modifiers are unwrapped to show the underlying type's default.
|
|
51
|
+
*
|
|
52
|
+
* ⚠️ **Order matters with `.default()`**:
|
|
53
|
+
* - `.nullable().default(5)` → uses `5`
|
|
54
|
+
* - `.default(5).nullable()` → uses type default `0` (`.nullable()` wraps after default is set)
|
|
55
|
+
*
|
|
56
|
+
* The same applies to `.optional()`.
|
|
57
|
+
*
|
|
58
|
+
* ### Unions
|
|
59
|
+
* Uses the first option's default value unless an explicit `.default()` is provided.
|
|
60
|
+
*
|
|
61
|
+
* ### Descriptions
|
|
62
|
+
* Property descriptions always appear as comments above their properties, regardless
|
|
63
|
+
* of the `comment` option. Multi-line descriptions are supported.
|
|
64
|
+
*
|
|
65
|
+
* ### Unsupported Types
|
|
66
|
+
* Unrecognized Zod types (enums, literals, records, tuples, intersections, etc.)
|
|
67
|
+
* are rendered as the string `'unknown'` with a default value of `null`.
|
|
68
|
+
*/
|
|
69
|
+
export declare function examplifyZod(input: z.ZodTypeAny, options?: ExamplifyZodOptions): string;
|
|
70
|
+
/**
|
|
71
|
+
* Options for controlling the output format of examplifyZod().
|
|
72
|
+
*/
|
|
73
|
+
export interface ExamplifyZodOptions {
|
|
74
|
+
/**
|
|
75
|
+
* Whether to comment out property lines with '//' markers.
|
|
76
|
+
* When false, outputs property lines without comment prefix.
|
|
77
|
+
* When true, all property lines are commented.
|
|
78
|
+
* @default true
|
|
79
|
+
*/
|
|
80
|
+
comment?: boolean;
|
|
81
|
+
/**
|
|
82
|
+
* Whether to also comment the outermost object braces.
|
|
83
|
+
* Only applies when `comment` is true. Useful for embedding in existing JSON.
|
|
84
|
+
* @default false
|
|
85
|
+
*/
|
|
86
|
+
commentAlsoOutermostBraces?: boolean;
|
|
87
|
+
/**
|
|
88
|
+
* Column position where comment markers ('//' prefix) start.
|
|
89
|
+
* Controls horizontal alignment of comments.
|
|
90
|
+
* @default 2
|
|
91
|
+
*/
|
|
92
|
+
commentIndentation?: number;
|
|
93
|
+
}
|