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,1036 @@
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.YarnRepoProtocol = void 0;
40
+ const build_failed_error_1 = require("build-failed-error");
41
+ const core_types_1 = require("core-types");
42
+ const escape_string_regexp_1 = __importDefault(require("escape-string-regexp"));
43
+ const execa_1 = __importDefault(require("execa"));
44
+ const fs = __importStar(require("fs"));
45
+ const fse = __importStar(require("fs-extra"));
46
+ const misc_1 = require("misc");
47
+ const path = __importStar(require("path"));
48
+ const reporter_output_1 = require("reporter-output");
49
+ const task_name_1 = require("task-name");
50
+ const Tmp = __importStar(require("tmp-promise"));
51
+ const unit_metadata_1 = require("unit-metadata");
52
+ const zod_1 = require("zod");
53
+ const build_task_record_1 = require("./build-task-record");
54
+ const generate_test_run_summary_1 = require("./generate-test-run-summary");
55
+ const rerun_list_1 = require("./rerun-list");
56
+ const yarn_repo_protocol_config_1 = require("./yarn-repo-protocol-config");
57
+ const yarnWorkspacesInfoSchema = zod_1.z.record(zod_1.z.object({
58
+ location: zod_1.z.string(),
59
+ workspaceDependencies: zod_1.z.string().array(),
60
+ mismatchedWorkspaceDependencies: zod_1.z.string().array(),
61
+ }));
62
+ async function getTempFile() {
63
+ const ret = (await Tmp.file()).path;
64
+ return ret;
65
+ }
66
+ function isSimpleName(fileName) {
67
+ return path.basename(fileName) === fileName;
68
+ }
69
+ class YarnRepoProtocol {
70
+ constructor(logger,
71
+ // TODO(imaman): deprecate it.
72
+ assetPublisher) {
73
+ this.logger = logger;
74
+ this.assetPublisher = assetPublisher;
75
+ this.scriptNames = {
76
+ build: 'build',
77
+ validate: 'validate',
78
+ postBuild: 'build:post',
79
+ prepareAssets: 'prepare-assets',
80
+ };
81
+ this.src = 'src';
82
+ this.tests = 'tests';
83
+ this.tsconfigBaseName = 'tsconfig-base.json';
84
+ if (!isSimpleName(this.tsconfigBaseName)) {
85
+ throw new Error(`tsconfig base file name must be a simple name (not a path). Got: "${this.tsconfigBaseName}"`);
86
+ }
87
+ }
88
+ getConfigSchema() {
89
+ return yarn_repo_protocol_config_1.YarnRepoProtocolConfig;
90
+ }
91
+ dist(which) {
92
+ const d = `dist`;
93
+ return which === undefined
94
+ ? d
95
+ : which === 's'
96
+ ? `${d}/${this.src}`
97
+ : which === 't'
98
+ ? `${d}/${this.tests}`
99
+ : (0, misc_1.shouldNeverHappen)(which);
100
+ }
101
+ get state() {
102
+ return this.state_ ?? (0, misc_1.failMe)('state was not set');
103
+ }
104
+ get testRunSummaryFile() {
105
+ return path.join(this.state.outDirName, 'test-runs.json');
106
+ }
107
+ hasRunScript(unitId, runScript) {
108
+ const pj = this.getPackageJson(unitId);
109
+ const runScripts = Object.keys(pj.scripts ?? {});
110
+ return runScripts.includes(runScript);
111
+ }
112
+ getTestCommand(unitId) {
113
+ // Check if custom test commands are allowed
114
+ const toggle = this.state.config.enableCustomTestCommands ?? true;
115
+ if (!toggle) {
116
+ return undefined;
117
+ }
118
+ const pj = this.getPackageJson(unitId);
119
+ // Check for buildRaptor.testCommand in package.json
120
+ const schema = zod_1.z.object({ buildRaptor: zod_1.z.object({ testCommand: zod_1.z.string().optional() }).optional() });
121
+ const { buildRaptor } = schema.parse(pj);
122
+ return buildRaptor?.testCommand;
123
+ }
124
+ async hasSpecFiles(testsDir) {
125
+ try {
126
+ const files = await misc_1.DirectoryScanner.listPaths(testsDir, { startingPointMustExist: false });
127
+ return files.some(file => file.endsWith('.spec.ts'));
128
+ }
129
+ catch (error) {
130
+ // If directory doesn't exist or error reading it, assume no spec files
131
+ this.logger.info(`Error checking for spec files in ${testsDir}: ${error}`);
132
+ return false;
133
+ }
134
+ }
135
+ parseConfig(untypedConfig) {
136
+ const parseResult = yarn_repo_protocol_config_1.YarnRepoProtocolConfig.safeParse(untypedConfig ?? {}, { path: ['repoProtocol'] });
137
+ if (parseResult.success) {
138
+ return parseResult.data;
139
+ }
140
+ const formattedIssues = parseResult.error.issues.map(at => at.path.length ? `Attribute: "${at.path.join('.')}": ${at.message}` : at.message);
141
+ throw new build_failed_error_1.BuildFailedError(`bad config\n${formattedIssues.join('\n')}`);
142
+ }
143
+ async initialize(rootDir, publisher, outDirName, repoProtocolConfig) {
144
+ const yarnInfo = await this.getYarnInfo(rootDir);
145
+ const config = this.parseConfig(repoProtocolConfig);
146
+ const allUnits = computeUnits(yarnInfo);
147
+ const units = computeRealUnits(allUnits);
148
+ const [packageByUnitId, _] = await Promise.all([
149
+ readPackages(rootDir, units),
150
+ createOutDirs(rootDir, units, outDirName),
151
+ ]);
152
+ const versionByPackageId = computeVersions([...packageByUnitId.values()]);
153
+ const violations = [];
154
+ const graph = new misc_1.Graph(x => x);
155
+ for (const [p, data] of Object.entries(yarnInfo)) {
156
+ const uid = (0, unit_metadata_1.UnitId)(p);
157
+ graph.vertex(uid);
158
+ for (const dep of data.workspaceDependencies) {
159
+ graph.edge(uid, (0, unit_metadata_1.UnitId)(dep));
160
+ }
161
+ for (const d of data.mismatchedWorkspaceDependencies) {
162
+ violations.push([uid, (0, unit_metadata_1.UnitId)(d)]);
163
+ }
164
+ }
165
+ const violation = violations.find(Boolean);
166
+ if (violation) {
167
+ const [consumer, supplier] = violation;
168
+ const ps = (0, misc_1.hardGet)(packageByUnitId, supplier);
169
+ // We assume that there is a consistent version for all dependencies so we lookup that version, instead of looking
170
+ // into the package.json of the consumer and digging the exact version that is specified there.
171
+ const v = (0, misc_1.hardGet)(versionByPackageId, supplier);
172
+ // TODO(imaman): generate a comprehensive error message that lists *all* violations.
173
+ throw new build_failed_error_1.BuildFailedError(`Version mismatch for dependency "${supplier}" of "${consumer}": ${ps.version} vs. ${v}`);
174
+ }
175
+ await this.generateTsConfigFiles(rootDir, units, graph);
176
+ await this.generateSymlinksToPackages(rootDir, units);
177
+ this.state_ = {
178
+ yarnInfo,
179
+ graph,
180
+ rootDir,
181
+ units: allUnits,
182
+ packageByUnitId,
183
+ versionByPackageId,
184
+ publisher,
185
+ config,
186
+ outDirName,
187
+ };
188
+ }
189
+ async generateSymlinksToPackages(rootDir, units) {
190
+ const nodeModules = (0, core_types_1.PathInRepo)('node_modules');
191
+ const nodeModulesLoc = rootDir.resolve(nodeModules);
192
+ await fse.mkdirp(rootDir.resolve(nodeModules));
193
+ for (const u of units) {
194
+ const link = nodeModules.expand(u.id);
195
+ const linkLoc = rootDir.resolve(link);
196
+ const exists = await fse.pathExists(linkLoc);
197
+ if (exists) {
198
+ continue;
199
+ }
200
+ const packageLoc = rootDir.resolve(u.pathInRepo);
201
+ const packageFromNodeModules = path.relative(nodeModulesLoc, packageLoc);
202
+ await fse.symlink(packageFromNodeModules, linkLoc);
203
+ }
204
+ }
205
+ async generateTsConfigFiles(rootDir, units, graph) {
206
+ const rootBase = rootDir.resolve((0, core_types_1.PathInRepo)(this.tsconfigBaseName));
207
+ const rootBaseExists = await fse.pathExists(rootBase);
208
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
209
+ const rootBaseContent = rootBaseExists ? (await fse.readJSON(rootBase)) : {};
210
+ const defaultOptions = {
211
+ module: 'CommonJS',
212
+ inlineSourceMap: true,
213
+ newLine: 'LF',
214
+ declaration: true,
215
+ target: 'ES2021',
216
+ lib: ['ES2021', 'DOM'],
217
+ strict: true,
218
+ noImplicitAny: true,
219
+ moduleResolution: 'node',
220
+ allowSyntheticDefaultImports: true,
221
+ esModuleInterop: true,
222
+ resolveJsonModule: true,
223
+ };
224
+ for (const u of units) {
225
+ const deps = graph.neighborsOf(u.id);
226
+ const localBase = rootDir.resolve(u.pathInRepo.expand(this.tsconfigBaseName));
227
+ const localBaseExists = await fse.pathExists(localBase);
228
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
229
+ const localBaseContent = localBaseExists ? (await fse.readJSON(localBase)) : {};
230
+ const additions = [...(localBaseContent.include ?? []), ...(rootBaseContent.include ?? [])];
231
+ const tsconf = {
232
+ ...(localBaseExists
233
+ ? { extends: `./${this.tsconfigBaseName}` }
234
+ : rootBaseExists
235
+ ? { extends: path.relative(u.pathInRepo.val, this.tsconfigBaseName) }
236
+ : {}),
237
+ compilerOptions: {
238
+ ...(localBaseExists || rootBaseExists ? {} : defaultOptions),
239
+ composite: true,
240
+ outDir: this.dist(),
241
+ },
242
+ references: deps.map(d => {
243
+ const dp = units.find(at => at.id === d) ?? (0, misc_1.failMe)(`Unit not found: ${d} (when generating tsconfig.json for ${u.id})`);
244
+ return {
245
+ path: path.relative(u.pathInRepo.val, dp.pathInRepo.val),
246
+ };
247
+ }),
248
+ include: [
249
+ `${this.src}/**/*`,
250
+ `${this.src}/**/*.json`,
251
+ `${this.tests}/**/*`,
252
+ `${this.tests}/**/*.json`,
253
+ ...additions,
254
+ ],
255
+ };
256
+ if (!tsconf.references?.length) {
257
+ delete tsconf.references;
258
+ }
259
+ const content = JSON.stringify(tsconf, null, 2);
260
+ const p = rootDir.resolve(u.pathInRepo.expand('tsconfig.json'));
261
+ if (await fse.pathExists(p)) {
262
+ const existing = JSON.stringify(await fse.readJSON(p, 'utf-8'), null, 2);
263
+ if (existing.trim() === content.trim()) {
264
+ this.logger.info(`skipping generation of tsconfig.json in ${u.id} - no changes`);
265
+ continue;
266
+ }
267
+ }
268
+ this.logger.info(`updating the tsconfig.json file of ${u.id}`);
269
+ await fse.writeFile(p, content);
270
+ }
271
+ }
272
+ async close() { }
273
+ async run(cmd, args, dir, outputFile, additionalEnvVars = {}) {
274
+ const summary = `<${dir}$ ${cmd} ${args.join(' ')}>`;
275
+ this.logger.info(`Dispatching ${summary}. output: ${outputFile}`);
276
+ const out = await fse.open(outputFile, 'w');
277
+ try {
278
+ const p = await (0, execa_1.default)(cmd, args, { cwd: dir, stdout: out, stderr: out, reject: false, env: additionalEnvVars });
279
+ this.logger.info(`exitCode of ${cmd} ${args.join(' ')} is ${p.exitCode}`);
280
+ if (p.exitCode === 0) {
281
+ return 'OK';
282
+ }
283
+ return 'FAIL';
284
+ }
285
+ catch (e) {
286
+ this.logger.error(`execution of ${summary} failed`, e);
287
+ return 'CRASH';
288
+ }
289
+ finally {
290
+ await fse.close(out);
291
+ }
292
+ }
293
+ // TODO(imaman): this should be retired. custom build tasks should be used instead.
294
+ async runAdditionalBuildActions(unitId, dir, outputFile) {
295
+ await this.checkBuiltFiles(dir);
296
+ return await this.runPostBuild(unitId, dir, outputFile);
297
+ }
298
+ async runPostBuild(unitId, dir, outputFile) {
299
+ if (!this.hasRunScript(unitId, this.scriptNames.postBuild)) {
300
+ return 'OK';
301
+ }
302
+ const tempFile = await getTempFile();
303
+ const ret = await this.run('npm', ['run', this.scriptNames.postBuild], dir, tempFile);
304
+ const toAppend = await fse.readFile(tempFile);
305
+ await fse.appendFile(outputFile, toAppend);
306
+ return ret;
307
+ }
308
+ async checkBuiltFiles(dir) {
309
+ for (const codeDir of [this.src, this.tests]) {
310
+ const inputFiles = new Map();
311
+ const inputDir = path.join(dir, codeDir);
312
+ const paths = await misc_1.DirectoryScanner.listPaths(inputDir, { startingPointMustExist: false });
313
+ for (const p of paths) {
314
+ inputFiles.set(p, fs.statSync(path.join(inputDir, p)).mode);
315
+ }
316
+ const d = path.join(dir, `${this.dist()}/${codeDir}`);
317
+ const distFiles = await misc_1.DirectoryScanner.listPaths(d, { startingPointMustExist: false });
318
+ const replaceSuffix = (f, targetSuffx) => f.replace(/\.js$/, targetSuffx).replace(/\.d\.ts$/, targetSuffx);
319
+ const inputFileExists = (f) => {
320
+ let ret;
321
+ ret = inputFiles.get(f);
322
+ if (ret) {
323
+ return ret;
324
+ }
325
+ ret = inputFiles.get(replaceSuffix(f, '.ts'));
326
+ if (ret) {
327
+ return ret;
328
+ }
329
+ ret = inputFiles.get(replaceSuffix(f, '.tsx'));
330
+ if (ret) {
331
+ return ret;
332
+ }
333
+ return undefined;
334
+ };
335
+ for (const f of distFiles) {
336
+ const orig = inputFileExists(f);
337
+ const resolved = path.join(d, f);
338
+ if (orig === undefined) {
339
+ this.logger.info(`deleting unmatched dist file: ${f}`);
340
+ fs.rmSync(resolved);
341
+ }
342
+ else {
343
+ fs.chmodSync(resolved, orig);
344
+ }
345
+ }
346
+ }
347
+ }
348
+ getInstallFeatureToggle() {
349
+ const raw = this.state.config.install ?? 'off';
350
+ if (typeof raw === 'boolean') {
351
+ return raw ? 'on' : 'off';
352
+ }
353
+ return raw;
354
+ }
355
+ async execute(taskName, outputFile, _buildRunId) {
356
+ if (taskName === installTaskName) {
357
+ const ft = this.getInstallFeatureToggle();
358
+ return (0, misc_1.switchOn)(ft, {
359
+ off: async () => {
360
+ throw new Error(`cannot execute ${taskName} when its feature toggle is set to ${ft}`);
361
+ },
362
+ dormant: async () => {
363
+ fs.writeFileSync(outputFile, '');
364
+ const ret = 'OK';
365
+ return ret;
366
+ },
367
+ on: async () => {
368
+ this.logger.print(`Installing dependencies...`);
369
+ const ret = await this.run('yarn', ['--frozen-lockfile'], this.state.rootDir.resolve(), outputFile);
370
+ return ret;
371
+ },
372
+ });
373
+ }
374
+ const { taskKind, unitId, subKind } = (0, task_name_1.TaskName)().undo(taskName);
375
+ const u = this.state.units.find(at => at.id === unitId) ?? (0, misc_1.failMe)(`unit ID not found: ${unitId}`);
376
+ const dir = this.state.rootDir.resolve(u.pathInRepo);
377
+ if (taskKind === 'build' && subKind === '') {
378
+ let buildStatus;
379
+ if (this.state.config.uberBuild ?? true) {
380
+ buildStatus = await this.runUberBuild(outputFile, taskName);
381
+ }
382
+ else {
383
+ buildStatus = await this.run('npm', ['run', this.scriptNames.build], dir, outputFile);
384
+ }
385
+ return await (0, misc_1.switchOn)(buildStatus, {
386
+ CRASH: () => Promise.resolve(buildStatus),
387
+ FAIL: () => Promise.resolve(buildStatus),
388
+ OK: () => this.runAdditionalBuildActions(u.id, dir, outputFile),
389
+ });
390
+ }
391
+ if (taskKind === 'build' && subKind !== '') {
392
+ return await this.run('npm', ['run', subKind], dir, outputFile);
393
+ }
394
+ if (taskKind === 'test') {
395
+ // Check if there are any *.spec.ts files in the tests directory
396
+ const testsDir = path.join(dir, this.tests);
397
+ const hasSpecFiles = await this.hasSpecFiles(testsDir);
398
+ if (!hasSpecFiles) {
399
+ // No spec files found - skip test execution
400
+ this.logger.info(`No *.spec.ts files found in ${testsDir}, skipping test execution`);
401
+ await fs.promises.writeFile(outputFile, `No test files found in ${testsDir}\n`);
402
+ // Create empty test summary file to maintain invariant
403
+ const dirInRepo = this.state.rootDir.unresolve(dir);
404
+ const resolvedSummaryFile = this.state.rootDir.resolve(dirInRepo.expand(this.testRunSummaryFile));
405
+ fs.writeFileSync(resolvedSummaryFile, JSON.stringify({}));
406
+ // Create empty jest output file
407
+ const jof = path.join(dir, JEST_OUTPUT_FILE);
408
+ fs.writeFileSync(jof, JSON.stringify([]));
409
+ // Still run validate if it exists
410
+ const tempFile = await getTempFile();
411
+ const validateResult = await this.runValidate(u, dir, tempFile);
412
+ const toAppend = await fse.readFile(tempFile);
413
+ await fse.appendFile(outputFile, toAppend);
414
+ return validateResult;
415
+ }
416
+ const tempFile = await getTempFile();
417
+ const testCommand = this.getTestCommand(u.id);
418
+ // Run test and validate in parallel (same approach for both custom and Jest)
419
+ const [testResult, validateResult] = await Promise.all([
420
+ testCommand ? this.runCustomTest(u.id, dir, taskName, outputFile) : this.runJest(dir, taskName, outputFile),
421
+ this.runValidate(u, dir, tempFile),
422
+ ]);
423
+ // Merge validate output into main output file
424
+ const toAppend = await fse.readFile(tempFile);
425
+ await fse.appendFile(outputFile, toAppend);
426
+ // Return based on test result: if test fails, return test result; if test passes, return validate result
427
+ return (0, misc_1.switchOn)(testResult, {
428
+ CRASH: () => testResult,
429
+ FAIL: () => testResult,
430
+ OK: () => validateResult,
431
+ });
432
+ }
433
+ if (taskKind === 'pack') {
434
+ const ret = await this.pack(u, dir);
435
+ await fse.writeFile(outputFile, '');
436
+ return ret;
437
+ }
438
+ if (taskKind === 'publish-assets') {
439
+ const scriptName = this.scriptNames.prepareAssets;
440
+ const fullPath = path.join(dir, PREPARED_ASSETS_DIR);
441
+ await fse.rm(fullPath, { force: true, recursive: true });
442
+ await fse.mkdirp(fullPath);
443
+ const ret = await this.run('npm', ['run', scriptName], dir, outputFile);
444
+ const exists = await fse.pathExists(fullPath);
445
+ if (!exists) {
446
+ throw new build_failed_error_1.BuildFailedError(`Output file ${path.basename(fullPath)} was not created by the ${scriptName} run script in ${dir}`);
447
+ }
448
+ const files = await fse.readdir(fullPath);
449
+ await Promise.all(files.map(async (f) => {
450
+ const contentToPublish = await fse.readFile(path.join(fullPath, f));
451
+ this.logger.info(`unit ${u.id}: publishing asset ${f}`);
452
+ const casAddress = await this.assetPublisher.publishAsset(u, contentToPublish, f);
453
+ this.logger.info(`unit ${u.id}: asset ${f} published to cas ${casAddress}`);
454
+ this.state.publisher.publish('assetPublished', {
455
+ taskName,
456
+ casAddress,
457
+ file: f,
458
+ });
459
+ }));
460
+ return ret;
461
+ }
462
+ throw new Error(`Unknown task ${taskKind} (at ${dir})`);
463
+ }
464
+ async runUberBuild(outputFile, taskName) {
465
+ if (this.state.uberBuildPromise) {
466
+ const ret = await this.state.uberBuildPromise;
467
+ await fse.writeFile(outputFile, ``);
468
+ return ret;
469
+ }
470
+ this.logger.info(`logging uberbuild in ${outputFile} (triggered by ${taskName})`);
471
+ const dirs = computeRealUnits(this.state.units).map(at => at.pathInRepo.val);
472
+ const compiler = this.state.config.compilerExecutable ?? 'tsc';
473
+ const p = this.run('npx', [compiler, '--build', ...dirs], this.state.rootDir.resolve(), outputFile);
474
+ this.state.uberBuildPromise = p;
475
+ const ret = await this.state.uberBuildPromise;
476
+ return ret;
477
+ }
478
+ async runJest(dir, taskName, outputFile) {
479
+ const dirInRepo = this.state.rootDir.unresolve(dir);
480
+ // file path resolution here is ugly. it's probably better to change dir (parameter of this function) to be
481
+ // PathInRepo
482
+ const resolvedSummaryFile = this.state.rootDir.resolve(dirInRepo.expand(this.testRunSummaryFile));
483
+ // We must create the file (empty) such that even if the task fails there is still an output (to keep the invariant
484
+ // that all outputs must be produced by a task when it runs).
485
+ fs.writeFileSync(resolvedSummaryFile, JSON.stringify({}));
486
+ const jof = path.join(dir, JEST_OUTPUT_FILE);
487
+ const testsToRun = await this.computeTestsToRun(jof);
488
+ const reporterOutputFile = (await Tmp.file()).path;
489
+ const ret = await this.run('npx', [
490
+ 'jest',
491
+ ...testsToRun,
492
+ '--outputFile',
493
+ reporterOutputFile,
494
+ '--reporters',
495
+ 'build-raptor-jest-reporter',
496
+ '--reporters',
497
+ 'default',
498
+ ], dir, outputFile, this.state.config.additionalJestEnvVars);
499
+ const readStdout = () => fs.readFileSync(outputFile, 'utf-8').trim();
500
+ const latest = fs.readFileSync(reporterOutputFile, 'utf-8');
501
+ if (latest.trim().length === 0) {
502
+ const output = readStdout();
503
+ if (output.length) {
504
+ this.logger.print(`<No Jest tests were invoked. Jest output follows below. latest=${JSON.stringify(latest)}>\n${output}`);
505
+ fs.writeFileSync(jof, JSON.stringify(emptyRerunList));
506
+ return 'FAIL';
507
+ }
508
+ }
509
+ let reporterOutput;
510
+ try {
511
+ const parsed = JSON.parse(latest);
512
+ reporterOutput = reporter_output_1.ReporterOutput.parse(parsed);
513
+ }
514
+ catch (e) {
515
+ const output = readStdout();
516
+ const limit = 512;
517
+ this.logger.error(`crashing due to jest output file parsing error: ${JSON.stringify({
518
+ latest,
519
+ testsToRun,
520
+ outputFile,
521
+ })}. First ${limit} chars of the output file: ${output.slice(0, limit)}`, e);
522
+ throw new Error(`failed to parse ${reporterOutputFile} of ${taskName}: <${e}>`);
523
+ }
524
+ reporterOutput.cases.forEach(at => {
525
+ const fileName = this.state.rootDir.unresolve(at.fileName);
526
+ const verdict = (0, misc_1.switchOn)(at.status, {
527
+ disabled: () => undefined,
528
+ failed: () => 'TEST_FAILED',
529
+ passed: () => 'TEST_PASSED',
530
+ pending: () => undefined,
531
+ skipped: () => undefined,
532
+ todo: () => undefined,
533
+ });
534
+ if (verdict) {
535
+ const testPath = [...at.ancestorTitles, at.title];
536
+ this.state.publisher.publish('testEnded', {
537
+ verdict,
538
+ fileName: fileName.val,
539
+ testPath,
540
+ taskName,
541
+ durationMillis: at.duration,
542
+ });
543
+ }
544
+ });
545
+ const summary = (0, generate_test_run_summary_1.generateTestRunSummary)(this.state.rootDir, reporterOutput);
546
+ fs.writeFileSync(resolvedSummaryFile, JSON.stringify(summary));
547
+ const failingCases = reporterOutput.cases.filter(at => (0, misc_1.switchOn)(at.status, {
548
+ disabled: () => false,
549
+ failed: () => true,
550
+ passed: () => false,
551
+ pending: () => false,
552
+ skipped: () => false,
553
+ todo: () => false,
554
+ }));
555
+ const rerunList = (0, misc_1.sortBy)(failingCases.map(at => ({ fileName: at.fileName, testCaseFullName: at.testCaseFullName })), at => `${at.fileName} ${at.testCaseFullName}`);
556
+ fs.writeFileSync(jof, JSON.stringify(rerun_list_1.RerunList.parse(rerunList)));
557
+ return ret;
558
+ }
559
+ async runCustomTest(unitId, dir, _taskName, outputFile) {
560
+ const testCommand = this.getTestCommand(unitId);
561
+ if (!testCommand) {
562
+ throw new Error(`Custom test command not found for ${unitId}`);
563
+ }
564
+ // Resolve command path relative to repo root
565
+ const commandPath = this.state.rootDir.resolve((0, core_types_1.PathInRepo)(testCommand));
566
+ // Create empty test summary file to maintain invariant
567
+ const dirInRepo = this.state.rootDir.unresolve(dir);
568
+ const resolvedSummaryFile = this.state.rootDir.resolve(dirInRepo.expand(this.testRunSummaryFile));
569
+ fs.writeFileSync(resolvedSummaryFile, JSON.stringify({}));
570
+ // Prepare arguments for the test command
571
+ const args = [
572
+ dir, // Package directory absolute path
573
+ unitId.toString(), // Package name (unit ID)
574
+ path.join(dir, JEST_OUTPUT_FILE), // Rerun file path (optional use by custom runner)
575
+ ];
576
+ // Execute the custom test command
577
+ const ret = await this.run(commandPath, args, dir, outputFile);
578
+ // Write empty rerun list if custom runner doesn't provide one
579
+ const jof = path.join(dir, JEST_OUTPUT_FILE);
580
+ if (!fs.existsSync(jof)) {
581
+ fs.writeFileSync(jof, JSON.stringify([]));
582
+ }
583
+ return ret;
584
+ }
585
+ async runValidate(u, dir, outputFile) {
586
+ if (!this.hasRunScript(u.id, this.scriptNames.validate)) {
587
+ return 'OK';
588
+ }
589
+ const ret = await this.run('npm', ['run', this.scriptNames.validate], dir, outputFile);
590
+ return ret;
591
+ }
592
+ getPackageJson(uid) {
593
+ return this.state.packageByUnitId.get(uid) ?? (0, misc_1.failMe)(`Unit ID not found (${uid})`);
594
+ }
595
+ toUnitId(packageName) {
596
+ const ret = (0, unit_metadata_1.UnitId)(packageName);
597
+ if (this.state.packageByUnitId.has(ret)) {
598
+ return ret;
599
+ }
600
+ return undefined;
601
+ }
602
+ isInRepo(packageName) {
603
+ return this.toUnitId(packageName) !== undefined;
604
+ }
605
+ async computePackingPackageJson(unitId) {
606
+ const visited = new Set();
607
+ const scan = (u) => {
608
+ const uid = this.toUnitId(u);
609
+ if (!uid) {
610
+ return;
611
+ }
612
+ if (visited.has(uid)) {
613
+ return;
614
+ }
615
+ visited.add(uid);
616
+ const pd = this.getPackageJson(uid);
617
+ for (const d of Object.keys(pd.dependencies ?? {})) {
618
+ scan(d);
619
+ }
620
+ };
621
+ scan(unitId);
622
+ const allDeps = [...visited];
623
+ const packageDefs = allDeps.map(d => this.getPackageJson(d));
624
+ const outOfRepoDeps = [];
625
+ for (const at of packageDefs) {
626
+ for (const d of Object.keys(at.dependencies ?? {})) {
627
+ if (!this.isInRepo(d)) {
628
+ outOfRepoDeps.push(d);
629
+ }
630
+ }
631
+ }
632
+ // TODO(imaman): cover (the cloning).
633
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
634
+ const ret = JSON.parse(JSON.stringify(this.getPackageJson(unitId)));
635
+ ret.files = [this.dist()];
636
+ ret.dependencies = (0, misc_1.pairsToRecord)(outOfRepoDeps.sort().map(d => [d, this.getVersionOfDep(d)]));
637
+ ret.main = path.join(this.dist('s'), 'index.js');
638
+ delete ret.devDependencies;
639
+ ret.nohoist = true;
640
+ return ret;
641
+ }
642
+ getVersionOfDep(d) {
643
+ return (0, misc_1.hardGet)(this.state.versionByPackageId, d);
644
+ }
645
+ async pack(u, dir) {
646
+ const packageDef = await this.computePackingPackageJson(u.id);
647
+ const packDist = path.join(path.join(dir, PACK_DIR), 'dist');
648
+ const packDistSrc = path.join(packDist, this.src);
649
+ const packDistDeps = path.join(packDist, 'deps');
650
+ fs.mkdirSync(packDistSrc, { recursive: true });
651
+ fs.cpSync(path.join(dir, this.dist('s')), packDistSrc, { recursive: true });
652
+ this.logger.info(`updated packagejson is ${JSON.stringify(packageDef)}`);
653
+ const packageJsonPath = path.join(dir, PACK_DIR, 'package.json');
654
+ // create a deps directory (part of the package) that includes the code of in-repo deps.
655
+ const depUnits = this.state.graph
656
+ .traverseFrom(u.id, { direction: 'forward' })
657
+ .filter(at => at !== u.id)
658
+ .map(at => this.unitOf(at));
659
+ for (const at of depUnits) {
660
+ const d = path.join(packDistDeps, at.id);
661
+ fs.mkdirSync(d, { recursive: true });
662
+ fs.cpSync(this.state.rootDir.resolve(at.pathInRepo.expand(this.dist('s'))), d, { recursive: true });
663
+ }
664
+ try {
665
+ fs.writeFileSync(packageJsonPath, JSON.stringify(packageDef, null, 2));
666
+ }
667
+ catch (e) {
668
+ throw new Error(`Failed to write new package definition at ${packageJsonPath}: ${e}`);
669
+ }
670
+ // We use a synthetic entry point file which does the following:
671
+ // (i) creates a package-only node_modules directory with symlinks to various deps/* directories
672
+ // (ii) delegates to the *real* entry point: dist/src/index.js
673
+ //
674
+ // Step (i) allows imports (i.e., import <sometning> from '<some-package-name>') to be correctly resolved.
675
+ //
676
+ // The symlinks cannot be created at packing-time because NPM does not include symlinks in its packages
677
+ // (https://github.com/npm/npm/issues/3310#issuecomment-15904722). Initially we tried to do it via a postinstall
678
+ // script but it turns out that yarn tries to optimize away the package-only node_modules directory (when it updates
679
+ // other packages, on subsequent install operations). Hence, we have to do this at import-time.
680
+ const indexJs = path.join(dir, PACK_DIR, this.dist('s'), 'index.js');
681
+ const content = fs.readFileSync(indexJs, 'utf-8');
682
+ const preamble = [
683
+ '(() => {',
684
+ ' const fs = require(`fs`)',
685
+ ' const path = require(`path`)',
686
+ ' const dist = path.dirname(__dirname)',
687
+ ' const distNodeModules = path.join(dist, `node_modules`)',
688
+ ' const distDeps = path.join(dist, `deps`)',
689
+ ' fs.rmSync(distNodeModules, {force: true, recursive: true})',
690
+ ' fs.mkdirSync(distNodeModules, {recursive: true})',
691
+ ' if (fs.existsSync(distDeps)) {',
692
+ ' for (const p of fs.readdirSync(distDeps)) {',
693
+ ' fs.symlinkSync(`../deps/${p}`, `${distNodeModules}/${p}`)',
694
+ ' }',
695
+ ' }',
696
+ '})()',
697
+ '',
698
+ ].join('\n');
699
+ fs.writeFileSync(indexJs, preamble + content);
700
+ return 'OK';
701
+ }
702
+ async getYarnInfo(rootDir) {
703
+ const copy = {};
704
+ // eslint-disable-next-line no-process-env
705
+ for (const [k, v] of Object.entries(process.env)) {
706
+ // FORCE_COLOR makes yarn return colored output and then JSON.parse() fails. Ideally we'd want to pass an empty
707
+ // env to any process we spawn, but some of the CI systems rely on env vars being set.
708
+ if (k === 'FORCE_COLOR') {
709
+ continue;
710
+ }
711
+ copy[k] = v;
712
+ }
713
+ const p = await (0, execa_1.default)('yarn', ['--silent', 'workspaces', 'info', '--json'], {
714
+ cwd: rootDir.resolve(),
715
+ reject: false,
716
+ encoding: 'utf-8',
717
+ extendEnv: false,
718
+ env: copy,
719
+ });
720
+ if (p.exitCode === 0) {
721
+ let parsed;
722
+ try {
723
+ parsed = JSON.parse(p.stdout);
724
+ }
725
+ catch (e) {
726
+ this.logger.info(`unparsable output of yarn workspaces info:\n<${p.stdout}>`);
727
+ throw new Error(`could not parse yarn workspaces info`);
728
+ }
729
+ return yarnWorkspacesInfoSchema.parse(parsed);
730
+ }
731
+ this.logger.info(`running "yarn workspaces info" failed:\n<${p.stderr}>`);
732
+ throw new Error(`Failed to get yarn info for ${rootDir}`);
733
+ }
734
+ async getGraph() {
735
+ return this.state.graph;
736
+ }
737
+ async getUnits() {
738
+ return this.state.units;
739
+ }
740
+ unitOf(uid) {
741
+ return this.state.units.find(at => at.id === uid) ?? (0, misc_1.failMe)(`Unit not found (unit ID: ${uid})`);
742
+ }
743
+ async getTasks() {
744
+ const unitIds = computeRealUnits(this.state.units).map(at => at.id);
745
+ const ret = unitIds
746
+ .map(at => this.unitOf(at))
747
+ .flatMap(u => [
748
+ this.buildTask(u),
749
+ this.testTask(u),
750
+ this.packTask(u),
751
+ this.publishTask(u),
752
+ ...this.customTasks(u),
753
+ ])
754
+ .flatMap(x => (x ? [x] : []));
755
+ const installTaskInfo = {
756
+ taskName: installTaskName,
757
+ inputs: [(0, core_types_1.PathInRepo)('yarn.lock'), (0, core_types_1.PathInRepo)('package.json')],
758
+ outputLocations: [{ pathInRepo: (0, core_types_1.PathInRepo)('node_modules'), purge: 'NEVER' }],
759
+ };
760
+ (0, misc_1.switchOn)(this.getInstallFeatureToggle(), {
761
+ off: () => { },
762
+ dormant: () => {
763
+ ret.push(installTaskInfo);
764
+ },
765
+ on: () => {
766
+ ret.push(installTaskInfo);
767
+ },
768
+ });
769
+ return ret;
770
+ }
771
+ depList(...taskNames) {
772
+ return taskNames.filter(at => {
773
+ if (at !== installTaskName) {
774
+ return true;
775
+ }
776
+ return (0, misc_1.switchOn)(this.getInstallFeatureToggle(), {
777
+ off: () => false,
778
+ dormant: () => true,
779
+ on: () => true,
780
+ });
781
+ });
782
+ }
783
+ buildTask(u) {
784
+ const dir = u.pathInRepo;
785
+ const deps = this.state.graph
786
+ .traverseFrom(u.id)
787
+ .filter(at => at !== u.id)
788
+ .map(at => this.unitOf(at).pathInRepo);
789
+ const ret = {
790
+ labels: ['build'],
791
+ useCaching: this.state.config.cacheCompilationOutputs ?? true,
792
+ taskName: (0, task_name_1.TaskName)(u.id, (0, task_name_1.TaskKind)('build')),
793
+ outputLocations: [{ pathInRepo: dir.expand(this.dist()), purge: 'NEVER' }],
794
+ inputs: [
795
+ dir.expand(this.src),
796
+ dir.expand(this.tests),
797
+ dir.expand('package.json'),
798
+ ...deps.map(d => d.expand(this.dist('s'))),
799
+ ],
800
+ deps: this.depList(installTaskName),
801
+ };
802
+ (0, misc_1.switchOn)(this.getInstallFeatureToggle(), {
803
+ off: () => {
804
+ ret.inputs?.push((0, core_types_1.PathInRepo)('yarn.lock'));
805
+ },
806
+ dormant: () => { },
807
+ on: () => { },
808
+ });
809
+ return ret;
810
+ }
811
+ testTask(u) {
812
+ const dir = u.pathInRepo;
813
+ const deps = this.state.graph
814
+ .traverseFrom(u.id)
815
+ .filter(at => at !== u.id)
816
+ .map(at => this.unitOf(at).pathInRepo);
817
+ return {
818
+ labels: ['test'],
819
+ taskName: (0, task_name_1.TaskName)(u.id, (0, task_name_1.TaskKind)('test')),
820
+ outputLocations: [
821
+ { pathInRepo: dir.expand(JEST_OUTPUT_FILE), purge: 'ALWAYS' },
822
+ { pathInRepo: dir.expand(this.testRunSummaryFile), purge: 'ALWAYS', isPublic: true },
823
+ ],
824
+ inputs: [
825
+ dir.expand(this.dist('s')),
826
+ dir.expand(this.dist('t')),
827
+ dir.expand('package.json'),
828
+ ...deps.map(d => d.expand(this.dist('s'))),
829
+ ],
830
+ deps: this.depList(installTaskName),
831
+ };
832
+ }
833
+ packTask(u) {
834
+ const dir = u.pathInRepo;
835
+ const deps = this.state.graph
836
+ .traverseFrom(u.id)
837
+ .filter(at => at !== u.id)
838
+ .map(at => this.unitOf(at).pathInRepo);
839
+ return {
840
+ labels: ['pack'],
841
+ taskName: (0, task_name_1.TaskName)(u.id, (0, task_name_1.TaskKind)('pack')),
842
+ outputLocations: [{ pathInRepo: dir.expand(PACK_DIR), purge: 'ALWAYS' }],
843
+ inputs: [dir.expand(this.dist('s')), ...deps.map(d => d.expand(this.dist('s')))],
844
+ };
845
+ }
846
+ publishTask(u) {
847
+ if (!this.hasRunScript(u.id, this.scriptNames.prepareAssets)) {
848
+ return undefined;
849
+ }
850
+ const dir = u.pathInRepo;
851
+ return {
852
+ labels: ['publish-assets'],
853
+ taskName: (0, task_name_1.TaskName)(u.id, (0, task_name_1.TaskKind)('publish-assets')),
854
+ outputLocations: [{ pathInRepo: dir.expand(PREPARED_ASSETS_DIR), purge: 'NEVER' }],
855
+ inputs: [dir.expand('package.json'), dir.expand(this.dist('s'))],
856
+ };
857
+ }
858
+ customTasks(u) {
859
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
860
+ const casted = this.getPackageJson(u.id);
861
+ const dir = u.pathInRepo;
862
+ const pj = dir.expand('package.json');
863
+ const parseResult = build_task_record_1.BuildTaskRecord.safeParse(casted.buildTasks ?? {});
864
+ if (!parseResult.success) {
865
+ throw new build_failed_error_1.BuildFailedError(`found a buildTasks object (in ${pj}) which is not well formed: ${parseResult.error.message}`);
866
+ }
867
+ const btr = parseResult.data;
868
+ const computeOutputLocation = (buildTaskName, s) => {
869
+ try {
870
+ return dir.to(s);
871
+ }
872
+ catch (e) {
873
+ throw new build_failed_error_1.BuildFailedError(`build task ${buildTaskName} in ${pj} specifies an illegal input: ${e}`);
874
+ }
875
+ };
876
+ const ret = [];
877
+ for (const name of Object.keys(btr)) {
878
+ const unresolvedDef = btr[name];
879
+ const def = typeof unresolvedDef === 'string' ? this.resolveBuildTasks(dir, name, unresolvedDef, pj) : unresolvedDef;
880
+ if (!this.hasRunScript(u.id, name)) {
881
+ throw new build_failed_error_1.BuildFailedError(`found a build task named "${name}" but no run script with that name is defined in ${pj}`);
882
+ }
883
+ const inputs = def.inputs === '_ALWAYS_'
884
+ ? [(0, core_types_1.PathInRepo)('.build-raptor/build-run-id')]
885
+ : [pj, ...toArray(def.inputs).map(at => computeOutputLocation(name, at))];
886
+ ret.push({
887
+ taskName: (0, task_name_1.TaskName)(u.id, (0, task_name_1.TaskKind)('build'), name),
888
+ labels: toArray(def.labels ?? []),
889
+ inputs,
890
+ outputLocations: [
891
+ ...toArray(def.outputs ?? []).map(at => ({
892
+ pathInRepo: dir.expand(at),
893
+ purge: 'ALWAYS',
894
+ isPublic: false,
895
+ })),
896
+ ...toArray(def.publicOutputs ?? []).map(at => ({
897
+ pathInRepo: dir.expand(at),
898
+ purge: 'ALWAYS',
899
+ isPublic: true,
900
+ })),
901
+ ],
902
+ });
903
+ }
904
+ return ret;
905
+ }
906
+ resolveBuildTasks(dir, name, pointer, originatingFrom) {
907
+ let where = dir.to(pointer);
908
+ const absPathToIndex = new Map(); // Maps file path to its position in the chain
909
+ while (true) {
910
+ const fileToRead = this.state.rootDir.resolve(where);
911
+ const cycleStart = absPathToIndex.get(fileToRead);
912
+ if (cycleStart !== undefined) {
913
+ const cycle = (0, misc_1.sortBy)([...absPathToIndex.entries()], ([_, index]) => index)
914
+ .slice(cycleStart)
915
+ .map(([abs]) => this.state.rootDir.unresolve(abs));
916
+ cycle.push(where); // Complete the cycle
917
+ throw new build_failed_error_1.BuildFailedError(`Circular reference detected in build task definition: ${cycle.join(' -> ')}`);
918
+ }
919
+ absPathToIndex.set(fileToRead, absPathToIndex.size);
920
+ if (!fs.existsSync(fileToRead)) {
921
+ throw new build_failed_error_1.BuildFailedError(`Could no find file ${where} while resolving build task "${name}" from ${originatingFrom}`);
922
+ }
923
+ const unparsed = JSON.parse(fs.readFileSync(fileToRead, 'utf-8'));
924
+ const parseResult = build_task_record_1.BuildTaskRecord.safeParse(unparsed);
925
+ if (!parseResult.success) {
926
+ throw new build_failed_error_1.BuildFailedError(`buildTask object (in ${fileToRead}) is not well formed: ${parseResult.error.message}`);
927
+ }
928
+ const parsed = parseResult.data;
929
+ const ret = parsed[name];
930
+ if (!ret) {
931
+ throw new build_failed_error_1.BuildFailedError(`could not find buildTask "${name}" in ${fileToRead}`);
932
+ }
933
+ if (typeof ret === 'object') {
934
+ return ret;
935
+ }
936
+ where = (0, core_types_1.PathInRepo)(path.dirname(where.val)).to(ret);
937
+ }
938
+ }
939
+ async computeTestsToRun(resolved) {
940
+ const exists = await fse.pathExists(resolved);
941
+ if (!exists) {
942
+ this.logger.info('jest-output.json does not exist. running everything!');
943
+ return [this.tests];
944
+ }
945
+ const content = await fse.readFile(resolved, 'utf-8');
946
+ let parsed;
947
+ try {
948
+ parsed = JSON.parse(content);
949
+ }
950
+ catch (e) {
951
+ this.logger.info(`failed to JSON parse ${resolved} <${e}> - using fallback`);
952
+ parsed = emptyRerunList;
953
+ }
954
+ let rerunList;
955
+ try {
956
+ rerunList = rerun_list_1.RerunList.parse(parsed);
957
+ }
958
+ catch (e) {
959
+ this.logger.info(`failed to parse rerun-list from ${resolved} <${e}> - using fallback`);
960
+ rerunList = emptyRerunList;
961
+ }
962
+ if (rerunList.length === 0) {
963
+ this.logger.info(`No failed tests found in ${resolved}`);
964
+ // TODO(imaman): rethink this. maybe we want to run nothing if there are no failed tests.
965
+ // It boilsdown to whether we trust jest-output.json or not.
966
+ return [this.tests];
967
+ }
968
+ const names = (0, misc_1.sortBy)(rerunList.map(at => at.testCaseFullName), x => x);
969
+ const fileNames = (0, misc_1.uniqueBy)(rerunList.map(at => at.fileName), x => x);
970
+ const ret = [...fileNames, '-t', names.map(x => (0, escape_string_regexp_1.default)(x)).join('|')];
971
+ this.logger.info(`tests to run: ${JSON.stringify(ret)}`);
972
+ return ret;
973
+ }
974
+ }
975
+ exports.YarnRepoProtocol = YarnRepoProtocol;
976
+ const PACK_DIR = 'pack';
977
+ function computeUnits(yarnInfo) {
978
+ const ret = [];
979
+ for (const [p, data] of Object.entries(yarnInfo)) {
980
+ const uid = (0, unit_metadata_1.UnitId)(p);
981
+ ret.push(new unit_metadata_1.UnitMetadata(data.location, uid));
982
+ }
983
+ ret.push(new unit_metadata_1.UnitMetadata('', rootUnitId));
984
+ return ret;
985
+ }
986
+ async function readPackages(rootDir, units) {
987
+ const ret = new Map();
988
+ await (0, misc_1.promises)(units).forEach(20, async (um) => {
989
+ const p = rootDir.resolve(um.pathInRepo.expand('package.json'));
990
+ const content = await fse.readJSON(p);
991
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
992
+ ret.set(um.id, content);
993
+ });
994
+ return ret;
995
+ }
996
+ async function createOutDirs(rootDir, units, outDirName) {
997
+ if (!outDirName) {
998
+ return;
999
+ }
1000
+ await (0, misc_1.promises)(units).forEach(20, async (um) => {
1001
+ const p = rootDir.resolve(um.pathInRepo.expand(outDirName));
1002
+ await fse.ensureDir(p);
1003
+ });
1004
+ }
1005
+ function computeVersions(packages) {
1006
+ const ret = new Map();
1007
+ const register = (d, v) => {
1008
+ const preexisting = ret.get(d);
1009
+ if (preexisting && preexisting !== v) {
1010
+ const arr = [preexisting, v].sort();
1011
+ throw new build_failed_error_1.BuildFailedError(`Inconsistent version for depenedency "${d}": ${arr.join(', ')}`);
1012
+ }
1013
+ ret.set(d, v);
1014
+ };
1015
+ for (const p of packages) {
1016
+ for (const [d, v] of Object.entries(p.dependencies ?? {})) {
1017
+ register(d, v);
1018
+ }
1019
+ for (const [d, v] of Object.entries(p.devDependencies ?? {})) {
1020
+ register(d, v);
1021
+ }
1022
+ }
1023
+ return ret;
1024
+ }
1025
+ function computeRealUnits(units) {
1026
+ return units.filter(at => at.id !== rootUnitId);
1027
+ }
1028
+ const JEST_OUTPUT_FILE = 'jest-output.json';
1029
+ const PREPARED_ASSETS_DIR = 'prepared-assets';
1030
+ const rootUnitId = (0, unit_metadata_1.UnitId)('.');
1031
+ const installTaskName = (0, task_name_1.TaskName)(rootUnitId, (0, task_name_1.TaskKind)('install'));
1032
+ const emptyRerunList = rerun_list_1.RerunList.parse([]);
1033
+ function toArray(input) {
1034
+ return Array.isArray(input) ? input : [input];
1035
+ }
1036
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieWFybi1yZXBvLXByb3RvY29sLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3lhcm4tcmVwby1wcm90b2NvbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwyREFBcUQ7QUFDckQsMkNBQWlEO0FBQ2pELGdGQUFxRDtBQUNyRCxrREFBeUI7QUFDekIsdUNBQXdCO0FBQ3hCLDhDQUErQjtBQUUvQiwrQkFZYTtBQUNiLDJDQUE0QjtBQVM1QixxREFBZ0Q7QUFDaEQseUNBQThDO0FBQzlDLGlEQUFrQztBQUVsQyxpREFBb0Q7QUFDcEQsNkJBQXVCO0FBRXZCLDJEQUFrRjtBQUNsRiwyRUFBb0U7QUFDcEUsNkNBQXdDO0FBQ3hDLDJFQUFvRTtBQUVwRSxNQUFNLHdCQUF3QixHQUFHLE9BQUMsQ0FBQyxNQUFNLENBQ3ZDLE9BQUMsQ0FBQyxNQUFNLENBQUM7SUFDUCxRQUFRLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRTtJQUNwQixxQkFBcUIsRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsS0FBSyxFQUFFO0lBQ3pDLCtCQUErQixFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxLQUFLLEVBQUU7Q0FDcEQsQ0FBQyxDQUNILENBQUE7QUFpQkQsS0FBSyxVQUFVLFdBQVc7SUFDeEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQTtJQUNuQyxPQUFPLEdBQUcsQ0FBQTtBQUNaLENBQUM7QUFFRCxTQUFTLFlBQVksQ0FBQyxRQUFnQjtJQUNwQyxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssUUFBUSxDQUFBO0FBQzdDLENBQUM7QUFFRCxNQUFhLGdCQUFnQjtJQVczQixZQUNtQixNQUFjO0lBQy9CLDhCQUE4QjtJQUNiLGNBQXlCO1FBRnpCLFdBQU0sR0FB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