@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.
- package/dist/src/commands/document.js +31 -2
- package/dist/src/commands/document.js.map +1 -1
- package/dist/src/commands/index.d.ts +1 -0
- package/dist/src/commands/index.js +1 -0
- package/dist/src/commands/index.js.map +1 -1
- package/dist/src/commands/validate-question-file.d.ts +2 -0
- package/dist/src/commands/validate-question-file.js +70 -0
- package/dist/src/commands/validate-question-file.js.map +1 -0
- package/dist/src/index.js +2 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/questions/managedQuestionFileValidator.d.ts +53 -0
- package/dist/src/questions/managedQuestionFileValidator.js +140 -0
- package/dist/src/questions/managedQuestionFileValidator.js.map +1 -0
- package/dist/src/services/queryLanguage.d.ts +21 -0
- package/dist/src/services/queryLanguage.js +34 -0
- package/dist/src/services/queryLanguage.js.map +1 -0
- package/dist/tsconfig.dist.tsbuildinfo +845 -12
- package/package.json +7 -4
- package/src/__tests__/__snapshots__/cli.test.ts.snap +52 -5
- package/src/__tests__/cli/validate-question-file.test.ts +24 -0
- package/src/__tests__/cli.test.ts +4 -0
- package/src/commands/document.ts +39 -2
- package/src/commands/index.ts +1 -0
- package/src/commands/validate-question-file.ts +82 -0
- package/src/index.ts +3 -1
- package/src/questions/__fixtures__/questions/basic.yaml +15 -0
- package/src/questions/__fixtures__/questions/compliance.yaml +41 -0
- package/src/questions/__fixtures__/questions/empty-questions.yaml +4 -0
- package/src/questions/__fixtures__/questions/invalid-yaml.yaml +16 -0
- package/src/questions/__fixtures__/questions/multiple-queries.yaml +17 -0
- package/src/questions/__fixtures__/questions/multiple-questions.yaml +27 -0
- package/src/questions/__fixtures__/questions/non-unique-question-id.yaml +28 -0
- package/src/questions/__fixtures__/questions/non-unique-question-name.yaml +18 -0
- package/src/questions/__fixtures__/questions/non-unique-question-tag.yaml +17 -0
- package/src/questions/__fixtures__/questions/non-unique-question-title.yaml +28 -0
- package/src/questions/managedQuestionFileValidator.test.ts +175 -0
- package/src/questions/managedQuestionFileValidator.ts +180 -0
- 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
|
|
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;
|
|
1
|
+
{"version":3,"file":"document.js","sourceRoot":"","sources":["../../../src/commands/document.ts"],"names":[],"mappings":"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"}
|
|
@@ -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,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
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;AAAA,yCAA0C;AAE1C,
|
|
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"}
|