@keragon/connector-cli 0.0.6 → 0.0.9

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 (27) hide show
  1. package/assets/templates/add/action/src/components/{<%= componentName %>/<%= componentName %>.definition.json.ejs → [%= componentName %]/[%= componentName %].definition.json.ejs } +6 -7
  2. package/assets/templates/add/action/src/components/[%= componentName %]/index.ts.ejs +5 -0
  3. package/assets/templates/add/implementation/component/__tests__/[%= name %].test.ts.ejs +36 -0
  4. package/assets/templates/add/implementation/component/src/components/{<%= name %>/<%= name %>.ts.ejs → [%= name %]/[%= name %].ts.ejs } +6 -6
  5. package/assets/templates/add/implementation/connector/__tests__/[%= name %].test.ts.ejs +28 -0
  6. package/assets/templates/add/implementation/connector/src/{<%= name %>.ts.ejs → [%= name %].ts.ejs } +2 -2
  7. package/assets/templates/add/pollingtrigger/__tests__/{<%= componentName %>.test.ts.ejs → [%= componentName %].test.ts.ejs } +7 -7
  8. package/assets/templates/add/pollingtrigger/src/components/{<%= componentName %>/<%= componentName %>.definition.json.ejs → [%= componentName %]/[%= componentName %].definition.json.ejs } +9 -9
  9. package/assets/templates/add/pollingtrigger/src/components/{<%= componentName %>/<%= componentName %>.ts.ejs → [%= componentName %]/[%= componentName %].ts.ejs } +2 -2
  10. package/assets/templates/add/pollingtrigger/src/components/[%= componentName %]/index.ts.ejs +7 -0
  11. package/assets/templates/add/trigger/__tests__/{<%= componentName %>.test.ts.ejs → [%= componentName %].test.ts.ejs } +8 -8
  12. package/assets/templates/add/trigger/src/components/{<%= componentName %>/<%= componentName %>.definition.json.ejs → [%= componentName %]/[%= componentName %].definition.json.ejs } +8 -8
  13. package/assets/templates/add/trigger/src/components/{<%= componentName %>/<%= componentName %>.ts.ejs → [%= componentName %]/[%= componentName %].ts.ejs } +4 -4
  14. package/assets/templates/add/trigger/src/components/[%= componentName %]/index.ts.ejs +7 -0
  15. package/assets/templates/create/connector/README.md.ejs +1 -1
  16. package/assets/templates/create/connector/keragon.json.ejs +2 -2
  17. package/assets/templates/create/connector/package.json.ejs +2 -2
  18. package/assets/templates/create/connector/src/[%= name %].definition.json.ejs +19 -0
  19. package/assets/templates/create/connector/src/index.ts.ejs +3 -3
  20. package/main.js +1 -1
  21. package/package.json +7 -2
  22. package/assets/templates/add/action/src/components/<%= componentName %>/index.ts.ejs +0 -5
  23. package/assets/templates/add/implementation/component/__tests__/<%= name %>.test.ts.ejs +0 -36
  24. package/assets/templates/add/implementation/connector/__tests__/<%= name %>.test.ts.ejs +0 -28
  25. package/assets/templates/add/pollingtrigger/src/components/<%= componentName %>/index.ts.ejs +0 -7
  26. package/assets/templates/add/trigger/src/components/<%= componentName %>/index.ts.ejs +0 -7
  27. package/assets/templates/create/connector/src/<%= name %>.definition.json.ejs +0 -10
