build-raptor 0.131.0 → 0.133.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (214) hide show
  1. package/dist/deps/brand/brand.d.ts +5 -0
  2. package/dist/deps/brand/brand.js +3 -0
  3. package/dist/deps/brand/index.d.ts +1 -0
  4. package/dist/deps/brand/index.js +18 -0
  5. package/dist/deps/build-failed-error/build-failed-error.d.ts +14 -0
  6. package/dist/deps/build-failed-error/build-failed-error.js +13 -0
  7. package/dist/deps/build-failed-error/index.d.ts +1 -0
  8. package/dist/deps/build-failed-error/index.js +18 -0
  9. package/dist/deps/build-raptor-api/build-raptor-api.d.ts +351 -0
  10. package/dist/deps/build-raptor-api/build-raptor-api.js +132 -0
  11. package/dist/deps/build-raptor-api/index.d.ts +2 -0
  12. package/dist/deps/build-raptor-api/index.js +19 -0
  13. package/dist/deps/build-raptor-api/step-by-step-processor.d.ts +35 -0
  14. package/dist/deps/build-raptor-api/step-by-step-processor.js +3 -0
  15. package/dist/deps/build-raptor-core/breakdown.d.ts +18 -0
  16. package/dist/deps/build-raptor-core/breakdown.js +99 -0
  17. package/dist/deps/build-raptor-core/build-raptor-config.d.ts +21 -0
  18. package/dist/deps/build-raptor-core/build-raptor-config.js +25 -0
  19. package/dist/deps/build-raptor-core/default-asset-publisher.d.ts +10 -0
  20. package/dist/deps/build-raptor-core/default-asset-publisher.js +16 -0
  21. package/dist/deps/build-raptor-core/engine-bootstrapper.d.ts +50 -0
  22. package/dist/deps/build-raptor-core/engine-bootstrapper.js +200 -0
  23. package/dist/deps/build-raptor-core/engine-event-scheme.d.ts +20 -0
  24. package/dist/deps/build-raptor-core/engine-event-scheme.js +3 -0
  25. package/dist/deps/build-raptor-core/engine.d.ts +66 -0
  26. package/dist/deps/build-raptor-core/engine.js +285 -0
  27. package/dist/deps/build-raptor-core/examplify-zod.d.ts +93 -0
  28. package/dist/deps/build-raptor-core/examplify-zod.js +257 -0
  29. package/dist/deps/build-raptor-core/execution-plan.d.ts +20 -0
  30. package/dist/deps/build-raptor-core/execution-plan.js +66 -0
  31. package/dist/deps/build-raptor-core/execution-record.d.ts +17 -0
  32. package/dist/deps/build-raptor-core/execution-record.js +3 -0
  33. package/dist/deps/build-raptor-core/execution-type.d.ts +2 -0
  34. package/dist/deps/build-raptor-core/execution-type.js +3 -0
  35. package/dist/deps/build-raptor-core/find-repo-dir.d.ts +1 -0
  36. package/dist/deps/build-raptor-core/find-repo-dir.js +27 -0
  37. package/dist/deps/build-raptor-core/fingerprint-ledger.d.ts +33 -0
  38. package/dist/deps/build-raptor-core/fingerprint-ledger.js +164 -0
  39. package/dist/deps/build-raptor-core/fingerprint.d.ts +3 -0
  40. package/dist/deps/build-raptor-core/fingerprint.js +13 -0
  41. package/dist/deps/build-raptor-core/fingerprinter.d.ts +15 -0
  42. package/dist/deps/build-raptor-core/fingerprinter.js +122 -0
  43. package/dist/deps/build-raptor-core/hasher.d.ts +21 -0
  44. package/dist/deps/build-raptor-core/hasher.js +93 -0
  45. package/dist/deps/build-raptor-core/index.d.ts +9 -0
  46. package/dist/deps/build-raptor-core/index.js +26 -0
  47. package/dist/deps/build-raptor-core/model.d.ts +17 -0
  48. package/dist/deps/build-raptor-core/model.js +40 -0
  49. package/dist/deps/build-raptor-core/nop-asset-publisher.d.ts +6 -0
  50. package/dist/deps/build-raptor-core/nop-asset-publisher.js +12 -0
  51. package/dist/deps/build-raptor-core/performance-report.d.ts +5 -0
  52. package/dist/deps/build-raptor-core/performance-report.js +3 -0
  53. package/dist/deps/build-raptor-core/phase.d.ts +1 -0
  54. package/dist/deps/build-raptor-core/phase.js +3 -0
  55. package/dist/deps/build-raptor-core/planner.d.ts +12 -0
  56. package/dist/deps/build-raptor-core/planner.js +43 -0
  57. package/dist/deps/build-raptor-core/purger.d.ts +11 -0
  58. package/dist/deps/build-raptor-core/purger.js +65 -0
  59. package/dist/deps/build-raptor-core/slot-index.d.ts +6 -0
  60. package/dist/deps/build-raptor-core/slot-index.js +17 -0
  61. package/dist/deps/build-raptor-core/step-by-step-transmitter.d.ts +15 -0
  62. package/dist/deps/build-raptor-core/step-by-step-transmitter.js +94 -0
  63. package/dist/deps/build-raptor-core/tar-stream.d.ts +20 -0
  64. package/dist/deps/build-raptor-core/tar-stream.js +194 -0
  65. package/dist/deps/build-raptor-core/task-executor.d.ts +32 -0
  66. package/dist/deps/build-raptor-core/task-executor.js +321 -0
  67. package/dist/deps/build-raptor-core/task-store-cli.d.ts +1 -0
  68. package/dist/deps/build-raptor-core/task-store-cli.js +61 -0
  69. package/dist/deps/build-raptor-core/task-store-event.d.ts +17 -0
  70. package/dist/deps/build-raptor-core/task-store-event.js +3 -0
  71. package/dist/deps/build-raptor-core/task-store.d.ts +41 -0
  72. package/dist/deps/build-raptor-core/task-store.js +302 -0
  73. package/dist/deps/build-raptor-core/task-summary.d.ts +12 -0
  74. package/dist/deps/build-raptor-core/task-summary.js +3 -0
  75. package/dist/deps/build-raptor-core/task-tracker.d.ts +23 -0
  76. package/dist/deps/build-raptor-core/task-tracker.js +97 -0
  77. package/dist/deps/build-raptor-core/task.d.ts +30 -0
  78. package/dist/deps/build-raptor-core/task.js +90 -0
  79. package/dist/deps/build-raptor-core/updatable-task-output-registry.d.ts +13 -0
  80. package/dist/deps/build-raptor-core/updatable-task-output-registry.js +75 -0
  81. package/dist/deps/build-raptor-core/validate-task-infos.d.ts +3 -0
  82. package/dist/deps/build-raptor-core/validate-task-infos.js +53 -0
  83. package/dist/deps/build-raptor-core-testkit/build-raptor-core-testkit.d.ts +1 -0
  84. package/dist/deps/build-raptor-core-testkit/build-raptor-core-testkit.js +18 -0
  85. package/dist/deps/build-raptor-core-testkit/driver.d.ts +119 -0
  86. package/dist/deps/build-raptor-core-testkit/driver.js +305 -0
  87. package/dist/deps/build-raptor-core-testkit/index.d.ts +3 -0
  88. package/dist/deps/build-raptor-core-testkit/index.js +20 -0
  89. package/dist/deps/build-raptor-core-testkit/repo-protocol-testkit.d.ts +35 -0
  90. package/dist/deps/build-raptor-core-testkit/repo-protocol-testkit.js +226 -0
  91. package/dist/deps/build-raptor-core-testkit/simple-node-repo-protocol.d.ts +27 -0
  92. package/dist/deps/build-raptor-core-testkit/simple-node-repo-protocol.js +140 -0
  93. package/dist/deps/build-run-id/build-run-id.d.ts +3 -0
  94. package/dist/deps/build-run-id/build-run-id.js +13 -0
  95. package/dist/deps/build-run-id/index.d.ts +1 -0
  96. package/dist/deps/build-run-id/index.js +18 -0
  97. package/dist/deps/core-types/core-types.d.ts +29 -0
  98. package/dist/deps/core-types/core-types.js +81 -0
  99. package/dist/deps/core-types/index.d.ts +1 -0
  100. package/dist/deps/core-types/index.js +18 -0
  101. package/dist/deps/logger/index.d.ts +1 -0
  102. package/dist/deps/logger/index.js +18 -0
  103. package/dist/deps/logger/logger.d.ts +26 -0
  104. package/dist/deps/logger/logger.js +152 -0
  105. package/dist/deps/misc/arrays.d.ts +7 -0
  106. package/dist/deps/misc/arrays.js +67 -0
  107. package/dist/deps/misc/camelize-record.d.ts +6 -0
  108. package/dist/deps/misc/camelize-record.js +16 -0
  109. package/dist/deps/misc/clean-directory.d.ts +4 -0
  110. package/dist/deps/misc/clean-directory.js +80 -0
  111. package/dist/deps/misc/constructs.d.ts +106 -0
  112. package/dist/deps/misc/constructs.js +131 -0
  113. package/dist/deps/misc/directory-scanner.d.ts +49 -0
  114. package/dist/deps/misc/directory-scanner.js +165 -0
  115. package/dist/deps/misc/executor.d.ts +39 -0
  116. package/dist/deps/misc/executor.js +59 -0
  117. package/dist/deps/misc/file-system-storage-client.d.ts +23 -0
  118. package/dist/deps/misc/file-system-storage-client.js +93 -0
  119. package/dist/deps/misc/folderify.d.ts +8 -0
  120. package/dist/deps/misc/folderify.js +86 -0
  121. package/dist/deps/misc/graph.d.ts +29 -0
  122. package/dist/deps/misc/graph.js +200 -0
  123. package/dist/deps/misc/in-memory-storage-client.d.ts +21 -0
  124. package/dist/deps/misc/in-memory-storage-client.js +75 -0
  125. package/dist/deps/misc/index.d.ts +20 -0
  126. package/dist/deps/misc/index.js +37 -0
  127. package/dist/deps/misc/int.d.ts +10 -0
  128. package/dist/deps/misc/int.js +29 -0
  129. package/dist/deps/misc/internal/graph-executor.d.ts +15 -0
  130. package/dist/deps/misc/internal/graph-executor.js +93 -0
  131. package/dist/deps/misc/maps.d.ts +29 -0
  132. package/dist/deps/misc/maps.js +47 -0
  133. package/dist/deps/misc/misc.d.ts +23 -0
  134. package/dist/deps/misc/misc.js +94 -0
  135. package/dist/deps/misc/object-map.d.ts +10 -0
  136. package/dist/deps/misc/object-map.js +26 -0
  137. package/dist/deps/misc/promises.d.ts +39 -0
  138. package/dist/deps/misc/promises.js +78 -0
  139. package/dist/deps/misc/records.d.ts +11 -0
  140. package/dist/deps/misc/records.js +40 -0
  141. package/dist/deps/misc/slurp-dir.d.ts +1 -0
  142. package/dist/deps/misc/slurp-dir.js +14 -0
  143. package/dist/deps/misc/storage-client.d.ts +12 -0
  144. package/dist/deps/misc/storage-client.js +3 -0
  145. package/dist/deps/misc/stream-to-buffer.d.ts +2 -0
  146. package/dist/deps/misc/stream-to-buffer.js +26 -0
  147. package/dist/deps/misc/strings.d.ts +12 -0
  148. package/dist/deps/misc/strings.js +68 -0
  149. package/dist/deps/misc/typed-publisher.d.ts +17 -0
  150. package/dist/deps/misc/typed-publisher.js +65 -0
  151. package/dist/deps/repo-protocol/index.d.ts +3 -0
  152. package/dist/deps/repo-protocol/index.js +20 -0
  153. package/dist/deps/repo-protocol/repo-protocol.d.ts +49 -0
  154. package/dist/deps/repo-protocol/repo-protocol.js +3 -0
  155. package/dist/deps/repo-protocol/task-info.d.ts +18 -0
  156. package/dist/deps/repo-protocol/task-info.js +3 -0
  157. package/dist/deps/repo-protocol/test-run-summary.d.ts +54 -0
  158. package/dist/deps/repo-protocol/test-run-summary.js +32 -0
  159. package/dist/deps/repo-protocol-toolbox/generate-task-infos.d.ts +5 -0
  160. package/dist/deps/repo-protocol-toolbox/generate-task-infos.js +26 -0
  161. package/dist/deps/repo-protocol-toolbox/index.d.ts +3 -0
  162. package/dist/deps/repo-protocol-toolbox/index.js +20 -0
  163. package/dist/deps/repo-protocol-toolbox/repo-protocol-toolbox.d.ts +10 -0
  164. package/dist/deps/repo-protocol-toolbox/repo-protocol-toolbox.js +90 -0
  165. package/dist/deps/repo-protocol-toolbox/task-definition.d.ts +14 -0
  166. package/dist/deps/repo-protocol-toolbox/task-definition.js +3 -0
  167. package/dist/deps/reporter-output/index.d.ts +1 -0
  168. package/dist/deps/reporter-output/index.js +18 -0
  169. package/dist/deps/reporter-output/reporter-output.d.ts +49 -0
  170. package/dist/deps/reporter-output/reporter-output.js +25 -0
  171. package/dist/deps/s3-storage-client/creds.d.ts +4 -0
  172. package/dist/deps/s3-storage-client/creds.js +3 -0
  173. package/dist/deps/s3-storage-client/get-s3-storage-client-factory.d.ts +3 -0
  174. package/dist/deps/s3-storage-client/get-s3-storage-client-factory.js +45 -0
  175. package/dist/deps/s3-storage-client/index.d.ts +2 -0
  176. package/dist/deps/s3-storage-client/index.js +19 -0
  177. package/dist/deps/s3-storage-client/main.d.ts +1 -0
  178. package/dist/deps/s3-storage-client/main.js +20 -0
  179. package/dist/deps/s3-storage-client/s3-storage-client.d.ts +25 -0
  180. package/dist/deps/s3-storage-client/s3-storage-client.js +134 -0
  181. package/dist/deps/task-name/index.d.ts +1 -0
  182. package/dist/deps/task-name/index.js +18 -0
  183. package/dist/deps/task-name/task-name.d.ts +17 -0
  184. package/dist/deps/task-name/task-name.js +44 -0
  185. package/dist/deps/unit-metadata/index.d.ts +1 -0
  186. package/dist/deps/unit-metadata/index.js +18 -0
  187. package/dist/deps/unit-metadata/unit-metadata.d.ts +14 -0
  188. package/dist/deps/unit-metadata/unit-metadata.js +32 -0
  189. package/dist/deps/yarn-repo-protocol/build-task-record.d.ts +61 -0
  190. package/dist/deps/yarn-repo-protocol/build-task-record.js +29 -0
  191. package/dist/deps/yarn-repo-protocol/generate-test-run-summary.d.ts +4 -0
  192. package/dist/deps/yarn-repo-protocol/generate-test-run-summary.js +26 -0
  193. package/dist/deps/yarn-repo-protocol/index.d.ts +2 -0
  194. package/dist/deps/yarn-repo-protocol/index.js +19 -0
  195. package/dist/deps/yarn-repo-protocol/rerun-list.d.ts +12 -0
  196. package/dist/deps/yarn-repo-protocol/rerun-list.js +6 -0
  197. package/dist/deps/yarn-repo-protocol/yarn-repo-protocol-config.d.ts +24 -0
  198. package/dist/deps/yarn-repo-protocol/yarn-repo-protocol-config.js +34 -0
  199. package/dist/deps/yarn-repo-protocol/yarn-repo-protocol.d.ts +82 -0
  200. package/dist/deps/yarn-repo-protocol/yarn-repo-protocol.js +1036 -0
  201. package/dist/src/build-raptor-cli.d.ts +60 -0
  202. package/dist/src/build-raptor-cli.js +514 -0
  203. package/dist/src/index.d.ts +1 -0
  204. package/dist/src/index.js +20 -0
  205. package/dist/src/main.d.ts +2 -0
  206. package/dist/src/main.js +23 -0
  207. package/dist/src/register-asset-request.d.ts +18 -0
  208. package/dist/src/register-asset-request.js +11 -0
  209. package/dist/src/task-execution-visualizer.d.ts +17 -0
  210. package/dist/src/task-execution-visualizer.js +116 -0
  211. package/package.json +17 -14
  212. package/build-raptor.js +0 -7259
  213. package/index.d.ts +0 -22
  214. package/index.js +0 -7231
