@datadog/datadog-ci-base 5.7.0 → 5.9.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 (204) hide show
  1. package/dist/cli.d.ts +13 -1
  2. package/dist/cli.js +76 -33
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/aas/common.d.ts +13 -2
  5. package/dist/commands/aas/common.js +46 -24
  6. package/dist/commands/aas/common.js.map +1 -1
  7. package/dist/commands/aas/instrument.js +1 -1
  8. package/dist/commands/aas/instrument.js.map +1 -1
  9. package/dist/commands/aas/uninstrument.js +1 -1
  10. package/dist/commands/aas/uninstrument.js.map +1 -1
  11. package/dist/commands/ci-env/cli.d.ts +2 -0
  12. package/dist/commands/ci-env/cli.js +10 -0
  13. package/dist/commands/ci-env/cli.js.map +1 -0
  14. package/dist/commands/ci-env/read.d.ts +7 -0
  15. package/dist/commands/ci-env/read.js +176 -0
  16. package/dist/commands/ci-env/read.js.map +1 -0
  17. package/dist/commands/cloud-run/constants.js +1 -2
  18. package/dist/commands/cloud-run/constants.js.map +1 -1
  19. package/dist/commands/container-app/common.js +10 -11
  20. package/dist/commands/container-app/common.js.map +1 -1
  21. package/dist/commands/coverage/upload.d.ts +2 -0
  22. package/dist/commands/coverage/upload.js +6 -0
  23. package/dist/commands/coverage/upload.js.map +1 -1
  24. package/dist/commands/elf-symbols/cli.d.ts +2 -0
  25. package/dist/commands/elf-symbols/cli.js +10 -0
  26. package/dist/commands/elf-symbols/cli.js.map +1 -0
  27. package/dist/commands/elf-symbols/elf-constants.d.ts +256 -0
  28. package/dist/commands/elf-symbols/elf-constants.js +465 -0
  29. package/dist/commands/elf-symbols/elf-constants.js.map +1 -0
  30. package/dist/commands/elf-symbols/elf.d.ts +105 -0
  31. package/dist/commands/elf-symbols/elf.js +431 -0
  32. package/dist/commands/elf-symbols/elf.js.map +1 -0
  33. package/dist/commands/elf-symbols/helpers.d.ts +4 -0
  34. package/dist/commands/elf-symbols/helpers.js +29 -0
  35. package/dist/commands/elf-symbols/helpers.js.map +1 -0
  36. package/dist/commands/elf-symbols/interfaces.d.ts +18 -0
  37. package/dist/commands/elf-symbols/interfaces.js +7 -0
  38. package/dist/commands/elf-symbols/interfaces.js.map +1 -0
  39. package/dist/commands/elf-symbols/renderer.d.ts +19 -0
  40. package/dist/commands/elf-symbols/renderer.js +87 -0
  41. package/dist/commands/elf-symbols/renderer.js.map +1 -0
  42. package/dist/commands/elf-symbols/upload.d.ts +31 -0
  43. package/dist/commands/elf-symbols/upload.js +412 -0
  44. package/dist/commands/elf-symbols/upload.js.map +1 -0
  45. package/dist/commands/flutter-symbols/cli.d.ts +2 -0
  46. package/dist/commands/flutter-symbols/cli.js +10 -0
  47. package/dist/commands/flutter-symbols/cli.js.map +1 -0
  48. package/dist/commands/flutter-symbols/helpers.d.ts +8 -0
  49. package/dist/commands/flutter-symbols/helpers.js +51 -0
  50. package/dist/commands/flutter-symbols/helpers.js.map +1 -0
  51. package/dist/commands/flutter-symbols/interfaces.d.ts +17 -0
  52. package/dist/commands/flutter-symbols/interfaces.js +10 -0
  53. package/dist/commands/flutter-symbols/interfaces.js.map +1 -0
  54. package/dist/commands/flutter-symbols/renderer.d.ts +23 -0
  55. package/dist/commands/flutter-symbols/renderer.js +106 -0
  56. package/dist/commands/flutter-symbols/renderer.js.map +1 -0
  57. package/dist/commands/flutter-symbols/upload.d.ts +44 -0
  58. package/dist/commands/flutter-symbols/upload.js +510 -0
  59. package/dist/commands/flutter-symbols/upload.js.map +1 -0
  60. package/dist/commands/lambda/cli.d.ts +2 -1
  61. package/dist/commands/lambda/cli.js +2 -0
  62. package/dist/commands/lambda/cli.js.map +1 -1
  63. package/dist/commands/lambda/cloudwatch.d.ts +15 -0
  64. package/dist/commands/lambda/cloudwatch.js +77 -0
  65. package/dist/commands/lambda/cloudwatch.js.map +1 -0
  66. package/dist/commands/measure/cli.d.ts +2 -0
  67. package/dist/commands/measure/cli.js +10 -0
  68. package/dist/commands/measure/cli.js.map +1 -0
  69. package/dist/commands/measure/measure.d.ts +18 -0
  70. package/dist/commands/measure/measure.js +171 -0
  71. package/dist/commands/measure/measure.js.map +1 -0
  72. package/dist/commands/pe-symbols/breakpad.d.ts +2 -0
  73. package/dist/commands/pe-symbols/breakpad.js +159 -0
  74. package/dist/commands/pe-symbols/breakpad.js.map +1 -0
  75. package/dist/commands/pe-symbols/cli.d.ts +2 -0
  76. package/dist/commands/pe-symbols/cli.js +10 -0
  77. package/dist/commands/pe-symbols/cli.js.map +1 -0
  78. package/dist/commands/pe-symbols/helpers.d.ts +4 -0
  79. package/dist/commands/pe-symbols/helpers.js +30 -0
  80. package/dist/commands/pe-symbols/helpers.js.map +1 -0
  81. package/dist/commands/pe-symbols/interfaces.d.ts +17 -0
  82. package/dist/commands/pe-symbols/interfaces.js +7 -0
  83. package/dist/commands/pe-symbols/interfaces.js.map +1 -0
  84. package/dist/commands/pe-symbols/pe-constants.d.ts +51 -0
  85. package/dist/commands/pe-symbols/pe-constants.js +160 -0
  86. package/dist/commands/pe-symbols/pe-constants.js.map +1 -0
  87. package/dist/commands/pe-symbols/pe.d.ts +40 -0
  88. package/dist/commands/pe-symbols/pe.js +249 -0
  89. package/dist/commands/pe-symbols/pe.js.map +1 -0
  90. package/dist/commands/pe-symbols/renderer.d.ts +19 -0
  91. package/dist/commands/pe-symbols/renderer.js +87 -0
  92. package/dist/commands/pe-symbols/renderer.js.map +1 -0
  93. package/dist/commands/pe-symbols/upload.d.ts +34 -0
  94. package/dist/commands/pe-symbols/upload.js +457 -0
  95. package/dist/commands/pe-symbols/upload.js.map +1 -0
  96. package/dist/commands/react-native/cli.d.ts +5 -0
  97. package/dist/commands/react-native/cli.js +16 -0
  98. package/dist/commands/react-native/cli.js.map +1 -0
  99. package/dist/commands/react-native/codepush.d.ts +29 -0
  100. package/dist/commands/react-native/codepush.js +176 -0
  101. package/dist/commands/react-native/codepush.js.map +1 -0
  102. package/dist/commands/react-native/errors.d.ts +9 -0
  103. package/dist/commands/react-native/errors.js +34 -0
  104. package/dist/commands/react-native/errors.js.map +1 -0
  105. package/dist/commands/react-native/injectDebugId.d.ts +42 -0
  106. package/dist/commands/react-native/injectDebugId.js +252 -0
  107. package/dist/commands/react-native/injectDebugId.js.map +1 -0
  108. package/dist/commands/react-native/interfaces.d.ts +20 -0
  109. package/dist/commands/react-native/interfaces.js +93 -0
  110. package/dist/commands/react-native/interfaces.js.map +1 -0
  111. package/dist/commands/react-native/renderer.d.ts +20 -0
  112. package/dist/commands/react-native/renderer.js +111 -0
  113. package/dist/commands/react-native/renderer.js.map +1 -0
  114. package/dist/commands/react-native/upload.d.ts +30 -0
  115. package/dist/commands/react-native/upload.js +317 -0
  116. package/dist/commands/react-native/upload.js.map +1 -0
  117. package/dist/commands/react-native/utils.d.ts +4 -0
  118. package/dist/commands/react-native/utils.js +35 -0
  119. package/dist/commands/react-native/utils.js.map +1 -0
  120. package/dist/commands/react-native/validation.d.ts +6 -0
  121. package/dist/commands/react-native/validation.js +24 -0
  122. package/dist/commands/react-native/validation.js.map +1 -0
  123. package/dist/commands/react-native/xcode.d.ts +58 -0
  124. package/dist/commands/react-native/xcode.js +561 -0
  125. package/dist/commands/react-native/xcode.js.map +1 -0
  126. package/dist/commands/sourcemaps/cli.d.ts +2 -0
  127. package/dist/commands/sourcemaps/cli.js +10 -0
  128. package/dist/commands/sourcemaps/cli.js.map +1 -0
  129. package/dist/commands/sourcemaps/interfaces.d.ts +18 -0
  130. package/dist/commands/sourcemaps/interfaces.js +59 -0
  131. package/dist/commands/sourcemaps/interfaces.js.map +1 -0
  132. package/dist/commands/sourcemaps/renderer.d.ts +13 -0
  133. package/dist/commands/sourcemaps/renderer.js +93 -0
  134. package/dist/commands/sourcemaps/renderer.js.map +1 -0
  135. package/dist/commands/sourcemaps/upload.d.ts +29 -0
  136. package/dist/commands/sourcemaps/upload.js +342 -0
  137. package/dist/commands/sourcemaps/upload.js.map +1 -0
  138. package/dist/commands/sourcemaps/utils.d.ts +3 -0
  139. package/dist/commands/sourcemaps/utils.js +73 -0
  140. package/dist/commands/sourcemaps/utils.js.map +1 -0
  141. package/dist/commands/sourcemaps/validation.d.ts +7 -0
  142. package/dist/commands/sourcemaps/validation.js +41 -0
  143. package/dist/commands/sourcemaps/validation.js.map +1 -0
  144. package/dist/commands/span/cli.d.ts +2 -0
  145. package/dist/commands/span/cli.js +10 -0
  146. package/dist/commands/span/cli.js.map +1 -0
  147. package/dist/commands/span/span.d.ts +10 -0
  148. package/dist/commands/span/span.js +112 -0
  149. package/dist/commands/span/span.js.map +1 -0
  150. package/dist/commands/terraform/cli.d.ts +2 -0
  151. package/dist/commands/terraform/cli.js +10 -0
  152. package/dist/commands/terraform/cli.js.map +1 -0
  153. package/dist/commands/terraform/upload.d.ts +14 -0
  154. package/dist/commands/terraform/upload.js +93 -0
  155. package/dist/commands/terraform/upload.js.map +1 -0
  156. package/dist/commands/trace/api.d.ts +6 -0
  157. package/dist/commands/trace/api.js +38 -0
  158. package/dist/commands/trace/api.js.map +1 -0
  159. package/dist/commands/trace/cli.d.ts +2 -0
  160. package/dist/commands/trace/cli.js +10 -0
  161. package/dist/commands/trace/cli.js.map +1 -0
  162. package/dist/commands/trace/helper.d.ts +16 -0
  163. package/dist/commands/trace/helper.js +125 -0
  164. package/dist/commands/trace/helper.js.map +1 -0
  165. package/dist/commands/trace/interfaces.d.ts +18 -0
  166. package/dist/commands/trace/interfaces.js +14 -0
  167. package/dist/commands/trace/interfaces.js.map +1 -0
  168. package/dist/commands/trace/test-utils.d.ts +4 -0
  169. package/dist/commands/trace/test-utils.js +156 -0
  170. package/dist/commands/trace/test-utils.js.map +1 -0
  171. package/dist/commands/trace/trace.d.ts +10 -0
  172. package/dist/commands/trace/trace.js +110 -0
  173. package/dist/commands/trace/trace.js.map +1 -0
  174. package/dist/commands/unity-symbols/cli.d.ts +2 -0
  175. package/dist/commands/unity-symbols/cli.js +10 -0
  176. package/dist/commands/unity-symbols/cli.js.map +1 -0
  177. package/dist/commands/unity-symbols/helpers.d.ts +4 -0
  178. package/dist/commands/unity-symbols/helpers.js +29 -0
  179. package/dist/commands/unity-symbols/helpers.js.map +1 -0
  180. package/dist/commands/unity-symbols/interfaces.d.ts +14 -0
  181. package/dist/commands/unity-symbols/interfaces.js +9 -0
  182. package/dist/commands/unity-symbols/interfaces.js.map +1 -0
  183. package/dist/commands/unity-symbols/renderer.d.ts +19 -0
  184. package/dist/commands/unity-symbols/renderer.js +88 -0
  185. package/dist/commands/unity-symbols/renderer.js.map +1 -0
  186. package/dist/commands/unity-symbols/upload.d.ts +32 -0
  187. package/dist/commands/unity-symbols/upload.js +392 -0
  188. package/dist/commands/unity-symbols/upload.js.map +1 -0
  189. package/dist/commands/version/cli.d.ts +2 -0
  190. package/dist/commands/version/cli.js +10 -0
  191. package/dist/commands/version/cli.js.map +1 -0
  192. package/dist/commands/version/version.d.ts +6 -0
  193. package/dist/commands/version/version.js +31 -0
  194. package/dist/commands/version/version.js.map +1 -0
  195. package/dist/helpers/ci.js +50 -5
  196. package/dist/helpers/ci.js.map +1 -1
  197. package/dist/helpers/plugin.js +1 -1
  198. package/dist/helpers/plugin.js.map +1 -1
  199. package/dist/helpers/serverless/azure.d.ts +2 -0
  200. package/dist/helpers/serverless/azure.js +3 -3
  201. package/dist/helpers/serverless/azure.js.map +1 -1
  202. package/dist/helpers/serverless/lambda-layer-versions.d.ts +3 -3
  203. package/dist/helpers/serverless/lambda-layer-versions.js +3 -3
  204. package/package.json +23 -17
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.extractRepeatedPath = exports.getMinifiedFilePath = exports.readLastLine = void 0;
16
+ const promises_1 = require("fs/promises");
17
+ const upath_1 = __importDefault(require("upath"));
18
+ // Reads the last non-empty line from a file using a buffer from the end
19
+ const readLastLine = (filePath) => __awaiter(void 0, void 0, void 0, function* () {
20
+ let fh;
21
+ let lastLine = '';
22
+ try {
23
+ fh = yield (0, promises_1.open)(filePath, 'r');
24
+ const stats = yield fh.stat();
25
+ const fileSize = stats.size;
26
+ // Read up to 1KB from the end (should be enough for sourceMappingURL comment)
27
+ const bufferSize = Math.min(1024, fileSize);
28
+ const buffer = Buffer.alloc(bufferSize);
29
+ const position = Math.max(0, fileSize - bufferSize);
30
+ yield fh.read(buffer, 0, bufferSize, position);
31
+ const tailContent = buffer.toString('utf-8');
32
+ // Get the last non-empty line (handle multiple trailing newlines)
33
+ // note: windows uses \r\n as line separator while unix uses \n
34
+ const lines = tailContent.split(/\r?\n/);
35
+ for (const line of lines.reverse()) {
36
+ if (line.trim().length !== 0) {
37
+ lastLine = line;
38
+ break;
39
+ }
40
+ }
41
+ }
42
+ finally {
43
+ if (fh !== undefined) {
44
+ yield fh.close();
45
+ }
46
+ }
47
+ return lastLine;
48
+ });
49
+ exports.readLastLine = readLastLine;
50
+ const getMinifiedFilePath = (sourcemapPath) => {
51
+ if (upath_1.default.extname(sourcemapPath) !== '.map') {
52
+ throw Error('cannot get minified file path from a file which is not a sourcemap');
53
+ }
54
+ return sourcemapPath.replace(new RegExp('\\.map$'), '');
55
+ };
56
+ exports.getMinifiedFilePath = getMinifiedFilePath;
57
+ // ExtractRepeatedPath checks if the last part of paths of the first arg are repeated at the start of the second arg.
58
+ const extractRepeatedPath = (path1, path2) => {
59
+ const splitOnSlashes = new RegExp(/[/]+|[\\]+/);
60
+ const trimSlashes = new RegExp(/^[/]+|^[\\]+|[/]+$|[\\]+$/);
61
+ const path1split = path1.trim().replace(trimSlashes, '').split(splitOnSlashes);
62
+ const path2split = path2.trim().replace(trimSlashes, '').split(splitOnSlashes);
63
+ const normalizedpath2 = path2split.join('/');
64
+ for (let i = path1split.length; i > 0; i--) {
65
+ const path1subset = path1split.slice(-i).join('/');
66
+ if (normalizedpath2.startsWith(path1subset)) {
67
+ return path1subset;
68
+ }
69
+ }
70
+ return undefined;
71
+ };
72
+ exports.extractRepeatedPath = extractRepeatedPath;
73
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/commands/sourcemaps/utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { Writable } from 'stream';
2
+ import { Sourcemap } from './interfaces';
3
+ export declare class InvalidPayload extends Error {
4
+ reason: string;
5
+ constructor(reason: string, message?: string);
6
+ }
7
+ export declare const validatePayload: (sourcemap: Sourcemap, stdout: Writable) => void;
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validatePayload = exports.InvalidPayload = void 0;
4
+ const validation_1 = require("@datadog/datadog-ci-base/helpers/validation");
5
+ const renderer_1 = require("./renderer");
6
+ const utils_1 = require("./utils");
7
+ class InvalidPayload extends Error {
8
+ constructor(reason, message) {
9
+ super(message);
10
+ this.reason = reason;
11
+ }
12
+ }
13
+ exports.InvalidPayload = InvalidPayload;
14
+ const validatePayload = (sourcemap, stdout) => {
15
+ // Check existence of sourcemap file
16
+ const sourcemapCheck = (0, validation_1.checkFile)(sourcemap.sourcemapPath);
17
+ if (!sourcemapCheck.exists) {
18
+ // This case should not happen as all collected sourcemaps should point to correct files
19
+ throw new InvalidPayload('missing_sourcemap', `Skipping missing sourcemap (${sourcemap.sourcemapPath})`);
20
+ }
21
+ if (sourcemapCheck.empty) {
22
+ throw new InvalidPayload('empty_sourcemap', `Skipping empty sourcemap (${sourcemap.sourcemapPath})`);
23
+ }
24
+ // Check existence of minified file
25
+ const minifiedFileCheck = (0, validation_1.checkFile)(sourcemap.minifiedFilePath);
26
+ if (!minifiedFileCheck.exists) {
27
+ throw new InvalidPayload('missing_js', `Missing corresponding JS file for sourcemap (${sourcemap.minifiedFilePath})`);
28
+ }
29
+ if (minifiedFileCheck.empty) {
30
+ throw new InvalidPayload('empty_js', `Skipping sourcemap (${sourcemap.sourcemapPath}) due to ${sourcemap.minifiedFilePath} being empty`);
31
+ }
32
+ // Check for --minified-path-prefix flag misuages.
33
+ if (sourcemap.minifiedPathPrefix) {
34
+ const repeated = (0, utils_1.extractRepeatedPath)(sourcemap.minifiedPathPrefix, sourcemap.relativePath);
35
+ if (repeated) {
36
+ stdout.write((0, renderer_1.renderMinifiedPathPrefixMisusage)(sourcemap, repeated));
37
+ }
38
+ }
39
+ };
40
+ exports.validatePayload = validatePayload;
41
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../../src/commands/sourcemaps/validation.ts"],"names":[],"mappings":";;;AAEA,4EAAqE;AAGrE,yCAA2D;AAC3D,mCAA2C;AAE3C,MAAa,cAAe,SAAQ,KAAK;IAGvC,YAAY,MAAc,EAAE,OAAgB;QAC1C,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;IACtB,CAAC;CACF;AAPD,wCAOC;AAEM,MAAM,eAAe,GAAG,CAAC,SAAoB,EAAE,MAAgB,EAAE,EAAE;IACxE,oCAAoC;IACpC,MAAM,cAAc,GAAG,IAAA,sBAAS,EAAC,SAAS,CAAC,aAAa,CAAC,CAAA;IACzD,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE;QAC1B,wFAAwF;QACxF,MAAM,IAAI,cAAc,CAAC,mBAAmB,EAAE,+BAA+B,SAAS,CAAC,aAAa,GAAG,CAAC,CAAA;KACzG;IACD,IAAI,cAAc,CAAC,KAAK,EAAE;QACxB,MAAM,IAAI,cAAc,CAAC,iBAAiB,EAAE,6BAA6B,SAAS,CAAC,aAAa,GAAG,CAAC,CAAA;KACrG;IACD,mCAAmC;IACnC,MAAM,iBAAiB,GAAG,IAAA,sBAAS,EAAC,SAAS,CAAC,gBAAgB,CAAC,CAAA;IAC/D,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE;QAC7B,MAAM,IAAI,cAAc,CACtB,YAAY,EACZ,gDAAgD,SAAS,CAAC,gBAAgB,GAAG,CAC9E,CAAA;KACF;IACD,IAAI,iBAAiB,CAAC,KAAK,EAAE;QAC3B,MAAM,IAAI,cAAc,CACtB,UAAU,EACV,uBAAuB,SAAS,CAAC,aAAa,YAAY,SAAS,CAAC,gBAAgB,cAAc,CACnG,CAAA;KACF;IAED,kDAAkD;IAClD,IAAI,SAAS,CAAC,kBAAkB,EAAE;QAChC,MAAM,QAAQ,GAAG,IAAA,2BAAmB,EAAC,SAAS,CAAC,kBAAkB,EAAE,SAAS,CAAC,YAAY,CAAC,CAAA;QAC1F,IAAI,QAAQ,EAAE;YACZ,MAAM,CAAC,KAAK,CAAC,IAAA,2CAAgC,EAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAA;SACpE;KACF;AACH,CAAC,CAAA;AAhCY,QAAA,eAAe,mBAgC3B"}
@@ -0,0 +1,2 @@
1
+ import { SpanCommand } from './span';
2
+ export declare const commands: (typeof SpanCommand)[];
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.commands = void 0;
4
+ /* eslint-disable import-x/order */
5
+ const span_1 = require("./span");
6
+ // prettier-ignore
7
+ exports.commands = [
8
+ span_1.SpanCommand,
9
+ ];
10
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../../src/commands/span/cli.ts"],"names":[],"mappings":";;;AAAA,mCAAmC;AACnC,iCAAkC;AAElC,kBAAkB;AACL,QAAA,QAAQ,GAAG;IACtB,kBAAW;CACZ,CAAA"}
@@ -0,0 +1,10 @@
1
+ import { CustomSpanCommand } from '../trace/helper';
2
+ export declare class SpanCommand extends CustomSpanCommand {
3
+ static paths: string[][];
4
+ static usage: import("clipanion").Usage;
5
+ private name;
6
+ private durationInMs;
7
+ private startTimeInMs;
8
+ private endTimeInMs;
9
+ execute(): Promise<number>;
10
+ }
@@ -0,0 +1,112 @@
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
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
26
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
27
+ return new (P || (P = Promise))(function (resolve, reject) {
28
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
29
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
30
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
31
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
32
+ });
33
+ };
34
+ Object.defineProperty(exports, "__esModule", { value: true });
35
+ exports.SpanCommand = void 0;
36
+ const clipanion_1 = require("clipanion");
37
+ const validation = __importStar(require("@datadog/datadog-ci-base/helpers/validation"));
38
+ const helper_1 = require("../trace/helper");
39
+ class SpanCommand extends helper_1.CustomSpanCommand {
40
+ constructor() {
41
+ super(...arguments);
42
+ this.name = clipanion_1.Option.String('--name');
43
+ this.durationInMs = clipanion_1.Option.String('--duration', {
44
+ validator: validation.isInteger(),
45
+ });
46
+ this.startTimeInMs = clipanion_1.Option.String('--start-time', {
47
+ validator: validation.isInteger(),
48
+ });
49
+ this.endTimeInMs = clipanion_1.Option.String('--end-time', {
50
+ validator: validation.isInteger(),
51
+ });
52
+ }
53
+ execute() {
54
+ return __awaiter(this, void 0, void 0, function* () {
55
+ this.tryEnableFips();
56
+ if (!this.name) {
57
+ this.context.stdout.write(`The span name must be provided.\n`);
58
+ return 1;
59
+ }
60
+ if ((this.startTimeInMs && !this.endTimeInMs) ||
61
+ (!this.startTimeInMs && this.endTimeInMs) ||
62
+ (this.durationInMs && (this.startTimeInMs || this.endTimeInMs))) {
63
+ this.context.stdout.write(`Either duration or start and end time must be provided.\n`);
64
+ return 1;
65
+ }
66
+ if (this.startTimeInMs && this.endTimeInMs) {
67
+ this.durationInMs = this.endTimeInMs - this.startTimeInMs;
68
+ }
69
+ if (!this.durationInMs) {
70
+ this.context.stdout.write(`The span duration must be provided or start-time and end-time.\n`);
71
+ return 1;
72
+ }
73
+ if (this.durationInMs < 0) {
74
+ this.context.stdout.write(`The span duration must be positive / end time must be after start time.\n`);
75
+ return 1;
76
+ }
77
+ const endTime = this.endTimeInMs ? new Date(this.endTimeInMs) : new Date();
78
+ const startTime = new Date(endTime.getTime() - this.durationInMs);
79
+ return this.executeReportCustomSpan(this.generateSpanId(), startTime, endTime, {
80
+ name: this.name,
81
+ error_message: '',
82
+ exit_code: 0,
83
+ command: 'datadog-ci trace span',
84
+ });
85
+ });
86
+ }
87
+ }
88
+ exports.SpanCommand = SpanCommand;
89
+ SpanCommand.paths = [['trace', 'span']];
90
+ SpanCommand.usage = clipanion_1.Command.Usage({
91
+ category: 'CI Visibility',
92
+ description: 'Report a custom span to Datadog with name, start / end time or duration, tags and measures.',
93
+ details: `
94
+ This command reports a span with custom name and custom duration to Datadog.\n
95
+ See README for details.
96
+ `,
97
+ examples: [
98
+ [
99
+ 'Create span with name "Get Dependencies" and duration of 10s and report to Datadog',
100
+ 'datadog-ci trace span --name "Get Dependencies" --duration 10000',
101
+ ],
102
+ [
103
+ 'Create span with name "Build" and duration of 10s using timestamps and report to Datadog',
104
+ 'datadog-ci trace span --name "Build" --start-time 1744357891967 --end-time 1744357901967',
105
+ ],
106
+ [
107
+ 'Create span with name "Get Dependencies" and duration of 10s and report to Datadog with tags and measures',
108
+ 'datadog-ci trace span --name "Get Dependencies" --duration 10000 --tags "dependency-set:notify" --measures "n-dependencies:42"',
109
+ ],
110
+ ],
111
+ });
112
+ //# sourceMappingURL=span.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"span.js","sourceRoot":"","sources":["../../../src/commands/span/span.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { TerraformUploadCommand } from './upload';
2
+ export declare const commands: (typeof TerraformUploadCommand)[];
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.commands = void 0;
4
+ /* eslint-disable import-x/order */
5
+ const upload_1 = require("./upload");
6
+ // prettier-ignore
7
+ exports.commands = [
8
+ upload_1.TerraformUploadCommand,
9
+ ];
10
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../../src/commands/terraform/cli.ts"],"names":[],"mappings":";;;AAAA,mCAAmC;AACnC,qCAA+C;AAE/C,kBAAkB;AACL,QAAA,QAAQ,GAAG;IACtB,+BAAsB;CACvB,CAAA"}
@@ -0,0 +1,14 @@
1
+ import { BaseCommand } from '../..';
2
+ export declare class TerraformUploadCommand extends BaseCommand {
3
+ static paths: string[][];
4
+ static usage: import("clipanion").Usage;
5
+ protected artifactType: "plan" | "state";
6
+ protected filePaths: string[];
7
+ protected repoId: string | undefined;
8
+ protected skipGitMetadataUpload: boolean;
9
+ protected verbose: boolean;
10
+ protected fips: boolean;
11
+ protected fipsIgnoreError: boolean;
12
+ protected dryRun: boolean;
13
+ execute(): Promise<number | void>;
14
+ }
@@ -0,0 +1,93 @@
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
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
26
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
27
+ return new (P || (P = Promise))(function (resolve, reject) {
28
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
29
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
30
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
31
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
32
+ });
33
+ };
34
+ Object.defineProperty(exports, "__esModule", { value: true });
35
+ exports.TerraformUploadCommand = void 0;
36
+ const clipanion_1 = require("clipanion");
37
+ const t = __importStar(require("typanion"));
38
+ const plugin_1 = require("@datadog/datadog-ci-base/helpers/plugin");
39
+ const __1 = require("../..");
40
+ class TerraformUploadCommand extends __1.BaseCommand {
41
+ constructor() {
42
+ super(...arguments);
43
+ // Artifact type: 'plan' or 'state'
44
+ this.artifactType = clipanion_1.Option.String({ required: true, validator: t.isEnum(['plan', 'state']) });
45
+ // File paths to upload (one or more)
46
+ this.filePaths = clipanion_1.Option.Rest({ required: 1 });
47
+ // Optional repo ID override
48
+ this.repoId = clipanion_1.Option.String('--repo-id', {
49
+ description: 'Repository identifier override (e.g., github.com/datadog/my-repo)',
50
+ });
51
+ // Skip git metadata upload
52
+ this.skipGitMetadataUpload = clipanion_1.Option.Boolean('--skip-git-metadata-upload', false, {
53
+ description: 'Skip the upload of git metadata',
54
+ });
55
+ // Verbose logging
56
+ this.verbose = clipanion_1.Option.Boolean('--verbose', false, {
57
+ description: 'Enable verbose logging',
58
+ });
59
+ // FIPS mode
60
+ this.fips = clipanion_1.Option.Boolean('--fips', false, { description: 'Enable FIPS mode for the command' });
61
+ this.fipsIgnoreError = clipanion_1.Option.Boolean('--fips-ignore-error', false, {
62
+ description: 'Ignore FIPS errors and continue execution',
63
+ });
64
+ // Dry run mode
65
+ this.dryRun = clipanion_1.Option.Boolean('--dry-run', false, {
66
+ description: 'Run the command in dry run mode, without uploading any data to Datadog',
67
+ });
68
+ }
69
+ execute() {
70
+ return __awaiter(this, void 0, void 0, function* () {
71
+ return (0, plugin_1.executePluginCommand)(this);
72
+ });
73
+ }
74
+ }
75
+ exports.TerraformUploadCommand = TerraformUploadCommand;
76
+ TerraformUploadCommand.paths = [['terraform', 'upload']];
77
+ TerraformUploadCommand.usage = clipanion_1.Command.Usage({
78
+ category: 'CI Visibility',
79
+ description: 'Upload Terraform plan or state files to Datadog.',
80
+ details: `
81
+ This command uploads Terraform runtime artifacts (plan or state JSON) to Datadog
82
+ for enhanced cloud-to-code mapping and policy evaluation.\n
83
+ See README for details.
84
+ `,
85
+ examples: [
86
+ ['Upload a Terraform plan file', 'datadog-ci terraform upload plan terraform-plan.json'],
87
+ ['Upload multiple Terraform plan files', 'datadog-ci terraform upload plan plan1.json plan2.json plan3.json'],
88
+ ['Upload a Terraform state file', 'datadog-ci terraform upload state terraform.tfstate'],
89
+ ['Upload with verbose output', 'datadog-ci terraform upload plan terraform-plan.json --verbose'],
90
+ ['Dry run mode', 'datadog-ci terraform upload plan terraform-plan.json --dry-run'],
91
+ ],
92
+ });
93
+ //# sourceMappingURL=upload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload.js","sourceRoot":"","sources":["../../../src/commands/terraform/upload.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,yCAAyC;AACzC,4CAA6B;AAE7B,oEAA4E;AAE5E,6BAAiC;AAEjC,MAAa,sBAAuB,SAAQ,eAAW;IAAvD;;QAoBE,mCAAmC;QACzB,iBAAY,GAAG,kBAAM,CAAC,MAAM,CAAC,EAAC,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,OAAO,CAAU,CAAC,EAAC,CAAC,CAAA;QAEzG,qCAAqC;QAC3B,cAAS,GAAG,kBAAM,CAAC,IAAI,CAAC,EAAC,QAAQ,EAAE,CAAC,EAAC,CAAC,CAAA;QAEhD,4BAA4B;QAClB,WAAM,GAAG,kBAAM,CAAC,MAAM,CAAC,WAAW,EAAE;YAC5C,WAAW,EAAE,mEAAmE;SACjF,CAAC,CAAA;QAEF,2BAA2B;QACjB,0BAAqB,GAAG,kBAAM,CAAC,OAAO,CAAC,4BAA4B,EAAE,KAAK,EAAE;YACpF,WAAW,EAAE,iCAAiC;SAC/C,CAAC,CAAA;QAEF,kBAAkB;QACR,YAAO,GAAG,kBAAM,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,EAAE;YACrD,WAAW,EAAE,wBAAwB;SACtC,CAAC,CAAA;QAEF,YAAY;QACF,SAAI,GAAG,kBAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAC,WAAW,EAAE,kCAAkC,EAAC,CAAC,CAAA;QACzF,oBAAe,GAAG,kBAAM,CAAC,OAAO,CAAC,qBAAqB,EAAE,KAAK,EAAE;YACvE,WAAW,EAAE,2CAA2C;SACzD,CAAC,CAAA;QAEF,eAAe;QACL,WAAM,GAAG,kBAAM,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,EAAE;YACpD,WAAW,EAAE,wEAAwE;SACtF,CAAC,CAAA;IAKJ,CAAC;IAHc,OAAO;;YAClB,OAAO,IAAA,6BAAoB,EAAC,IAAI,CAAC,CAAA;QACnC,CAAC;KAAA;;AAtDH,wDAuDC;AAtDe,4BAAK,GAAG,CAAC,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC,AAA5B,CAA4B;AAEjC,4BAAK,GAAG,mBAAO,CAAC,KAAK,CAAC;IAClC,QAAQ,EAAE,eAAe;IACzB,WAAW,EAAE,kDAAkD;IAC/D,OAAO,EAAE;;;;KAIR;IACD,QAAQ,EAAE;QACR,CAAC,8BAA8B,EAAE,sDAAsD,CAAC;QACxF,CAAC,sCAAsC,EAAE,mEAAmE,CAAC;QAC7G,CAAC,+BAA+B,EAAE,qDAAqD,CAAC;QACxF,CAAC,4BAA4B,EAAE,gEAAgE,CAAC;QAChG,CAAC,cAAc,EAAE,gEAAgE,CAAC;KACnF;CACF,CAAC,AAfiB,CAejB"}
@@ -0,0 +1,6 @@
1
+ import type { AxiosPromise, AxiosRequestConfig, AxiosResponse } from 'axios';
2
+ import { Payload } from './interfaces';
3
+ export declare const reportCustomSpan: (request: (args: AxiosRequestConfig) => AxiosPromise<AxiosResponse>) => (customSpan: Payload) => Promise<AxiosResponse<AxiosResponse<any, any, {}>, any, {}>>;
4
+ export declare const apiConstructor: (baseUrl: string, apiKey: string) => {
5
+ reportCustomSpan: (customSpan: Payload) => Promise<AxiosResponse<AxiosResponse<any, any, {}>, any, {}>>;
6
+ };
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.apiConstructor = exports.reportCustomSpan = void 0;
13
+ const utils_1 = require("@datadog/datadog-ci-base/helpers/utils");
14
+ // Dependency follows-redirects sets a default maxBodyLength of 10 MB https://github.com/follow-redirects/follow-redirects/blob/b774a77e582b97174813b3eaeb86931becba69db/index.js#L391
15
+ // We don't want any hard limit enforced by the CLI, the backend will enforce a max size by returning 413 errors.
16
+ const maxBodyLength = Infinity;
17
+ const reportCustomSpan = (request) => (customSpan) => __awaiter(void 0, void 0, void 0, function* () {
18
+ return request({
19
+ data: {
20
+ data: {
21
+ type: 'ci_app_custom_span',
22
+ attributes: customSpan,
23
+ },
24
+ },
25
+ maxBodyLength,
26
+ method: 'POST',
27
+ url: '/api/intake/ci/custom_spans',
28
+ });
29
+ });
30
+ exports.reportCustomSpan = reportCustomSpan;
31
+ const apiConstructor = (baseUrl, apiKey) => {
32
+ const requestIntake = (0, utils_1.getRequestBuilder)({ baseUrl, apiKey });
33
+ return {
34
+ reportCustomSpan: (0, exports.reportCustomSpan)(requestIntake),
35
+ };
36
+ };
37
+ exports.apiConstructor = apiConstructor;
38
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../../src/commands/trace/api.ts"],"names":[],"mappings":";;;;;;;;;;;;AAEA,kEAAwE;AAIxE,sLAAsL;AACtL,iHAAiH;AACjH,MAAM,aAAa,GAAG,QAAQ,CAAA;AAEvB,MAAM,gBAAgB,GAC3B,CAAC,OAAkE,EAAE,EAAE,CAAC,CAAO,UAAmB,EAAE,EAAE;IACpG,OAAO,OAAO,CAAC;QACb,IAAI,EAAE;YACJ,IAAI,EAAE;gBACJ,IAAI,EAAE,oBAAoB;gBAC1B,UAAU,EAAE,UAAU;aACvB;SACF;QACD,aAAa;QACb,MAAM,EAAE,MAAM;QACd,GAAG,EAAE,6BAA6B;KACnC,CAAC,CAAA;AACJ,CAAC,CAAA,CAAA;AAbU,QAAA,gBAAgB,oBAa1B;AAEI,MAAM,cAAc,GAAG,CAAC,OAAe,EAAE,MAAc,EAAE,EAAE;IAChE,MAAM,aAAa,GAAG,IAAA,yBAAiB,EAAC,EAAC,OAAO,EAAE,MAAM,EAAC,CAAC,CAAA;IAE1D,OAAO;QACL,gBAAgB,EAAE,IAAA,wBAAgB,EAAC,aAAa,CAAC;KAClD,CAAA;AACH,CAAC,CAAA;AANY,QAAA,cAAc,kBAM1B"}
@@ -0,0 +1,2 @@
1
+ import { TraceCommand } from './trace';
2
+ export declare const commands: (typeof TraceCommand)[];
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.commands = void 0;
4
+ /* eslint-disable import-x/order */
5
+ const trace_1 = require("./trace");
6
+ // prettier-ignore
7
+ exports.commands = [
8
+ trace_1.TraceCommand,
9
+ ];
10
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../../src/commands/trace/cli.ts"],"names":[],"mappings":";;;AAAA,mCAAmC;AACnC,mCAAoC;AAEpC,kBAAkB;AACL,QAAA,QAAQ,GAAG;IACtB,oBAAY;CACb,CAAA"}
@@ -0,0 +1,16 @@
1
+ import { BaseCommand } from '@datadog/datadog-ci-base';
2
+ export declare abstract class CustomSpanCommand extends BaseCommand {
3
+ private measures;
4
+ private dryRun;
5
+ private tags;
6
+ private fips;
7
+ private fipsIgnoreError;
8
+ private config;
9
+ protected generateSpanId(): string;
10
+ protected tryEnableFips(): void;
11
+ protected executeReportCustomSpan(id: string, startTime: Date, endTime: Date, extraTags: Record<string, any>): Promise<number>;
12
+ private getApiHelper;
13
+ private getBaseIntakeUrl;
14
+ private reportCustomSpan;
15
+ private handleError;
16
+ }
@@ -0,0 +1,125 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.CustomSpanCommand = void 0;
16
+ const crypto_1 = __importDefault(require("crypto"));
17
+ const chalk_1 = __importDefault(require("chalk"));
18
+ const clipanion_1 = require("clipanion");
19
+ const datadog_ci_base_1 = require("@datadog/datadog-ci-base");
20
+ const constants_1 = require("@datadog/datadog-ci-base/constants");
21
+ const ci_1 = require("@datadog/datadog-ci-base/helpers/ci");
22
+ const env_1 = require("@datadog/datadog-ci-base/helpers/env");
23
+ const fips_1 = require("@datadog/datadog-ci-base/helpers/fips");
24
+ const format_git_span_data_1 = require("@datadog/datadog-ci-base/helpers/git/format-git-span-data");
25
+ const retry_1 = require("@datadog/datadog-ci-base/helpers/retry");
26
+ const tags_1 = require("@datadog/datadog-ci-base/helpers/tags");
27
+ const user_provided_git_1 = require("@datadog/datadog-ci-base/helpers/user-provided-git");
28
+ const api_1 = require("./api");
29
+ const interfaces_1 = require("./interfaces");
30
+ class CustomSpanCommand extends datadog_ci_base_1.BaseCommand {
31
+ constructor() {
32
+ var _a, _b;
33
+ super(...arguments);
34
+ this.measures = clipanion_1.Option.Array('--measures');
35
+ this.dryRun = clipanion_1.Option.Boolean('--dry-run');
36
+ this.tags = clipanion_1.Option.Array('--tags');
37
+ this.fips = clipanion_1.Option.Boolean('--fips', false);
38
+ this.fipsIgnoreError = clipanion_1.Option.Boolean('--fips-ignore-error', false);
39
+ this.config = {
40
+ apiKey: process.env.DATADOG_API_KEY || process.env.DD_API_KEY,
41
+ envVarTags: process.env.DD_TAGS,
42
+ fips: (_a = (0, env_1.toBoolean)(process.env[constants_1.FIPS_ENV_VAR])) !== null && _a !== void 0 ? _a : false,
43
+ fipsIgnoreError: (_b = (0, env_1.toBoolean)(process.env[constants_1.FIPS_IGNORE_ERROR_ENV_VAR])) !== null && _b !== void 0 ? _b : false,
44
+ };
45
+ }
46
+ generateSpanId() {
47
+ return crypto_1.default.randomBytes(5).toString('hex');
48
+ }
49
+ tryEnableFips() {
50
+ (0, fips_1.enableFips)(this.fips || this.config.fips, this.fipsIgnoreError || this.config.fipsIgnoreError);
51
+ }
52
+ executeReportCustomSpan(id, startTime, endTime, extraTags) {
53
+ return __awaiter(this, void 0, void 0, function* () {
54
+ const provider = (0, ci_1.getCIProvider)();
55
+ if (!interfaces_1.SUPPORTED_PROVIDERS.includes(provider)) {
56
+ this.context.stdout.write(`Unsupported CI provider "${provider}". Supported providers are: ${interfaces_1.SUPPORTED_PROVIDERS.join(', ')}\n`);
57
+ return 1;
58
+ }
59
+ const realGithubJobName = (0, ci_1.getGithubJobNameFromLogs)(this.context);
60
+ const ciSpanTags = (0, ci_1.getCISpanTags)(realGithubJobName);
61
+ const envVarTags = this.config.envVarTags ? (0, tags_1.parseTags)(this.config.envVarTags.split(',')) : {};
62
+ const cliTags = this.tags ? (0, tags_1.parseTags)(this.tags) : {};
63
+ const cliMeasures = this.measures ? (0, tags_1.parseTags)(this.measures) : {};
64
+ const measures = Object.entries(cliMeasures).reduce((acc, [key, value]) => {
65
+ const parsedValue = parseFloat(value);
66
+ if (!isNaN(parsedValue)) {
67
+ return Object.assign(Object.assign({}, acc), { [key]: parsedValue });
68
+ }
69
+ return acc;
70
+ }, {});
71
+ const gitSpanTags = yield (0, format_git_span_data_1.getGitMetadata)();
72
+ const userGitSpanTags = (0, user_provided_git_1.getUserGitSpanTags)();
73
+ yield this.reportCustomSpan({
74
+ start_time: startTime.toISOString(),
75
+ end_time: endTime.toISOString(),
76
+ ci_provider: provider,
77
+ span_id: id,
78
+ tags: Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, gitSpanTags), ciSpanTags), userGitSpanTags), cliTags), envVarTags),
79
+ measures,
80
+ command: extraTags.command,
81
+ name: extraTags.name,
82
+ error_message: extraTags.error_message,
83
+ exit_code: extraTags.exit_code,
84
+ });
85
+ return 0;
86
+ });
87
+ }
88
+ getApiHelper() {
89
+ if (!this.config.apiKey) {
90
+ this.context.stdout.write(`Neither ${chalk_1.default.red.bold('DATADOG_API_KEY')} nor ${chalk_1.default.red.bold('DD_API_KEY')} is in your environment.\n`);
91
+ throw new Error('API key is missing');
92
+ }
93
+ return (0, api_1.apiConstructor)(this.getBaseIntakeUrl(), this.config.apiKey);
94
+ }
95
+ getBaseIntakeUrl() {
96
+ const site = process.env.DATADOG_SITE || process.env.DD_SITE || 'datadoghq.com';
97
+ return `https://api.${site}`;
98
+ }
99
+ reportCustomSpan(payload) {
100
+ return __awaiter(this, void 0, void 0, function* () {
101
+ if (this.dryRun) {
102
+ this.context.stdout.write(`${chalk_1.default.green.bold('[DRY-RUN]')} Reporting custom span: ${JSON.stringify(payload)}\n`);
103
+ return;
104
+ }
105
+ const api = this.getApiHelper();
106
+ try {
107
+ yield (0, retry_1.retryRequest)(() => api.reportCustomSpan(payload), {
108
+ onRetry: (e, attempt) => {
109
+ this.context.stderr.write(chalk_1.default.yellow(`[attempt ${attempt}] Could not report custom span. Retrying...: ${e.message}\n`));
110
+ },
111
+ retries: 5,
112
+ });
113
+ }
114
+ catch (error) {
115
+ this.handleError(error);
116
+ }
117
+ });
118
+ }
119
+ handleError(error) {
120
+ this.context.stderr.write(`${chalk_1.default.red.bold('[ERROR]')} Failed to report custom span: ` +
121
+ `${error.response ? JSON.stringify(error.response.data, undefined, 2) : ''}\n`);
122
+ }
123
+ }
124
+ exports.CustomSpanCommand = CustomSpanCommand;
125
+ //# sourceMappingURL=helper.js.map