@@ -1,4 +1,4 @@
1
- <%
1
+ [%
2
2
  function formatComponentTitle(str) {
3
3
  const spaced = str?.replace(/([A-Z])/g, ' $1')?.toLowerCase();
4
4
  return spaced?.charAt(0).toUpperCase() + spaced?.slice(1);
@@ -22,8 +22,8 @@
22
22
  if (http) {
23
23
  obj.request = {
24
24
  config: {
25
- method: "get",
26
- url: "/"
25
+ method: (typeof method === 'string' && method) ? method.toLowerCase() : "get",
26
+ url: (typeof url === 'string' && url) ? url : "/"
27
27
  },
28
28
  };
29
29
  }
@@ -96,8 +96,8 @@
96
96
  if (outputs) {
97
97
  obj.outputs = {
98
98
  "$schema": "https://json-schema.org/draft/2020-12/schema",
99
- type: "array",
100
- title: "Items",
99
+ type: "object",
100
+ title: "Item",
101
101
  properties: {
102
102
  id: {
103
103
  type: "string",
@@ -110,5 +110,4 @@
110
110
  }
111
111
  };
112
112
  }
113
- %>
114
- <%- JSON.stringify(obj, null, 2) %>
113
+ %][%- JSON.stringify(obj, null, 2) %]
@@ -0,0 +1,5 @@
1
+ import definition from './[%= componentName %].definition.json';
2
+
3
+ export default {
4
+ definition,
5
+ };
@@ -0,0 +1,36 @@
1
+ import {
2
+ Credentials
3
+ } from '@keragon/connector-sdk';
4
+ import app from '../src';
5
+ import [%= className %] from '../src/components/[%= name %]/[%= name %]';
6
+ const { definition, ctor: [%= firstLetterUpperCase(connectorName) %] } = app;
7
+
8
+ const setupTest = ({
9
+ credentials = {
10
+ authScheme: {
11
+ id: 'com.keragon.[%= connectorName %].environments.prod.authSchemes.custom',
12
+ },
13
+ }
14
+ }: {
15
+ credentials?: Credentials
16
+ }) => {
17
+ const [%= connectorName %] = new [%= firstLetterUpperCase(connectorName) %]({
18
+ definition, credentials,
19
+ });
20
+ const component = [%= connectorName %].constructComponent({ componentId: 'com.keragon.[%= connectorName %].[%= name %]' }) as [%= className %];
21
+
22
+ return { [%= connectorName %], component, credentials }
23
+ };
24
+
25
+ describe('Component: [%= className %] should', () => {
26
+ it('implement run', async () => {
27
+ // Arrange
28
+ const { component } = setupTest({});
29
+
30
+ // Act
31
+ const outputs = await component.run({});
32
+
33
+ // Assert
34
+ expect(outputs).toBe({});
35
+ });
36
+ });
@@ -1,12 +1,12 @@
1
1
  import {
2
- <%= isHttp ? 'HttpApp, HttpComponent,' : 'App, Component,' %>
2
+ [%= isHttp ? 'HttpApp, HttpComponent,' : 'App, Component,' %]
3
3
  RunFunctionArgs,
4
4
  RunFunctionReturnType,
5
5
  } from "@keragon/connector-sdk";
6
- <%- isHttp ? "import { AxiosRequestConfig } from 'axios';" : '' %>
6
+ [%- isHttp ? "import { AxiosRequestConfig } from 'axios';" : '' %]
7
7
 
8
- export default class <%= className %> extends <%= isHttp ? 'HttpComponent' : 'Component' %><<%= isHttp ? 'HttpApp' : 'App' %>> {
9
- <%_ if (isHttp) { _%>
8
+ export default class [%= className %] extends [%= isHttp ? 'HttpComponent' : 'Component' %]<[%= isHttp ? 'HttpApp' : 'App' %]> {
9
+ [%_ if (isHttp) { _%]
10
10
  override async onRequest({
11
11
  requestConfig,
12
12
  }: {
@@ -25,10 +25,10 @@ export default class <%= className %> extends <%= isHttp ? 'HttpComponent' : 'Co
25
25
  },
26
26
  };
27
27
  }
28
- <%_ } else { _%>
28
+ [%_ } else { _%]
29
29
  override async run({ inputs }: RunFunctionArgs): Promise<RunFunctionReturnType> {
30
30
  if (!inputs) throw new Error(`Component ${this.definition.id} run() received no inputs`);
31
31
  throw new Error('Change default implementation of run() method');
32
32
  }
33
- <%_ } _%>
33
+ [%_ } _%]
34
34
  }
@@ -0,0 +1,28 @@
1
+ import {
2
+ Credentials
3
+ } from '@keragon/connector-sdk';
4
+ import app from '../src';
5
+ const { definition, ctor: [%= firstLetterUpperCase(name) %] } = app;
6
+
7
+ const setupTest = ({
8
+ credentials = {
9
+ authScheme: {
10
+ id: 'com.keragon.[%= name %].environments.prod.authSchemes.custom',
11
+ },
12
+ }
13
+ }: {
14
+ credentials?: Credentials
15
+ }) => {
16
+ const [%= name %] = new [%= firstLetterUpperCase(name) %]({
17
+ definition, credentials,
18
+ });
19
+ return { [%= name %], credentials }
20
+ };
21
+
22
+ describe('Connector: [%= firstLetterUpperCase(name) %] should', () => {
23
+ it('construct connector', async () => {
24
+ const { [%= name %] } = setupTest({});
25
+
26
+ expect([%= name %]).toBeDefined();
27
+ });
28
+ });
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  ConfigureCredentialsArgs,
3
- <%= isHttp ? 'HttpApp' : 'App' %>,
3
+ [%= isHttp ? 'HttpApp' : 'App' %],
4
4
  } from '@keragon/connector-sdk';
5
5
 
6
- export default class <%= firstLetterUpperCase(name) %> extends <%= isHttp ? 'HttpApp' : 'App' %> {
6
+ export default class [%= firstLetterUpperCase(name) %] extends [%= isHttp ? 'HttpApp' : 'App' %] {
7
7
  // TODO: default implementation
8
8
  override async configureCredentials(args: ConfigureCredentialsArgs) {
9
9
  const configuredCredentials = await super.configureCredentials(args);
@@ -1,7 +1,7 @@
1
1
  import { CloudEventData } from '@keragon/types';
2
2
  import { CloudEvent } from 'cloudevents';
3
3
  import app from '../src';
4
- const { definition, ctor: <%= firstLetterUpperCase(connectorId) %> } = app;
4
+ const { definition, ctor: [%= firstLetterUpperCase(connectorId) %] } = app;
5
5
 
6
6
  const mockAxiosGet = jest.fn();
7
7
  const mockAxiosPost = jest.fn();
@@ -28,22 +28,22 @@ const setUpTest = ({
28
28
  }: {
29
29
  store?: Record<string, unknown>;
30
30
  }) => {
31
- const <%= connectorId %>: InstanceType<typeof <%= firstLetterUpperCase(connectorId) %>> = new <%= firstLetterUpperCase(connectorId) %>({
31
+ const [%= connectorId %]: InstanceType<typeof [%= firstLetterUpperCase(connectorId) %]> = new [%= firstLetterUpperCase(connectorId) %]({
32
32
  definition,
33
33
  credentials: {
34
34
  key: 'mockKey',
35
35
  authScheme: {
36
36
  // TODO authScheme
37
- id: '<%= connectorId %>.environments.prod.authSchemes.apiKey',
37
+ id: '[%= connectorId %].environments.prod.authSchemes.apiKey',
38
38
  },
39
39
  }
40
40
  });
41
41
 
42
- const trigger = <%= connectorId %>.constructComponent({ componentId: '<%= componentId %>', store });
43
- return { <%= connectorId %>, trigger, webhookUrl: 'https://test.com/v1/' };
42
+ const trigger = [%= connectorId %].constructComponent({ componentId: '[%= componentId %]', store });
43
+ return { [%= connectorId %], trigger, webhookUrl: 'https://test.com/v1/' };
44
44
  };
45
45
 
46
- describe('Component: Trigger <%= componentId %> should', () => {
46
+ describe('Component: Trigger [%= componentId %] should', () => {
47
47
 
48
48
  it('.generateSampleEvents returns sample', async () => {
49
49
  // Arrange
@@ -61,7 +61,7 @@ describe('Component: Trigger <%= componentId %> should', () => {
61
61
 
62
62
  // Assert
63
63
  expect(mockGetDynamicValue).toHaveBeenCalledWith({
64
- componentId: '<%= connectorId %>.getItems',
64
+ componentId: '[%= connectorId %].getItems',
65
65
  processInputs: '${ {} }',
66
66
  processOutputs: '${ }',
67
67
  });
@@ -1,13 +1,13 @@
1
1
  {
2
- "id": "<%= componentId %>",
3
- "title": "<%= title %>",
4
- "description": "<%= desc %>",
2
+ "id": "[%= componentId %]",
3
+ "title": "[%= title %]",
4
+ "description": "[%= desc %]",
5
5
  "type": "trigger",
6
- "sdkVersion": "0.0.1"<% if (alert) { %>,
6
+ "sdkVersion": "0.0.1"[% if (alert) { %],
7
7
  "alerts": [{
8
8
  "type": "info",
9
9
  "content": "TODO: Add alert message. You can change the type to 'warning' or 'error' if needed."
10
- }]<% } %>,
10
+ }][% } %],
11
11
  "poll": {
12
12
  "schedule": {
13
13
  "cron": "*/5 * * * *"
@@ -17,11 +17,11 @@
17
17
  "getDedupValue": "${ .item.created_time }"
18
18
  },
19
19
  "poller": {
20
- "componentId": "<%= connectorId %>.getItems<TODO set correct component>",
20
+ "componentId": "[%= connectorId %].getItems<TODO set correct component>",
21
21
  "processInputs": "${ { event: .event } }",
22
22
  "processOutputs": "${ . | sort_by(.created_time) | reverse }"
23
23
  }
24
- }<% if (inputs) { %>,
24
+ }[% if (inputs) { %],
25
25
  "inputs": {
26
26
  "$schema": "https://json-schema.org/draft/2020-12/schema",
27
27
  "type": "object",
@@ -32,11 +32,11 @@
32
32
  "type": "string",
33
33
  "title": "Event",
34
34
  "dynamicEnum": {
35
- "componentId": "<%= connectorId %>.get",
35
+ "componentId": "[%= connectorId %].get",
36
36
  "processInputs": "${ }",
37
37
  "processOutputs": "${ [.[] | {label: .name, value: .type}] }"
38
38
  }
39
39
  }
40
40
  }
41
- }<% } %>
41
+ }[% } %]
42
42
  }
@@ -5,12 +5,12 @@ import {
5
5
  App,
6
6
  } from '@keragon/connector-sdk';
7
7
 
8
- export default class <%= firstLetterUpperCase(componentName) %> extends PollingTrigger<App> implements HasSampleEvents {
8
+ export default class [%= firstLetterUpperCase(componentName) %] extends PollingTrigger<App> implements HasSampleEvents {
9
9
 
10
10
  async generateSampleEvents({ store: _, ...inputs }: Record<string, unknown>): Promise<SampleEvent[]> {
11
11
  const { a, b, c } = this.validateInputs(inputs);
12
12
  const items = await this.getDynamicValue({
13
- componentId: '<%= connectorId %>.getItems<TODO set correct component>',
13
+ componentId: '[%= connectorId %].getItems<TODO set correct component>',
14
14
  processInputs: `\${ ${JSON.stringify({ a, b, c })} }`,
15
15
  processOutputs: '${ sort_by(.date) | reverse }'
16
16
  });
@@ -0,0 +1,7 @@
1
+ import definition from './[%= componentName %].definition.json';
2
+ import [%= firstLetterUpperCase(componentName) %] from './[%= componentName %]';
3
+
4
+ export default {
5
+ ctor: [%= firstLetterUpperCase(componentName) %],
6
+ definition,
7
+ };
@@ -1,7 +1,7 @@
1
1
  import { CloudEventData } from '@keragon/types';
2
2
  import { CloudEvent } from 'cloudevents';
3
3
  import app from '../src';
4
- const { definition, ctor: <%= firstLetterUpperCase(connectorId) %> } = app;
4
+ const { definition, ctor: [%= firstLetterUpperCase(connectorId) %] } = app;
5
5
 
6
6
  const mockAxiosGet = jest.fn();
7
7
  const mockAxiosPost = jest.fn();
@@ -28,22 +28,22 @@ const setUpTest = ({
28
28
  }: {
29
29
  store?: Record<string, unknown>;
30
30
  }) => {
31
- const <%= connectorId %>: InstanceType<typeof <%= firstLetterUpperCase(connectorId) %>> = new <%= firstLetterUpperCase(connectorId) %>({
31
+ const [%= connectorId %]: InstanceType<typeof [%= firstLetterUpperCase(connectorId) %]> = new [%= firstLetterUpperCase(connectorId) %]({
32
32
  definition,
33
33
  credentials: {
34
34
  key: 'mockKey',
35
35
  authScheme: {
36
36
  // TODO authScheme
37
- id: '<%= connectorId %>.environments.prod.authSchemes.apiKey',
37
+ id: '[%= connectorId %].environments.prod.authSchemes.apiKey',
38
38
  },
39
39
  }
40
40
  });
41
41
 
42
- const trigger = <%= connectorId %>.constructComponent({ componentId: '<%= componentId %>', store });
43
- return { <%= connectorId %>, trigger, webhookUrl: 'https://test.com/v1/' };
42
+ const trigger = [%= connectorId %].constructComponent({ componentId: '[%= componentId %]', store });
43
+ return { [%= connectorId %], trigger, webhookUrl: 'https://test.com/v1/' };
44
44
  };
45
45
 
46
- describe('Component: Trigger <%= componentId %> should', () => {
46
+ describe('Component: Trigger [%= componentId %] should', () => {
47
47
 
48
48
  describe('implement configure() and', () => {
49
49
 
@@ -66,7 +66,7 @@ describe('Component: Trigger <%= componentId %> should', () => {
66
66
  });
67
67
 
68
68
  // Assert that the webhook id, url and secret were stored
69
- expect(trigger.store.get('webhookURL')).toEqual('https://test.com/v2/?triggerId=<%= componentId %>');
69
+ expect(trigger.store.get('webhookURL')).toEqual('https://test.com/v2/?triggerId=[%= componentId %]');
70
70
  expect(trigger.store.get('webhookID')).toEqual('mockWebhookId');
71
71
 
72
72
  // Assert that the configured inputs are returned
@@ -107,7 +107,7 @@ describe('Component: Trigger <%= componentId %> should', () => {
107
107
 
108
108
  const event = {} as CloudEvent<CloudEventData>;
109
109
 
110
- await expect(trigger.run({ event })).rejects.toThrow('Component <%= componentId %> run() received no event payload');
110
+ await expect(trigger.run({ event })).rejects.toThrow('Component [%= componentId %] run() received no event payload');
111
111
  });
112
112
 
113
113
  it('return passed events', async () => {
@@ -1,19 +1,19 @@
1
1
  {
2
- "id": "<%= componentId %>",
3
- "title": "<%= title %>",
4
- "description": "<%= desc %>",
2
+ "id": "[%= componentId %]",
3
+ "title": "[%= title %]",
4
+ "description": "[%= desc %]",
5
5
  "type": "trigger",
6
- "sdkVersion": "0.0.1"<% if (alert) { %>,
6
+ "sdkVersion": "0.0.1"[% if (alert) { %],
7
7
  "alerts": [{
8
8
  "type": "info",
9
9
  "content": "TODO: Add alert message. You can change the type to 'warning' or 'error' if needed."
10
- }]<% } %><% if (http) { %>,
10
+ }][% } %][% if (http) { %],
11
11
  "request": {
12
12
  "config": {
13
13
  "method": "get",
14
14
  "url": "/"
15
15
  }
16
- }<% } %><% if (inputs) { %>,
16
+ }[% } %][% if (inputs) { %],
17
17
  "inputs": {
18
18
  "$schema": "https://json-schema.org/draft/2020-12/schema",
19
19
  "type": "object",
@@ -24,11 +24,11 @@
24
24
  "type": "string",
25
25
  "title": "Event",
26
26
  "dynamicEnum": {
27
- "componentId": "<%= connectorId %>.get",
27
+ "componentId": "[%= connectorId %].get",
28
28
  "processInputs": "${ }",
29
29
  "processOutputs": "${ [.[] | {label: .name, value: .type}] }"
30
30
  }
31
31
  }
32
32
  }
33
- }<% } %>
33
+ }[% } %]
34
34
  }
@@ -4,11 +4,11 @@ import {
4
4
  extractErrorMessage,
5
5
  RunFunctionReturnType,
6
6
  RunFunctionArgs,
7
- <%= http ? 'HttpApp' : 'App' %>,
8
- <%= http ? 'HttpComponent' : 'Component' %>,
7
+ [%= http ? 'HttpApp' : 'App' %],
8
+ [%= http ? 'HttpComponent' : 'Component' %],
9
9
  } from '@keragon/connector-sdk';
10
10
 
11
- export default class <%= firstLetterUpperCase(componentName) %> extends <%- http ? 'HttpComponent<HttpApp>' : 'Component<App>' %> implements HasSampleEvents {
11
+ export default class [%= firstLetterUpperCase(componentName) %] extends [%- http ? 'HttpComponent<HttpApp>' : 'Component<App>' %] implements HasSampleEvents {
12
12
 
13
13
  override async configure(inputs: Record<string, unknown> = {}, webhookURL: string, ..._rest: string[]) {
14
14
  if (this.store.get('webhookID')) {
@@ -51,7 +51,7 @@ export default class <%= firstLetterUpperCase(componentName) %> extends <%- http
51
51
  async generateSampleEvents({ store: _, ...inputs }: Record<string, unknown>): Promise<SampleEvent[]> {
52
52
  const { a, b, c } = this.validateInputs(inputs);
53
53
  const items = await this.getDynamicValue({
54
- componentId: '<%= connectorId %>.getItems<TODO set correct component>',
54
+ componentId: '[%= connectorId %].getItems<TODO set correct component>',
55
55
  processInputs: `\${ ${JSON.stringify({ a, b, c })} }`,
56
56
  processOutputs: '${ sort_by(.date) | reverse }'
57
57
  });
@@ -0,0 +1,7 @@
1
+ import definition from './[%= componentName %].definition.json';
2
+ import [%= firstLetterUpperCase(componentName) %] from './[%= componentName %]';
3
+
4
+ export default {
5
+ ctor: [%= firstLetterUpperCase(componentName) %],
6
+ definition,
7
+ };
@@ -1 +1 @@
1
- # <%= name %> connector
1
+ # [%= name %] connector
@@ -1,3 +1,3 @@
1
1
  {
2
- "name": "<%= name %>"
3
- }
2
+ "name": "[%= name %]"
3
+ }
@@ -1,7 +1,7 @@
1
1
  {
2
- "name": "@keragonhq/<%= name %>",
2
+ "name": "@keragonhq/[%= name %]",
3
3
  "version": "0.0.1",
4
- "description": "Keragon's built-in <%= firstLetterUpperCase(name) %> app",
4
+ "description": "Keragon's built-in [%= firstLetterUpperCase(name) %] app",
5
5
  "main": "index.js",
6
6
  "publishConfig": {
7
7
  "registry": "https://npm.pkg.github.com",
@@ -0,0 +1,19 @@
1
+ {
2
+ "id": "com.keragon.[%= name %]",
3
+ "title": "[%= firstLetterUpperCase(name) %]",
4
+ "tags": [%- JSON.stringify(tags ?? []) %],
5
+ "icon": "/assets/[%= name %].svg",
6
+ "description": "[%= desc %]",
7
+ "version": "0.0.1",
8
+ "environments": [
9
+ {
10
+ "id": "com.keragon.[%= name %].environments.prod",
11
+ "title": "Production",
12
+ "description": "Production environment"[% if (http) { %],
13
+ "requestDefaults": {
14
+ "baseURL": "[%= baseUrl ? baseUrl : '<Replace with base URL>' %]"
15
+ },
16
+ "supportedAuthSchemes": [][% } %]
17
+ }
18
+ ]
19
+ }
@@ -1,9 +1,9 @@
1
1
  import {
2
- <%= http ? 'createHttpAppDescriptor' : 'createAppDescriptor' %>
2
+ [%= http ? 'createHttpAppDescriptor' : 'createAppDescriptor' %]
3
3
  } from '@keragon/connector-sdk';
4
4
  import components from './components';
5
- import definition from './<%= name %>.definition.json';
5
+ import definition from './[%= name %].definition.json';
6
6
 
7
- export default <%= http ? 'createHttpAppDescriptor' : 'createAppDescriptor' %> ({
7
+ export default [%= http ? 'createHttpAppDescriptor' : 'createAppDescriptor' %] ({
8
8
  definition: { ...definition, components },
9
9
  });