Skip to content

Commit 9c8de02

Browse files
authored
Add polling trigger functionality to CNI (#387)
* Add flow trigger type to integration * Runtime validation for triggerType and schedule * Remove property from the yaml that's generated * Extract polling context logic * Add support for poll trigger * Add testing for polling support * Migrate all types to use generics * Don't thread generic config vars * Add generic defaults * Punt on this for now * Minor bump
1 parent 00d30b4 commit 9c8de02

23 files changed

+1533
-229
lines changed

packages/spectral-test/src/IntegrationDefinition.test-d.ts

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,3 +48,35 @@ expectAssignable<Parameters<FlowExecutionContextActions["slack"]["postMessage"]>
4848
connection: "testConnection",
4949
channel: "testChannel",
5050
});
51+
52+
const withPollingTriggerDefinition = integration({
53+
name: "Polling Integration",
54+
description: "Integration with polling trigger",
55+
category: "Basic",
56+
version: "0.0.1",
57+
iconPath: "icon.png",
58+
flows: [
59+
{
60+
name: "Polling Flow",
61+
stableKey: "pollingFlow",
62+
description: "A flow with a polling trigger",
63+
triggerType: "polling",
64+
schedule: { value: "*/5 * * * *" }, // Required for polling triggers
65+
onTrigger: async (context, payload, params) => {
66+
// Test polling context methods are available
67+
const state = context.polling.getState();
68+
context.polling.setState({ lastPoll: new Date().toISOString() });
69+
70+
return Promise.resolve({
71+
payload,
72+
});
73+
},
74+
onExecution: async (context, params) => {
75+
return Promise.resolve({
76+
data: "SUCCESS",
77+
});
78+
},
79+
},
80+
],
81+
});
82+
expectAssignable<Component>(withPollingTriggerDefinition);

packages/spectral/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@prismatic-io/spectral",
3-
"version": "10.12.3",
3+
"version": "10.13.0",
44
"description": "Utility library for building Prismatic connectors and code-native integrations",
55
"keywords": ["prismatic"],
66
"main": "dist/index.js",

