@jupiterone/integration-sdk-cli 6.17.0 → 6.21.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 (38) hide show
  1. package/dist/src/commands/document.js +31 -2
  2. package/dist/src/commands/document.js.map +1 -1
  3. package/dist/src/commands/index.d.ts +1 -0
  4. package/dist/src/commands/index.js +1 -0
  5. package/dist/src/commands/index.js.map +1 -1
  6. package/dist/src/commands/validate-question-file.d.ts +2 -0
  7. package/dist/src/commands/validate-question-file.js +70 -0
  8. package/dist/src/commands/validate-question-file.js.map +1 -0
  9. package/dist/src/index.js +2 -1
  10. package/dist/src/index.js.map +1 -1
  11. package/dist/src/questions/managedQuestionFileValidator.d.ts +53 -0
  12. package/dist/src/questions/managedQuestionFileValidator.js +140 -0
  13. package/dist/src/questions/managedQuestionFileValidator.js.map +1 -0
  14. package/dist/src/services/queryLanguage.d.ts +21 -0
  15. package/dist/src/services/queryLanguage.js +34 -0
  16. package/dist/src/services/queryLanguage.js.map +1 -0
  17. package/dist/tsconfig.dist.tsbuildinfo +845 -12
  18. package/package.json +7 -4
  19. package/src/__tests__/__snapshots__/cli.test.ts.snap +52 -5
  20. package/src/__tests__/cli/validate-question-file.test.ts +24 -0
  21. package/src/__tests__/cli.test.ts +4 -0
  22. package/src/commands/document.ts +39 -2
  23. package/src/commands/index.ts +1 -0
  24. package/src/commands/validate-question-file.ts +82 -0
  25. package/src/index.ts +3 -1
  26. package/src/questions/__fixtures__/questions/basic.yaml +15 -0
  27. package/src/questions/__fixtures__/questions/compliance.yaml +41 -0
  28. package/src/questions/__fixtures__/questions/empty-questions.yaml +4 -0
  29. package/src/questions/__fixtures__/questions/invalid-yaml.yaml +16 -0
  30. package/src/questions/__fixtures__/questions/multiple-queries.yaml +17 -0
  31. package/src/questions/__fixtures__/questions/multiple-questions.yaml +27 -0
  32. package/src/questions/__fixtures__/questions/non-unique-question-id.yaml +28 -0
  33. package/src/questions/__fixtures__/questions/non-unique-question-name.yaml +18 -0
  34. package/src/questions/__fixtures__/questions/non-unique-question-tag.yaml +17 -0
  35. package/src/questions/__fixtures__/questions/non-unique-question-title.yaml +28 -0
  36. package/src/questions/managedQuestionFileValidator.test.ts +175 -0
  37. package/src/questions/managedQuestionFileValidator.ts +180 -0
  38. package/src/services/queryLanguage.ts +46 -0
@@ -101,9 +101,28 @@ function generateRelationshipTableFromAllStepEntityMetadata(metadata) {
101
101
  ]);
102
102
  return generated;
103
103
  }
