@datadog/datadog-ci 3.3.0 → 3.4.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 (90) hide show
  1. package/dist/cli.js +1 -1
  2. package/dist/cli.js.map +1 -1
  3. package/dist/commands/dora/__tests__/deployment.test.js +2 -0
  4. package/dist/commands/dora/__tests__/deployment.test.js.map +1 -1
  5. package/dist/commands/dora/api.js +3 -0
  6. package/dist/commands/dora/api.js.map +1 -1
  7. package/dist/commands/dora/deployment.d.ts +1 -0
  8. package/dist/commands/dora/deployment.js +8 -1
  9. package/dist/commands/dora/deployment.js.map +1 -1
  10. package/dist/commands/dora/interfaces.d.ts +1 -0
  11. package/dist/commands/lambda/__tests__/functions/instrument.part1.test.js +2 -0
  12. package/dist/commands/lambda/__tests__/functions/instrument.part1.test.js.map +1 -1
  13. package/dist/commands/lambda/__tests__/functions/instrument.part2.test.js +4 -0
  14. package/dist/commands/lambda/__tests__/functions/instrument.part2.test.js.map +1 -1
  15. package/dist/commands/lambda/__tests__/functions/uninstrument.test.js +3 -0
  16. package/dist/commands/lambda/__tests__/functions/uninstrument.test.js.map +1 -1
  17. package/dist/commands/lambda/__tests__/instrument.test.js +7 -0
  18. package/dist/commands/lambda/__tests__/instrument.test.js.map +1 -1
  19. package/dist/commands/lambda/__tests__/uninstrument.test.js +3 -0
  20. package/dist/commands/lambda/__tests__/uninstrument.test.js.map +1 -1
  21. package/dist/commands/lambda/constants.d.ts +3 -0
  22. package/dist/commands/lambda/constants.js +5 -2
  23. package/dist/commands/lambda/constants.js.map +1 -1
  24. package/dist/commands/lambda/functions/instrument.js +10 -0
  25. package/dist/commands/lambda/functions/instrument.js.map +1 -1
  26. package/dist/commands/lambda/functions/uninstrument.js +3 -0
  27. package/dist/commands/lambda/functions/uninstrument.js.map +1 -1
  28. package/dist/commands/lambda/instrument.d.ts +1 -0
  29. package/dist/commands/lambda/instrument.js +5 -2
  30. package/dist/commands/lambda/instrument.js.map +1 -1
  31. package/dist/commands/lambda/interfaces.d.ts +3 -0
  32. package/dist/commands/react-native/__tests__/codepush.test.js +35 -0
  33. package/dist/commands/react-native/__tests__/codepush.test.js.map +1 -1
  34. package/dist/commands/react-native/__tests__/utils.test.js +42 -0
  35. package/dist/commands/react-native/__tests__/utils.test.js.map +1 -1
  36. package/dist/commands/react-native/codepush.js +7 -2
  37. package/dist/commands/react-native/codepush.js.map +1 -1
  38. package/dist/commands/react-native/utils.d.ts +1 -0
  39. package/dist/commands/react-native/utils.js +5 -1
  40. package/dist/commands/react-native/utils.js.map +1 -1
  41. package/dist/commands/sbom/__tests__/payload.test.js +45 -15
  42. package/dist/commands/sbom/__tests__/payload.test.js.map +1 -1
  43. package/dist/commands/sbom/__tests__/validation.test.js +4 -0
  44. package/dist/commands/sbom/__tests__/validation.test.js.map +1 -1
  45. package/dist/commands/sbom/constants.d.ts +1 -2
  46. package/dist/commands/sbom/constants.js +2 -4
  47. package/dist/commands/sbom/constants.js.map +1 -1
  48. package/dist/commands/sbom/payload.js +69 -3
  49. package/dist/commands/sbom/payload.js.map +1 -1
  50. package/dist/commands/sbom/types.d.ts +13 -0
  51. package/dist/commands/span/__tests__/span.test.d.ts +1 -0
  52. package/dist/commands/span/__tests__/span.test.js +108 -0
  53. package/dist/commands/span/__tests__/span.test.js.map +1 -0
  54. package/dist/commands/span/cli.d.ts +1 -0
  55. package/dist/commands/span/cli.js +5 -0
  56. package/dist/commands/span/cli.js.map +1 -0
  57. package/dist/commands/span/span.d.ts +10 -0
  58. package/dist/commands/span/span.js +112 -0
  59. package/dist/commands/span/span.js.map +1 -0
  60. package/dist/commands/synthetics/__tests__/build-and-test.test.js +63 -105
  61. package/dist/commands/synthetics/__tests__/build-and-test.test.js.map +1 -1
  62. package/dist/commands/synthetics/build-and-test.d.ts +20 -3
  63. package/dist/commands/synthetics/build-and-test.js +180 -66
  64. package/dist/commands/synthetics/build-and-test.js.map +1 -1
  65. package/dist/commands/synthetics/run-tests-command.js +5 -2
  66. package/dist/commands/synthetics/run-tests-command.js.map +1 -1
  67. package/dist/commands/synthetics/utils/internal.d.ts +0 -2
  68. package/dist/commands/synthetics/utils/internal.js +1 -15
  69. package/dist/commands/synthetics/utils/internal.js.map +1 -1
  70. package/dist/commands/trace/__tests__/trace.test.js +3 -100
  71. package/dist/commands/trace/__tests__/trace.test.js.map +1 -1
  72. package/dist/commands/trace/helper.d.ts +16 -0
  73. package/dist/commands/trace/helper.js +123 -0
  74. package/dist/commands/trace/helper.js.map +1 -0
  75. package/dist/commands/trace/test-utils.d.ts +1 -0
  76. package/dist/commands/trace/test-utils.js +119 -0
  77. package/dist/commands/trace/test-utils.js.map +1 -0
  78. package/dist/commands/trace/trace.d.ts +2 -12
  79. package/dist/commands/trace/trace.js +14 -93
  80. package/dist/commands/trace/trace.js.map +1 -1
  81. package/dist/helpers/__tests__/flare.test.js +2 -1
  82. package/dist/helpers/__tests__/flare.test.js.map +1 -1
  83. package/dist/helpers/ci.d.ts +2 -2
  84. package/dist/helpers/flare.js +2 -1
  85. package/dist/helpers/flare.js.map +1 -1
  86. package/dist/helpers/interfaces.d.ts +2 -3
  87. package/dist/helpers/tags.d.ts +2 -0
  88. package/dist/helpers/tags.js +4 -1
  89. package/dist/helpers/tags.js.map +1 -1
  90. package/package.json +1 -1