packages/spectral/src/generators/cniComponentManifest/index.ts

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
import axios, { AxiosError } from "axios";
2-
import type { DataSourceType } from "../../types";
2+
import type {
3+
DataSourceType,
4+
Inputs,
5+
ConfigVarResultCollection,
6+
TriggerPayload,
7+
TriggerResult,
8+
} from "../../types";
39
import {
410
ComponentNode,
511
InputNode,
@@ -22,7 +28,17 @@ function transformInputNodes(inputs: InputNode[]) {
2228

2329
// This function does not return a complete Component as described in ServerTypes;
2430
// it instead selectively returns only what's needed to generate a manifest.
25-
export const fetchComponentDataForManifest = async ({
31+
export const fetchComponentDataForManifest = async <
32+
TInputs extends Inputs,
33+
TActionInputs extends Inputs,
34+
TConfigVars extends ConfigVarResultCollection = ConfigVarResultCollection,
35+
TPayload extends TriggerPayload = TriggerPayload,
36+
TAllowsBranching extends boolean = boolean,
37+
TResult extends TriggerResult<TAllowsBranching, TPayload> = TriggerResult<
38+
TAllowsBranching,
39+
TPayload
40+
>,
41+
>({
2642
componentKey,
2743
isPrivate,
2844
}: { componentKey: string; isPrivate: boolean }) => {
@@ -96,7 +112,10 @@ export const fetchComponentDataForManifest = async ({
96112
const componentActions = await getComponentActions(component.id, prismaticUrl, accessToken);
97113

98114
const actions: Record<string, FormattedAction> = {};
99-
const triggers: Record<string, FormattedTrigger> = {};
115+
const triggers: Record<
116+
string,
117+
FormattedTrigger<TInputs, TActionInputs, TConfigVars, TPayload, TAllowsBranching, TResult>
118+
> = {};
100119
const dataSources: Record<string, FormattedDataSource> = {};
101120

102121
componentActions.forEach((node) => {

packages/spectral/src/generators/cniComponentManifest/types.ts

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
import { Action, Component, DataSource, Trigger } from "../../serverTypes";
1+
import { Action, Component, DataSource, Trigger, TriggerPayload } from "../../serverTypes";
2+
import { ConfigVarResultCollection, Inputs } from "../../types";
3+
import { TriggerResult } from "../../types/TriggerResult";
24

35
export interface ComponentNode {
46
id: string;
@@ -51,15 +53,45 @@ export interface InputNode {
5153
}
5254

5355
export type FormattedAction = Pick<Action, "key" | "display" | "inputs" | "examplePayload">;
54-
export type FormattedTrigger = Pick<Trigger, "key" | "display" | "inputs">;
56+
export type FormattedTrigger<
57+
TInputs extends Inputs,
58+
TActionInputs extends Inputs,
59+
TConfigVars extends ConfigVarResultCollection = ConfigVarResultCollection,
60+
TPayload extends TriggerPayload = TriggerPayload,
61+
TAllowsBranching extends boolean = boolean,
62+
TResult extends TriggerResult<TAllowsBranching, TPayload> = TriggerResult<
63+
TAllowsBranching,
64+
TPayload
65+
>,
66+
> = Pick<
67+
Trigger<TInputs, TActionInputs, TConfigVars, TPayload, TAllowsBranching, TResult>,
68+
"key" | "display" | "inputs"
69+
>;
5570
export type FormattedDataSource = Pick<
5671
DataSource,
5772
"key" | "display" | "inputs" | "dataSourceType" | "examplePayload"
5873
>;
5974

60-
export type ComponentForManifest = Pick<Component, "key" | "public" | "display" | "connections"> & {
75+
export type ComponentForManifest<
76+
TInputs extends Inputs,
77+
TActionInputs extends Inputs,
78+
TConfigVars extends ConfigVarResultCollection = ConfigVarResultCollection,
79+
TPayload extends TriggerPayload = TriggerPayload,
80+
TAllowsBranching extends boolean = boolean,
81+
TResult extends TriggerResult<TAllowsBranching, TPayload> = TriggerResult<
82+
TAllowsBranching,
83+
TPayload
84+
>,
85+
> = Pick<
86+
Component<TInputs, TActionInputs, TConfigVars, TPayload, TAllowsBranching, TResult>,
87+
"key" | "public" | "display" | "connections"
88+
> & {
6189
actions: Record<string, Action | FormattedAction>;
62-
triggers: Record<string, Trigger | FormattedTrigger>;
90+
triggers: Record<
91+
string,
92+
| Trigger<TInputs, TActionInputs, TConfigVars, TPayload, TAllowsBranching, TResult>
93+
| FormattedTrigger<TInputs, TActionInputs, TConfigVars, TPayload, TAllowsBranching, TResult>
94+
>;
6395
dataSources: Record<string, DataSource | FormattedDataSource>;
6496
};
6597

packages/spectral/src/generators/componentManifest/createActions.ts

Lines changed: 39 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,22 +7,57 @@ import { createTemplate } from "../utils/createTemplate";
77
import { createTypeInterface } from "../utils/createTypeInterface";
88
import { createImport } from "../utils/createImport";
99
import type { ComponentForManifest } from "../cniComponentManifest/types";
10+
import { Inputs, ConfigVarResultCollection, TriggerPayload, TriggerResult } from "../../types";
1011

11-
interface CreateActionsProps {
12-
component: ComponentForManifest;
12+
interface CreateActionsProps<
13+
TInputs extends Inputs,
14+
TActionInputs extends Inputs,
15+
TConfigVars extends ConfigVarResultCollection = ConfigVarResultCollection,
16+
TPayload extends TriggerPayload = TriggerPayload,
17+
TAllowsBranching extends boolean = boolean,
18+
TResult extends TriggerResult<TAllowsBranching, TPayload> = TriggerResult<
19+
TAllowsBranching,
20+
TPayload
21+
>,
22+
> {
23+
component: ComponentForManifest<
24+
TInputs,
25+
TActionInputs,
26+
TConfigVars,
27+
TPayload,
28+
TAllowsBranching,
29+
TResult
30+
>;
1331
dryRun: boolean;
1432
verbose: boolean;
1533
sourceDir: string;
1634
destinationDir: string;
1735
}
1836

19-
export const createActions = async ({
37+
export const createActions = async <
38+
TInputs extends Inputs,
39+
TActionInputs extends Inputs,
40+
TConfigVars extends ConfigVarResultCollection = ConfigVarResultCollection,
41+
TPayload extends TriggerPayload = TriggerPayload,
42+
TAllowsBranching extends boolean = boolean,
43+
TResult extends TriggerResult<TAllowsBranching, TPayload> = TriggerResult<
44+
TAllowsBranching,
45+
TPayload
46+
>,
47+
>({
2048
component,
2149
dryRun,
2250
verbose,
2351
sourceDir,
2452
destinationDir,
25-
}: CreateActionsProps) => {
53+
}: CreateActionsProps<
54+
TInputs,
55+
TActionInputs,
56+
TConfigVars,
57+
TPayload,
58+
TAllowsBranching,
59+
TResult
60+
>) => {
2661
if (verbose) {
2762
console.info("Creating actions...");
2863
}

packages/spectral/src/generators/componentManifest/createConnections.ts

Lines changed: 39 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,22 +7,57 @@ import { createTemplate } from "../utils/createTemplate";
77
import { createTypeInterface } from "../utils/createTypeInterface";
88
import { createImport } from "../utils/createImport";
99
import type { ComponentForManifest } from "../cniComponentManifest/types";
10+
import { Inputs, ConfigVarResultCollection, TriggerPayload, TriggerResult } from "../../types";
1011

11-
interface CreateConnectionsProps {
12-
component: ComponentForManifest;
12+
interface CreateConnectionsProps<
13+
TInputs extends Inputs,
14+
TActionInputs extends Inputs,
15+
TConfigVars extends ConfigVarResultCollection = ConfigVarResultCollection,
16+
TPayload extends TriggerPayload = TriggerPayload,
17+
TAllowsBranching extends boolean = boolean,
18+
TResult extends TriggerResult<TAllowsBranching, TPayload> = TriggerResult<
19+
TAllowsBranching,
20+
TPayload
21+
>,
22+
> {
23+
component: ComponentForManifest<
24+
TInputs,
25+
TActionInputs,
26+
TConfigVars,
27+
TPayload,
28+
TAllowsBranching,
29+
TResult
30+
>;
1331
dryRun: boolean;
1432
verbose: boolean;
1533
sourceDir: string;
1634
destinationDir: string;
1735
}
1836

19-
export const createConnections = async ({
37+
export const createConnections = async <
38+
TInputs extends Inputs,
39+
TActionInputs extends Inputs,
40+
TConfigVars extends ConfigVarResultCollection = ConfigVarResultCollection,
41+
TPayload extends TriggerPayload = TriggerPayload,
42+
TAllowsBranching extends boolean = boolean,
43+
TResult extends TriggerResult<TAllowsBranching, TPayload> = TriggerResult<
44+
TAllowsBranching,
45+
TPayload
46+
>,
47+
>({
2048
component,
2149
dryRun,
2250
verbose,
2351
sourceDir,
2452
destinationDir,
25-
}: CreateConnectionsProps) => {
53+
}: CreateConnectionsProps<
54+
TInputs,
55+
TActionInputs,
56+
TConfigVars,
57+
TPayload,
58+
TAllowsBranching,
59+
TResult
60+
>) => {
2661
if (verbose) {
2762
console.info("Creating connections...");
2863
}

packages/spectral/src/generators/componentManifest/createDataSources.ts

Lines changed: 39 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,22 +8,57 @@ import { createTypeInterface } from "../utils/createTypeInterface";
88
import { createImport } from "../utils/createImport";
99
import type { DataSourceType } from "../../types";
1010
import type { ComponentForManifest } from "../cniComponentManifest/types";
11+
import { Inputs, ConfigVarResultCollection, TriggerPayload, TriggerResult } from "../../types";
1112

12-
interface CreateDataSourcesProps {
13-
component: ComponentForManifest;
13+
interface CreateDataSourcesProps<
14+
TInputs extends Inputs,
15+
TActionInputs extends Inputs,
16+
TConfigVars extends ConfigVarResultCollection = ConfigVarResultCollection,
17+
TPayload extends TriggerPayload = TriggerPayload,
18+
TAllowsBranching extends boolean = boolean,
19+
TResult extends TriggerResult<TAllowsBranching, TPayload> = TriggerResult<
20+
TAllowsBranching,
21+
TPayload
22+
>,
23+
> {
24+
component: ComponentForManifest<
25+
TInputs,
26+
TActionInputs,
27+
TConfigVars,
28+
TPayload,
29+
TAllowsBranching,
30+
TResult
31+
>;
1432
dryRun: boolean;
1533
verbose: boolean;
1634
sourceDir: string;
1735
destinationDir: string;
1836
}
1937

20-
export const createDataSources = async ({
38+
export const createDataSources = async <
39+
TInputs extends Inputs,
40+
TActionInputs extends Inputs,
41+
TConfigVars extends ConfigVarResultCollection = ConfigVarResultCollection,
42+
TPayload extends TriggerPayload = TriggerPayload,
43+
TAllowsBranching extends boolean = boolean,
44+
TResult extends TriggerResult<TAllowsBranching, TPayload> = TriggerResult<
45+
TAllowsBranching,
46+
TPayload
47+
>,
48+
>({
2149
component,
2250
dryRun,
2351
verbose,
2452
sourceDir,
2553
destinationDir,
26-
}: CreateDataSourcesProps) => {
54+
}: CreateDataSourcesProps<
55+
TInputs,
56+
TActionInputs,
57+
TConfigVars,
58+
TPayload,
59+
TAllowsBranching,
60+
TResult
61+
>) => {
2762
if (verbose) {
2863
console.info("Creating data sources...");
2964
}

packages/spectral/src/generators/componentManifest/createStaticFiles.ts

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,26 @@ import path from "path";
33
import { helpers } from "./helpers";
44
import { createTemplate } from "../utils/createTemplate";
55
import type { Component } from "../../serverTypes";
6+
import { Inputs, ConfigVarResultCollection, TriggerPayload, TriggerResult } from "../../types";
67

78
export interface PackageDependencies {
89
spectral: string;
910
dependencies: Record<string, string>;
1011
devDependencies: Record<string, string>;
1112
}
1213

13-
interface CreateStaticFilesProps {
14-
component: Component;
14+
interface CreateStaticFilesProps<
15+
TInputs extends Inputs,
16+
TActionInputs extends Inputs,
17+
TConfigVars extends ConfigVarResultCollection = ConfigVarResultCollection,
18+
TPayload extends TriggerPayload = TriggerPayload,
19+
TAllowsBranching extends boolean = boolean,
20+
TResult extends TriggerResult<TAllowsBranching, TPayload> = TriggerResult<
21+
TAllowsBranching,
22+
TPayload
23+
>,
24+
> {
25+
component: Component<TInputs, TActionInputs, TConfigVars, TPayload, TAllowsBranching, TResult>;
1526
dryRun: boolean;
1627
signature: string | null;
1728
packageName: string;
@@ -22,7 +33,17 @@ interface CreateStaticFilesProps {
2233
registry: string | null;
2334
}
2435

25-
export const createStaticFiles = async ({
36+
export const createStaticFiles = async <
37+
TInputs extends Inputs,
38+
TActionInputs extends Inputs,
39+
TConfigVars extends ConfigVarResultCollection = ConfigVarResultCollection,
40+
TPayload extends TriggerPayload = TriggerPayload,
41+
TAllowsBranching extends boolean = boolean,
42+
TResult extends TriggerResult<TAllowsBranching, TPayload> = TriggerResult<
43+
TAllowsBranching,
44+
TPayload
45+
>,
46+
>({
2647
component,
2748
dryRun,
2849
signature,
@@ -32,7 +53,14 @@ export const createStaticFiles = async ({
3253
sourceDir,
3354
destinationDir,
3455
registry,
35-
}: CreateStaticFilesProps) => {
56+
}: CreateStaticFilesProps<
57+
TInputs,
58+
TActionInputs,
59+
TConfigVars,
60+
TPayload,
61+
TAllowsBranching,
62+
TResult
63+
>) => {
3664
if (verbose) {
3765
console.info("Creating static files...");
3866
}

0 commit comments

Comments
 (0)