Skip to content

Commit b62a35d

Browse files
committed
Provide stepMetadata to steps through IntegrationStepExecutionContext
Fix stepMetadata field placement and propagate Clearly there needs to be a better test for this... Add a test to ensure stepMetadata reaches execution handler
1 parent 42526a2 commit b62a35d

16 files changed

Lines changed: 278 additions & 41 deletions

File tree

packages/integration-sdk-cli/src/__tests__/cli.test.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -509,6 +509,11 @@ describe('collect/visualize integration', () => {
509509
});
510510
});
511511

512+
test('custom context and config types', async () => {
513+
loadProjectStructure('typeScriptCustomConfigsProject');
514+
await createCli().parseAsync(['node', 'j1-integration', 'collect']);
515+
});
516+
512517
describe('document', () => {
513518
test('loads the integration with entities and relationships and writes documentation results', async () => {
514519
await documentCommandSnapshotTest('docsInstanceWithRelationships');

packages/integration-sdk-core/src/types/context.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { IntegrationInstance, IntegrationInstanceConfig } from './instance';
22
import { JobState } from './jobState';
33
import { IntegrationLogger } from './logger';
4+
import { StepMetadata } from './step';
45

56
export type Execution = {
67
startedOn: number;
@@ -24,7 +25,7 @@ export interface ExecutionContext {
2425
* `IntegrationInstanceConfig`, containing dynamic values perhaps calculated
2526
* based on the instance config.
2627
*/
27-
export type IntegrationExecutionConfig = object;
28+
export type IntegrationExecutionConfig = Record<string, any>;
2829

2930
/**
3031
* @param TInstanceConfig the integration specific type of the `instance.config`
@@ -51,6 +52,7 @@ export type IntegrationExecutionContext<
5152

5253
export type StepExecutionContext = ExecutionContext & {
5354
jobState: JobState;
55+
stepMetadata: StepMetadata;
5456
};
5557

5658
/**
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
MY_INSTANCE_CONFIG_FIELD=myInstanceConfigFieldValue
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
.j1-integration
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import {
2+
IntegrationExecutionConfig,
3+
IntegrationExecutionContext,
4+
IntegrationInstanceConfig,
5+
IntegrationStepExecutionContext,
6+
} from '@jupiterone/integration-sdk-core';
7+
8+
export interface CustomInstanceConfig extends IntegrationInstanceConfig {
9+
myInstanceConfigField: string;
10+
}
11+
12+
export interface CustomExecutionConfig extends IntegrationExecutionConfig {
13+
myExecutionConfigField: string;
14+
}
15+
16+
export type CustomExecutionContext = IntegrationExecutionContext<
17+
CustomInstanceConfig,
18+
CustomExecutionConfig
19+
>;
20+
21+
export interface CustomStepExecutionContext
22+
extends IntegrationStepExecutionContext<
23+
CustomInstanceConfig,
24+
CustomExecutionConfig
25+
> {
26+
myStepExecutionContextField: string;
27+
}
28+
29+
export function validateInvocation(context: CustomExecutionContext) {
30+
if (
31+
context.instance.config.myInstanceConfigField !==
32+
'myInstanceConfigFieldValue'
33+
)
34+
throw new Error('Invalid instance config');
35+
}
36+
37+
export function loadExecutionConfig(options: {
38+
config: CustomInstanceConfig;
39+
}): CustomExecutionConfig {
40+
if (options.config.myInstanceConfigField !== 'myInstanceConfigFieldValue')
41+
throw new Error('Invalid instance config');
42+
return {
43+
myExecutionConfigField: 'myExecutionConfigFieldValue',
44+
};
45+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import { IntegrationInvocationConfig } from '@jupiterone/integration-sdk-core';
2+
import {
3+
CustomExecutionConfig,
4+
CustomInstanceConfig,
5+
loadExecutionConfig,
6+
validateInvocation,
7+
} from './config';
8+
import step from './steps';
9+
10+
export const invocationConfig: IntegrationInvocationConfig<
11+
CustomInstanceConfig,
12+
CustomExecutionConfig
13+
> = {
14+
instanceConfigFields: {
15+
myInstanceConfigField: {
16+
mask: true,
17+
type: 'string',
18+
},
19+
},
20+
integrationSteps: [step],
21+
validateInvocation,
22+
loadExecutionConfig,
23+
};
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
import {
2+
createIntegrationEntity,
3+
IntegrationStep,
4+
} from '@jupiterone/integration-sdk-core';
5+
import {
6+
CustomExecutionConfig,
7+
CustomInstanceConfig,
8+
CustomStepExecutionContext,
9+
} from './config';
10+
11+
const stepId = 'step-id';
12+
const stepName = 'Step Name';
13+
const entities = [
14+
{
15+
resourceName: 'The Account',
16+
_type: 'my_account',
17+
_class: 'Account',
18+
},
19+
];
20+
const relationships = [];
21+
22+
const step: IntegrationStep<CustomInstanceConfig, CustomExecutionConfig> = {
23+
id: stepId,
24+
name: stepName,
25+
entities,
26+
relationships,
27+
28+
executionHandler: async (context: CustomStepExecutionContext) => {
29+
const { instance, jobState, executionConfig, stepMetadata } = context;
30+
31+
if (
32+
context.myStepExecutionContextField != 'myStepExecutionContextFieldValue'
33+
)
34+
throw new Error('Invalid step execution context');
35+
36+
if (
37+
executionConfig.myExecutionConfigField !== 'myExecutionConfigFieldValue'
38+
)
39+
throw new Error('Invalid execution config');
40+
41+
if (instance.config.myInstanceConfigField !== 'myInstanceConfigFieldValue')
42+
throw new Error('Invalid instance config');
43+
44+
if (stepMetadata.id != stepId) throw new Error('Invalid step metadata');
45+
if (stepMetadata.name != stepName) throw new Error('Invalid step metadata');
46+
if (stepMetadata.entities != entities)
47+
throw new Error('Invalid step metadata');
48+
if (stepMetadata.relationships != relationships)
49+
throw new Error('Invalid step metadata');
50+
51+
await jobState.addEntities([
52+
createIntegrationEntity({
53+
entityData: {
54+
source: {
55+
id: '1234',
56+
name: instance.config.myInstanceConfigField,
57+
description: executionConfig.myExecutionConfigField,
58+
},
59+
assign: {
60+
_key: 'account:1234',
61+
_type: 'my_account',
62+
_class: 'Account',
63+
},
64+
},
65+
}),
66+
]);
67+
},
68+
};
69+
70+
export default step;

packages/integration-sdk-private-test-utils/__fixtures__/typeScriptIntegrationProject/src/index.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,9 @@ import fetchUsers from './steps/fetchUsers';
33

44
import validateInvocation from './validateInvocation';
55
import getStepStartStates from './getStepStartStates';
6+
import { IntegrationInvocationConfig } from '@jupiterone/integration-sdk-core';
67

7-
export const invocationConfig = {
8+
export const invocationConfig: IntegrationInvocationConfig = {
89
instanceConfigFields: {
910
myConfig: {
1011
mask: true,

packages/integration-sdk-private-test-utils/__fixtures__/typeScriptIntegrationProject/src/steps/fetchUsers.ts

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import {
2-
IntegrationStepExecutionContext,
3-
createIntegrationEntity,
42
createDirectRelationship,
3+
createIntegrationEntity,
4+
IntegrationStepExecutionContext,
55
Step,
66
StepExecutionContext,
77
} from '@jupiterone/integration-sdk-core';
@@ -25,9 +25,7 @@ const fetchUsersStep: Step<StepExecutionContext> = {
2525
targetType: 'my_user',
2626
},
2727
],
28-
executionHandler: async ({
29-
jobState,
30-
}: IntegrationStepExecutionContext<{}>) => {
28+
executionHandler: async ({ jobState }: IntegrationStepExecutionContext) => {
3129
await jobState.addEntities([
3230
createIntegrationEntity({
3331
entityData: {
Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1-
export default function validateInvocation() {
2-
return 'loaded';
1+
import { IntegrationExecutionContext } from '@jupiterone/integration-sdk-core';
2+
3+
export default function validateInvocation(
4+
_context: IntegrationExecutionContext,
5+
) {
6+
// no problem-o
37
}

0 commit comments

Comments
 (0)