build-raptor 0.129.0 → 0.131.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/build-raptor.js +7259 -0
- package/index.d.ts +22 -0
- package/index.js +7231 -0
- package/package.json +13 -17
- package/dist/deps/brand/brand.d.ts +0 -5
- package/dist/deps/brand/brand.js +0 -3
- package/dist/deps/brand/index.d.ts +0 -1
- package/dist/deps/brand/index.js +0 -18
- package/dist/deps/build-failed-error/build-failed-error.d.ts +0 -14
- package/dist/deps/build-failed-error/build-failed-error.js +0 -13
- package/dist/deps/build-failed-error/index.d.ts +0 -1
- package/dist/deps/build-failed-error/index.js +0 -18
- package/dist/deps/build-raptor-api/build-raptor-api.d.ts +0 -351
- package/dist/deps/build-raptor-api/build-raptor-api.js +0 -132
- package/dist/deps/build-raptor-api/index.d.ts +0 -2
- package/dist/deps/build-raptor-api/index.js +0 -19
- package/dist/deps/build-raptor-api/step-by-step-processor.d.ts +0 -35
- package/dist/deps/build-raptor-api/step-by-step-processor.js +0 -3
- package/dist/deps/build-raptor-core/breakdown.d.ts +0 -18
- package/dist/deps/build-raptor-core/breakdown.js +0 -99
- package/dist/deps/build-raptor-core/build-raptor-config.d.ts +0 -18
- package/dist/deps/build-raptor-core/build-raptor-config.js +0 -21
- package/dist/deps/build-raptor-core/default-asset-publisher.d.ts +0 -10
- package/dist/deps/build-raptor-core/default-asset-publisher.js +0 -16
- package/dist/deps/build-raptor-core/engine-bootstrapper.d.ts +0 -50
- package/dist/deps/build-raptor-core/engine-bootstrapper.js +0 -200
- package/dist/deps/build-raptor-core/engine-event-scheme.d.ts +0 -20
- package/dist/deps/build-raptor-core/engine-event-scheme.js +0 -3
- package/dist/deps/build-raptor-core/engine.d.ts +0 -66
- package/dist/deps/build-raptor-core/engine.js +0 -285
- package/dist/deps/build-raptor-core/examplify-zod.d.ts +0 -93
- package/dist/deps/build-raptor-core/examplify-zod.js +0 -257
- package/dist/deps/build-raptor-core/execution-plan.d.ts +0 -20
- package/dist/deps/build-raptor-core/execution-plan.js +0 -66
- package/dist/deps/build-raptor-core/execution-record.d.ts +0 -17
- package/dist/deps/build-raptor-core/execution-record.js +0 -3
- package/dist/deps/build-raptor-core/execution-type.d.ts +0 -2
- package/dist/deps/build-raptor-core/execution-type.js +0 -3
- package/dist/deps/build-raptor-core/find-repo-dir.d.ts +0 -1
- package/dist/deps/build-raptor-core/find-repo-dir.js +0 -27
- package/dist/deps/build-raptor-core/fingerprint-ledger.d.ts +0 -33
- package/dist/deps/build-raptor-core/fingerprint-ledger.js +0 -164
- package/dist/deps/build-raptor-core/fingerprint.d.ts +0 -3
- package/dist/deps/build-raptor-core/fingerprint.js +0 -13
- package/dist/deps/build-raptor-core/fingerprinter.d.ts +0 -14
- package/dist/deps/build-raptor-core/fingerprinter.js +0 -121
- package/dist/deps/build-raptor-core/hasher.d.ts +0 -21
- package/dist/deps/build-raptor-core/hasher.js +0 -93
- package/dist/deps/build-raptor-core/index.d.ts +0 -9
- package/dist/deps/build-raptor-core/index.js +0 -26
- package/dist/deps/build-raptor-core/model.d.ts +0 -17
- package/dist/deps/build-raptor-core/model.js +0 -40
- package/dist/deps/build-raptor-core/nop-asset-publisher.d.ts +0 -6
- package/dist/deps/build-raptor-core/nop-asset-publisher.js +0 -12
- package/dist/deps/build-raptor-core/performance-report.d.ts +0 -5
- package/dist/deps/build-raptor-core/performance-report.js +0 -3
- package/dist/deps/build-raptor-core/phase.d.ts +0 -1
- package/dist/deps/build-raptor-core/phase.js +0 -3
- package/dist/deps/build-raptor-core/planner.d.ts +0 -12
- package/dist/deps/build-raptor-core/planner.js +0 -43
- package/dist/deps/build-raptor-core/purger.d.ts +0 -11
- package/dist/deps/build-raptor-core/purger.js +0 -65
- package/dist/deps/build-raptor-core/slot-index.d.ts +0 -6
- package/dist/deps/build-raptor-core/slot-index.js +0 -17
- package/dist/deps/build-raptor-core/step-by-step-transmitter.d.ts +0 -15
- package/dist/deps/build-raptor-core/step-by-step-transmitter.js +0 -94
- package/dist/deps/build-raptor-core/tar-stream.d.ts +0 -20
- package/dist/deps/build-raptor-core/tar-stream.js +0 -194
- package/dist/deps/build-raptor-core/task-executor.d.ts +0 -32
- package/dist/deps/build-raptor-core/task-executor.js +0 -321
- package/dist/deps/build-raptor-core/task-store-cli.d.ts +0 -1
- package/dist/deps/build-raptor-core/task-store-cli.js +0 -61
- package/dist/deps/build-raptor-core/task-store-event.d.ts +0 -17
- package/dist/deps/build-raptor-core/task-store-event.js +0 -3
- package/dist/deps/build-raptor-core/task-store.d.ts +0 -41
- package/dist/deps/build-raptor-core/task-store.js +0 -302
- package/dist/deps/build-raptor-core/task-summary.d.ts +0 -12
- package/dist/deps/build-raptor-core/task-summary.js +0 -3
- package/dist/deps/build-raptor-core/task-tracker.d.ts +0 -23
- package/dist/deps/build-raptor-core/task-tracker.js +0 -97
- package/dist/deps/build-raptor-core/task.d.ts +0 -30
- package/dist/deps/build-raptor-core/task.js +0 -90
- package/dist/deps/build-raptor-core/updatable-task-output-registry.d.ts +0 -13
- package/dist/deps/build-raptor-core/updatable-task-output-registry.js +0 -75
- package/dist/deps/build-raptor-core/validate-task-infos.d.ts +0 -3
- package/dist/deps/build-raptor-core/validate-task-infos.js +0 -53
- package/dist/deps/build-raptor-core-testkit/build-raptor-core-testkit.d.ts +0 -1
- package/dist/deps/build-raptor-core-testkit/build-raptor-core-testkit.js +0 -18
- package/dist/deps/build-raptor-core-testkit/driver.d.ts +0 -119
- package/dist/deps/build-raptor-core-testkit/driver.js +0 -305
- package/dist/deps/build-raptor-core-testkit/index.d.ts +0 -3
- package/dist/deps/build-raptor-core-testkit/index.js +0 -20
- package/dist/deps/build-raptor-core-testkit/repo-protocol-testkit.d.ts +0 -35
- package/dist/deps/build-raptor-core-testkit/repo-protocol-testkit.js +0 -226
- package/dist/deps/build-raptor-core-testkit/simple-node-repo-protocol.d.ts +0 -27
- package/dist/deps/build-raptor-core-testkit/simple-node-repo-protocol.js +0 -140
- package/dist/deps/build-raptor-jest-reporter/index.d.ts +0 -0
- package/dist/deps/build-raptor-jest-reporter/index.js +0 -33
- package/dist/deps/build-run-id/build-run-id.d.ts +0 -3
- package/dist/deps/build-run-id/build-run-id.js +0 -13
- package/dist/deps/build-run-id/index.d.ts +0 -1
- package/dist/deps/build-run-id/index.js +0 -18
- package/dist/deps/core-types/core-types.d.ts +0 -29
- package/dist/deps/core-types/core-types.js +0 -81
- package/dist/deps/core-types/index.d.ts +0 -1
- package/dist/deps/core-types/index.js +0 -18
- package/dist/deps/logger/index.d.ts +0 -1
- package/dist/deps/logger/index.js +0 -18
- package/dist/deps/logger/logger.d.ts +0 -26
- package/dist/deps/logger/logger.js +0 -152
- package/dist/deps/misc/arrays.d.ts +0 -7
- package/dist/deps/misc/arrays.js +0 -67
- package/dist/deps/misc/camelize-record.d.ts +0 -6
- package/dist/deps/misc/camelize-record.js +0 -16
- package/dist/deps/misc/clean-directory.d.ts +0 -4
- package/dist/deps/misc/clean-directory.js +0 -80
- package/dist/deps/misc/constructs.d.ts +0 -106
- package/dist/deps/misc/constructs.js +0 -131
- package/dist/deps/misc/directory-scanner.d.ts +0 -49
- package/dist/deps/misc/directory-scanner.js +0 -165
- package/dist/deps/misc/executor.d.ts +0 -39
- package/dist/deps/misc/executor.js +0 -59
- package/dist/deps/misc/file-system-storage-client.d.ts +0 -23
- package/dist/deps/misc/file-system-storage-client.js +0 -93
- package/dist/deps/misc/folderify.d.ts +0 -8
- package/dist/deps/misc/folderify.js +0 -86
- package/dist/deps/misc/graph.d.ts +0 -29
- package/dist/deps/misc/graph.js +0 -200
- package/dist/deps/misc/in-memory-storage-client.d.ts +0 -21
- package/dist/deps/misc/in-memory-storage-client.js +0 -75
- package/dist/deps/misc/index.d.ts +0 -20
- package/dist/deps/misc/index.js +0 -37
- package/dist/deps/misc/int.d.ts +0 -10
- package/dist/deps/misc/int.js +0 -29
- package/dist/deps/misc/internal/graph-executor.d.ts +0 -15
- package/dist/deps/misc/internal/graph-executor.js +0 -93
- package/dist/deps/misc/maps.d.ts +0 -29
- package/dist/deps/misc/maps.js +0 -47
- package/dist/deps/misc/misc.d.ts +0 -23
- package/dist/deps/misc/misc.js +0 -94
- package/dist/deps/misc/object-map.d.ts +0 -10
- package/dist/deps/misc/object-map.js +0 -26
- package/dist/deps/misc/promises.d.ts +0 -39
- package/dist/deps/misc/promises.js +0 -78
- package/dist/deps/misc/records.d.ts +0 -11
- package/dist/deps/misc/records.js +0 -40
- package/dist/deps/misc/slurp-dir.d.ts +0 -1
- package/dist/deps/misc/slurp-dir.js +0 -14
- package/dist/deps/misc/storage-client.d.ts +0 -12
- package/dist/deps/misc/storage-client.js +0 -3
- package/dist/deps/misc/stream-to-buffer.d.ts +0 -2
- package/dist/deps/misc/stream-to-buffer.js +0 -26
- package/dist/deps/misc/strings.d.ts +0 -12
- package/dist/deps/misc/strings.js +0 -68
- package/dist/deps/misc/typed-publisher.d.ts +0 -17
- package/dist/deps/misc/typed-publisher.js +0 -65
- package/dist/deps/repo-protocol/index.d.ts +0 -3
- package/dist/deps/repo-protocol/index.js +0 -20
- package/dist/deps/repo-protocol/repo-protocol.d.ts +0 -49
- package/dist/deps/repo-protocol/repo-protocol.js +0 -3
- package/dist/deps/repo-protocol/task-info.d.ts +0 -18
- package/dist/deps/repo-protocol/task-info.js +0 -3
- package/dist/deps/repo-protocol/test-run-summary.d.ts +0 -54
- package/dist/deps/repo-protocol/test-run-summary.js +0 -32
- package/dist/deps/repo-protocol-toolbox/generate-task-infos.d.ts +0 -5
- package/dist/deps/repo-protocol-toolbox/generate-task-infos.js +0 -26
- package/dist/deps/repo-protocol-toolbox/index.d.ts +0 -3
- package/dist/deps/repo-protocol-toolbox/index.js +0 -20
- package/dist/deps/repo-protocol-toolbox/repo-protocol-toolbox.d.ts +0 -10
- package/dist/deps/repo-protocol-toolbox/repo-protocol-toolbox.js +0 -90
- package/dist/deps/repo-protocol-toolbox/task-definition.d.ts +0 -14
- package/dist/deps/repo-protocol-toolbox/task-definition.js +0 -3
- package/dist/deps/reporter-output/index.d.ts +0 -1
- package/dist/deps/reporter-output/index.js +0 -18
- package/dist/deps/reporter-output/reporter-output.d.ts +0 -49
- package/dist/deps/reporter-output/reporter-output.js +0 -25
- package/dist/deps/s3-storage-client/creds.d.ts +0 -4
- package/dist/deps/s3-storage-client/creds.js +0 -3
- package/dist/deps/s3-storage-client/get-s3-storage-client-factory.d.ts +0 -3
- package/dist/deps/s3-storage-client/get-s3-storage-client-factory.js +0 -45
- package/dist/deps/s3-storage-client/index.d.ts +0 -2
- package/dist/deps/s3-storage-client/index.js +0 -19
- package/dist/deps/s3-storage-client/main.d.ts +0 -1
- package/dist/deps/s3-storage-client/main.js +0 -20
- package/dist/deps/s3-storage-client/s3-storage-client.d.ts +0 -25
- package/dist/deps/s3-storage-client/s3-storage-client.js +0 -134
- package/dist/deps/task-name/index.d.ts +0 -1
- package/dist/deps/task-name/index.js +0 -18
- package/dist/deps/task-name/task-name.d.ts +0 -17
- package/dist/deps/task-name/task-name.js +0 -44
- package/dist/deps/unit-metadata/index.d.ts +0 -1
- package/dist/deps/unit-metadata/index.js +0 -18
- package/dist/deps/unit-metadata/unit-metadata.d.ts +0 -14
- package/dist/deps/unit-metadata/unit-metadata.js +0 -32
- package/dist/deps/yarn-repo-protocol/build-task-record.d.ts +0 -61
- package/dist/deps/yarn-repo-protocol/build-task-record.js +0 -29
- package/dist/deps/yarn-repo-protocol/generate-test-run-summary.d.ts +0 -4
- package/dist/deps/yarn-repo-protocol/generate-test-run-summary.js +0 -26
- package/dist/deps/yarn-repo-protocol/index.d.ts +0 -2
- package/dist/deps/yarn-repo-protocol/index.js +0 -19
- package/dist/deps/yarn-repo-protocol/rerun-list.d.ts +0 -12
- package/dist/deps/yarn-repo-protocol/rerun-list.js +0 -6
- package/dist/deps/yarn-repo-protocol/yarn-repo-protocol-config.d.ts +0 -24
- package/dist/deps/yarn-repo-protocol/yarn-repo-protocol-config.js +0 -33
- package/dist/deps/yarn-repo-protocol/yarn-repo-protocol.d.ts +0 -82
- package/dist/deps/yarn-repo-protocol/yarn-repo-protocol.js +0 -1036
- package/dist/src/build-raptor-cli.d.ts +0 -60
- package/dist/src/build-raptor-cli.js +0 -514
- package/dist/src/index.d.ts +0 -1
- package/dist/src/index.js +0 -20
- package/dist/src/main.d.ts +0 -2
- package/dist/src/main.js +0 -23
- package/dist/src/register-asset-request.d.ts +0 -18
- package/dist/src/register-asset-request.js +0 -11
- package/dist/src/task-execution-visualizer.d.ts +0 -17
- package/dist/src/task-execution-visualizer.js +0 -116
|
@@ -1,285 +0,0 @@
|
|
|
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, 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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
|
|
@@ -1,93 +0,0 @@
|
|
|
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
|
-
}
|
|
@@ -1,257 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.examplifyZod = examplifyZod;
|
|
4
|
-
const misc_1 = require("misc");
|
|
5
|
-
const zod_1 = require("zod");
|
|
6
|
-
function getZodTypeName(schema) {
|
|
7
|
-
if (schema instanceof zod_1.ZodString) {
|
|
8
|
-
return 'string';
|
|
9
|
-
}
|
|
10
|
-
if (schema instanceof zod_1.ZodNumber) {
|
|
11
|
-
return 'number';
|
|
12
|
-
}
|
|
13
|
-
if (schema instanceof zod_1.ZodBoolean) {
|
|
14
|
-
return 'boolean';
|
|
15
|
-
}
|
|
16
|
-
if (schema instanceof zod_1.ZodObject) {
|
|
17
|
-
return 'object';
|
|
18
|
-
}
|
|
19
|
-
if (schema instanceof zod_1.ZodArray) {
|
|
20
|
-
return 'array';
|
|
21
|
-
}
|
|
22
|
-
if (schema instanceof zod_1.ZodUnion) {
|
|
23
|
-
return 'union';
|
|
24
|
-
}
|
|
25
|
-
return 'unknown';
|
|
26
|
-
}
|
|
27
|
-
function unwrap(schema) {
|
|
28
|
-
if (schema instanceof zod_1.ZodOptional || schema instanceof zod_1.ZodNullable) {
|
|
29
|
-
return unwrap(schema.unwrap());
|
|
30
|
-
}
|
|
31
|
-
if (schema instanceof zod_1.ZodDefault) {
|
|
32
|
-
return unwrap(schema.removeDefault());
|
|
33
|
-
}
|
|
34
|
-
return schema;
|
|
35
|
-
}
|
|
36
|
-
function getDescription(schema) {
|
|
37
|
-
if (schema.description) {
|
|
38
|
-
return schema.description;
|
|
39
|
-
}
|
|
40
|
-
if (schema instanceof zod_1.ZodOptional || schema instanceof zod_1.ZodNullable) {
|
|
41
|
-
return getDescription(schema.unwrap());
|
|
42
|
-
}
|
|
43
|
-
if (schema instanceof zod_1.ZodDefault) {
|
|
44
|
-
return getDescription(schema.removeDefault());
|
|
45
|
-
}
|
|
46
|
-
return undefined;
|
|
47
|
-
}
|
|
48
|
-
function reflect(schema) {
|
|
49
|
-
const unwrapped = unwrap(schema);
|
|
50
|
-
const typeName = getZodTypeName(unwrapped);
|
|
51
|
-
const description = getDescription(schema);
|
|
52
|
-
if (typeName === 'array') {
|
|
53
|
-
return { tag: 'array', description, defaultValue: [] };
|
|
54
|
-
}
|
|
55
|
-
if (typeName === 'boolean' || typeName === 'string' || typeName === 'number' || typeName === 'unknown') {
|
|
56
|
-
const d = schema instanceof zod_1.ZodDefault
|
|
57
|
-
? schema.parse(undefined)
|
|
58
|
-
: { boolean: false, string: '', number: 0, unknown: null }[typeName];
|
|
59
|
-
return { tag: typeName, description, defaultValue: d };
|
|
60
|
-
}
|
|
61
|
-
if (typeName === 'union') {
|
|
62
|
-
if (!(unwrapped instanceof zod_1.z.ZodUnion)) {
|
|
63
|
-
throw new Error(`type name mismatch - expected: ${typeName}, got: ${unwrapped.constructor.name}`);
|
|
64
|
-
}
|
|
65
|
-
const options = unwrapped.options;
|
|
66
|
-
if (!Array.isArray(options)) {
|
|
67
|
-
throw new Error(`type name mismatch - expected: an array, got: ${options.constructor.name}`);
|
|
68
|
-
}
|
|
69
|
-
const casted = options; // eslint-disable-line @typescript-eslint/consistent-type-assertions
|
|
70
|
-
const mapped = casted.map(at => reflect(at));
|
|
71
|
-
const d = schema instanceof zod_1.ZodDefault ? schema.parse(undefined) : mapped[0].defaultValue;
|
|
72
|
-
return { tag: 'union', description, defaultValue: d };
|
|
73
|
-
}
|
|
74
|
-
if (typeName === 'object') {
|
|
75
|
-
if (!(unwrapped instanceof zod_1.z.ZodObject)) {
|
|
76
|
-
throw new Error(`type name mismatch - expected: ${typeName}, got: ${unwrapped.constructor.name}`);
|
|
77
|
-
}
|
|
78
|
-
const obj = Object.fromEntries(Object.entries(unwrapped.shape).map(kv => {
|
|
79
|
-
const k = kv[0];
|
|
80
|
-
const v = kv[1];
|
|
81
|
-
return [k, reflect(v)]; // eslint-disable-line @typescript-eslint/consistent-type-assertions
|
|
82
|
-
}));
|
|
83
|
-
return { tag: 'object', of: obj, description, defaultValue: {} };
|
|
84
|
-
}
|
|
85
|
-
(0, misc_1.shouldNeverHappen)(typeName);
|
|
86
|
-
}
|
|
87
|
-
class Writer {
|
|
88
|
-
constructor(nesting) {
|
|
89
|
-
this.nesting = nesting;
|
|
90
|
-
this.blocks = [];
|
|
91
|
-
}
|
|
92
|
-
nest() {
|
|
93
|
-
const ret = new Writer(this.nesting + 1);
|
|
94
|
-
this.blocks.push({ tag: 'writer', writer: ret });
|
|
95
|
-
return ret;
|
|
96
|
-
}
|
|
97
|
-
writeln(...parts) {
|
|
98
|
-
this.blocks.push({ tag: 'line', nesting: this.nesting, parts, isDesc: false });
|
|
99
|
-
}
|
|
100
|
-
writeDescLine(...parts) {
|
|
101
|
-
this.blocks.push({ tag: 'line', nesting: this.nesting, parts, isDesc: true });
|
|
102
|
-
}
|
|
103
|
-
collectOutput(acc, options) {
|
|
104
|
-
for (const block of this.blocks) {
|
|
105
|
-
if (block.tag === 'writer') {
|
|
106
|
-
block.writer.collectOutput(acc, options);
|
|
107
|
-
}
|
|
108
|
-
else if (block.tag === 'line') {
|
|
109
|
-
// Skip blocks with no parts ([]). A blank (comment) line can still be produced if block.parts is ['']
|
|
110
|
-
if (block.parts.length) {
|
|
111
|
-
let content = block.parts.join('');
|
|
112
|
-
if (!content.trim()) {
|
|
113
|
-
acc.push('');
|
|
114
|
-
continue;
|
|
115
|
-
}
|
|
116
|
-
const addComment = block.isDesc || (options.comment && (block.nesting > 0 || options.commentAlsoOutermostBraces));
|
|
117
|
-
const col = !addComment ? 0 : block.nesting > 0 ? options.commentIndentation : 0;
|
|
118
|
-
const preContent = (addComment ? ' '.repeat(col) + '// ' : '') + ' '.repeat(Math.max(0, 2 * block.nesting - col));
|
|
119
|
-
if (!block.isDesc) {
|
|
120
|
-
acc.push(preContent + content);
|
|
121
|
-
continue;
|
|
122
|
-
}
|
|
123
|
-
const lineMax = 120;
|
|
124
|
-
const allowedLen = lineMax - preContent.length;
|
|
125
|
-
while (true) {
|
|
126
|
-
if (content.length < allowedLen) {
|
|
127
|
-
acc.push(preContent + content);
|
|
128
|
-
break;
|
|
129
|
-
}
|
|
130
|
-
const lastSpace = content.slice(0, lineMax).lastIndexOf(' ');
|
|
131
|
-
if (lastSpace < 0) {
|
|
132
|
-
acc.push(preContent + content);
|
|
133
|
-
break;
|
|
134
|
-
}
|
|
135
|
-
acc.push(preContent + content.slice(0, lastSpace));
|
|
136
|
-
content = content.slice(lastSpace).trimStart();
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
else {
|
|
141
|
-
(0, misc_1.shouldNeverHappen)(block);
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
function format(r, w, path) {
|
|
147
|
-
const trimmed = r.description?.trim();
|
|
148
|
-
if (trimmed) {
|
|
149
|
-
for (const line of trimmed.split('\n')) {
|
|
150
|
-
w.writeDescLine(line);
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
const pref = path.length ? `${JSON.stringify(path.at(-1) ?? '')}: ` : ``;
|
|
154
|
-
if (r.tag === 'array' ||
|
|
155
|
-
r.tag === 'boolean' ||
|
|
156
|
-
r.tag === 'number' ||
|
|
157
|
-
r.tag === 'string' ||
|
|
158
|
-
r.tag === 'union' ||
|
|
159
|
-
r.tag === 'unknown') {
|
|
160
|
-
w.writeln(pref, JSON.stringify(r.defaultValue), path.length ? ',' : '');
|
|
161
|
-
return;
|
|
162
|
-
}
|
|
163
|
-
if (r.tag === 'object') {
|
|
164
|
-
w.writeln(pref, '{');
|
|
165
|
-
const nestedWriter = w.nest();
|
|
166
|
-
let isFirst = true;
|
|
167
|
-
for (const [k, v] of Object.entries(r.of)) {
|
|
168
|
-
if (!v) {
|
|
169
|
-
continue;
|
|
170
|
-
}
|
|
171
|
-
if (!isFirst) {
|
|
172
|
-
nestedWriter.writeln('');
|
|
173
|
-
}
|
|
174
|
-
isFirst = false;
|
|
175
|
-
format(v, nestedWriter, [...path, k]);
|
|
176
|
-
}
|
|
177
|
-
w.writeln('}', path.length ? ',' : '');
|
|
178
|
-
return;
|
|
179
|
-
}
|
|
180
|
-
(0, misc_1.shouldNeverHappen)(r.tag);
|
|
181
|
-
}
|
|
182
|
-
/**
|
|
183
|
-
* Generates a formatted example from a Zod schema with default values and descriptions.
|
|
184
|
-
*
|
|
185
|
-
* Converts any supported Zod schema into a human-readable example showing the data
|
|
186
|
-
* structure with defaults. Useful for generating annotated configuration files that
|
|
187
|
-
* serve as both documentation and a working starting point.
|
|
188
|
-
*
|
|
189
|
-
* **Note**: Output is formatted for readability and is not valid JSON (contains
|
|
190
|
-
* inline comments and trailing commas).
|
|
191
|
-
*
|
|
192
|
-
* @example
|
|
193
|
-
* ```ts
|
|
194
|
-
* const schema = z.object({
|
|
195
|
-
* port: z.number().default(3000).describe('Server port'),
|
|
196
|
-
* host: z.string().optional()
|
|
197
|
-
* })
|
|
198
|
-
*
|
|
199
|
-
* console.log(examplifyZod(schema))
|
|
200
|
-
* // Output:
|
|
201
|
-
* {
|
|
202
|
-
* // Server port
|
|
203
|
-
* // port: 3000,
|
|
204
|
-
*
|
|
205
|
-
* // host: "",
|
|
206
|
-
* }
|
|
207
|
-
*
|
|
208
|
-
* console.log(examplifyZod(schema, { comment: false }))
|
|
209
|
-
* // Output:
|
|
210
|
-
* {
|
|
211
|
-
* // Server port
|
|
212
|
-
* port: 3000,
|
|
213
|
-
*
|
|
214
|
-
* // host: "",
|
|
215
|
-
* }
|
|
216
|
-
* ```
|
|
217
|
-
*
|
|
218
|
-
* @param input - Any Zod schema (object, primitive, array, union, etc.)
|
|
219
|
-
* @param options - Formatting options (see {@link ExamplifyZodOptions})
|
|
220
|
-
* @returns A formatted string example matching the schema structure with defaults populated
|
|
221
|
-
*
|
|
222
|
-
* @remarks
|
|
223
|
-
* ### Default Values
|
|
224
|
-
* - **Primitives**: Use type defaults: `0`, `""`, `false`
|
|
225
|
-
* - **Arrays**: Always shown as an empty array `[]`
|
|
226
|
-
* - **Objects**: Empty object `{}`
|
|
227
|
-
* - **With `.default()`**: Uses the specified default value
|
|
228
|
-
*
|
|
229
|
-
* ### Nullable/Optional Handling
|
|
230
|
-
* These modifiers are unwrapped to show the underlying type's default.
|
|
231
|
-
*
|
|
232
|
-
* ⚠️ **Order matters with `.default()`**:
|
|
233
|
-
* - `.nullable().default(5)` → uses `5`
|
|
234
|
-
* - `.default(5).nullable()` → uses type default `0` (`.nullable()` wraps after default is set)
|
|
235
|
-
*
|
|
236
|
-
* The same applies to `.optional()`.
|
|
237
|
-
*
|
|
238
|
-
* ### Unions
|
|
239
|
-
* Uses the first option's default value unless an explicit `.default()` is provided.
|
|
240
|
-
*
|
|
241
|
-
* ### Descriptions
|
|
242
|
-
* Property descriptions always appear as comments above their properties, regardless
|
|
243
|
-
* of the `comment` option. Multi-line descriptions are supported.
|
|
244
|
-
*
|
|
245
|
-
* ### Unsupported Types
|
|
246
|
-
* Unrecognized Zod types (enums, literals, records, tuples, intersections, etc.)
|
|
247
|
-
* are rendered as the string `'unknown'` with a default value of `null`.
|
|
248
|
-
*/
|
|
249
|
-
function examplifyZod(input, options = {}) {
|
|
250
|
-
const r = reflect(input);
|
|
251
|
-
const w = new Writer(0);
|
|
252
|
-
format(r, w, []);
|
|
253
|
-
const acc = [];
|
|
254
|
-
w.collectOutput(acc, { comment: true, commentAlsoOutermostBraces: false, commentIndentation: 2, ...options });
|
|
255
|
-
return acc.join('\n');
|
|
256
|
-
}
|
|
257
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhhbXBsaWZ5LXpvZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9leGFtcGxpZnktem9kLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBbVRBLG9DQU9DO0FBMVRELCtCQUF3QztBQUN4Qyw2QkFZWTtBQUlaLFNBQVMsY0FBYyxDQUFDLE1BQWtCO0lBQ3hDLElBQUksTUFBTSxZQUFZLGVBQVMsRUFBRSxDQUFDO1FBQ2hDLE9BQU8sUUFBUSxDQUFBO0lBQ2pCLENBQUM7SUFDRCxJQUFJLE1BQU0sWUFBWSxlQUFTLEVBQUUsQ0FBQztRQUNoQyxPQUFPLFFBQVEsQ0FBQTtJQUNqQixDQUFDO0lBQ0QsSUFBSSxNQUFNLFlBQVksZ0JBQVUsRUFBRSxDQUFDO1FBQ2pDLE9BQU8sU0FBUyxDQUFBO0lBQ2xCLENBQUM7SUFDRCxJQUFJLE1BQU0sWUFBWSxlQUFTLEVBQUUsQ0FBQztRQUNoQyxPQUFPLFFBQVEsQ0FBQTtJQUNqQixDQUFDO0lBQ0QsSUFBSSxNQUFNLFlBQVksY0FBUSxFQUFFLENBQUM7UUFDL0IsT0FBTyxPQUFPLENBQUE7SUFDaEIsQ0FBQztJQUNELElBQUksTUFBTSxZQUFZLGNBQVEsRUFBRSxDQUFDO1FBQy9CLE9BQU8sT0FBTyxDQUFBO0lBQ2hCLENBQUM7SUFDRCxPQUFPLFNBQVMsQ0FBQTtBQUNsQixDQUFDO0FBRUQsU0FBUyxNQUFNLENBQUMsTUFBa0I7SUFDaEMsSUFBSSxNQUFNLFlBQVksaUJBQVcsSUFBSSxNQUFNLFlBQVksaUJBQVcsRUFBRSxDQUFDO1FBQ25FLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFBO0lBQ2hDLENBQUM7SUFDRCxJQUFJLE1BQU0sWUFBWSxnQkFBVSxFQUFFLENBQUM7UUFDakMsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUE7SUFDdkMsQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFBO0FBQ2YsQ0FBQztBQUVELFNBQVMsY0FBYyxDQUFDLE1BQWtCO0lBQ3hDLElBQUksTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3ZCLE9BQU8sTUFBTSxDQUFDLFdBQVcsQ0FBQTtJQUMzQixDQUFDO0lBRUQsSUFBSSxNQUFNLFlBQVksaUJBQVcsSUFBSSxNQUFNLFlBQVksaUJBQVcsRUFBRSxDQUFDO1FBQ25FLE9BQU8sY0FBYyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFBO0lBQ3hDLENBQUM7SUFDRCxJQUFJLE1BQU0sWUFBWSxnQkFBVSxFQUFFLENBQUM7UUFDakMsT0FBTyxjQUFjLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUE7SUFDL0MsQ0FBQztJQUVELE9BQU8sU0FBUyxDQUFBO0FBQ2xCLENBQUM7QUFRRCxTQUFTLE9BQU8sQ0FBQyxNQUFvQjtJQUNuQyxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDaEMsTUFBTSxRQUFRLEdBQUcsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFBO0lBQzFDLE1BQU0sV0FBVyxHQUFHLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUUxQyxJQUFJLFFBQVEsS0FBSyxPQUFPLEVBQUUsQ0FBQztRQUN6QixPQUFPLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLEVBQUUsRUFBRSxDQUFBO0lBQ3hELENBQUM7SUFDRCxJQUFJLFFBQVEsS0FBSyxTQUFTLElBQUksUUFBUSxLQUFLLFFBQVEsSUFBSSxRQUFRLEtBQUssUUFBUSxJQUFJLFFBQVEsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUN2RyxNQUFNLENBQUMsR0FDTCxNQUFNLFlBQVksZ0JBQVU7WUFDMUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDO1lBQ3pCLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUN4RSxPQUFPLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLENBQUMsRUFBRSxDQUFBO0lBQ3hELENBQUM7SUFFRCxJQUFJLFFBQVEsS0FBSyxPQUFPLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsQ0FBQyxTQUFTLFlBQVksT0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDdkMsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQ0FBa0MsUUFBUSxVQUFVLFNBQVMsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQTtRQUNuRyxDQUFDO1FBRUQsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQTtRQUNqQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQzVCLE1BQU0sSUFBSSxLQUFLLENBQUMsaURBQWlELE9BQU8sQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQTtRQUM5RixDQUFDO1FBRUQsTUFBTSxNQUFNLEdBQUcsT0FBeUIsQ0FBQSxDQUFDLG9FQUFvRTtRQUM3RyxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7UUFDNUMsTUFBTSxDQUFDLEdBQUcsTUFBTSxZQUFZLGdCQUFVLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUE7UUFDekYsT0FBTyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxDQUFDLEVBQUUsQ0FBQTtJQUN2RCxDQUFDO0lBRUQsSUFBSSxRQUFRLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLENBQUMsU0FBUyxZQUFZLE9BQUMsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQ3hDLE1BQU0sSUFBSSxLQUFLLENBQUMsa0NBQWtDLFFBQVEsVUFBVSxTQUFTLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUE7UUFDbkcsQ0FBQztRQUVELE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQzVCLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRTtZQUN2QyxNQUFNLENBQUMsR0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUE7WUFDdkIsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFBO1lBQ2YsT0FBTyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBaUIsQ0FBQyxDQUFDLENBQUEsQ0FBQyxvRUFBb0U7UUFDN0csQ0FBQyxDQUFDLENBQ0gsQ0FBQTtRQUVELE9BQU8sRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxFQUFFLEVBQUUsQ0FBQTtJQUNsRSxDQUFDO0lBRUQsSUFBQSx3QkFBaUIsRUFBQyxRQUFRLENBQUMsQ0FBQTtBQUM3QixDQUFDO0FBY0QsTUFBTSxNQUFNO0lBR1YsWUFBNkIsT0FBZTtRQUFmLFlBQU8sR0FBUCxPQUFPLENBQVE7UUFGcEMsV0FBTSxHQUFrQixFQUFFLENBQUE7SUFFYSxDQUFDO0lBRWhELElBQUk7UUFDRixNQUFNLEdBQUcsR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFBO1FBQ3hDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQTtRQUNoRCxPQUFPLEdBQUcsQ0FBQTtJQUNaLENBQUM7SUFFRCxPQUFPLENBQUMsR0FBRyxLQUFlO1FBQ3hCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUE7SUFDaEYsQ0FBQztJQUVELGFBQWEsQ0FBQyxHQUFHLEtBQWU7UUFDOUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQTtJQUMvRSxDQUFDO0lBRUQsYUFBYSxDQUFDLEdBQWEsRUFBRSxPQUFzQztRQUNqRSxLQUFLLE1BQU0sS0FBSyxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNoQyxJQUFJLEtBQUssQ0FBQyxHQUFHLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQzNCLEtBQUssQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQTtZQUMxQyxDQUFDO2lCQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSyxNQUFNLEVBQUUsQ0FBQztnQkFDaEMsc0dBQXNHO2dCQUN0RyxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7b0JBQ3ZCLElBQUksT0FBTyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBO29CQUNsQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7d0JBQ3BCLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7d0JBQ1osU0FBUTtvQkFDVixDQUFDO29CQUNELE1BQU0sVUFBVSxHQUNkLEtBQUssQ0FBQyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxDQUFDLElBQUksT0FBTyxDQUFDLDBCQUEwQixDQUFDLENBQUMsQ0FBQTtvQkFDaEcsTUFBTSxHQUFHLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO29CQUNoRixNQUFNLFVBQVUsR0FDZCxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQTtvQkFDaEcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQzt3QkFDbEIsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDLENBQUE7d0JBQzlCLFNBQVE7b0JBQ1YsQ0FBQztvQkFFRCxNQUFNLE9BQU8sR0FBRyxHQUFHLENBQUE7b0JBQ25CLE1BQU0sVUFBVSxHQUFHLE9BQU8sR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFBO29CQUM5QyxPQUFPLElBQUksRUFBRSxDQUFDO3dCQUNaLElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxVQUFVLEVBQUUsQ0FBQzs0QkFDaEMsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDLENBQUE7NEJBQzlCLE1BQUs7d0JBQ1AsQ0FBQzt3QkFDRCxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUE7d0JBQzVELElBQUksU0FBUyxHQUFHLENBQUMsRUFBRSxDQUFDOzRCQUNsQixHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxPQUFPLENBQUMsQ0FBQTs0QkFDOUIsTUFBSzt3QkFDUCxDQUFDO3dCQUVELEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUE7d0JBQ2xELE9BQU8sR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFBO29CQUNoRCxDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sSUFBQSx3QkFBaUIsRUFBQyxLQUFLLENBQUMsQ0FBQTtZQUMxQixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7Q0FDRjtBQUVELFNBQVMsTUFBTSxDQUFDLENBQVksRUFBRSxDQUFTLEVBQUUsSUFBYztJQUNyRCxNQUFNLE9BQU8sR0FBRyxDQUFDLENBQUMsV0FBVyxFQUFFLElBQUksRUFBRSxDQUFBO0lBQ3JDLElBQUksT0FBTyxFQUFFLENBQUM7UUFDWixLQUFLLE1BQU0sSUFBSSxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUN2QyxDQUFDLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQ3ZCLENBQUM7SUFDSCxDQUFDO0lBRUQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUE7SUFDeEUsSUFDRSxDQUFDLENBQUMsR0FBRyxLQUFLLE9BQU87UUFDakIsQ0FBQyxDQUFDLEdBQUcsS0FBSyxTQUFTO1FBQ25CLENBQUMsQ0FBQyxHQUFHLEtBQUssUUFBUTtRQUNsQixDQUFDLENBQUMsR0FBRyxLQUFLLFFBQVE7UUFDbEIsQ0FBQyxDQUFDLEdBQUcsS0FBSyxPQUFPO1FBQ2pCLENBQUMsQ0FBQyxHQUFHLEtBQUssU0FBUyxFQUNuQixDQUFDO1FBQ0QsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUN2RSxPQUFNO0lBQ1IsQ0FBQztJQUVELElBQUksQ0FBQyxDQUFDLEdBQUcsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUN2QixDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQTtRQUNwQixNQUFNLFlBQVksR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUE7UUFDN0IsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFBO1FBQ2xCLEtBQUssTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQzFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDUCxTQUFRO1lBQ1YsQ0FBQztZQUVELElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDYixZQUFZLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFBO1lBQzFCLENBQUM7WUFDRCxPQUFPLEdBQUcsS0FBSyxDQUFBO1lBQ2YsTUFBTSxDQUFDLENBQUMsRUFBRSxZQUFZLEVBQUUsQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ3ZDLENBQUM7UUFDRCxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBQ3RDLE9BQU07SUFDUixDQUFDO0lBQ0QsSUFBQSx3QkFBaUIsRUFBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUE7QUFDMUIsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrRUc7QUFDSCxTQUFnQixZQUFZLENBQUMsS0FBbUIsRUFBRSxVQUErQixFQUFFO0lBQ2pGLE1BQU0sQ0FBQyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUN4QixNQUFNLENBQUMsR0FBRyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUN2QixNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQTtJQUNoQixNQUFNLEdBQUcsR0FBYSxFQUFFLENBQUE7SUFDeEIsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLDBCQUEwQixFQUFFLEtBQUssRUFBRSxrQkFBa0IsRUFBRSxDQUFDLEVBQUUsR0FBRyxPQUFPLEVBQUUsQ0FBQyxDQUFBO0lBQzdHLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtBQUN2QixDQUFDIn0=
|