@@ -1,27 +1,4 @@
1
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 (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
24
- };
25
2
  var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
26
3
  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
27
4
  return new (P || (P = Promise))(function (resolve, reject) {
@@ -31,103 +8,84 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
31
8
  step((generator = generator.apply(thisArg, _arguments || [])).next());
32
9
  });
33
10
  };
34
- var __importDefault = (this && this.__importDefault) || function (mod) {
35
- return (mod && mod.__esModule) ? mod : { "default": mod };
36
- };
37
11
  Object.defineProperty(exports, "__esModule", { value: true });
38
- const http = __importStar(require("http"));
39
- const axios_1 = __importDefault(require("axios"));
40
12
  const build_and_test_1 = require("../build-and-test");
41
13
  const fixtures_1 = require("./fixtures");
42
14
  const NODE_COMMAND = process.execPath;
43
- describe('build-and-test - spawnBuildPluginDevServer', () => {
44
- beforeEach(() => {
45
- jest.resetAllMocks();
46
- jest.restoreAllMocks();
47
- });
15
+ describe('build-and-test - buildAssets', () => {
16
+ const tearDowns = [];
17
+ afterEach(() => __awaiter(void 0, void 0, void 0, function* () {
18
+ for (let tearDown; (tearDown = tearDowns.pop());) {
19
+ yield tearDown();
20
+ }
21
+ }));
22
+ // This httpClient function should be self-contained, as its body will be injected as a string in the build command.
23
+ const httpClient = () => {
24
+ const url = process.env.DATADOG_SYNTHETICS_REPORT_BUILD_URL;
25
+ if (!url) {
26
+ throw new Error('DATADOG_SYNTHETICS_REPORT_BUILD_URL is not set');
27
+ }
28
+ void fetch(url, {
29
+ method: 'POST',
30
+ headers: {
31
+ 'Content-Type': 'application/json',
32
+ },
33
+ body: JSON.stringify({
34
+ outputDirectory: 'output-directory',
35
+ publicPath: 'prefix/',
36
+ }),
37
+ });
38
+ };
48
39
  test('alert when the build-plugin is not configured', () => __awaiter(void 0, void 0, void 0, function* () {
49
40
  // Given a build command without the build plugin configured
50
41
  const MOCKED_BUILD_COMMAND_NOT_CONFIGURED = `${NODE_COMMAND} -e "console.log('build successful')"`;
51
42
  // When calling spawnBuildPluginDevServer
52
- const commandPromise = (0, build_and_test_1.spawnBuildPluginDevServer)(MOCKED_BUILD_COMMAND_NOT_CONFIGURED, fixtures_1.mockReporter);
43
+ const commandPromise = (0, build_and_test_1.buildAssets)(MOCKED_BUILD_COMMAND_NOT_CONFIGURED, fixtures_1.mockReporter);
53
44
  // Then it should throw when the command exits.
54
45
  yield expect(commandPromise).rejects.toThrow(build_and_test_1.UnconfiguredBuildPluginError);
55
46
  }));
56
- test('wait for the dev server and return expected readiness and status even with delayed server startup', () => __awaiter(void 0, void 0, void 0, function* () {
57
- // Given a dev server which listen on the port provided in the environment variable BUILD_PLUGINS_S8S_PORT.
58
- // The implementation of this server is written as a function, and stringified into a single line,
59
- // to be used in a node -e command.
60
- const httpDevServer = () => {
61
- setTimeout(() => {
62
- http
63
- .createServer((_, res) => res
64
- .writeHead(200, {
65
- 'Content-Type': 'application/json',
66
- })
67
- .end(JSON.stringify({
68
- status: 'success',
69
- publicPrefix: 'prefix2/',
70
- })))
71
- .listen(process.env.BUILD_PLUGINS_S8S_PORT);
72
- }, 500);
73
- };
74
- const SERVER_IMPLEMENTATION = httpDevServer.toString().replace(/\n\s+/g, '');
75
- const MOCKED_BUILD_COMMAND = `${NODE_COMMAND} -e "(${SERVER_IMPLEMENTATION})()"`;
47
+ test('advertise the right URL and returns the reported builds', () => __awaiter(void 0, void 0, void 0, function* () {
48
+ // Given a build command which reports a build with a publicPath and an outputDirectory to the url advertised by DATADOG_SYNTHETICS_REPORT_BUILD_URL
49
+ const CLIENT_IMPLEMENTATION = httpClient.toString().replace(/\n\s+/g, '');
50
+ const MOCKED_BUILD_COMMAND = `${NODE_COMMAND} -e "(${CLIENT_IMPLEMENTATION})()"`;
76
51
  // When calling spawnBuildPluginDevServer
77
- const start = Date.now();
78
- const command = yield (0, build_and_test_1.spawnBuildPluginDevServer)(MOCKED_BUILD_COMMAND, fixtures_1.mockReporter);
79
- const end = Date.now();
80
- // Then it should send requests to the dev server until it's ready to serve,
81
- // and return the devServerUrl and the path prefix.
82
- expect(command.devServerUrl).toBe('http://localhost:4000');
83
- expect(command.publicPrefix).toBe('prefix2/');
84
- // The server should resolve the promise at maximum 1 second after the server is ready
85
- expect(end - start).toBeLessThanOrEqual(500 + 1000);
86
- // Stop the command at the end of the test.
87
- yield command.stop();
88
- }));
89
- test('should wait for dev server even if the build fails', () => __awaiter(void 0, void 0, void 0, function* () {
90
- // Set up axios response sequence
91
- jest
92
- .spyOn(axios_1.default, 'get')
93
- .mockRejectedValueOnce({ code: 'ECONNREFUSED' }) // First attempt: connection refused
94
- .mockResolvedValueOnce({ data: { status: 'fail' } }) // Second attempt: build failed
95
- .mockResolvedValueOnce({ data: { status: 'success', publicPrefix: 'prefix3/' } }); // Third attempt: success
96
- // Setup isAxiosError for ECONNREFUSED error
97
- jest.spyOn(axios_1.default, 'isAxiosError').mockImplementation((error) => {
98
- return error && error.code === 'ECONNREFUSED';
99
- });
100
- // When calling spawnBuildPluginDevServer with any command
101
- const MOCKED_BUILD_COMMAND = `${NODE_COMMAND} -e "setTimeout(() => {}, 100000)"`;
102
- const command = yield (0, build_and_test_1.spawnBuildPluginDevServer)(MOCKED_BUILD_COMMAND, fixtures_1.mockReporter);
103
- // Then it should wait until the build succeeds
104
- expect(command.devServerUrl).toBe('http://localhost:4000');
105
- expect(command.publicPrefix).toBe('prefix3/');
106
- // Verify the axios GET was called multiple times
107
- expect(axios_1.default.get).toHaveBeenCalledTimes(3);
108
- // Stop the command at the end of the test.
109
- yield command.stop();
52
+ const { builds, devServerUrl, stop } = yield (0, build_and_test_1.buildAssets)(MOCKED_BUILD_COMMAND, fixtures_1.mockReporter);
53
+ tearDowns.push(stop);
54
+ // Then it should return the devServerUrl and the path prefix.
55
+ expect(devServerUrl).toMatch(/\/_datadog-ci_\/build$/);
56
+ expect(builds).toEqual([
57
+ {
58
+ outputDirectory: 'output-directory',
59
+ publicPath: 'prefix/',
60
+ },
61
+ ]);
110
62
  }));
111
- test('should handle non-OK status code from dev server', () => __awaiter(void 0, void 0, void 0, function* () {
112
- // Set up axios error response
113
- const axiosError = {
114
- isAxiosError: true,
115
- code: 'ERR_BAD_RESPONSE',
116
- response: {
117
- status: 500,
118
- statusText: 'Internal Server Error',
63
+ test('rejects malformed builds', () => __awaiter(void 0, void 0, void 0, function* () {
64
+ // Given the devServer to which to report builds
65
+ const CLIENT_IMPLEMENTATION = httpClient.toString().replace(/\n\s+/g, '');
66
+ const MOCKED_BUILD_COMMAND = `${NODE_COMMAND} -e "(${CLIENT_IMPLEMENTATION})()"`;
67
+ const { devServerUrl, stop } = yield (0, build_and_test_1.buildAssets)(MOCKED_BUILD_COMMAND, fixtures_1.mockReporter);
68
+ tearDowns.push(stop);
69
+ // When sending a malformed build
70
+ const correctPayload = {
71
+ method: 'POST',
72
+ headers: {
73
+ 'Content-Type': 'application/json',
74
+ },
75
+ body: {
76
+ outputDirectory: 'output-directory',
77
+ publicPath: 'prefix/',
119
78
  },
120
79
  };
121
- jest.spyOn(axios_1.default, 'get').mockRejectedValueOnce(axiosError);
122
- // Setup isAxiosError for the specific error
123
- jest.spyOn(axios_1.default, 'isAxiosError').mockImplementation((error) => {
124
- return error === axiosError;
125
- });
126
- // When calling spawnBuildPluginDevServer with any command
127
- const MOCKED_BUILD_COMMAND = `${NODE_COMMAND} -e "setTimeout(() => {}, 100000)"`;
128
- const commandPromise = (0, build_and_test_1.spawnBuildPluginDevServer)(MOCKED_BUILD_COMMAND, fixtures_1.mockReporter);
129
- // Then it should throw with the server error
130
- yield expect(commandPromise).rejects.toThrow('Dev server returned error: 500 Internal Server Error');
80
+ const [missingOutputDirectory, missingPublicPath] = yield Promise.all([
81
+ fetch(devServerUrl, Object.assign(Object.assign({}, correctPayload), { body: JSON.stringify(Object.assign(Object.assign({}, correctPayload.body), { outputDirectory: undefined })) })),
82
+ fetch(devServerUrl, Object.assign(Object.assign({}, correctPayload), { body: JSON.stringify(Object.assign(Object.assign({}, correctPayload.body), { publicPath: undefined })) })),
83
+ ]);
84
+ // Then it should reject the malformed builds reported.
85
+ expect(missingOutputDirectory.status).toBe(500);
86
+ expect(yield missingOutputDirectory.text()).toBe(`Internal Server Error: ${build_and_test_1.MalformedBuildError.message}`);
87
+ expect(missingPublicPath.status).toBe(500);
88
+ expect(yield missingPublicPath.text()).toBe(`Internal Server Error: ${build_and_test_1.MalformedBuildError.message}`);
131
89
  }));
132
90
  });
133
91
  //# sourceMappingURL=build-and-test.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"build-and-test.test.js","sourceRoot":"","sources":["../../../../src/commands/synthetics/__tests__/build-and-test.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"build-and-test.test.js","sourceRoot":"","sources":["../../../../src/commands/synthetics/__tests__/build-and-test.test.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,25 @@
1
+ /// <reference types="node" />
2
+ import * as http from 'http';
1
3
  import { MainReporter } from './interfaces';
2
- export declare const DEFAULT_BUILD_PLUGIN_PORT = 4000;
4
+ interface ReportedBuild {
5
+ outputDirectory: string;
6
+ publicPath: string;
7
+ }
3
8
  export declare const UnconfiguredBuildPluginError: Error;
4
- export declare const spawnBuildPluginDevServer: (buildCommand: string, reporter: MainReporter) => Promise<{
9
+ export declare const MalformedBuildError: Error;
10
+ declare const routeVerbs: readonly ["get", "post", "put", "patch", "delete"];
11
+ type RouteVerb = typeof routeVerbs[number];
12
+ export type Routes = Record<string, {
13
+ [key in RouteVerb]?: (req: http.IncomingMessage, res: http.ServerResponse) => Promise<void>;
14
+ }>;
15
+ export type RequestHandlerOptions = {
16
+ builds: ReportedBuild[];
17
+ root?: string;
18
+ routes?: Routes;
19
+ };
20
+ export declare const buildAssets: (buildCommand: string, reporter: MainReporter) => Promise<{
21
+ builds: ReportedBuild[];
5
22
  devServerUrl: string;
6
- publicPrefix: string;
7
23
  stop: () => Promise<void>;
8
24
  }>;
25
+ export {};
@@ -1,4 +1,27 @@
1
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 (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
2
25
  var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
26
  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
27
  return new (P || (P = Promise))(function (resolve, reject) {
@@ -8,95 +31,186 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
8
31
  step((generator = generator.apply(thisArg, _arguments || [])).next());
9
32
  });
10
33
  };
11
- var __importDefault = (this && this.__importDefault) || function (mod) {
12
- return (mod && mod.__esModule) ? mod : { "default": mod };
13
- };
14
34
  Object.defineProperty(exports, "__esModule", { value: true });
15
- exports.spawnBuildPluginDevServer = exports.UnconfiguredBuildPluginError = exports.DEFAULT_BUILD_PLUGIN_PORT = void 0;
35
+ exports.buildAssets = exports.MalformedBuildError = exports.UnconfiguredBuildPluginError = void 0;
16
36
  const child_process_1 = require("child_process");
17
37
  const events_1 = require("events");
18
- const axios_1 = __importDefault(require("axios"));
19
- const internal_1 = require("./utils/internal");
20
- exports.DEFAULT_BUILD_PLUGIN_PORT = 4000;
38
+ const fs_1 = require("fs");
39
+ const http = __importStar(require("http"));
40
+ const path = __importStar(require("path"));
41
+ const REPORT_BUILD_PATHNAME = '/_datadog-ci_/build';
21
42
  exports.UnconfiguredBuildPluginError = new Error(`
22
43
  We couldn't detect the Datadog Build plugins within your build. Did you add it?
23
44
  If not, you can learn more about it here: https://github.com/DataDog/build-plugins#readme
24
45
  `);
25
- const watchBuildPluginServerReadiness = (buildPluginServerUrl, abortSignal) => __awaiter(void 0, void 0, void 0, function* () {
26
- return (0, internal_1.poll)(() => __awaiter(void 0, void 0, void 0, function* () {
27
- try {
28
- const response = yield axios_1.default.get(buildPluginServerUrl, { signal: abortSignal });
29
- const { status, publicPrefix = '' } = response.data;
30
- if (status === 'success') {
46
+ exports.MalformedBuildError = new Error(`Invalid payload. Expected payload is {\"outputDirectory\": string, \"publicPath\": string}`);
47
+ const MIME_TYPES = {
48
+ default: 'application/octet-stream',
49
+ html: 'text/html; charset=UTF-8',
50
+ js: 'application/javascript',
51
+ css: 'text/css',
52
+ png: 'image/png',
53
+ jpg: 'image/jpg',
54
+ gif: 'image/gif',
55
+ ico: 'image/x-icon',
56
+ svg: 'image/svg+xml',
57
+ };
58
+ const isMIMEType = (mime) => {
59
+ return Object.keys(MIME_TYPES).includes(mime);
60
+ };
61
+ const routeVerbs = ['get', 'post', 'put', 'patch', 'delete'];
62
+ const isRouteVerb = (verb) => {
63
+ return routeVerbs.includes(verb);
64
+ };
65
+ const fileExists = (filePath) => __awaiter(void 0, void 0, void 0, function* () {
66
+ try {
67
+ yield fs_1.promises.access(filePath);
68
+ return true;
69
+ }
70
+ catch (_a) {
71
+ return false;
72
+ }
73
+ });
74
+ const prepareFile = (root = process.cwd(), builds, requestUrl) => __awaiter(void 0, void 0, void 0, function* () {
75
+ const staticPath = path.isAbsolute(root) ? root : path.resolve(process.cwd(), root);
76
+ for (const build of builds) {
77
+ if (requestUrl.startsWith(build.publicPath)) {
78
+ const url = new URL(requestUrl, 'http://127.0.0.1');
79
+ const filePath = path.join(path.resolve(staticPath, build.outputDirectory), // absolute path to the assets directory
80
+ path.relative(build.publicPath, url.pathname), // relative path to the file
81
+ url.pathname.endsWith('/') ? 'index.html' : '' // add index.html if the path ends with a slash
82
+ );
83
+ // Verify path is within the intended directory
84
+ const directDescendant = filePath.startsWith(path.resolve(staticPath, build.outputDirectory));
85
+ // Check if the file exists (only if it's withing the intended directory)
86
+ const found = directDescendant && (yield fileExists(filePath));
87
+ if (directDescendant && found) {
31
88
  return {
32
- readiness: 'buildCommandReady',
33
- publicPrefix,
89
+ found: true,
90
+ ext: path.extname(filePath).substring(1).toLowerCase(),
91
+ content: yield fs_1.promises.readFile(filePath, { encoding: 'utf-8' }),
34
92
  };
35
93
  }
36
94
  }
37
- catch (error) {
38
- // If we got an http error with a response, return buildCommandErrored
39
- if (axios_1.default.isAxiosError(error) && error.code !== 'ECONNREFUSED' && error.response) {
40
- return {
41
- readiness: 'buildCommandErrored',
42
- error: new Error(`Dev server returned error: ${error.response.status} ${error.response.statusText}`),
43
- };
95
+ }
96
+ return {
97
+ found: false,
98
+ };
99
+ });
100
+ const getRequestHandler = ({ builds, root, routes }) => (req, res) => __awaiter(void 0, void 0, void 0, function* () {
101
+ var _b, _c;
102
+ try {
103
+ // Handle routes.
104
+ const route = routes === null || routes === void 0 ? void 0 : routes[req.url || '/'];
105
+ if (route) {
106
+ const verb = (_c = (_b = req.method) === null || _b === void 0 ? void 0 : _b.toLowerCase()) !== null && _c !== void 0 ? _c : '';
107
+ if (isRouteVerb(verb)) {
108
+ const handler = route[verb];
109
+ if (handler) {
110
+ yield handler(req, res);
111
+ return;
112
+ }
44
113
  }
45
- // Otherwise ignore errors and continue polling in case the dev server is still starting
46
114
  }
47
- }), abortSignal);
115
+ // Fallback to files.
116
+ const file = yield prepareFile(root, builds, req.url || '/');
117
+ if (file.found) {
118
+ const mimeType = isMIMEType(file.ext) ? MIME_TYPES[file.ext] : MIME_TYPES.default;
119
+ res.writeHead(200, { 'Content-Type': mimeType });
120
+ res.end(file.content);
121
+ return;
122
+ }
123
+ res.writeHead(404);
124
+ res.end();
125
+ }
126
+ catch (error) {
127
+ const errorMessage = error instanceof Error ? error.message : String(error);
128
+ res.writeHead(500, { 'Content-Type': MIME_TYPES.html });
129
+ res.end(`Internal Server Error: ${errorMessage}`);
130
+ }
48
131
  });
49
- const watchBuildCommandExit = (buildCommand) => __awaiter(void 0, void 0, void 0, function* () {
50
- yield (0, events_1.once)(buildCommand, 'close');
51
- return {
52
- readiness: 'buildCommandExited',
53
- };
132
+ const getRequestBody = (req) => __awaiter(void 0, void 0, void 0, function* () {
133
+ const chunks = [];
134
+ req.on('data', (chunk) => chunks.push(chunk));
135
+ yield (0, events_1.once)(req, 'end');
136
+ return chunks.join('');
54
137
  });
55
- const spawnBuildPluginDevServer = (buildCommand, reporter) => __awaiter(void 0, void 0, void 0, function* () {
56
- const buildPluginPort = exports.DEFAULT_BUILD_PLUGIN_PORT;
138
+ const getReportedBuild = (payload) => {
139
+ const reportedBuild = JSON.parse(payload);
140
+ if ('outputDirectory' in reportedBuild &&
141
+ typeof reportedBuild.outputDirectory === 'string' &&
142
+ 'publicPath' in reportedBuild &&
143
+ typeof reportedBuild.publicPath === 'string') {
144
+ return reportedBuild;
145
+ }
146
+ throw exports.MalformedBuildError;
147
+ };
148
+ const spawnDevServer = () => __awaiter(void 0, void 0, void 0, function* () {
149
+ const builds = [];
150
+ const requestHandler = getRequestHandler({
151
+ builds,
152
+ root: process.cwd(),
153
+ routes: {
154
+ [REPORT_BUILD_PATHNAME]: {
155
+ post: (req, res) => __awaiter(void 0, void 0, void 0, function* () {
156
+ const body = yield getRequestBody(req);
157
+ const reportedBuild = getReportedBuild(body);
158
+ builds.push(reportedBuild);
159
+ res.end();
160
+ }),
161
+ },
162
+ },
163
+ });
164
+ // eslint-disable-next-line @typescript-eslint/no-misused-promises
165
+ const server = http.createServer(requestHandler);
166
+ server.listen();
167
+ yield (0, events_1.once)(server, 'listening');
168
+ return { builds, server, url: getBuildReportUrl(server) };
169
+ });
170
+ const buildAssets = (buildCommand, reporter) => __awaiter(void 0, void 0, void 0, function* () {
171
+ var _d, _e, _f, _g;
172
+ const { builds, server, url } = yield spawnDevServer();
57
173
  // Spawn the build command process with the BUILD_PLUGINS_S8S_PORT environment variable.
58
174
  const buildCommandProcess = (0, child_process_1.spawn)(buildCommand, [], {
59
- env: { BUILD_PLUGINS_S8S_PORT: String(buildPluginPort) },
60
- shell: true,
175
+ env: Object.assign({ DATADOG_SYNTHETICS_REPORT_BUILD_URL: url }, process.env),
176
+ shell: (_e = (_d = process.env.SHELL) !== null && _d !== void 0 ? _d : process.env.ComSpec) !== null && _e !== void 0 ? _e : true,
61
177
  });
62
- // Wait for the build command to either exit, or provide a dev server serving the built assets.
63
- const controller = new AbortController(); // used to abort the watcher and its http requests
64
- const buildCommandExited = watchBuildCommandExit(buildCommandProcess);
65
- const buildCommandReady = watchBuildPluginServerReadiness('http://localhost:' + String(buildPluginPort) + '/_datadog-ci_/build-status', controller.signal);
66
- const buildCommandReturnValue = yield Promise.race([
67
- buildCommandReady,
68
- buildCommandExited,
69
- ]);
70
- controller.abort();
71
- if (buildCommandReturnValue === undefined) {
72
- yield killBuildCommand(buildCommandProcess, buildCommandExited);
73
- throw new Error('Unexpected state: buildCommandReturnValue is undefined');
74
- }
75
- if (buildCommandReturnValue.readiness === 'buildCommandExited') {
76
- reporter.error(exports.UnconfiguredBuildPluginError.message);
77
- yield killBuildCommand(buildCommandProcess, buildCommandExited);
178
+ (_f = buildCommandProcess.stdout) === null || _f === void 0 ? void 0 : _f.pipe(process.stdout);
179
+ (_g = buildCommandProcess.stderr) === null || _g === void 0 ? void 0 : _g.pipe(process.stderr);
180
+ // Wait for the build command to finish
181
+ yield (0, events_1.once)(buildCommandProcess, 'close');
182
+ if (builds.length === 0) {
183
+ yield stopDevServer(server);
78
184
  throw exports.UnconfiguredBuildPluginError;
79
185
  }
80
- if (buildCommandReturnValue.readiness === 'buildCommandErrored') {
81
- reporter.error(buildCommandReturnValue.error.message);
82
- yield killBuildCommand(buildCommandProcess, buildCommandExited);
83
- throw buildCommandReturnValue.error;
84
- }
85
- const { publicPrefix = '' } = buildCommandReturnValue;
86
186
  // Once the build server is ready, return its URL with the advertised public prefix to run the tests against it.
87
187
  return {
88
- devServerUrl: 'http://localhost:' + String(buildPluginPort),
89
- publicPrefix,
90
- stop: () => __awaiter(void 0, void 0, void 0, function* () { return killBuildCommand(buildCommandProcess, buildCommandExited); }),
188
+ builds,
189
+ devServerUrl: url,
190
+ stop: () => __awaiter(void 0, void 0, void 0, function* () { return stopDevServer(server); }),
91
191
  };
92
192
  });
93
- exports.spawnBuildPluginDevServer = spawnBuildPluginDevServer;
94
- const killBuildCommand = (buildCommandProcess, buildCommandExited) => __awaiter(void 0, void 0, void 0, function* () {
95
- var _a, _b, _c;
96
- buildCommandProcess.kill();
97
- (_a = buildCommandProcess.stdin) === null || _a === void 0 ? void 0 : _a.destroy();
98
- (_b = buildCommandProcess.stdout) === null || _b === void 0 ? void 0 : _b.destroy();
99
- (_c = buildCommandProcess.stderr) === null || _c === void 0 ? void 0 : _c.destroy();
100
- yield buildCommandExited;
193
+ exports.buildAssets = buildAssets;
194
+ const getBuildReportUrl = (server) => {
195
+ var _a;
196
+ // net.Server can be listening on a named pipe, in which case the address is a string
197
+ // or not listening yet, in which case the address is null, which we cast to the 'undefined' string
198
+ // to meet the same condition as if it was a named pipe, and throw.
199
+ const serverAddress = (_a = server.address()) !== null && _a !== void 0 ? _a : 'undefined';
200
+ if (typeof serverAddress === 'string') {
201
+ throw new Error('Server address is not valid');
202
+ }
203
+ const url = new URL(serverAddress.family === 'IPv6'
204
+ ? `http://[${serverAddress.address}]:${serverAddress.port}`
205
+ : `http://${serverAddress.address}:${serverAddress.port}`);
206
+ url.pathname = REPORT_BUILD_PATHNAME;
207
+ return url.href;
208
+ };
209
+ const stopDevServer = (server) => __awaiter(void 0, void 0, void 0, function* () {
210
+ if (server.listening) {
211
+ const serverClosed = (0, events_1.once)(server, 'close');
212
+ server.close();
213
+ yield serverClosed;
214
+ }
101
215
  });
102
216
  //# sourceMappingURL=build-and-test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"build-and-test.js","sourceRoot":"","sources":["../../../src/commands/synthetics/build-and-test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"build-and-test.js","sourceRoot":"","sources":["../../../src/commands/synthetics/build-and-test.ts"],"names":[],"mappings":"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"}
@@ -132,12 +132,15 @@ class RunTestsCommand extends base_command_1.BaseCommand {
132
132
  this.reporter.error('The `buildCommand` option is required for the `build-and-test` command.');
133
133
  return 1;
134
134
  }
135
- const { devServerUrl, publicPrefix, stop } = yield (0, build_and_test_1.spawnBuildPluginDevServer)(this.config.buildCommand, this.reporter);
135
+ const { builds, devServerUrl, stop } = yield (0, build_and_test_1.buildAssets)(this.config.buildCommand, this.reporter);
136
136
  this.tearDowns.push(stop);
137
+ const resourceUrlSubstitutionRegexes = builds.map(
138
+ // All of the resources matching the publicPath prefix will be redirected to the dev server.
139
+ (build) => `.*${build.publicPath}|${devServerUrl}/${build.publicPath}`);
137
140
  this.config = (0, deep_extend_1.default)(this.config, {
138
141
  tunnel: true,
139
142
  defaultTestOverrides: {
140
- resourceUrlSubstitutionRegexes: [`.*${publicPrefix}|${devServerUrl}`],
143
+ resourceUrlSubstitutionRegexes,
141
144
  },
142
145
  });
143
146
  }