104
+ function generateMappedRelationshipTableFromAllStepEntityMetadata(metadata) {
105
+ const generated = table([
106
+ [
107
+ 'Source Entity `_type`',
108
+ 'Relationship `_class`',
109
+ 'Target Entity `_type`',
110
+ 'Direction',
111
+ ],
112
+ ...metadata.map((v) => [
113
+ `\`${v.sourceType}\``,
114
+ `**${v._class}**`,
115
+ `\`*${v.targetType}*\``,
116
+ `${v.direction}`,
117
+ ]),
118
+ ]);
119
+ return generated;
120
+ }
104
121
  function generateGraphObjectDocumentationFromStepsMetadata(metadata) {
122
+ var _a;
105
123
  let entitySection = '';
106
124
  let relationshipSection = '';
125
+ let mappedRelationshipSection = '';
107
126
  if (metadata.entities.length) {
108
127
  const generatedEntityTable = generateEntityTableFromAllStepEntityMetadata(metadata.entities);
109
128
  entitySection += `
@@ -120,9 +139,19 @@ ${generatedEntityTable}`;
120
139
 
121
140
  ### Relationships
122
141
 
123
- The following relationships are created/mapped:
142
+ The following relationships are created:
124
143
 
125
144
  ${generatedRelationshipTable}`;
145
+ }
146
+ if ((_a = metadata.mappedRelationships) === null || _a === void 0 ? void 0 : _a.length) {
147
+ const generatedMappedRelationshipTable = generateMappedRelationshipTableFromAllStepEntityMetadata(metadata.mappedRelationships);
148
+ mappedRelationshipSection += `
149
+
150
+ ### Mapped Relationships
151
+
152
+ The following mapped relationships are created:
153
+
154
+ ${generatedMappedRelationshipTable}`;
126
155
  }
127
156
  return `${J1_DOCUMENTATION_MARKER_START}
128
157
  <!--
@@ -135,7 +164,7 @@ https://github.com/JupiterOne/sdk/blob/main/docs/integrations/development.md
135
164
  ********************************************************************************
136
165
  -->
137
166
 
138
- ## Data Model${entitySection}${relationshipSection}
167
+ ## Data Model${entitySection}${relationshipSection}${mappedRelationshipSection}
139
168
 
140
169
  <!--
141
170
  ********************************************************************************
@@ -1 +1 @@
1
- {"version":3,"file":"document.js","sourceRoot":"","sources":["../../../src/commands/document.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA,yCAA0C;AAC1C,2BAAoC;AACpC,2CAA6B;AAQ7B,4CAA8B;AAC9B,gFAG2C;AAE3C,MAAM,KAAK,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;AAExC,MAAM,6BAA6B,GACjC,0CAA0C,CAAC;AAC7C,MAAM,2BAA2B,GAAG,wCAAwC,CAAC;AAM7E,SAAgB,QAAQ;IACtB,OAAO,yBAAa,CAAC,UAAU,CAAC;SAC7B,WAAW,CAAC,sCAAsC,CAAC;SACnD,MAAM,CACL,gCAAgC,EAChC,gDAAgD,EAChD,OAAO,CAAC,GAAG,EAAE,CACd;SACA,MAAM,CACL,0BAA0B,EAC1B,kDAAkD,EAClD,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,eAAe,CAAC,CACnC;SACA,MAAM,CAAC,qBAAqB,CAAC,CAAC;AACnC,CAAC;AAdD,4BAcC;AAED,KAAK,UAAU,qBAAqB,CAClC,OAA4B;IAE5B,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC;IAC5C,MAAM,qBAAqB,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;IAEjE,GAAG,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;IACxD,MAAM,QAAQ,GAAG,MAAM,mDAAwB,CAAC;QAC9C,WAAW;KACZ,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,MAAM,EAAE;QAC/D,GAAG,CAAC,IAAI,CACN,4EAA4E,CAC7E,CAAC;QACF,OAAO;KACR;IAED,GAAG,CAAC,IAAI,CACN,0DAA0D,qBAAqB,MAAM,CACtF,CAAC;IACF,MAAM,oBAAoB,GAAG,MAAM,oBAAoB,CACrD,qBAAqB,CACtB,CAAC;IACF,GAAG,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAC;IAEjE,MAAM,gCAAgC,GAAG,iDAAiD,CACxF,QAAQ,CACT,CAAC;IAEF,GAAG,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;IAC3D,GAAG,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;IAC5D,GAAG,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;IAE3C,MAAM,oBAAoB,GAAG,6BAA6B,CACxD,oBAAoB,EACpB,gCAAgC,CACjC,CAAC;IAEF,GAAG,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;IAErD,MAAM,aAAE,CAAC,SAAS,CAAC,qBAAqB,EAAE,oBAAoB,EAAE;QAC9D,QAAQ,EAAE,OAAO;KAClB,CAAC,CAAC;IAEH,GAAG,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;AACpD,CAAC;AAED,KAAK,UAAU,oBAAoB,CACjC,qBAA6B;IAE7B,IAAI;QACF,MAAM,IAAI,GAAG,MAAM,aAAE,CAAC,QAAQ,CAAC,qBAAqB,EAAE;YACpD,QAAQ,EAAE,OAAO;SAClB,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;KACb;IAAC,OAAO,GAAG,EAAE;QACZ,GAAG,CAAC,KAAK,CACP,oDAAoD,qBAAqB,SAAS,GAAG,CAAC,OAAO,GAAG,CACjG,CAAC;QACF,MAAM,GAAG,CAAC;KACX;AACH,CAAC;AAED,SAAS,kCAAkC,CAAC,MAAyB;IACnE,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE;QAC9B,OAAO,KAAK,MAAM,IAAI,CAAC;KACxB;IAED,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,4CAA4C,CACnD,QAA8B;IAE9B,MAAM,SAAS,GAAG,KAAK,CAAC;QACtB,CAAC,WAAW,EAAE,gBAAgB,EAAE,iBAAiB,CAAC;QAClD,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;YACrB,CAAC,CAAC,YAAY;YACd,KAAK,CAAC,CAAC,KAAK,IAAI;YAChB,kCAAkC,CAAC,CAAC,CAAC,MAAM,CAAC;SAC7C,CAAC;KACH,CAAC,CAAC;IAEH,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,kDAAkD,CACzD,QAAoC;IAEpC,MAAM,SAAS,GAAG,KAAK,CAAC;QACtB,CAAC,uBAAuB,EAAE,uBAAuB,EAAE,uBAAuB,CAAC;QAC3E,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;YACrB,KAAK,CAAC,CAAC,UAAU,IAAI;YACrB,KAAK,CAAC,CAAC,MAAM,IAAI;YACjB,KAAK,CAAC,CAAC,UAAU,IAAI;SACtB,CAAC;KACH,CAAC,CAAC;IAEH,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,iDAAiD,CACxD,QAA2C;IAE3C,IAAI,aAAa,GAAG,EAAE,CAAC;IACvB,IAAI,mBAAmB,GAAG,EAAE,CAAC;IAE7B,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE;QAC5B,MAAM,oBAAoB,GAAG,4CAA4C,CACvE,QAAQ,CAAC,QAAQ,CAClB,CAAC;QAEF,aAAa,IAAI;;;;;;EAMnB,oBAAoB,EAAE,CAAC;KACtB;IAED,IAAI,QAAQ,CAAC,aAAa,CAAC,MAAM,EAAE;QACjC,MAAM,0BAA0B,GAAG,kDAAkD,CACnF,QAAQ,CAAC,aAAa,CACvB,CAAC;QAEF,mBAAmB,IAAI;;;;;;EAMzB,0BAA0B,EAAE,CAAC;KAC5B;IAED,OAAO,GAAG,6BAA6B;;;;;;;;;;;eAW1B,aAAa,GAAG,mBAAmB;;;;;;;EAOhD,2BAA2B,EAAE,CAAC;AAChC,CAAC;AAED,SAAS,6BAA6B,CACpC,oBAA4B,EAC5B,gCAAwC;IAExC,MAAM,UAAU,GAAG,oBAAoB,CAAC,OAAO,CAC7C,6BAA6B,CAC9B,CAAC;IAEF,IAAI,UAAU,KAAK,CAAC,CAAC,EAAE;QACrB,OAAO,oBAAoB,GAAG,MAAM,GAAG,gCAAgC,CAAC;KACzE;IAED,MAAM,QAAQ,GAAG,oBAAoB,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC;IAE3E,IAAI,QAAQ,KAAK,CAAC,CAAC,EAAE;QACnB,MAAM,IAAI,KAAK,CACb,oGAAoG,CACrG,CAAC;KACH;IAED,OAAO,CACL,oBAAoB,CAAC,SAAS,CAAC,CAAC,EAAE,UAAU,CAAC;QAC7C,gCAAgC;QAChC,oBAAoB,CAAC,SAAS;QAC5B,yEAAyE;QACzE,yCAAyC;QACzC,QAAQ,GAAG,2BAA2B,CAAC,MAAM,CAC9C,CACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"document.js","sourceRoot":"","sources":["../../../src/commands/document.ts"],"names":[],"mappings":"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"}
@@ -5,3 +5,4 @@ export * from './sync';
5
5
  export * from './run';
6
6
  export * from './document';
7
7
  export * from './visualize-types';
8
+ export * from './validate-question-file';
@@ -17,4 +17,5 @@ __exportStar(require("./sync"), exports);
17
17
  __exportStar(require("./run"), exports);
18
18
  __exportStar(require("./document"), exports);
19
19
  __exportStar(require("./visualize-types"), exports);
20
+ __exportStar(require("./validate-question-file"), exports);
20
21
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/index.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,4CAA0B;AAC1B,yCAAuB;AACvB,8CAA4B;AAC5B,yCAAuB;AACvB,wCAAsB;AACtB,6CAA2B;AAC3B,oDAAkC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/index.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,4CAA0B;AAC1B,yCAAuB;AACvB,8CAA4B;AAC5B,yCAAuB;AACvB,wCAAsB;AACtB,6CAA2B;AAC3B,oDAAkC;AAClC,2DAAyC"}
@@ -0,0 +1,2 @@
1
+ export declare function getDefaultQuestionFilePath(): string;
2
+ export declare function validateQuestionFile(): import("commander").Command;
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
11
+ }) : function(o, v) {
12
+ o["default"] = v;
13
+ });
14
+ var __importStar = (this && this.__importStar) || function (mod) {
15
+ if (mod && mod.__esModule) return mod;
16
+ var result = {};
17
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
+ __setModuleDefault(result, mod);
19
+ return result;
20
+ };
21
+ Object.defineProperty(exports, "__esModule", { value: true });
22
+ exports.validateQuestionFile = exports.getDefaultQuestionFilePath = void 0;
23
+ const commander_1 = require("commander");
24
+ const log = __importStar(require("../log"));
25
+ const managedQuestionFileValidator_1 = require("../questions/managedQuestionFileValidator");
26
+ const integration_sdk_runtime_1 = require("@jupiterone/integration-sdk-runtime");
27
+ const path = __importStar(require("path"));
28
+ function getDefaultQuestionFilePath() {
29
+ return path.join(process.cwd(), './jupiterone/questions/questions.yaml');
30
+ }
31
+ exports.getDefaultQuestionFilePath = getDefaultQuestionFilePath;
32
+ function validateQuestionFile() {
33
+ return commander_1.createCommand('validate-question-file')
34
+ .description('validates an integration questions file')
35
+ .requiredOption('-p, --file-path <filePath>', 'absolute path to managed question file', getDefaultQuestionFilePath())
36
+ .option('-a, --jupiterone-account-id <jupiteroneAccountId>', 'J1 account ID used to validate J1QL queries')
37
+ .option('-k, --jupiterone-api-key <jupiteroneApiKey>', 'J1 API key used to validate J1QL queries')
38
+ .option('-d, --dry-run', 'skip making HTTP requests to validate J1QL queries')
39
+ .action(executeValidateQuestionFileAction);
40
+ }
41
+ exports.validateQuestionFile = validateQuestionFile;
42
+ async function executeValidateQuestionFileAction(options) {
43
+ const { filePath, jupiteroneAccountId, jupiteroneApiKey, dryRun } = options;
44
+ log.info(`\nRunning validate-question-file action (path=${filePath}, accountId=${jupiteroneAccountId}, dryRun=${dryRun})...\n`);
45
+ let apiClient;
46
+ if (!dryRun && (!jupiteroneAccountId || !jupiteroneApiKey)) {
47
+ throw new Error('Must provide J1 account ID and API key (except for --dry-run)');
48
+ }
49
+ else if (!dryRun && jupiteroneAccountId && jupiteroneApiKey) {
50
+ apiClient = integration_sdk_runtime_1.createApiClient({
51
+ apiBaseUrl: integration_sdk_runtime_1.getApiBaseUrl({
52
+ dev: !!process.env.JUPITERONE_DEV,
53
+ }),
54
+ account: jupiteroneAccountId,
55
+ accessToken: jupiteroneApiKey,
56
+ });
57
+ }
58
+ try {
59
+ await managedQuestionFileValidator_1.validateManagedQuestionFile({
60
+ filePath,
61
+ apiClient,
62
+ });
63
+ }
64
+ catch (err) {
65
+ log.error('Failed to validate managed question file!');
66
+ throw err;
67
+ }
68
+ log.info('Successfully validated managed question file!');
69
+ }
70
+ //# sourceMappingURL=validate-question-file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-question-file.js","sourceRoot":"","sources":["../../../src/commands/validate-question-file.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA,yCAA0C;AAC1C,4CAA8B;AAE9B,4FAAwF;AACxF,iFAI6C;AAC7C,2CAA6B;AAS7B,SAAgB,0BAA0B;IACxC,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,uCAAuC,CAAC,CAAC;AAC3E,CAAC;AAFD,gEAEC;AAED,SAAgB,oBAAoB;IAClC,OAAO,yBAAa,CAAC,wBAAwB,CAAC;SAC3C,WAAW,CAAC,yCAAyC,CAAC;SACtD,cAAc,CACb,4BAA4B,EAC5B,wCAAwC,EACxC,0BAA0B,EAAE,CAC7B;SACA,MAAM,CACL,mDAAmD,EACnD,6CAA6C,CAC9C;SACA,MAAM,CACL,6CAA6C,EAC7C,0CAA0C,CAC3C;SACA,MAAM,CACL,eAAe,EACf,oDAAoD,CACrD;SACA,MAAM,CAAC,iCAAiC,CAAC,CAAC;AAC/C,CAAC;AArBD,oDAqBC;AAED,KAAK,UAAU,iCAAiC,CAC9C,OAAwC;IAExC,MAAM,EAAE,QAAQ,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAE5E,GAAG,CAAC,IAAI,CACN,iDAAiD,QAAQ,eAAe,mBAAmB,YAAY,MAAM,QAAQ,CACtH,CAAC;IAEF,IAAI,SAAgC,CAAC;IAErC,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,mBAAmB,IAAI,CAAC,gBAAgB,CAAC,EAAE;QAC1D,MAAM,IAAI,KAAK,CACb,+DAA+D,CAChE,CAAC;KACH;SAAM,IAAI,CAAC,MAAM,IAAI,mBAAmB,IAAI,gBAAgB,EAAE;QAC7D,SAAS,GAAG,yCAAe,CAAC;YAC1B,UAAU,EAAE,uCAAa,CAAC;gBACxB,GAAG,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc;aAClC,CAAC;YACF,OAAO,EAAE,mBAAmB;YAC5B,WAAW,EAAE,gBAAgB;SAC9B,CAAC,CAAC;KACJ;IAED,IAAI;QACF,MAAM,0DAA2B,CAAC;YAChC,QAAQ;YACR,SAAS;SACV,CAAC,CAAC;KACJ;IAAC,OAAO,GAAG,EAAE;QACZ,GAAG,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC;QACvD,MAAM,GAAG,CAAC;KACX;IAED,GAAG,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;AAC5D,CAAC"}
package/dist/src/index.js CHANGED
@@ -11,7 +11,8 @@ function createCli() {
11
11
  .addCommand(commands_1.sync())
12
12
  .addCommand(commands_1.run())
13
13
  .addCommand(commands_1.visualizeTypes())
14
- .addCommand(commands_1.document());
14
+ .addCommand(commands_1.document())
15
+ .addCommand(commands_1.validateQuestionFile());
15
16
  }
16
17
  exports.createCli = createCli;
17
18
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;AAAA,yCAA0C;AAE1C,yCAQoB;AAEpB,SAAgB,SAAS;IACvB,OAAO,yBAAa,EAAE;SACnB,UAAU,CAAC,kBAAO,EAAE,CAAC;SACrB,UAAU,CAAC,eAAI,EAAE,CAAC;SAClB,UAAU,CAAC,oBAAS,EAAE,CAAC;SACvB,UAAU,CAAC,eAAI,EAAE,CAAC;SAClB,UAAU,CAAC,cAAG,EAAE,CAAC;SACjB,UAAU,CAAC,yBAAc,EAAE,CAAC;SAC5B,UAAU,CAAC,mBAAQ,EAAE,CAAC,CAAC;AAC5B,CAAC;AATD,8BASC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;AAAA,yCAA0C;AAE1C,yCASoB;AAEpB,SAAgB,SAAS;IACvB,OAAO,yBAAa,EAAE;SACnB,UAAU,CAAC,kBAAO,EAAE,CAAC;SACrB,UAAU,CAAC,eAAI,EAAE,CAAC;SAClB,UAAU,CAAC,oBAAS,EAAE,CAAC;SACvB,UAAU,CAAC,eAAI,EAAE,CAAC;SAClB,UAAU,CAAC,cAAG,EAAE,CAAC;SACjB,UAAU,CAAC,yBAAc,EAAE,CAAC;SAC5B,UAAU,CAAC,mBAAQ,EAAE,CAAC;SACtB,UAAU,CAAC,+BAAoB,EAAE,CAAC,CAAC;AACxC,CAAC;AAVD,8BAUC"}
@@ -0,0 +1,53 @@
1
+ import { ApiClient } from '@jupiterone/integration-sdk-runtime';
2
+ import * as Runtypes from 'runtypes';
3
+ export declare const ManagedQuestionQueryRecord: Runtypes.Record<{
4
+ name: Runtypes.Union2<Runtypes.String, Runtypes.Literal<undefined>>;
5
+ query: Runtypes.String;
6
+ }, false>;
7
+ export declare const ManagedQuestionComplianceDetailsRecord: Runtypes.Record<{
8
+ standard: Runtypes.String;
9
+ requirements: Runtypes.Union2<Runtypes.Array<Runtypes.String, false>, Runtypes.Literal<undefined>>;
10
+ controls: Runtypes.Union2<Runtypes.Array<Runtypes.String, false>, Runtypes.Literal<undefined>>;
11
+ }, false>;
12
+ export declare const ManagedQuestionRecord: Runtypes.Record<{
13
+ id: Runtypes.String;
14
+ title: Runtypes.String;
15
+ description: Runtypes.String;
16
+ queries: Runtypes.Array<Runtypes.Record<{
17
+ name: Runtypes.Union2<Runtypes.String, Runtypes.Literal<undefined>>;
18
+ query: Runtypes.String;
19
+ }, false>, false>;
20
+ tags: Runtypes.Array<Runtypes.String, false>;
21
+ compliance: Runtypes.Union2<Runtypes.Array<Runtypes.Record<{
22
+ standard: Runtypes.String;
23
+ requirements: Runtypes.Union2<Runtypes.Array<Runtypes.String, false>, Runtypes.Literal<undefined>>;
24
+ controls: Runtypes.Union2<Runtypes.Array<Runtypes.String, false>, Runtypes.Literal<undefined>>;
25
+ }, false>, false>, Runtypes.Literal<undefined>>;
26
+ }, false>;
27
+ export declare const QuestionUploadFileDataRecord: Runtypes.Record<{
28
+ integrationDefinitionId: Runtypes.String;
29
+ sourceId: Runtypes.String;
30
+ questions: Runtypes.Array<Runtypes.Record<{
31
+ id: Runtypes.String;
32
+ title: Runtypes.String;
33
+ description: Runtypes.String;
34
+ queries: Runtypes.Array<Runtypes.Record<{
35
+ name: Runtypes.Union2<Runtypes.String, Runtypes.Literal<undefined>>;
36
+ query: Runtypes.String;
37
+ }, false>, false>;
38
+ tags: Runtypes.Array<Runtypes.String, false>;
39
+ compliance: Runtypes.Union2<Runtypes.Array<Runtypes.Record<{
40
+ standard: Runtypes.String;
41
+ requirements: Runtypes.Union2<Runtypes.Array<Runtypes.String, false>, Runtypes.Literal<undefined>>;
42
+ controls: Runtypes.Union2<Runtypes.Array<Runtypes.String, false>, Runtypes.Literal<undefined>>;
43
+ }, false>, false>, Runtypes.Literal<undefined>>;
44
+ }, false>, false>;
45
+ }, false>;
46
+ export declare type ManagedQuestion = Runtypes.Static<typeof ManagedQuestionRecord>;
47
+ export declare type QuestionUploadFileData = Runtypes.Static<typeof QuestionUploadFileDataRecord>;
48
+ declare type ValidateManagedQuestionFileParams = {
49
+ filePath: string;
50
+ apiClient?: ApiClient;
51
+ };
52
+ export declare function validateManagedQuestionFile(params: ValidateManagedQuestionFileParams): Promise<void>;
53
+ export {};
@@ -0,0 +1,140 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
11
+ }) : function(o, v) {
12
+ o["default"] = v;
13
+ });
14
+ var __importStar = (this && this.__importStar) || function (mod) {
15
+ if (mod && mod.__esModule) return mod;
16
+ var result = {};
17
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
+ __setModuleDefault(result, mod);
19
+ return result;
20
+ };
21
+ Object.defineProperty(exports, "__esModule", { value: true });
22
+ exports.validateManagedQuestionFile = exports.QuestionUploadFileDataRecord = exports.ManagedQuestionRecord = exports.ManagedQuestionComplianceDetailsRecord = exports.ManagedQuestionQueryRecord = void 0;
23
+ const fs_1 = require("fs");
24
+ const yaml = __importStar(require("js-yaml"));
25
+ const Runtypes = __importStar(require("runtypes"));
26
+ const queryLanguage = __importStar(require("../services/queryLanguage"));
27
+ exports.ManagedQuestionQueryRecord = Runtypes.Record({
28
+ name: Runtypes.String.Or(Runtypes.Undefined),
29
+ query: Runtypes.String,
30
+ });
31
+ exports.ManagedQuestionComplianceDetailsRecord = Runtypes.Record({
32
+ standard: Runtypes.String,
33
+ requirements: Runtypes.Array(Runtypes.String).Or(Runtypes.Undefined),
34
+ controls: Runtypes.Array(Runtypes.String).Or(Runtypes.Undefined),
35
+ });
36
+ exports.ManagedQuestionRecord = Runtypes.Record({
37
+ id: Runtypes.String,
38
+ title: Runtypes.String,
39
+ description: Runtypes.String,
40
+ queries: Runtypes.Array(exports.ManagedQuestionQueryRecord),
41
+ tags: Runtypes.Array(Runtypes.String),
42
+ compliance: Runtypes.Array(exports.ManagedQuestionComplianceDetailsRecord).Or(Runtypes.Undefined),
43
+ });
44
+ exports.QuestionUploadFileDataRecord = Runtypes.Record({
45
+ integrationDefinitionId: Runtypes.String,
46
+ sourceId: Runtypes.String,
47
+ questions: Runtypes.Array(exports.ManagedQuestionRecord),
48
+ });
49
+ function validateQuestionIdUniqueness(questions) {
50
+ const questionsIdSet = new Set();
51
+ for (const question of questions) {
52
+ if (questionsIdSet.has(question.id)) {
53
+ throw new Error(`Non-unique question ID found in file (questionId=${question.id})`);
54
+ }
55
+ questionsIdSet.add(question.id);
56
+ }
57
+ }
58
+ function validateQuestionTitleUniqueness(questions) {
59
+ const questionTitleSet = new Set();
60
+ for (const question of questions) {
61
+ if (questionTitleSet.has(question.title)) {
62
+ throw new Error(`Non-unique question title found in file (questionId=${question.id}, questionTitle=${question.title})`);
63
+ }
64
+ questionTitleSet.add(question.title);
65
+ }
66
+ }
67
+ function validateQuestionQueryNameUniqueness(questions) {
68
+ for (const question of questions) {
69
+ const questionQueryNameSet = new Set();
70
+ for (const query of question.queries) {
71
+ if (query.name) {
72
+ if (questionQueryNameSet.has(query.name)) {
73
+ throw new Error(`Duplicate query name in question detected (questionId=${question.id}, queryName=${query.name})`);
74
+ }
75
+ questionQueryNameSet.add(query.name);
76
+ }
77
+ }
78
+ }
79
+ }
80
+ async function validateQuestionQueries(apiClient, questions) {
81
+ const queries = [];
82
+ for (const question of questions) {
83
+ for (const query of question.queries) {
84
+ queries.push(query.query);
85
+ }
86
+ }
87
+ const queryValidationResults = await queryLanguage.validateQueries(apiClient, queries);
88
+ const failedQueries = queryValidationResults
89
+ .filter((r) => r.valid === false)
90
+ .map((r) => r.query);
91
+ if (failedQueries.length) {
92
+ throw new Error(`Queries failed to validate (queries=${JSON.stringify(failedQueries, null, 2)})`);
93
+ }
94
+ }
95
+ function validateQuestionTagUniqueness(questions) {
96
+ for (const question of questions) {
97
+ const questionTagSet = new Set();
98
+ for (const tag of question.tags) {
99
+ if (questionTagSet.has(tag)) {
100
+ throw new Error(`Non-unique question tag found (questionId=${question.id}, tag=${tag})`);
101
+ }
102
+ questionTagSet.add(tag);
103
+ }
104
+ }
105
+ }
106
+ function validateQuestionFileData(questionFile) {
107
+ exports.QuestionUploadFileDataRecord.check(questionFile);
108
+ validateQuestionIdUniqueness(questionFile.questions);
109
+ validateQuestionTitleUniqueness(questionFile.questions);
110
+ validateQuestionTagUniqueness(questionFile.questions);
111
+ validateQuestionQueryNameUniqueness(questionFile.questions);
112
+ }
113
+ async function loadFile(filePath) {
114
+ try {
115
+ const file = await fs_1.promises.readFile(filePath, {
116
+ encoding: 'utf-8',
117
+ });
118
+ return file;
119
+ }
120
+ catch (err) {
121
+ if (err.code === 'ENOENT') {
122
+ throw new Error(`Question file not found (filePath=${filePath})`);
123
+ }
124
+ throw err;
125
+ }
126
+ }
127
+ async function loadQuestionFile(filePath) {
128
+ const rawQuestionFile = await loadFile(filePath);
129
+ return yaml.load(rawQuestionFile);
130
+ }
131
+ async function validateManagedQuestionFile(params) {
132
+ const { filePath, apiClient } = params;
133
+ const parsedQuestionFile = await loadQuestionFile(filePath);
134
+ validateQuestionFileData(parsedQuestionFile);
135
+ if (apiClient) {
136
+ await validateQuestionQueries(apiClient, parsedQuestionFile.questions);
137
+ }
138
+ }
139
+ exports.validateManagedQuestionFile = validateManagedQuestionFile;
140
+ //# sourceMappingURL=managedQuestionFileValidator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"managedQuestionFileValidator.js","sourceRoot":"","sources":["../../../src/questions/managedQuestionFileValidator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { ApiClient } from '@jupiterone/integration-sdk-runtime';
2
+ declare enum QueryLanguageErrorCode {
3
+ PARSER_ERROR = "PARSER_ERROR",
4
+ VALIDATION_ERROR = "VALIDATION_ERROR",
5
+ INTERNAL_SERVER_ERROR = "INTERNAL_SERVER_ERROR",
6
+ FORBIDDEN_ERROR = "FORBIDDEN_ERROR"
7
+ }
8
+ declare type ParseAndValidateRawQueriesResult = {
9
+ valid: boolean;
10
+ query: string;
11
+ error?: {
12
+ message: string;
13
+ code: QueryLanguageErrorCode;
14
+ };
15
+ };
16
+ declare type ParseAndValidateRawQueriesResults = ParseAndValidateRawQueriesResult[];
17
+ /**
18
+ * Sends queries to `/j1ql/validate` in batches to be validated
19
+ */
20
+ export declare function validateQueries(apiClient: ApiClient, queries: string[]): Promise<ParseAndValidateRawQueriesResults>;
21
+ export {};
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.validateQueries = void 0;
7
+ const chunk_1 = __importDefault(require("lodash/chunk"));
8
+ var QueryLanguageErrorCode;
9
+ (function (QueryLanguageErrorCode) {
10
+ QueryLanguageErrorCode["PARSER_ERROR"] = "PARSER_ERROR";
11
+ QueryLanguageErrorCode["VALIDATION_ERROR"] = "VALIDATION_ERROR";
12
+ QueryLanguageErrorCode["INTERNAL_SERVER_ERROR"] = "INTERNAL_SERVER_ERROR";
13
+ QueryLanguageErrorCode["FORBIDDEN_ERROR"] = "FORBIDDEN_ERROR";
14
+ })(QueryLanguageErrorCode || (QueryLanguageErrorCode = {}));
15
+ /**
16
+ * Maximum number of queries that can be supplied to `/j1ql/validate` endpoint
17
+ */
18
+ const MAX_QUERIES_TO_VALIDATE = 250;
19
+ /**
20
+ * Sends queries to `/j1ql/validate` in batches to be validated
21
+ */
22
+ async function validateQueries(apiClient, queries) {
23
+ const queryBatches = chunk_1.default(queries, MAX_QUERIES_TO_VALIDATE);
24
+ let overallResults = [];
25
+ for (const queryBatch of queryBatches) {
26
+ const result = await apiClient.post('/j1ql/validate', {
27
+ queries: queryBatch,
28
+ });
29
+ overallResults = overallResults.concat(result.data);
30
+ }
31
+ return overallResults;
32
+ }
33
+ exports.validateQueries = validateQueries;
34
+ //# sourceMappingURL=queryLanguage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queryLanguage.js","sourceRoot":"","sources":["../../../src/services/queryLanguage.ts"],"names":[],"mappings":";;;;;;AAAA,yDAAiC;AAGjC,IAAK,sBAKJ;AALD,WAAK,sBAAsB;IACzB,uDAA6B,CAAA;IAC7B,+DAAqC,CAAA;IACrC,yEAA+C,CAAA;IAC/C,6DAAmC,CAAA;AACrC,CAAC,EALI,sBAAsB,KAAtB,sBAAsB,QAK1B;AAaD;;GAEG;AACH,MAAM,uBAAuB,GAAG,GAAG,CAAC;AAEpC;;GAEG;AACI,KAAK,UAAU,eAAe,CACnC,SAAoB,EACpB,OAAiB;IAEjB,MAAM,YAAY,GAAG,eAAK,CAAC,OAAO,EAAE,uBAAuB,CAAC,CAAC;IAC7D,IAAI,cAAc,GAAsC,EAAE,CAAC;IAE3D,KAAK,MAAM,UAAU,IAAI,YAAY,EAAE;QACrC,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,gBAAgB,EAAE;YACpD,OAAO,EAAE,UAAU;SACpB,CAAC,CAAC;QAEH,cAAc,GAAG,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;KACrD;IAED,OAAO,cAAc,CAAC;AACxB,CAAC;AAhBD,0CAgBC"}