@jupiterone/integration-sdk-cli 12.7.1 → 12.8.3

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 (174) hide show
  1. package/dist/src/bocchi/actions/steps.d.ts +4 -0
  2. package/dist/src/bocchi/actions/steps.js +20 -0
  3. package/dist/src/bocchi/actions/steps.js.map +1 -0
  4. package/dist/src/bocchi/bocchi.d.ts +1 -0
  5. package/dist/src/bocchi/bocchi.js +260 -0
  6. package/dist/src/bocchi/bocchi.js.map +1 -0
  7. package/dist/src/bocchi/templates/partials/directRelationships.hbs +26 -0
  8. package/dist/src/bocchi/templates/partials/mappedRelationships.hbs +36 -0
  9. package/dist/src/bocchi/templates/partials/stepMap.hbs +47 -0
  10. package/dist/src/bocchi/templates/steps/child-singleton.ts.hbs +47 -0
  11. package/dist/src/bocchi/templates/steps/fetch-child-entities.ts.hbs +58 -0
  12. package/dist/src/bocchi/templates/steps/fetch-entities.ts.hbs +47 -0
  13. package/dist/src/bocchi/templates/steps/index.test.ts.hbs +41 -0
  14. package/dist/src/bocchi/templates/steps/singleton.ts.hbs +45 -0
  15. package/dist/src/bocchi/templates/steps/spec.ts.hbs +73 -0
  16. package/dist/src/bocchi/templates/top-level/.env.example.hbs +3 -0
  17. package/dist/src/bocchi/templates/top-level/.eslintignore.hbs +1 -0
  18. package/dist/src/bocchi/templates/top-level/.eslintrc.hbs +6 -0
  19. package/dist/src/bocchi/templates/top-level/.github/workflows/build.yml.hbs +29 -0
  20. package/dist/src/bocchi/templates/top-level/.github/workflows/questions.yml.hbs +40 -0
  21. package/dist/src/bocchi/templates/top-level/.gitignore.hbs +8 -0
  22. package/dist/src/bocchi/templates/top-level/.node-version.hbs +1 -0
  23. package/dist/src/bocchi/templates/top-level/.prettierignore.hbs +6 -0
  24. package/dist/src/bocchi/templates/top-level/CHANGELOG.md.hbs +9 -0
  25. package/dist/src/bocchi/templates/top-level/CODEOWNERS.hbs +3 -0
  26. package/dist/src/bocchi/templates/top-level/Dockerfile.hbs +25 -0
  27. package/dist/src/bocchi/templates/top-level/LICENSE.hbs +373 -0
  28. package/dist/src/bocchi/templates/top-level/README.md.hbs +114 -0
  29. package/dist/src/bocchi/templates/top-level/docs/development.md.hbs +28 -0
  30. package/dist/src/bocchi/templates/top-level/docs/jupiterone.md.hbs +1 -0
  31. package/dist/src/bocchi/templates/top-level/docs/spec/index.ts.hbs +14 -0
  32. package/dist/src/bocchi/templates/top-level/husky.config.js.hbs +1 -0
  33. package/dist/src/bocchi/templates/top-level/jest.config.js.hbs +1 -0
  34. package/dist/src/bocchi/templates/top-level/jupiterone/questions/questions.yaml.hbs +16 -0
  35. package/dist/src/bocchi/templates/top-level/lint-staged.config.js.hbs +1 -0
  36. package/dist/src/bocchi/templates/top-level/package.json.hbs +49 -0
  37. package/dist/src/bocchi/templates/top-level/prettier.config.js.hbs +1 -0
  38. package/dist/src/bocchi/templates/top-level/src/client.ts.hbs +116 -0
  39. package/dist/src/bocchi/templates/top-level/src/config.ts.hbs +41 -0
  40. package/dist/src/bocchi/templates/top-level/src/index.test.ts.hbs +6 -0
  41. package/dist/src/bocchi/templates/top-level/src/index.ts.hbs +14 -0
  42. package/dist/src/bocchi/templates/top-level/src/steps/constants.ts.hbs +60 -0
  43. package/dist/src/bocchi/templates/top-level/src/steps/converters.ts.hbs +37 -0
  44. package/dist/src/bocchi/templates/top-level/src/steps/index.ts.hbs +13 -0
  45. package/dist/src/bocchi/templates/top-level/src/steps/types.ts.hbs +6 -0
  46. package/dist/src/bocchi/templates/top-level/test/README.md.hbs +5 -0
  47. package/dist/src/bocchi/templates/top-level/test/config.ts.hbs +30 -0
  48. package/dist/src/bocchi/templates/top-level/test/recording.ts.hbs +74 -0
  49. package/dist/src/bocchi/templates/top-level/tsconfig.dist.json.hbs +13 -0
  50. package/dist/src/bocchi/templates/top-level/tsconfig.json.hbs +7 -0
  51. package/dist/src/bocchi/utils/types.d.ts +98 -0
  52. package/dist/src/bocchi/utils/types.js +10 -0
  53. package/dist/src/bocchi/utils/types.js.map +1 -0
  54. package/dist/src/commands/bocchi.d.ts +1 -0
  55. package/dist/src/commands/bocchi.js +29 -0
  56. package/dist/src/commands/bocchi.js.map +1 -0
  57. package/dist/src/commands/collect.js.map +1 -1
  58. package/dist/src/commands/diff.js.map +1 -1
  59. package/dist/src/commands/document.js.map +1 -1
  60. package/dist/src/commands/generate-ingestion-sources-config.js.map +1 -1
  61. package/dist/src/commands/generate-integration-graph-schema.d.ts +2 -1
  62. package/dist/src/commands/generate-integration-graph-schema.js +1 -0
  63. package/dist/src/commands/generate-integration-graph-schema.js.map +1 -1
  64. package/dist/src/commands/generate.js +1 -1
  65. package/dist/src/commands/generate.js.map +1 -1
  66. package/dist/src/commands/index.d.ts +1 -0
  67. package/dist/src/commands/index.js +1 -0
  68. package/dist/src/commands/index.js.map +1 -1
  69. package/dist/src/commands/options.js.map +1 -1
  70. package/dist/src/commands/run.js.map +1 -1
  71. package/dist/src/commands/validate-question-file.js.map +1 -1
  72. package/dist/src/commands/visualize-types.js.map +1 -1
  73. package/dist/src/config.js.map +1 -1
  74. package/dist/src/generator/actions.d.ts +5 -1
  75. package/dist/src/generator/actions.js +19 -1
  76. package/dist/src/generator/actions.js.map +1 -1
  77. package/dist/src/generator/entitiesFlow.js.map +1 -1
  78. package/dist/src/generator/newIntegration.js +17 -3
  79. package/dist/src/generator/newIntegration.js.map +1 -1
  80. package/dist/src/generator/relationshipsFlow.js.map +1 -1
  81. package/dist/src/generator/stepsFlow.js.map +1 -1
  82. package/dist/src/generator/template/.github/workflows/build.yml.hbs +18 -0
  83. package/dist/src/generator/template/.github/workflows/questions.yml.hbs +12 -1
  84. package/dist/src/generator/template/Dockerfile.hbs +16 -0
  85. package/dist/src/generator/template/README.md.hbs +19 -5
  86. package/dist/src/generator/template/package.json.hbs +8 -2
  87. package/dist/src/generator/util.js.map +1 -1
  88. package/dist/src/index.js +2 -1
  89. package/dist/src/index.js.map +1 -1
  90. package/dist/src/log.js.map +1 -1
  91. package/dist/src/neo4j/neo4jGraphStore.js.map +1 -1
  92. package/dist/src/neo4j/neo4jUtilities.js.map +1 -1
  93. package/dist/src/neo4j/uploadToNeo4j.js.map +1 -1
  94. package/dist/src/neo4j/wipeNeo4j.js.map +1 -1
  95. package/dist/src/questions/managedQuestionFileValidator.js.map +1 -1
  96. package/dist/src/services/queryLanguage.js.map +1 -1
  97. package/dist/src/troubleshoot/utils.js.map +1 -1
  98. package/dist/src/utils/generateVisHTML.js.map +1 -1
  99. package/dist/src/utils/getSortedJupiterOneTypes.js.map +1 -1
  100. package/dist/src/visualization/createMappedRelationshipNodesAndEdges.js.map +1 -1
  101. package/dist/src/visualization/generateDependencyVisualization.js.map +1 -1
  102. package/dist/src/visualization/generateVisualization.js.map +1 -1
  103. package/dist/src/visualization/retrieveIntegrationData.js.map +1 -1
  104. package/dist/src/visualization/utils.js.map +1 -1
  105. package/dist/tsconfig.dist.tsbuildinfo +1 -1
  106. package/package.json +11 -9
  107. package/src/bocchi/README.md +95 -0
  108. package/src/bocchi/actions/steps.ts +17 -0
  109. package/src/bocchi/bocchi.ts +311 -0
  110. package/src/bocchi/docs/template/README.md +140 -0
  111. package/src/bocchi/docs/template/authentication.md +100 -0
  112. package/src/bocchi/docs/template/examples/example.json +127 -0
  113. package/src/bocchi/docs/template/examples/signalSciences.json +128 -0
  114. package/src/bocchi/docs/template/steps.md +656 -0
  115. package/src/bocchi/templates/partials/directRelationships.hbs +26 -0
  116. package/src/bocchi/templates/partials/mappedRelationships.hbs +36 -0
  117. package/src/bocchi/templates/partials/stepMap.hbs +47 -0
  118. package/src/bocchi/templates/steps/child-singleton.ts.hbs +47 -0
  119. package/src/bocchi/templates/steps/fetch-child-entities.ts.hbs +58 -0
  120. package/src/bocchi/templates/steps/fetch-entities.ts.hbs +47 -0
  121. package/src/bocchi/templates/steps/index.test.ts.hbs +41 -0
  122. package/src/bocchi/templates/steps/singleton.ts.hbs +45 -0
  123. package/src/bocchi/templates/steps/spec.ts.hbs +73 -0
  124. package/src/bocchi/templates/top-level/.env.example.hbs +3 -0
  125. package/src/bocchi/templates/top-level/.eslintignore.hbs +1 -0
  126. package/src/bocchi/templates/top-level/.eslintrc.hbs +6 -0
  127. package/src/bocchi/templates/top-level/.github/workflows/build.yml.hbs +29 -0
  128. package/src/bocchi/templates/top-level/.github/workflows/questions.yml.hbs +40 -0
  129. package/src/bocchi/templates/top-level/.gitignore.hbs +8 -0
  130. package/src/bocchi/templates/top-level/.node-version.hbs +1 -0
  131. package/src/bocchi/templates/top-level/.prettierignore.hbs +6 -0
  132. package/src/bocchi/templates/top-level/CHANGELOG.md.hbs +9 -0
  133. package/src/bocchi/templates/top-level/CODEOWNERS.hbs +3 -0
  134. package/src/bocchi/templates/top-level/Dockerfile.hbs +25 -0
  135. package/src/bocchi/templates/top-level/LICENSE.hbs +373 -0
  136. package/src/bocchi/templates/top-level/README.md.hbs +114 -0
  137. package/src/bocchi/templates/top-level/docs/development.md.hbs +28 -0
  138. package/src/bocchi/templates/top-level/docs/jupiterone.md.hbs +1 -0
  139. package/src/bocchi/templates/top-level/docs/spec/index.ts.hbs +14 -0
  140. package/src/bocchi/templates/top-level/husky.config.js.hbs +1 -0
  141. package/src/bocchi/templates/top-level/jest.config.js.hbs +1 -0
  142. package/src/bocchi/templates/top-level/jupiterone/questions/questions.yaml.hbs +16 -0
  143. package/src/bocchi/templates/top-level/lint-staged.config.js.hbs +1 -0
  144. package/src/bocchi/templates/top-level/package.json.hbs +49 -0
  145. package/src/bocchi/templates/top-level/prettier.config.js.hbs +1 -0
  146. package/src/bocchi/templates/top-level/src/client.ts.hbs +116 -0
  147. package/src/bocchi/templates/top-level/src/config.ts.hbs +41 -0
  148. package/src/bocchi/templates/top-level/src/index.test.ts.hbs +6 -0
  149. package/src/bocchi/templates/top-level/src/index.ts.hbs +14 -0
  150. package/src/bocchi/templates/top-level/src/steps/constants.ts.hbs +60 -0
  151. package/src/bocchi/templates/top-level/src/steps/converters.ts.hbs +37 -0
  152. package/src/bocchi/templates/top-level/src/steps/index.ts.hbs +13 -0
  153. package/src/bocchi/templates/top-level/src/steps/types.ts.hbs +6 -0
  154. package/src/bocchi/templates/top-level/test/README.md.hbs +5 -0
  155. package/src/bocchi/templates/top-level/test/config.ts.hbs +30 -0
  156. package/src/bocchi/templates/top-level/test/recording.ts.hbs +74 -0
  157. package/src/bocchi/templates/top-level/tsconfig.dist.json.hbs +13 -0
  158. package/src/bocchi/templates/top-level/tsconfig.json.hbs +7 -0
  159. package/src/bocchi/utils/types.ts +106 -0
  160. package/src/commands/bocchi.ts +28 -0
  161. package/src/commands/generate-ingestion-sources-config.ts +4 -5
  162. package/src/commands/generate-integration-graph-schema.test.ts +56 -0
  163. package/src/commands/generate-integration-graph-schema.ts +3 -0
  164. package/src/commands/generate.ts +1 -1
  165. package/src/commands/index.ts +1 -0
  166. package/src/generator/actions.ts +28 -1
  167. package/src/generator/newIntegration.ts +28 -4
  168. package/src/generator/template/.github/workflows/build.yml.hbs +18 -0
  169. package/src/generator/template/.github/workflows/questions.yml.hbs +12 -1
  170. package/src/generator/template/Dockerfile.hbs +16 -0
  171. package/src/generator/template/README.md.hbs +19 -5
  172. package/src/generator/template/package.json.hbs +8 -2
  173. package/src/index.ts +3 -1
  174. package/src/neo4j/README.md +2 -1
