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.
Files changed (216) hide show
  1. package/build-raptor.js +7259 -0
  2. package/index.d.ts +22 -0
  3. package/index.js +7231 -0
  4. package/package.json +13 -17
  5. package/dist/deps/brand/brand.d.ts +0 -5
  6. package/dist/deps/brand/brand.js +0 -3
  7. package/dist/deps/brand/index.d.ts +0 -1
  8. package/dist/deps/brand/index.js +0 -18
  9. package/dist/deps/build-failed-error/build-failed-error.d.ts +0 -14
  10. package/dist/deps/build-failed-error/build-failed-error.js +0 -13
  11. package/dist/deps/build-failed-error/index.d.ts +0 -1
  12. package/dist/deps/build-failed-error/index.js +0 -18
  13. package/dist/deps/build-raptor-api/build-raptor-api.d.ts +0 -351
  14. package/dist/deps/build-raptor-api/build-raptor-api.js +0 -132
  15. package/dist/deps/build-raptor-api/index.d.ts +0 -2
  16. package/dist/deps/build-raptor-api/index.js +0 -19
  17. package/dist/deps/build-raptor-api/step-by-step-processor.d.ts +0 -35
  18. package/dist/deps/build-raptor-api/step-by-step-processor.js +0 -3
  19. package/dist/deps/build-raptor-core/breakdown.d.ts +0 -18
  20. package/dist/deps/build-raptor-core/breakdown.js +0 -99
  21. package/dist/deps/build-raptor-core/build-raptor-config.d.ts +0 -18
  22. package/dist/deps/build-raptor-core/build-raptor-config.js +0 -21
  23. package/dist/deps/build-raptor-core/default-asset-publisher.d.ts +0 -10
  24. package/dist/deps/build-raptor-core/default-asset-publisher.js +0 -16
  25. package/dist/deps/build-raptor-core/engine-bootstrapper.d.ts +0 -50
  26. package/dist/deps/build-raptor-core/engine-bootstrapper.js +0 -200
  27. package/dist/deps/build-raptor-core/engine-event-scheme.d.ts +0 -20
  28. package/dist/deps/build-raptor-core/engine-event-scheme.js +0 -3
  29. package/dist/deps/build-raptor-core/engine.d.ts +0 -66
  30. package/dist/deps/build-raptor-core/engine.js +0 -285
  31. package/dist/deps/build-raptor-core/examplify-zod.d.ts +0 -93
  32. package/dist/deps/build-raptor-core/examplify-zod.js +0 -257
  33. package/dist/deps/build-raptor-core/execution-plan.d.ts +0 -20
  34. package/dist/deps/build-raptor-core/execution-plan.js +0 -66
  35. package/dist/deps/build-raptor-core/execution-record.d.ts +0 -17
  36. package/dist/deps/build-raptor-core/execution-record.js +0 -3
  37. package/dist/deps/build-raptor-core/execution-type.d.ts +0 -2
  38. package/dist/deps/build-raptor-core/execution-type.js +0 -3
  39. package/dist/deps/build-raptor-core/find-repo-dir.d.ts +0 -1
  40. package/dist/deps/build-raptor-core/find-repo-dir.js +0 -27
  41. package/dist/deps/build-raptor-core/fingerprint-ledger.d.ts +0 -33
  42. package/dist/deps/build-raptor-core/fingerprint-ledger.js +0 -164
  43. package/dist/deps/build-raptor-core/fingerprint.d.ts +0 -3
  44. package/dist/deps/build-raptor-core/fingerprint.js +0 -13
  45. package/dist/deps/build-raptor-core/fingerprinter.d.ts +0 -14
  46. package/dist/deps/build-raptor-core/fingerprinter.js +0 -121
  47. package/dist/deps/build-raptor-core/hasher.d.ts +0 -21
  48. package/dist/deps/build-raptor-core/hasher.js +0 -93
  49. package/dist/deps/build-raptor-core/index.d.ts +0 -9
  50. package/dist/deps/build-raptor-core/index.js +0 -26
  51. package/dist/deps/build-raptor-core/model.d.ts +0 -17
  52. package/dist/deps/build-raptor-core/model.js +0 -40
  53. package/dist/deps/build-raptor-core/nop-asset-publisher.d.ts +0 -6
  54. package/dist/deps/build-raptor-core/nop-asset-publisher.js +0 -12
  55. package/dist/deps/build-raptor-core/performance-report.d.ts +0 -5
  56. package/dist/deps/build-raptor-core/performance-report.js +0 -3
  57. package/dist/deps/build-raptor-core/phase.d.ts +0 -1
  58. package/dist/deps/build-raptor-core/phase.js +0 -3
  59. package/dist/deps/build-raptor-core/planner.d.ts +0 -12
  60. package/dist/deps/build-raptor-core/planner.js +0 -43
  61. package/dist/deps/build-raptor-core/purger.d.ts +0 -11
  62. package/dist/deps/build-raptor-core/purger.js +0 -65
  63. package/dist/deps/build-raptor-core/slot-index.d.ts +0 -6
  64. package/dist/deps/build-raptor-core/slot-index.js +0 -17
  65. package/dist/deps/build-raptor-core/step-by-step-transmitter.d.ts +0 -15
  66. package/dist/deps/build-raptor-core/step-by-step-transmitter.js +0 -94
  67. package/dist/deps/build-raptor-core/tar-stream.d.ts +0 -20
  68. package/dist/deps/build-raptor-core/tar-stream.js +0 -194
  69. package/dist/deps/build-raptor-core/task-executor.d.ts +0 -32
  70. package/dist/deps/build-raptor-core/task-executor.js +0 -321
  71. package/dist/deps/build-raptor-core/task-store-cli.d.ts +0 -1
  72. package/dist/deps/build-raptor-core/task-store-cli.js +0 -61
  73. package/dist/deps/build-raptor-core/task-store-event.d.ts +0 -17
  74. package/dist/deps/build-raptor-core/task-store-event.js +0 -3
  75. package/dist/deps/build-raptor-core/task-store.d.ts +0 -41
  76. package/dist/deps/build-raptor-core/task-store.js +0 -302
  77. package/dist/deps/build-raptor-core/task-summary.d.ts +0 -12
  78. package/dist/deps/build-raptor-core/task-summary.js +0 -3
  79. package/dist/deps/build-raptor-core/task-tracker.d.ts +0 -23
  80. package/dist/deps/build-raptor-core/task-tracker.js +0 -97
  81. package/dist/deps/build-raptor-core/task.d.ts +0 -30
  82. package/dist/deps/build-raptor-core/task.js +0 -90
  83. package/dist/deps/build-raptor-core/updatable-task-output-registry.d.ts +0 -13
  84. package/dist/deps/build-raptor-core/updatable-task-output-registry.js +0 -75
  85. package/dist/deps/build-raptor-core/validate-task-infos.d.ts +0 -3
  86. package/dist/deps/build-raptor-core/validate-task-infos.js +0 -53
  87. package/dist/deps/build-raptor-core-testkit/build-raptor-core-testkit.d.ts +0 -1
  88. package/dist/deps/build-raptor-core-testkit/build-raptor-core-testkit.js +0 -18
  89. package/dist/deps/build-raptor-core-testkit/driver.d.ts +0 -119
  90. package/dist/deps/build-raptor-core-testkit/driver.js +0 -305
  91. package/dist/deps/build-raptor-core-testkit/index.d.ts +0 -3
  92. package/dist/deps/build-raptor-core-testkit/index.js +0 -20
  93. package/dist/deps/build-raptor-core-testkit/repo-protocol-testkit.d.ts +0 -35
  94. package/dist/deps/build-raptor-core-testkit/repo-protocol-testkit.js +0 -226
  95. package/dist/deps/build-raptor-core-testkit/simple-node-repo-protocol.d.ts +0 -27
  96. package/dist/deps/build-raptor-core-testkit/simple-node-repo-protocol.js +0 -140
  97. package/dist/deps/build-raptor-jest-reporter/index.d.ts +0 -0
  98. package/dist/deps/build-raptor-jest-reporter/index.js +0 -33
  99. package/dist/deps/build-run-id/build-run-id.d.ts +0 -3
  100. package/dist/deps/build-run-id/build-run-id.js +0 -13
  101. package/dist/deps/build-run-id/index.d.ts +0 -1
  102. package/dist/deps/build-run-id/index.js +0 -18
  103. package/dist/deps/core-types/core-types.d.ts +0 -29
  104. package/dist/deps/core-types/core-types.js +0 -81
  105. package/dist/deps/core-types/index.d.ts +0 -1
  106. package/dist/deps/core-types/index.js +0 -18
  107. package/dist/deps/logger/index.d.ts +0 -1
  108. package/dist/deps/logger/index.js +0 -18
  109. package/dist/deps/logger/logger.d.ts +0 -26
  110. package/dist/deps/logger/logger.js +0 -152
  111. package/dist/deps/misc/arrays.d.ts +0 -7
  112. package/dist/deps/misc/arrays.js +0 -67
  113. package/dist/deps/misc/camelize-record.d.ts +0 -6
  114. package/dist/deps/misc/camelize-record.js +0 -16
  115. package/dist/deps/misc/clean-directory.d.ts +0 -4
  116. package/dist/deps/misc/clean-directory.js +0 -80
  117. package/dist/deps/misc/constructs.d.ts +0 -106
  118. package/dist/deps/misc/constructs.js +0 -131
  119. package/dist/deps/misc/directory-scanner.d.ts +0 -49
  120. package/dist/deps/misc/directory-scanner.js +0 -165
  121. package/dist/deps/misc/executor.d.ts +0 -39
  122. package/dist/deps/misc/executor.js +0 -59
  123. package/dist/deps/misc/file-system-storage-client.d.ts +0 -23
  124. package/dist/deps/misc/file-system-storage-client.js +0 -93
  125. package/dist/deps/misc/folderify.d.ts +0 -8
  126. package/dist/deps/misc/folderify.js +0 -86
  127. package/dist/deps/misc/graph.d.ts +0 -29
  128. package/dist/deps/misc/graph.js +0 -200
  129. package/dist/deps/misc/in-memory-storage-client.d.ts +0 -21
  130. package/dist/deps/misc/in-memory-storage-client.js +0 -75
  131. package/dist/deps/misc/index.d.ts +0 -20
  132. package/dist/deps/misc/index.js +0 -37
  133. package/dist/deps/misc/int.d.ts +0 -10
  134. package/dist/deps/misc/int.js +0 -29
  135. package/dist/deps/misc/internal/graph-executor.d.ts +0 -15
  136. package/dist/deps/misc/internal/graph-executor.js +0 -93
  137. package/dist/deps/misc/maps.d.ts +0 -29
  138. package/dist/deps/misc/maps.js +0 -47
  139. package/dist/deps/misc/misc.d.ts +0 -23
  140. package/dist/deps/misc/misc.js +0 -94
  141. package/dist/deps/misc/object-map.d.ts +0 -10
  142. package/dist/deps/misc/object-map.js +0 -26
  143. package/dist/deps/misc/promises.d.ts +0 -39
  144. package/dist/deps/misc/promises.js +0 -78
  145. package/dist/deps/misc/records.d.ts +0 -11
  146. package/dist/deps/misc/records.js +0 -40
  147. package/dist/deps/misc/slurp-dir.d.ts +0 -1
  148. package/dist/deps/misc/slurp-dir.js +0 -14
  149. package/dist/deps/misc/storage-client.d.ts +0 -12
  150. package/dist/deps/misc/storage-client.js +0 -3
  151. package/dist/deps/misc/stream-to-buffer.d.ts +0 -2
  152. package/dist/deps/misc/stream-to-buffer.js +0 -26
  153. package/dist/deps/misc/strings.d.ts +0 -12
  154. package/dist/deps/misc/strings.js +0 -68
  155. package/dist/deps/misc/typed-publisher.d.ts +0 -17
  156. package/dist/deps/misc/typed-publisher.js +0 -65
  157. package/dist/deps/repo-protocol/index.d.ts +0 -3
  158. package/dist/deps/repo-protocol/index.js +0 -20
  159. package/dist/deps/repo-protocol/repo-protocol.d.ts +0 -49
  160. package/dist/deps/repo-protocol/repo-protocol.js +0 -3
  161. package/dist/deps/repo-protocol/task-info.d.ts +0 -18
  162. package/dist/deps/repo-protocol/task-info.js +0 -3
  163. package/dist/deps/repo-protocol/test-run-summary.d.ts +0 -54
  164. package/dist/deps/repo-protocol/test-run-summary.js +0 -32
  165. package/dist/deps/repo-protocol-toolbox/generate-task-infos.d.ts +0 -5
  166. package/dist/deps/repo-protocol-toolbox/generate-task-infos.js +0 -26
  167. package/dist/deps/repo-protocol-toolbox/index.d.ts +0 -3
  168. package/dist/deps/repo-protocol-toolbox/index.js +0 -20
  169. package/dist/deps/repo-protocol-toolbox/repo-protocol-toolbox.d.ts +0 -10
  170. package/dist/deps/repo-protocol-toolbox/repo-protocol-toolbox.js +0 -90
  171. package/dist/deps/repo-protocol-toolbox/task-definition.d.ts +0 -14
  172. package/dist/deps/repo-protocol-toolbox/task-definition.js +0 -3
  173. package/dist/deps/reporter-output/index.d.ts +0 -1
  174. package/dist/deps/reporter-output/index.js +0 -18
  175. package/dist/deps/reporter-output/reporter-output.d.ts +0 -49
  176. package/dist/deps/reporter-output/reporter-output.js +0 -25
  177. package/dist/deps/s3-storage-client/creds.d.ts +0 -4
  178. package/dist/deps/s3-storage-client/creds.js +0 -3
  179. package/dist/deps/s3-storage-client/get-s3-storage-client-factory.d.ts +0 -3
  180. package/dist/deps/s3-storage-client/get-s3-storage-client-factory.js +0 -45
  181. package/dist/deps/s3-storage-client/index.d.ts +0 -2
  182. package/dist/deps/s3-storage-client/index.js +0 -19
  183. package/dist/deps/s3-storage-client/main.d.ts +0 -1
  184. package/dist/deps/s3-storage-client/main.js +0 -20
  185. package/dist/deps/s3-storage-client/s3-storage-client.d.ts +0 -25
  186. package/dist/deps/s3-storage-client/s3-storage-client.js +0 -134
  187. package/dist/deps/task-name/index.d.ts +0 -1
  188. package/dist/deps/task-name/index.js +0 -18
  189. package/dist/deps/task-name/task-name.d.ts +0 -17
  190. package/dist/deps/task-name/task-name.js +0 -44
  191. package/dist/deps/unit-metadata/index.d.ts +0 -1
  192. package/dist/deps/unit-metadata/index.js +0 -18
  193. package/dist/deps/unit-metadata/unit-metadata.d.ts +0 -14
  194. package/dist/deps/unit-metadata/unit-metadata.js +0 -32
  195. package/dist/deps/yarn-repo-protocol/build-task-record.d.ts +0 -61
  196. package/dist/deps/yarn-repo-protocol/build-task-record.js +0 -29
  197. package/dist/deps/yarn-repo-protocol/generate-test-run-summary.d.ts +0 -4
  198. package/dist/deps/yarn-repo-protocol/generate-test-run-summary.js +0 -26
  199. package/dist/deps/yarn-repo-protocol/index.d.ts +0 -2
  200. package/dist/deps/yarn-repo-protocol/index.js +0 -19
  201. package/dist/deps/yarn-repo-protocol/rerun-list.d.ts +0 -12
  202. package/dist/deps/yarn-repo-protocol/rerun-list.js +0 -6
  203. package/dist/deps/yarn-repo-protocol/yarn-repo-protocol-config.d.ts +0 -24
  204. package/dist/deps/yarn-repo-protocol/yarn-repo-protocol-config.js +0 -33
  205. package/dist/deps/yarn-repo-protocol/yarn-repo-protocol.d.ts +0 -82
  206. package/dist/deps/yarn-repo-protocol/yarn-repo-protocol.js +0 -1036
  207. package/dist/src/build-raptor-cli.d.ts +0 -60
  208. package/dist/src/build-raptor-cli.js +0 -514
  209. package/dist/src/index.d.ts +0 -1
  210. package/dist/src/index.js +0 -20
  211. package/dist/src/main.d.ts +0 -2
  212. package/dist/src/main.js +0 -23
  213. package/dist/src/register-asset-request.d.ts +0 -18
  214. package/dist/src/register-asset-request.js +0 -11
  215. package/dist/src/task-execution-visualizer.d.ts +0 -17
  216. 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhhbXBsaWZ5LXpvZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9leGFtcGxpZnktem9kLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBbVRBLG9DQU9DO0FBMVRELCtCQUF3QztBQUN4Qyw2QkFZWTtBQUlaLFNBQVMsY0FBYyxDQUFDLE1BQWtCO0lBQ3hDLElBQUksTUFBTSxZQUFZLGVBQVMsRUFBRSxDQUFDO1FBQ2hDLE9BQU8sUUFBUSxDQUFBO0lBQ2pCLENBQUM7SUFDRCxJQUFJLE1BQU0sWUFBWSxlQUFTLEVBQUUsQ0FBQztRQUNoQyxPQUFPLFFBQVEsQ0FBQTtJQUNqQixDQUFDO0lBQ0QsSUFBSSxNQUFNLFlBQVksZ0JBQVUsRUFBRSxDQUFDO1FBQ2pDLE9BQU8sU0FBUyxDQUFBO0lBQ2xCLENBQUM7SUFDRCxJQUFJLE1BQU0sWUFBWSxlQUFTLEVBQUUsQ0FBQztRQUNoQyxPQUFPLFFBQVEsQ0FBQTtJQUNqQixDQUFDO0lBQ0QsSUFBSSxNQUFNLFlBQVksY0FBUSxFQUFFLENBQUM7UUFDL0IsT0FBTyxPQUFPLENBQUE7SUFDaEIsQ0FBQztJQUNELElBQUksTUFBTSxZQUFZLGNBQVEsRUFBRSxDQUFDO1FBQy9CLE9BQU8sT0FBTyxDQUFBO0lBQ2hCLENBQUM7SUFDRCxPQUFPLFNBQVMsQ0FBQTtBQUNsQixDQUFDO0FBRUQsU0FBUyxNQUFNLENBQUMsTUFBa0I7SUFDaEMsSUFBSSxNQUFNLFlBQVksaUJBQVcsSUFBSSxNQUFNLFlBQVksaUJBQVcsRUFBRSxDQUFDO1FBQ25FLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFBO0lBQ2hDLENBQUM7SUFDRCxJQUFJLE1BQU0sWUFBWSxnQkFBVSxFQUFFLENBQUM7UUFDakMsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUE7SUFDdkMsQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFBO0FBQ2YsQ0FBQztBQUVELFNB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