build-raptor 0.130.0 → 0.131.0

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