@@ -0,0 +1,4 @@
1
+ import { Step } from '../utils/types';
2
+ export declare function stepTemplateHelper(step: Step): {
3
+ stepTemplateFile: string;
4
+ };
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.stepTemplateHelper = void 0;
4
+ const types_1 = require("../utils/types");
5
+ function stepTemplateHelper(step) {
6
+ return {
7
+ stepTemplateFile: `${determineTypeOfStep(step)}.ts.hbs`,
8
+ };
9
+ }
10
+ exports.stepTemplateHelper = stepTemplateHelper;
11
+ function determineTypeOfStep(step) {
12
+ return step.response.responseType === 'SINGLETON'
13
+ ? step.parentAssociation
14
+ ? types_1.StepType.CHILD_SINGLETON
15
+ : types_1.StepType.SINGLETON
16
+ : step.parentAssociation
17
+ ? types_1.StepType.FETCH_CHILD_ENTITIES
18
+ : types_1.StepType.FETCH_ENTITIES;
19
+ }
20
+ //# sourceMappingURL=steps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"steps.js","sourceRoot":"","sources":["../../../../src/bocchi/actions/steps.ts"],"names":[],"mappings":";;;AAAA,0CAAgD;AAEhD,SAAgB,kBAAkB,CAAC,IAAU;IAC3C,OAAO;QACL,gBAAgB,EAAE,GAAG,mBAAmB,CAAC,IAAI,CAAC,SAAS;KACxD,CAAC;AACJ,CAAC;AAJD,gDAIC;AAED,SAAS,mBAAmB,CAAC,IAAU;IACrC,OAAO,IAAI,CAAC,QAAQ,CAAC,YAAY,KAAK,WAAW;QAC/C,CAAC,CAAC,IAAI,CAAC,iBAAiB;YACtB,CAAC,CAAC,gBAAQ,CAAC,eAAe;YAC1B,CAAC,CAAC,gBAAQ,CAAC,SAAS;QACtB,CAAC,CAAC,IAAI,CAAC,iBAAiB;YACtB,CAAC,CAAC,gBAAQ,CAAC,oBAAoB;YAC/B,CAAC,CAAC,gBAAQ,CAAC,cAAc,CAAC;AAChC,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,260 @@
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 __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ const inquirer_checkbox_plus_prompt_1 = __importDefault(require("inquirer-checkbox-plus-prompt"));
30
+ const path_1 = __importDefault(require("path"));
31
+ const lodash_1 = require("lodash");
32
+ const actions_1 = require("../generator/actions");
33
+ const fs = __importStar(require("fs"));
34
+ const steps_1 = require("./actions/steps");
35
+ const integration_sdk_core_1 = require("@jupiterone/integration-sdk-core");
36
+ function bocchi(plop) {
37
+ plop.setActionType('yarnFormat', actions_1.yarnFormat);
38
+ plop.setActionType('yarnInstall', actions_1.yarnInstall);
39
+ plop.setActionType('yarnLint', actions_1.yarnLint);
40
+ plop.setActionType('j1Document', actions_1.j1Document);
41
+ plop.setPrompt('checkbox-plus', inquirer_checkbox_plus_prompt_1.default);
42
+ plop.setHelper('getDirectRelationships', (step, options) => {
43
+ return step.directRelationships.map((relationship) => {
44
+ const step2 = options.data.root.template.steps.find((s) => s.entity._type === relationship.targetType);
45
+ return {
46
+ step,
47
+ sourceStep: relationship.direction === integration_sdk_core_1.RelationshipDirection.FORWARD
48
+ ? step
49
+ : step2,
50
+ targetStep: relationship.direction === integration_sdk_core_1.RelationshipDirection.FORWARD
51
+ ? step2
52
+ : step,
53
+ relationshipClass: relationship._class,
54
+ targetKey: relationship.targetKey,
55
+ forward: relationship.direction === integration_sdk_core_1.RelationshipDirection.FORWARD,
56
+ };
57
+ });
58
+ });
59
+ plop.setHelper('getStepByType', (type, options) => {
60
+ return options.data.root.template.steps.find((s) => s.entity._type === type);
61
+ });
62
+ /**
63
+ * (_class, fromType, toType) => string
64
+ */
65
+ plop.setHelper('getRelationshipType', integration_sdk_core_1.generateRelationshipType);
66
+ plop.setHelper('sanitizeUrlPath', (urlTemplate) => {
67
+ const regex = /%parent\.(.+?)%/g;
68
+ for (const match of urlTemplate.matchAll(regex)) {
69
+ urlTemplate = urlTemplate.replace(match[0], '${parentEntity.' + match[1] + '}');
70
+ }
71
+ // looks at the urlTemplate provided and replaces "%nextToken%" with "${nextToken}",
72
+ // which is the string the client file will use to reference the nextToken
73
+ return urlTemplate.replace('%nextToken%', '${nextToken}');
74
+ });
75
+ plop.setHelper('escape', (data) => {
76
+ if (typeof data === 'string') {
77
+ return "'data'";
78
+ }
79
+ else if (Array.isArray(data)) {
80
+ return '[' + data.toString() + ']';
81
+ }
82
+ else {
83
+ return data;
84
+ }
85
+ });
86
+ plop.setHelper('sanitizeHttpMethod', (method = 'GET') => {
87
+ // if the user puts nothing in request.method, we need to default to GET
88
+ return method.toUpperCase();
89
+ });
90
+ plop.setHelper('sanitizeHttpBody', (body) => {
91
+ // Also, we need to check if the body contains "%nextToken%" and replace it with
92
+ // "nextToken" since that is the var in the client file that references the nextToken.
93
+ for (const key in body) {
94
+ if (typeof body[key] === 'string') {
95
+ body[key] = body[key].replace('%nextToken%', '${nextToken}');
96
+ }
97
+ }
98
+ return body;
99
+ });
100
+ plop.setHelper('isSingletonRequest', (responseType) => {
101
+ return responseType === 'SINGLETON';
102
+ });
103
+ plop.setHelper('configTypeToType', (type) => {
104
+ if (type.toLowerCase() === 'json') {
105
+ return 'Record<string, any>';
106
+ }
107
+ return type;
108
+ });
109
+ plop.setHelper('requiredConfig', (configFields) => {
110
+ return Object.entries(configFields)
111
+ .filter(([_, value]) => !value.optional)
112
+ .map(([key, _]) => key);
113
+ });
114
+ plop.setHelper('isNotEndpointAuth', (authStrategy) => {
115
+ return authStrategy !== 'endpoint';
116
+ });
117
+ plop.setHelper('sanitizeAuthObject', (authObj) => {
118
+ const regex = /%(response|config)\.(.+?)%/g;
119
+ for (const key in authObj) {
120
+ if (typeof authObj[key] === 'string') {
121
+ for (const match of authObj[key].matchAll(regex)) {
122
+ authObj[key] = authObj[key].replace(match[0], '${' +
123
+ (match[1] === 'config' ? 'this.' : '') +
124
+ match[1] +
125
+ '.' +
126
+ match[2] +
127
+ '}');
128
+ }
129
+ }
130
+ }
131
+ return authObj;
132
+ });
133
+ for (const partial of fs.readdirSync(path_1.default.join(__dirname, 'templates/partials'))) {
134
+ plop.setPartial(partial.replace('.hbs', ''), fs.readFileSync(path_1.default.join(__dirname, 'templates/partials', partial), 'utf8'));
135
+ }
136
+ plop.setGenerator('bocchi', {
137
+ description: 'Create a new integration graph project',
138
+ prompts: async function (inquirer) {
139
+ const { vendorName } = await inquirer.prompt({
140
+ type: 'input',
141
+ name: 'vendorName',
142
+ message: 'The integration vendor name (ex. AWS, Google Workspace, CrowdStrike)',
143
+ validate(input) {
144
+ if (!input) {
145
+ return 'Cannot be an empty string';
146
+ }
147
+ return true;
148
+ },
149
+ });
150
+ const { packageName } = await inquirer.prompt({
151
+ type: 'input',
152
+ name: 'packageName',
153
+ default: `@jupiterone/graph-${(0, lodash_1.kebabCase)(vendorName)}`,
154
+ message: 'The npm package name',
155
+ validate(input) {
156
+ if (!input) {
157
+ return 'Cannot be an empty string';
158
+ }
159
+ return true;
160
+ },
161
+ });
162
+ const { packageDescription } = await inquirer.prompt({
163
+ type: 'input',
164
+ name: 'packageDescription',
165
+ message: 'A description for package',
166
+ default: `An integration and graph conversion project for ${vendorName}`,
167
+ validate(input) {
168
+ if (!input) {
169
+ return 'Cannot be an empty string';
170
+ }
171
+ return true;
172
+ },
173
+ });
174
+ const { templateFile } = await inquirer.prompt({
175
+ type: 'input',
176
+ name: 'templateFile',
177
+ message: 'Template file for the integration',
178
+ validate(input) {
179
+ if (!input) {
180
+ return 'Cannot be an empty string';
181
+ }
182
+ return true;
183
+ },
184
+ });
185
+ return {
186
+ vendorName,
187
+ packageName,
188
+ packageDescription,
189
+ templateFile,
190
+ };
191
+ },
192
+ actions: function (data) {
193
+ if (!data) {
194
+ return [];
195
+ }
196
+ const { templateFile } = data;
197
+ // @jupiterone/graph-foo -> graph-foo
198
+ // graph-foo -> graph-foo
199
+ const directoryName = path_1.default.join(process.cwd(), path_1.default.basename(data.packageName));
200
+ const template = JSON.parse(fs.readFileSync(templateFile, 'utf8'));
201
+ const actions = [];
202
+ actions.push({
203
+ type: 'addMany',
204
+ destination: directoryName,
205
+ base: path_1.default.join(__dirname, '/templates/top-level'),
206
+ templateFiles: path_1.default.join(__dirname + '/templates/top-level/**'),
207
+ globOptions: { dot: true },
208
+ force: true,
209
+ data: { ...data, template },
210
+ });
211
+ for (const step of template.steps) {
212
+ const { stepTemplateFile } = (0, steps_1.stepTemplateHelper)(step);
213
+ actions.push({
214
+ type: 'add',
215
+ path: path_1.default.join(directoryName, path_1.default.normalize(`src/steps/${(0, lodash_1.kebabCase)(step.id)}/index.ts`)),
216
+ templateFile: path_1.default.join(__dirname, `templates/steps/${stepTemplateFile}`),
217
+ data: { template, step },
218
+ force: true,
219
+ });
220
+ actions.push({
221
+ type: 'add',
222
+ path: path_1.default.join(directoryName, path_1.default.normalize(`src/steps/${(0, lodash_1.kebabCase)(step.id)}/index.test.ts`)),
223
+ templateFile: path_1.default.join(__dirname, `templates/steps/index.test.ts.hbs`),
224
+ data: { template, step },
225
+ force: true,
226
+ });
227
+ actions.push({
228
+ type: 'add',
229
+ path: path_1.default.join(directoryName, path_1.default.normalize(`docs/spec/${(0, lodash_1.kebabCase)(step.id)}/index.ts`)),
230
+ templateFile: path_1.default.join(__dirname, `templates/steps/spec.ts.hbs`),
231
+ data: { template, step },
232
+ force: true,
233
+ });
234
+ }
235
+ actions.push({
236
+ type: 'yarnInstall',
237
+ path: directoryName,
238
+ verbose: true,
239
+ });
240
+ actions.push({
241
+ type: 'j1Document',
242
+ path: directoryName,
243
+ verbose: true,
244
+ });
245
+ actions.push({
246
+ type: 'yarnFormat',
247
+ path: directoryName,
248
+ verbose: true,
249
+ });
250
+ actions.push({
251
+ type: 'yarnLint',
252
+ path: directoryName,
253
+ verbose: true,
254
+ });
255
+ return actions;
256
+ },
257
+ });
258
+ }
259
+ module.exports = bocchi;
260
+ //# sourceMappingURL=bocchi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bocchi.js","sourceRoot":"","sources":["../../../src/bocchi/bocchi.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ {{#if directRelationships}}
2
+ {{#with (getDirectRelationships this)}}
3
+ {{#each this}}
4
+ export async function build{{pascalCase sourceStep.entity.name}}{{pascalCase relationshipClass}}{{pascalCase targetStep.entity.name}}Relationships({
5
+ jobState,
6
+ }: IntegrationStepExecutionContext<IntegrationConfig>): Promise<void> {
7
+ await jobState.iterateEntities(
8
+ { _type: Entities.{{constantCase step.entity.name}}._type },
9
+ async (entity) => {
10
+ const relatedEntity = await jobState.findEntity(entity.{{targetKey}} as string);
11
+ if (!relatedEntity) return;
12
+
13
+ await jobState.addRelationship(
14
+ createDirectRelationship({
15
+ from: {{#if forward}}entity{{else}}relatedEntity{{/if}},
16
+ _class: RelationshipClass.{{constantCase relationshipClass}},
17
+ to: {{#if forward}}relatedEntity{{else}}entity{{/if}},
18
+ }),
19
+ );
20
+ },
21
+ );
22
+ }
23
+
24
+ {{/each}}
25
+ {{/with}}
26
+ {{/if}}
@@ -0,0 +1,36 @@
1
+ {{#if mappedRelationships}}
2
+ export async function build{{pascalCase entity.name}}MappedRelationships({
3
+ jobState,
4
+ }: IntegrationStepExecutionContext<IntegrationConfig>): Promise<void> {
5
+ await jobState.iterateEntities(
6
+ { _type: Entities.{{constantCase entity.name}}._type },
7
+ async (entity: PrimitiveEntity) => {
8
+ {{#each mappedRelationships}}
9
+ await jobState.addRelationship(createMappedRelationship({
10
+ _class: RelationshipClass.{{constantCase _class}},
11
+ _mapping: {
12
+ sourceEntityKey: entity._key,
13
+ relationshipDirection: RelationshipDirection.{{constantCase direction}},
14
+ targetFilterKeys: [[
15
+ {{#each mappings}}
16
+ '{{targetProperty}}',
17
+ {{/each}}
18
+ ]],
19
+ targetEntity: {
20
+ {{#each mappings}}
21
+ {{#if targetValue}}
22
+ {{targetProperty}}: '{{targetValue}}',
23
+ {{/if}}
24
+ {{#if sourceProperty}}
25
+ {{targetProperty}}: entity.{{sourceProperty}},
26
+ {{/if}}
27
+ {{/each}}
28
+ }
29
+ }
30
+ }))
31
+ {{/each}}
32
+ },
33
+ );
34
+ }
35
+
36
+ {{/if}}
@@ -0,0 +1,47 @@
1
+ {
2
+ id: Steps.{{constantCase id}},
3
+ name: '{{name}}',
4
+ entities: [Entities.{{constantCase entity.name}}],
5
+ relationships: [
6
+ {{#if parentAssociation}}
7
+ Relationships.{{#with (getStepByType parentAssociation.parentEntityType)}}{{constantCase entity.name}}{{/with}}_{{constantCase parentAssociation.relationshipClass}}_{{constantCase entity.name}},
8
+ {{/if}}
9
+ ],
10
+ dependsOn: [
11
+ {{#each dependsOn}}
12
+ Steps.{{constantCase this}},
13
+ {{/each}}
14
+ ],
15
+ executionHandler: {{camelCase id}},
16
+ },
17
+ {{#if directRelationships}}
18
+ {{#with (getDirectRelationships this)}}
19
+ {{#each this}}
20
+ {
21
+ id: Steps.BUILD_{{constantCase sourceStep.entity.name}}_{{constantCase targetStep.entity.name}}_RELATIONSHIPS,
22
+ name: 'Build {{sourceStep.entity.name}} {{targetStep.entity.name}} Relationships',
23
+ entities: [],
24
+ relationships: [
25
+ Relationships.{{constantCase sourceStep.entity.name}}_{{constantCase relationshipClass}}_{{constantCase targetStep.entity.name}},
26
+ ],
27
+ dependsOn: [
28
+ Steps.{{constantCase sourceStep.id}},
29
+ Steps.{{constantCase targetStep.id}},
30
+ ],
31
+ executionHandler: build{{pascalCase sourceStep.entity.name}}{{pascalCase relationshipClass}}{{pascalCase targetStep.entity.name}}Relationships,
32
+ },
33
+ {{/each}}
34
+ {{/with}}
35
+ {{/if}}
36
+ {{#if mappedRelationships}}
37
+ {
38
+ id: Steps.BUILD_{{constantCase entity.name}}_MAPPED_RELATIONSHIPS,
39
+ name: 'Build {{entity.name}} Mapped Relationships',
40
+ entities: [],
41
+ relationships: [],
42
+ dependsOn: [
43
+ Steps.{{constantCase id}},
44
+ ],
45
+ executionHandler: build{{pascalCase entity.name}}MappedRelationships,
46
+ },
47
+ {{/if}}
@@ -0,0 +1,47 @@
1
+ {{#with step}}
2
+ import {
3
+ IntegrationStep,
4
+ IntegrationStepExecutionContext,
5
+ RelationshipClass,
6
+ {{#if directRelationships}}
7
+ createDirectRelationship,
8
+ {{/if}}
9
+ {{#if mappedRelationships}}
10
+ PrimitiveEntity,
11
+ RelationshipDirection,
12
+ createMappedRelationship,
13
+ {{/if}}
14
+ } from '@jupiterone/integration-sdk-core';
15
+
16
+ import { IntegrationConfig } from '../../config';
17
+ import {
18
+ Steps,
19
+ Entities,
20
+ Relationships,
21
+ } from '../constants';
22
+ {{#if request}}import { createAPIClient } from '../../client';{{/if}}
23
+ import { create{{pascalCase entity.name}}Entity } from '../converters';
24
+
25
+ export const {{camelCase entity.name}}Steps: IntegrationStep<IntegrationConfig>[] = [
26
+ {{> stepMap }}
27
+ ];
28
+
29
+ export async function {{camelCase id}}({
30
+ jobState,
31
+ instance,
32
+ logger
33
+ }: IntegrationStepExecutionContext<IntegrationConfig>) {
34
+ const client = createAPIClient(instance.config, logger);
35
+
36
+ await jobState.iterateEntities(
37
+ { _type: '{{ parentAssociation.parentEntityType }}' },
38
+ async (parentEntity) => {
39
+ const data = await client.get{{pascalCase entity.name}}(parentEntity);
40
+ await jobState.addEntity(create{{pascalCase entity.name}}Entity(data));
41
+ }
42
+ );
43
+ }
44
+
45
+ {{> directRelationships}}
46
+ {{> mappedRelationships}}
47
+ {{/with}}
@@ -0,0 +1,58 @@
1
+ {{#with step}}
2
+ import {
3
+ createDirectRelationship,
4
+ IntegrationStep,
5
+ IntegrationStepExecutionContext,
6
+ RelationshipClass,
7
+ {{#if directRelationships}}
8
+ createDirectRelationship,
9
+ {{/if}}
10
+ {{#if mappedRelationships}}
11
+ PrimitiveEntity,
12
+ RelationshipDirection,
13
+ createMappedRelationship,
14
+ {{/if}}
15
+ } from '@jupiterone/integration-sdk-core';
16
+
17
+ import { IntegrationConfig } from '../../config';
18
+ import {
19
+ Steps,
20
+ Entities,
21
+ Relationships,
22
+ } from '../constants';
23
+ import { createAPIClient } from '../../client';
24
+ import { create{{pascalCase entity.name}}Entity } from '../converters';
25
+
26
+ export const {{camelCase entity.name}}Steps: IntegrationStep<IntegrationConfig>[] = [
27
+ {{> stepMap }}
28
+ ];
29
+
30
+ export async function {{camelCase id}}({
31
+ instance,
32
+ jobState,
33
+ logger
34
+ }: IntegrationStepExecutionContext<IntegrationConfig>): Promise<void> {
35
+ const client = createAPIClient(instance.config, logger);
36
+
37
+ await jobState.iterateEntities(
38
+ { _type: '{{ parentAssociation.parentEntityType }}' },
39
+ async (parentEntity) => {
40
+ await client.iterate{{pascalCase entity.name}}s(
41
+ parentEntity,
42
+ async (data) => {
43
+ const entity = await jobState.addEntity(create{{pascalCase entity.name}}Entity(data));
44
+
45
+ await jobState.addRelationship(createDirectRelationship({
46
+ from: parentEntity,
47
+ _class: RelationshipClass.{{ parentAssociation.relationshipClass }},
48
+ to: entity,
49
+ }));
50
+ },
51
+ );
52
+ }
53
+ );
54
+ }
55
+
56
+ {{> directRelationships}}
57
+ {{> mappedRelationships}}
58
+ {{/with}}
@@ -0,0 +1,47 @@
1
+ {{#with step}}
2
+ import {
3
+ IntegrationStep,
4
+ IntegrationStepExecutionContext,
5
+ {{#if directRelationships}}
6
+ RelationshipClass,
7
+ createDirectRelationship,
8
+ {{/if}}
9
+ {{#if mappedRelationships}}
10
+ PrimitiveEntity,
11
+ RelationshipDirection,
12
+ createMappedRelationship,
13
+ {{/if}}
14
+ } from '@jupiterone/integration-sdk-core';
15
+
16
+ import { IntegrationConfig } from '../../config';
17
+ import {
18
+ Steps,
19
+ Entities,
20
+ {{#if directRelationships}}
21
+ Relationships,
22
+ {{/if}}
23
+ } from '../constants';
24
+ import { createAPIClient } from '../../client';
25
+ import { create{{pascalCase entity.name}}Entity } from '../converters';
26
+
27
+ export const {{camelCase entity.name}}Steps: IntegrationStep<IntegrationConfig>[] = [
28
+ {{> stepMap }}
29
+ ];
30
+
31
+ export async function {{camelCase id}}({
32
+ instance,
33
+ jobState,
34
+ logger
35
+ }: IntegrationStepExecutionContext<IntegrationConfig>): Promise<void> {
36
+ const client = createAPIClient(instance.config, logger);
37
+
38
+ await client.iterate{{pascalCase entity.name}}s(
39
+ async (data) => {
40
+ await jobState.addEntity(create{{pascalCase entity.name}}Entity(data));
41
+ },
42
+ );
43
+ }
44
+
45
+ {{> directRelationships}}
46
+ {{> mappedRelationships}}
47
+ {{/with}}
@@ -0,0 +1,41 @@
1
+ {{#with step}}
2
+ import { executeStepWithDependencies } from '@jupiterone/integration-sdk-testing';
3
+
4
+ import { buildStepTestConfigForStep } from '../../../test/config';
5
+ import { Recording, setupProjectRecording } from '../../../test/recording';
6
+ import { Steps } from '../constants';
7
+
8
+ let recording: Recording;
9
+ afterEach(async () => {
10
+ await recording.stop();
11
+ });
12
+
13
+ test('{{kebabCase id}}', async () => {
14
+ recording = setupProjectRecording({
15
+ directory: __dirname,
16
+ name: '{{kebabCase id}}',
17
+ });
18
+
19
+ const stepConfig = buildStepTestConfigForStep(Steps.{{constantCase id}});
20
+ const stepResult = await executeStepWithDependencies(stepConfig);
21
+ expect(stepResult).toMatchStepMetadata(stepConfig);
22
+ });
23
+
24
+ {{#if directRelationships}}
25
+ {{#with (getDirectRelationships this)}}
26
+ {{#each this}}
27
+ test('build-{{kebabCase sourceStep.entity.name}}-{{kebabCase targetStep.entity.name}}-relationships', async () => {
28
+ recording = setupProjectRecording({
29
+ directory: __dirname,
30
+ name: 'build-{{kebabCase sourceStep.entity.name}}-{{kebabCase targetStep.entity.name}}-relationships',
31
+ });
32
+
33
+ const stepConfig = buildStepTestConfigForStep(Steps.BUILD_{{constantCase sourceStep.entity.name}}_{{constantCase targetStep.entity.name}}_RELATIONSHIPS);
34
+ const stepResult = await executeStepWithDependencies(stepConfig);
35
+ expect(stepResult).toMatchStepMetadata(stepConfig);
36
+ });
37
+
38
+ {{/each}}
39
+ {{/with}}
40
+ {{/if}}
41
+ {{/with}}
@@ -0,0 +1,45 @@
1
+ {{#with step}}
2
+ import {
3
+ IntegrationStep,
4
+ IntegrationStepExecutionContext,
5
+ {{#if directRelationships}}
6
+ RelationshipClass,
7
+ createDirectRelationship,
8
+ {{/if}}
9
+ {{#if mappedRelationships}}
10
+ PrimitiveEntity,
11
+ RelationshipDirection,
12
+ createMappedRelationship,
13
+ {{/if}}
14
+ } from '@jupiterone/integration-sdk-core';
15
+
16
+ import { IntegrationConfig } from '../../config';
17
+ import {
18
+ Steps,
19
+ Entities,
20
+ {{#if directRelationships}}
21
+ Relationships,
22
+ {{/if}}
23
+ } from '../constants';
24
+ {{#if request}}import { createAPIClient } from '../../client';{{/if}}
25
+ import { create{{pascalCase entity.name}}Entity } from '../converters';
26
+
27
+ export const {{camelCase entity.name}}Steps: IntegrationStep<IntegrationConfig>[] = [
28
+ {{> stepMap }}
29
+ ];
30
+
31
+ export async function {{camelCase id}}({
32
+ jobState,
33
+ instance,
34
+ }: IntegrationStepExecutionContext<IntegrationConfig>) {
35
+ {{#if request}}
36
+ const client = createAPIClient(instance.config);
37
+
38
+ const data = await client.get{{camelCase entity.name}}();
39
+ {{/if}}
40
+ await jobState.addEntity(create{{pascalCase entity.name}}Entity({{#if request}}data{{/if}}));
41
+ }
42
+
43
+ {{> directRelationships}}
44
+ {{> mappedRelationships}}
45
+ {{/with}}