@@ -0,0 +1,257 @@
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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
@@ -0,0 +1,20 @@
1
+ import { PathInRepo } from 'core-types';
2
+ import { Logger } from 'logger';
3
+ import { Graph } from 'misc';
4
+ import { TaskName } from 'task-name';
5
+ import { Task } from './task';
6
+ import { TaskOutputRegistry } from './updatable-task-output-registry';
7
+ export declare class ExecutionPlan {
8
+ readonly taskGraph: Graph<TaskName>;
9
+ private readonly logger;
10
+ private readonly registry;
11
+ private readonly taskByName;
12
+ readonly errorPropagationGraph: Graph<TaskName>;
13
+ constructor(taskGraph: Graph<TaskName>, tasks: Task[], logger: Logger, registry: TaskOutputRegistry);
14
+ getTask(taskName: TaskName): Task;
15
+ tasks(): Task[];
16
+ apply(units: string[], goals: PathInRepo[], labels: string[]): TaskName[];
17
+ private dropOutOfScope;
18
+ private computeStartingPoints;
19
+ toString(): string;
20
+ }
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ExecutionPlan = void 0;
4
+ const build_failed_error_1 = require("build-failed-error");
5
+ const misc_1 = require("misc");
6
+ // TODO(imaman): rethink the name. It is not exactly a "Plan".
7
+ class ExecutionPlan {
8
+ constructor(taskGraph, tasks, logger, registry) {
9
+ this.taskGraph = taskGraph;
10
+ this.logger = logger;
11
+ this.registry = registry;
12
+ this.taskByName = new Map();
13
+ for (const t of tasks) {
14
+ this.taskByName.set(t.name, t);
15
+ }
16
+ this.errorPropagationGraph = taskGraph.copy();
17
+ }
18
+ getTask(taskName) {
19
+ return (0, misc_1.hardGet)(this.taskByName, taskName);
20
+ }
21
+ tasks() {
22
+ const taskNames = this.taskGraph.vertices();
23
+ return taskNames.map(tn => this.getTask(tn));
24
+ }
25
+ apply(units, goals, labels) {
26
+ this.logger.info(`apply(${JSON.stringify(units)}, ${JSON.stringify(goals)}, ${JSON.stringify(labels)}) called`);
27
+ const startingPoints = this.computeStartingPoints(units, goals, labels);
28
+ this.dropOutOfScope(startingPoints);
29
+ this.logger.info(`computed these startingPoints: ${JSON.stringify(startingPoints)}`);
30
+ return startingPoints;
31
+ }
32
+ dropOutOfScope(startingPoints) {
33
+ const inscope = new Set(this.taskGraph.traverseFrom(startingPoints, { direction: 'forward' }));
34
+ this.logger.info(`scope of ${startingPoints.join('; ')} is ${[...inscope].join('; ')}`);
35
+ for (const v of this.taskGraph.vertices()) {
36
+ if (!inscope.has(v)) {
37
+ this.taskGraph.remove(v);
38
+ }
39
+ }
40
+ this.logger.info(`Task graph (only in-scope):\n${this.taskGraph}`);
41
+ }
42
+ computeStartingPoints(units, goals, labels) {
43
+ const setOfUnitId = new Set(units);
44
+ this.logger.info(`setOfUnitId=${[...setOfUnitId].join('; ')}`);
45
+ const matchesUnit = setOfUnitId.size === 0 && goals.length === 0 ? () => true : (t) => setOfUnitId.has(t.unitId);
46
+ const matchesLabel = labels.length === 0 ? () => true : (t) => labels.some(label => t.labels.includes(label));
47
+ const ret = goals.flatMap(ol => {
48
+ const tns = this.registry.wideLookup(ol);
49
+ if (tns.length === 0) {
50
+ throw new build_failed_error_1.BuildFailedError(`no task found for goal "${ol}"`);
51
+ }
52
+ return tns.filter(t => matchesLabel(this.getTask(t)));
53
+ });
54
+ ret.push(...this.tasks()
55
+ .filter(t => matchesUnit(t) && matchesLabel(t))
56
+ .map(t => t.name));
57
+ ret.sort();
58
+ this.logger.info(`Found ${ret.length} starting points`);
59
+ return ret;
60
+ }
61
+ toString() {
62
+ return `(ExecutionPlan ${this.taskGraph.toString()})`;
63
+ }
64
+ }
65
+ exports.ExecutionPlan = ExecutionPlan;
66
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhlY3V0aW9uLXBsYW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZXhlY3V0aW9uLXBsYW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMkRBQXFEO0FBR3JELCtCQUFxQztBQU1yQyw4REFBOEQ7QUFDOUQsTUFBYSxhQUFhO0lBR3hCLFlBQ1csU0FBMEIsRUFDbkMsS0FBYSxFQUNJLE1BQWMsRUFDZCxRQUE0QjtRQUhwQyxjQUFTLEdBQVQsU0FBUyxDQUFpQjtRQUVsQixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2QsYUFBUSxHQUFSLFFBQVEsQ0FBb0I7UUFOOUIsZUFBVSxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFBO1FBUXJELEtBQUssTUFBTSxDQUFDLElBQUksS0FBSyxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQTtRQUNoQyxDQUFDO1FBRUQsSUFBSSxDQUFDLHFCQUFxQixHQUFHLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtJQUMvQyxDQUFDO0lBRUQsT0FBTyxDQUFDLFFBQWtCO1FBQ3hCLE9BQU8sSUFBQSxjQUFPLEVBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQTtJQUMzQyxDQUFDO0lBRUQsS0FBSztRQUNILE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUE7UUFDM0MsT0FBTyxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO0lBQzlDLENBQUM7SUFFRCxLQUFLLENBQUMsS0FBZSxFQUFFLEtBQW1CLEVBQUUsTUFBZ0I7UUFDMUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FB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
@@ -0,0 +1,17 @@
1
+ export type Verdict = 'UNKNOWN' | 'CRASH' | 'FAIL' | 'OK';
2
+ import { TaskName } from 'task-name';
3
+ import { ExecutionType } from './execution-type';
4
+ import { Phase } from './phase';
5
+ import { SlotIndex } from './slot-index';
6
+ export interface ExecutionRecord {
7
+ readonly verdict: Verdict;
8
+ readonly outputFile?: string;
9
+ readonly executionType: ExecutionType;
10
+ readonly startedAt: SlotIndex;
11
+ readonly endedAt: SlotIndex;
12
+ readonly rootCause?: TaskName;
13
+ readonly phases: {
14
+ phase: Phase;
15
+ timestampMillis: number;
16
+ }[];
17
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhlY3V0aW9uLXJlY29yZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9leGVjdXRpb24tcmVjb3JkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIifQ==
@@ -0,0 +1,2 @@
1
+ export type KnownExecutionType = 'EXECUTED' | 'CACHED' | 'CANNOT_START';
2
+ export type ExecutionType = 'UNKNOWN' | KnownExecutionType;
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhlY3V0aW9uLXR5cGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZXhlY3V0aW9uLXR5cGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9
@@ -0,0 +1 @@
1
+ export declare function findRepoDir(dir: string): string | undefined;
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.findRepoDir = findRepoDir;
7
+ const fs_1 = __importDefault(require("fs"));
8
+ const path_1 = __importDefault(require("path"));
9
+ function findRepoDir(dir) {
10
+ while (true) {
11
+ const pj = path_1.default.join(dir, 'package.json');
12
+ const ex = fs_1.default.existsSync(pj);
13
+ if (ex) {
14
+ const content = JSON.parse(fs_1.default.readFileSync(pj, 'utf-8'));
15
+ const keys = Object.keys(content);
16
+ if (keys.includes('workspaces')) {
17
+ return dir;
18
+ }
19
+ }
20
+ const next = path_1.default.dirname(dir);
21
+ if (next === dir) {
22
+ return undefined;
23
+ }
24
+ dir = next;
25
+ }
26
+ }
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmluZC1yZXBvLWRpci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9maW5kLXJlcG8tZGlyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBR0Esa0NBa0JDO0FBckJELDRDQUFtQjtBQUNuQixnREFBdUI7QUFFdkIsU0FBZ0IsV0FBVyxDQUFDLEdBQVc7SUFDckMsT0FBTyxJQUFJLEVBQUUsQ0FBQztRQUNaLE1BQU0sRUFBRSxHQUFHLGNBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLGNBQWMsQ0FBQyxDQUFBO1FBQ3pDLE1BQU0sRUFBRSxHQUFHLFlBQUUsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUE7UUFDNUIsSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUNQLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBRSxDQUFDLFlBQVksQ0FBQyxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQTtZQUN4RCxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO1lBQ2pDLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO2dCQUNoQyxPQUFPLEdBQUcsQ0FBQTtZQUNaLENBQUM7UUFDSCxDQUFDO1FBRUQsTUFBTSxJQUFJLEdBQUcsY0FBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUM5QixJQUFJLElBQUksS0FBSyxHQUFHLEVBQUUsQ0FBQztZQUNqQixPQUFPLFNBQVMsQ0FBQTtRQUNsQixDQUFDO1FBQ0QsR0FBRyxHQUFHLElBQUksQ0FBQTtJQUNaLENBQUM7QUFDSCxDQUFDIn0=
@@ -0,0 +1,33 @@
1
+ import { BuildRunId } from 'build-run-id';
2
+ import { Logger } from 'logger';
3
+ import { TaskName } from 'task-name';
4
+ import { Fingerprint } from './fingerprint';
5
+ import { Hasher } from './hasher';
6
+ export interface FingerprintLedger {
7
+ updateRun(buildRunId: BuildRunId): Promise<void>;
8
+ updateFile(h: Hasher, content: string): void;
9
+ updateDirectory(h: Hasher): void;
10
+ updateTask(task: TaskName, fingerprint: Fingerprint, parts: Record<string, Fingerprint>): void;
11
+ close(): Promise<void>;
12
+ }
13
+ export declare class NopFingerprintLedger implements FingerprintLedger {
14
+ updateRun(): Promise<void>;
15
+ updateFile(): void;
16
+ updateDirectory(): void;
17
+ updateTask(): void;
18
+ close(): Promise<void>;
19
+ }
20
+ export declare class PersistedFingerprintLedger implements FingerprintLedger {
21
+ private readonly logger;
22
+ private readonly ledgerFile;
23
+ private items;
24
+ private buildRunId?;
25
+ constructor(logger: Logger, ledgerFile: string);
26
+ updateRun(buildRunId: BuildRunId): Promise<void>;
27
+ updateFile(h: Hasher, content: string): void;
28
+ updateDirectory(h: Hasher): void;
29
+ updateTask(task: TaskName, fingerprint: Fingerprint, parts: Record<string, Fingerprint>): void;
30
+ close(): Promise<void>;
31
+ private read;
32
+ private write;
33
+ }
@@ -0,0 +1,164 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.PersistedFingerprintLedger = exports.NopFingerprintLedger = void 0;
37
+ const fse = __importStar(require("fs-extra"));
38
+ const misc_1 = require("misc");
39
+ const zod_1 = require("zod");
40
+ const LedgerItem = zod_1.z.union([
41
+ zod_1.z.object({
42
+ tag: zod_1.z.literal('file'),
43
+ buildRunId: zod_1.z.string(),
44
+ location: zod_1.z.string(),
45
+ fingerprint: zod_1.z.string(),
46
+ content: zod_1.z.string(),
47
+ }),
48
+ zod_1.z.object({
49
+ tag: zod_1.z.literal('dir'),
50
+ buildRunId: zod_1.z.string(),
51
+ location: zod_1.z.string(),
52
+ fingerprint: zod_1.z.string(),
53
+ parts: zod_1.z.record(zod_1.z.string(), zod_1.z.string()),
54
+ }),
55
+ zod_1.z.object({
56
+ tag: zod_1.z.literal('task'),
57
+ buildRunId: zod_1.z.string(),
58
+ task: zod_1.z.string(),
59
+ fingerprint: zod_1.z.string(),
60
+ parts: zod_1.z.record(zod_1.z.string(), zod_1.z.string()),
61
+ }),
62
+ zod_1.z.object({ tag: zod_1.z.literal('run'), buildRunId: zod_1.z.string() }),
63
+ ]);
64
+ const Items = LedgerItem.array();
65
+ class NopFingerprintLedger {
66
+ async updateRun() { }
67
+ updateFile() { }
68
+ updateDirectory() { }
69
+ updateTask() { }
70
+ async close() { }
71
+ }
72
+ exports.NopFingerprintLedger = NopFingerprintLedger;
73
+ class PersistedFingerprintLedger {
74
+ constructor(logger, ledgerFile) {
75
+ this.logger = logger;
76
+ this.ledgerFile = ledgerFile;
77
+ this.items = [];
78
+ this.logger.info(`fingerprint ledger initialized with file=${this.ledgerFile}`);
79
+ }
80
+ async updateRun(buildRunId) {
81
+ // Validate the stored content by reading it.
82
+ await this.read();
83
+ this.items.push({ tag: 'run', buildRunId });
84
+ this.buildRunId = buildRunId;
85
+ }
86
+ updateFile(h, content) {
87
+ const json = h.toJSON();
88
+ this.items.push({
89
+ tag: 'file',
90
+ buildRunId: this.buildRunId ?? (0, misc_1.failMe)('build run ID is missing'),
91
+ location: json.hasherName,
92
+ fingerprint: json.digest ?? (0, misc_1.failMe)(`got an undefined digest in ${JSON.stringify(json)}`),
93
+ content,
94
+ });
95
+ }
96
+ updateDirectory(h) {
97
+ const json = h.toJSON();
98
+ this.items.push({
99
+ tag: 'dir',
100
+ buildRunId: this.buildRunId ?? (0, misc_1.failMe)('build run ID is missing'),
101
+ location: json.hasherName,
102
+ fingerprint: json.digest ?? (0, misc_1.failMe)(`got an undefined digest in ${JSON.stringify(json)}`),
103
+ parts: json.audit,
104
+ });
105
+ }
106
+ updateTask(task, fingerprint, parts) {
107
+ this.items.push({
108
+ tag: 'task',
109
+ buildRunId: this.buildRunId ?? (0, misc_1.failMe)('build run ID is missing'),
110
+ task,
111
+ fingerprint,
112
+ parts,
113
+ });
114
+ this.logger.info(`Fingerprint of task ${task} with inputs: ${JSON.stringify(parts)} is ${fingerprint}`);
115
+ }
116
+ async close() {
117
+ const t0 = Date.now();
118
+ try {
119
+ const itemsToWrite = await this.read();
120
+ itemsToWrite.push(...this.items);
121
+ await this.write(itemsToWrite);
122
+ }
123
+ finally {
124
+ this.logger.info(`.close() took ${((Date.now() - t0) / 1000).toFixed(1)}s`);
125
+ }
126
+ }
127
+ // TODO(imaman): cover
128
+ async read() {
129
+ const t0 = Date.now();
130
+ try {
131
+ if (!(await fse.pathExists(this.ledgerFile))) {
132
+ return [];
133
+ }
134
+ const untyped = await fse.readJSON(this.ledgerFile);
135
+ const ret = Items.parse(untyped);
136
+ const len = JSON.stringify(ret).length;
137
+ this.logger.info(`Length of content read from ${this.ledgerFile} is ${len}`);
138
+ if (len > TRUNCATION_THRESHOLD) {
139
+ this.logger.info(`Discarding the preexsiting content of ${this.ledgerFile} because its length (${len}) exceeded the preset limit of ${TRUNCATION_THRESHOLD}`);
140
+ ret.length = 0;
141
+ }
142
+ return ret;
143
+ }
144
+ finally {
145
+ this.logger.info(`.read() on ${this.ledgerFile} took ${((Date.now() - t0) / 1000).toFixed(1)}s`);
146
+ }
147
+ }
148
+ async write(items) {
149
+ try {
150
+ await fse.writeJSON(this.ledgerFile, items);
151
+ }
152
+ catch (e) {
153
+ this.logger.error(`writeFile failed`, e);
154
+ throw new Error(`Could not save ${items.length} items to ${this.ledgerFile} due to: ${e}`);
155
+ }
156
+ }
157
+ }
158
+ exports.PersistedFingerprintLedger = PersistedFingerprintLedger;
159
+ /**
160
+ * If the length of the ledger that was read from the file exceeds this value, the ledger will be purged to avoid
161
+ * errors on the subsequent save.
162
+ */
163
+ const TRUNCATION_THRESHOLD = 200 * 1000 * 1000;
164
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmluZ2VycHJpbnQtbGVkZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2ZpbmdlcnByaW50LWxlZGdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQSw4Q0FBK0I7QUFFL0IsK0JBQTZCO0FBRTdCLDZCQUF1QjtBQUt2QixNQUFNLFVBQVUsR0FBRyxPQUFDLENBQUMsS0FBSyxDQUFDO0lBQ3pCLE9BQUMsQ0FBQyxNQUFNLENBQUM7UUFDUCxHQUFHLEVBQUUsT0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7UUFDdEIsVUFBVSxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUU7UUFDdEIsUUFBUSxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUU7UUFDcEIsV0FBVyxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUU7UUFDdkIsT0FBTyxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUU7S0FDcEIsQ0FBQztJQUNGLE9BQUMsQ0FBQyxNQUFNLENBQUM7UUFDUCxHQUFHLEVBQUUsT0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7UUFDckIsVUFBVSxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUU7UUFDdEIsUUFBUSxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUU7UUFDcEIsV0FBVyxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUU7UUFDdkIsS0FBSyxFQUFFLE9BQUMsQ0FBQyxNQUFNLENBQUMsT0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztLQUN4QyxDQUFDO0lBQ0YsT0FBQyxDQUFDLE1BQU0sQ0FBQztRQUNQLEdBQUcsRUFBRSxPQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztRQUN0QixVQUFVLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRTtRQUN0QixJQUFJLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRTtRQUNoQixXQUFXLEVB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
@@ -0,0 +1,3 @@
1
+ import { Brand } from 'brand';
2
+ export type Fingerprint = Brand<string, 'fingerprint'>;
3
+ export declare function Fingerprint(input: string): Fingerprint;
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Fingerprint = Fingerprint;
4
+ function validate(input) {
5
+ if (input.length === 0) {
6
+ throw new Error(`Bad Fingerprint: <${input}>`);
7
+ }
8
+ }
9
+ function Fingerprint(input) {
10
+ validate(input);
11
+ return input;
12
+ }
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmluZ2VycHJpbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZmluZ2VycHJpbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFTQSxrQ0FHQztBQVRELFNBQVMsUUFBUSxDQUFDLEtBQWE7SUFDN0IsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3ZCLE1BQU0sSUFBSSxLQUFLLENBQUMscUJBQXFCLEtBQUssR0FBRyxDQUFDLENBQUE7SUFDaEQsQ0FBQztBQUNILENBQUM7QUFFRCxTQUFnQixXQUFXLENBQUMsS0FBYTtJQUN2QyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDZixPQUFPLEtBQUssQ0FBQTtBQUNkLENBQUMifQ==