@oomol-lab/open-connector 1.7.0 → 1.8.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/README.md +4 -0
- package/assets/open-connector/catalog/apps/airtable.json +134 -0
- package/assets/open-connector/catalog/apps/aisa.json +916 -76
- package/assets/open-connector/catalog/apps/cal.json +24 -6
- package/assets/open-connector/catalog/apps/discordbot.json +2 -2
- package/assets/open-connector/catalog/apps/enormail.json +411 -0
- package/assets/open-connector/catalog/apps/feishu_app_bot.json +158 -0
- package/assets/open-connector/catalog/apps/github.json +275 -0
- package/assets/open-connector/catalog/apps/gitlab.json +125 -0
- package/assets/open-connector/catalog/apps/gmail.json +151 -0
- package/assets/open-connector/catalog/apps/googlecalendar.json +206 -0
- package/assets/open-connector/catalog/apps/googledrive.json +479 -0
- package/assets/open-connector/catalog/apps/googlesheets.json +144 -0
- package/assets/open-connector/catalog/apps/hithink_finance.json +6 -3
- package/assets/open-connector/catalog/apps/indexed.json +1115 -0
- package/assets/open-connector/catalog/apps/linear.json +116 -0
- package/assets/open-connector/catalog/apps/notion.json +142 -0
- package/assets/open-connector/catalog/apps/one_drive.json +185 -0
- package/assets/open-connector/catalog/apps/outlook.json +182 -0
- package/assets/open-connector/catalog/apps/shopify.json +282 -0
- package/assets/open-connector/catalog/apps/slack.json +182 -0
- package/assets/open-connector/catalog/apps/spotify.json +46 -43
- package/assets/open-connector/catalog/apps/stripe.json +96 -0
- package/assets/open-connector/catalog/apps/telegram.json +138 -0
- package/assets/open-connector/catalog/apps/weixin_store.json +543 -2
- package/assets/open-connector/catalog/apps/woocommerce.json +127 -0
- package/assets/open-connector/catalog/apps/zendesk.json +152 -0
- package/assets/open-connector/catalog/apps/zerotier.json +9 -9
- package/assets/open-connector/catalog/apps-index.json +1 -1
- package/assets/open-connector/migrations/0014_saas_project.sql +55 -0
- package/assets/open-connector/migrations/0015_saas_cleanup_runtime.sql +8 -0
- package/assets/open-connector/migrations/0016_trigger_policy.sql +1 -0
- package/assets/open-connector/migrations/0017_trigger_subscriptions.sql +17 -0
- package/assets/open-connector/migrations/postgresql/0014_saas_project.sql +55 -0
- package/assets/open-connector/migrations/postgresql/0015_saas_cleanup_runtime.sql +8 -0
- package/assets/open-connector/migrations/postgresql/0016_trigger_policy.sql +1 -0
- package/assets/open-connector/migrations/postgresql/0017_trigger_subscriptions.sql +17 -0
- package/package.json +2 -2
- package/src/connection-service.d.ts +40 -7
- package/src/connection-service.js +60 -18
- package/src/core/action-policy.d.ts +8 -1
- package/src/core/action-policy.js +51 -0
- package/src/core/cast.d.ts +3 -0
- package/src/core/cast.js +4 -1
- package/src/core/guarded-fetch.d.ts +5 -0
- package/src/core/guarded-fetch.js +13 -4
- package/src/core/remote-http.d.ts +33 -0
- package/src/core/remote-http.js +104 -0
- package/src/core/request.d.ts +1 -0
- package/src/core/request.js +7 -0
- package/src/core/types.d.ts +4 -0
- package/src/marketplace/marketplace-service.d.ts +0 -1
- package/src/marketplace/marketplace-service.js +80 -92
- package/src/mcp.js +19 -5
- package/src/oauth/oauth-flow-service.d.ts +8 -1
- package/src/oauth/oauth-flow-service.js +10 -4
- package/src/providers/action-contracts.generated.d.ts +4 -2
- package/src/providers/airtable/executors.d.ts +3 -0
- package/src/providers/airtable/executors.js +2 -0
- package/src/providers/airtable/trigger-on-record-changed.d.ts +2 -0
- package/src/providers/airtable/trigger-on-record-changed.definition.d.ts +4 -0
- package/src/providers/airtable/trigger-on-record-changed.definition.js +54 -0
- package/src/providers/airtable/trigger-on-record-changed.js +235 -0
- package/src/providers/aisa/executors.js +196 -22
- package/src/providers/cal/actions.js +5 -1
- package/src/providers/enormail/executors.d.ts +4 -0
- package/src/providers/enormail/executors.js +97 -0
- package/src/providers/feishu_app_bot/executors.d.ts +3 -0
- package/src/providers/feishu_app_bot/executors.js +2 -0
- package/src/providers/feishu_app_bot/trigger-config.d.ts +1 -0
- package/src/providers/feishu_app_bot/trigger-config.js +10 -0
- package/src/providers/feishu_app_bot/trigger-on-event.d.ts +2 -0
- package/src/providers/feishu_app_bot/trigger-on-event.definition.d.ts +4 -0
- package/src/providers/feishu_app_bot/trigger-on-event.definition.js +63 -0
- package/src/providers/feishu_app_bot/trigger-on-event.js +29 -0
- package/src/providers/feishu_app_bot/trigger-subscriptions.d.ts +5 -0
- package/src/providers/feishu_app_bot/trigger-subscriptions.js +70 -0
- package/src/providers/github/executors.d.ts +3 -0
- package/src/providers/github/executors.js +6 -0
- package/src/providers/github/trigger-on-repo-event.d.ts +2 -0
- package/src/providers/github/trigger-on-repo-event.definition.d.ts +4 -0
- package/src/providers/github/trigger-on-repo-event.definition.js +94 -0
- package/src/providers/github/trigger-on-repo-event.js +168 -0
- package/src/providers/github/trigger-watch-pull-request.d.ts +2 -0
- package/src/providers/github/trigger-watch-pull-request.definition.d.ts +4 -0
- package/src/providers/github/trigger-watch-pull-request.definition.js +49 -0
- package/src/providers/github/trigger-watch-pull-request.js +106 -0
- package/src/providers/gitlab/executors.d.ts +3 -0
- package/src/providers/gitlab/executors.js +2 -0
- package/src/providers/gitlab/trigger-on-project-event.d.ts +2 -0
- package/src/providers/gitlab/trigger-on-project-event.definition.d.ts +5 -0
- package/src/providers/gitlab/trigger-on-project-event.definition.js +63 -0
- package/src/providers/gitlab/trigger-on-project-event.js +186 -0
- package/src/providers/gmail/executors.d.ts +3 -0
- package/src/providers/gmail/executors.js +2 -0
- package/src/providers/gmail/trigger-on-message-received.d.ts +2 -0
- package/src/providers/gmail/trigger-on-message-received.definition.d.ts +4 -0
- package/src/providers/gmail/trigger-on-message-received.definition.js +74 -0
- package/src/providers/gmail/trigger-on-message-received.js +232 -0
- package/src/providers/googlecalendar/executors.d.ts +3 -0
- package/src/providers/googlecalendar/executors.js +2 -0
- package/src/providers/googlecalendar/trigger-on-event-changed.d.ts +2 -0
- package/src/providers/googlecalendar/trigger-on-event-changed.definition.d.ts +4 -0
- package/src/providers/googlecalendar/trigger-on-event-changed.definition.js +74 -0
- package/src/providers/googlecalendar/trigger-on-event-changed.js +233 -0
- package/src/providers/googledrive/executors.d.ts +3 -0
- package/src/providers/googledrive/executors.js +7 -0
- package/src/providers/googledrive/trigger-changes.d.ts +12 -0
- package/src/providers/googledrive/trigger-changes.definition.d.ts +7 -0
- package/src/providers/googledrive/trigger-changes.definition.js +101 -0
- package/src/providers/googledrive/trigger-changes.js +452 -0
- package/src/providers/googledrive/trigger-on-file-change.d.ts +2 -0
- package/src/providers/googledrive/trigger-on-file-change.definition.d.ts +4 -0
- package/src/providers/googledrive/trigger-on-file-change.definition.js +77 -0
- package/src/providers/googledrive/trigger-on-file-change.js +258 -0
- package/src/providers/googlesheets/executors.d.ts +3 -0
- package/src/providers/googlesheets/executors.js +2 -0
- package/src/providers/googlesheets/trigger-on-row-added.d.ts +2 -0
- package/src/providers/googlesheets/trigger-on-row-added.definition.d.ts +4 -0
- package/src/providers/googlesheets/trigger-on-row-added.definition.js +54 -0
- package/src/providers/googlesheets/trigger-on-row-added.js +234 -0
- package/src/providers/hithink_finance/runtime.js +1 -1
- package/src/providers/indexed/executors.d.ts +4 -0
- package/src/providers/indexed/executors.js +16 -0
- package/src/providers/indexed/runtime.d.ts +26 -0
- package/src/providers/indexed/runtime.js +129 -0
- package/src/providers/linear/executors.d.ts +3 -0
- package/src/providers/linear/executors.js +2 -0
- package/src/providers/linear/trigger-on-issue-changed.d.ts +2 -0
- package/src/providers/linear/trigger-on-issue-changed.definition.d.ts +5 -0
- package/src/providers/linear/trigger-on-issue-changed.definition.js +43 -0
- package/src/providers/linear/trigger-on-issue-changed.js +215 -0
- package/src/providers/notion/executors.d.ts +3 -0
- package/src/providers/notion/executors.js +2 -0
- package/src/providers/notion/trigger-on-database-page-event.d.ts +2 -0
- package/src/providers/notion/trigger-on-database-page-event.definition.d.ts +4 -0
- package/src/providers/notion/trigger-on-database-page-event.definition.js +63 -0
- package/src/providers/notion/trigger-on-database-page-event.js +293 -0
- package/src/providers/one_drive/executors.d.ts +3 -0
- package/src/providers/one_drive/executors.js +2 -0
- package/src/providers/one_drive/trigger-on-item-changed.d.ts +2 -0
- package/src/providers/one_drive/trigger-on-item-changed.definition.d.ts +4 -0
- package/src/providers/one_drive/trigger-on-item-changed.definition.js +63 -0
- package/src/providers/one_drive/trigger-on-item-changed.js +214 -0
- package/src/providers/outlook/executors.d.ts +3 -0
- package/src/providers/outlook/executors.js +2 -0
- package/src/providers/outlook/trigger-on-message-received.d.ts +2 -0
- package/src/providers/outlook/trigger-on-message-received.definition.d.ts +4 -0
- package/src/providers/outlook/trigger-on-message-received.definition.js +93 -0
- package/src/providers/outlook/trigger-on-message-received.js +226 -0
- package/src/providers/outlook_calendar/executors.js +6 -0
- package/src/providers/provider-loader.d.ts +5 -0
- package/src/providers/provider-loader.js +4 -0
- package/src/providers/registry.generated.js +2 -0
- package/src/providers/shopify/executors.d.ts +3 -0
- package/src/providers/shopify/executors.js +2 -0
- package/src/providers/shopify/trigger-on-shop-event.d.ts +2 -0
- package/src/providers/shopify/trigger-on-shop-event.definition.d.ts +4 -0
- package/src/providers/shopify/trigger-on-shop-event.definition.js +214 -0
- package/src/providers/shopify/trigger-on-shop-event.js +165 -0
- package/src/providers/slack/executors.d.ts +3 -0
- package/src/providers/slack/executors.js +2 -0
- package/src/providers/slack/trigger-on-message-posted.d.ts +2 -0
- package/src/providers/slack/trigger-on-message-posted.definition.d.ts +4 -0
- package/src/providers/slack/trigger-on-message-posted.definition.js +80 -0
- package/src/providers/slack/trigger-on-message-posted.js +176 -0
- package/src/providers/spotify/runtime.js +15 -4
- package/src/providers/stripe/executors.d.ts +3 -0
- package/src/providers/stripe/executors.js +2 -0
- package/src/providers/stripe/trigger-on-event.d.ts +2 -0
- package/src/providers/stripe/trigger-on-event.definition.d.ts +4 -0
- package/src/providers/stripe/trigger-on-event.definition.js +43 -0
- package/src/providers/stripe/trigger-on-event.js +212 -0
- package/src/providers/telegram/executors.d.ts +3 -0
- package/src/providers/telegram/executors.js +2 -0
- package/src/providers/telegram/trigger-on-update.d.ts +2 -0
- package/src/providers/telegram/trigger-on-update.definition.d.ts +5 -0
- package/src/providers/telegram/trigger-on-update.definition.js +78 -0
- package/src/providers/telegram/trigger-on-update.js +141 -0
- package/src/providers/weixin_store/access-token.d.ts +2 -1
- package/src/providers/weixin_store/access-token.js +15 -4
- package/src/providers/weixin_store/executors.js +97 -12
- package/src/providers/woocommerce/executors.d.ts +3 -0
- package/src/providers/woocommerce/executors.js +2 -0
- package/src/providers/woocommerce/trigger-on-store-event.d.ts +2 -0
- package/src/providers/woocommerce/trigger-on-store-event.definition.d.ts +4 -0
- package/src/providers/woocommerce/trigger-on-store-event.definition.js +55 -0
- package/src/providers/woocommerce/trigger-on-store-event.js +179 -0
- package/src/providers/zendesk/executors.d.ts +3 -0
- package/src/providers/zendesk/executors.js +2 -0
- package/src/providers/zendesk/trigger-on-event.d.ts +2 -0
- package/src/providers/zendesk/trigger-on-event.definition.d.ts +5 -0
- package/src/providers/zendesk/trigger-on-event.definition.js +101 -0
- package/src/providers/zendesk/trigger-on-event.js +188 -0
- package/src/saas/saas-cleanup-service.d.ts +26 -0
- package/src/saas/saas-cleanup-service.js +124 -0
- package/src/saas/saas-client.d.ts +86 -0
- package/src/saas/saas-client.js +369 -0
- package/src/saas/saas-execution-service.d.ts +15 -0
- package/src/saas/saas-execution-service.js +21 -0
- package/src/saas/saas-oauth-service.d.ts +25 -0
- package/src/saas/saas-oauth-service.js +197 -0
- package/src/saas/saas-project-service.d.ts +61 -0
- package/src/saas/saas-project-service.js +211 -0
- package/src/server/actions/action-idempotency.d.ts +1 -0
- package/src/server/actions/action-idempotency.js +1 -0
- package/src/server/actions/action-runner.d.ts +7 -0
- package/src/server/actions/action-runner.js +43 -7
- package/src/server/actions/run-log-summary.js +9 -0
- package/src/server/api/auth.d.ts +1 -0
- package/src/server/api/auth.js +13 -2
- package/src/server/api/cache-policy.js +4 -1
- package/src/server/api/connection-input.d.ts +7 -1
- package/src/server/api/connection-input.js +7 -1
- package/src/server/api/connection-routes.d.ts +3 -1
- package/src/server/api/connection-routes.js +21 -3
- package/src/server/api/http-utils.d.ts +4 -3
- package/src/server/api/oauth-completion-page.d.ts +124 -0
- package/src/server/api/oauth-completion-page.js +113 -18
- package/src/server/api/openapi.js +112 -14
- package/src/server/api/policy-input.js +6 -0
- package/src/server/api/runtime-api.d.ts +10 -2
- package/src/server/api/runtime-api.js +17 -4
- package/src/server/api/saas-completion-page.d.ts +2 -0
- package/src/server/api/saas-completion-page.js +103 -0
- package/src/server/connect-app.d.ts +5 -0
- package/src/server/connect-app.js +50 -0
- package/src/server/connect-server.d.ts +12 -0
- package/src/server/connect-server.js +147 -13
- package/src/server/connector-runtime.d.ts +3 -1
- package/src/server/connector-runtime.js +5 -2
- package/src/server/files/transit-files.js +16 -7
- package/src/server/proxy/proxy-runner.d.ts +5 -1
- package/src/server/proxy/proxy-runner.js +72 -26
- package/src/server/storage/connection-request-store.d.ts +41 -1
- package/src/server/storage/connection-request-store.js +245 -20
- package/src/server/storage/connection-store.d.ts +16 -0
- package/src/server/storage/connection-store.js +119 -0
- package/src/server/storage/node-runtime-database.js +3 -3
- package/src/server/storage/{postgres-migrations.d.ts → postgres/migrations.d.ts} +2 -2
- package/src/server/storage/{postgres-migrations.js → postgres/migrations.js} +1 -1
- package/src/server/storage/postgres/runtime-store.d.ts +43 -0
- package/src/server/storage/{postgres-runtime-store.js → postgres/runtime-store.js} +59 -94
- package/src/server/storage/runtime-database.d.ts +4 -0
- package/src/server/storage/runtime-sql.d.ts +1 -1
- package/src/server/storage/runtime-sql.js +2 -1
- package/src/server/storage/runtime-store.d.ts +1 -0
- package/src/server/storage/runtime-token-service.d.ts +2 -0
- package/src/server/storage/runtime-token-service.js +3 -0
- package/src/server/storage/saas-project-store.d.ts +77 -0
- package/src/server/storage/saas-project-store.js +273 -0
- package/src/server/storage/{sqlite-runtime-store.d.ts → sqlite/runtime-store.d.ts} +21 -25
- package/src/server/storage/{sqlite-runtime-store.js → sqlite/runtime-store.js} +100 -115
- package/src/server/storage/trigger-store.d.ts +16 -0
- package/src/server/storage/trigger-store.js +96 -0
- package/src/triggers/common/config.d.ts +2 -0
- package/src/triggers/common/config.js +17 -0
- package/src/triggers/common/configOptions.d.ts +13 -0
- package/src/triggers/common/configOptions.js +1 -0
- package/src/triggers/common/encoding.d.ts +3 -0
- package/src/triggers/common/encoding.js +19 -0
- package/src/triggers/common/integration.d.ts +115 -0
- package/src/triggers/common/integration.js +31 -0
- package/src/triggers/common/json.d.ts +6 -0
- package/src/triggers/common/json.js +91 -0
- package/src/triggers/common/poll.d.ts +41 -0
- package/src/triggers/common/poll.js +15 -0
- package/src/triggers/common/proxy.d.ts +14 -0
- package/src/triggers/common/proxy.js +1 -0
- package/src/triggers/common/types.d.ts +42 -0
- package/src/triggers/common/types.js +1 -0
- package/src/triggers/maintenance.d.ts +40 -0
- package/src/triggers/maintenance.js +120 -0
- package/src/triggers/metadata.d.ts +8 -0
- package/src/triggers/metadata.js +1 -0
- package/src/triggers/request.d.ts +33 -0
- package/src/triggers/request.js +52 -0
- package/src/triggers/resources.d.ts +12 -0
- package/src/triggers/resources.js +121 -0
- package/src/triggers/signature.d.ts +4 -0
- package/src/triggers/signature.js +48 -0
- package/src/triggers/store.d.ts +29 -0
- package/src/triggers/store.js +1 -0
- package/src/triggers/subscriptions.d.ts +22 -0
- package/src/triggers/subscriptions.js +220 -0
- package/src/triggers/trigger-runner.d.ts +34 -0
- package/src/triggers/trigger-runner.js +169 -0
- package/src/server/storage/postgres-runtime-store.d.ts +0 -39
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { IntegrationConnectionError, PermanentIntegrationError, TransientIntegrationError, } from "../../triggers/common/integration.js";
|
|
2
|
+
import { isJsonObject } from "../../triggers/common/json.js";
|
|
3
|
+
import { feishuResourceKind } from "./trigger-config.js";
|
|
4
|
+
export function feishuSubscriptions(config, provider) {
|
|
5
|
+
if (config.resource == null)
|
|
6
|
+
return [];
|
|
7
|
+
if (!isJsonObject(config.resource))
|
|
8
|
+
throw new PermanentIntegrationError("Invalid Feishu resource.");
|
|
9
|
+
const { kind, id, documentType } = config.resource;
|
|
10
|
+
if (typeof id != "string" || id.length == 0)
|
|
11
|
+
throw new PermanentIntegrationError("A Feishu resource ID is required.");
|
|
12
|
+
if (kind != feishuResourceKind(config.eventTypes))
|
|
13
|
+
throw new PermanentIntegrationError("The selected events do not support this resource subscription.");
|
|
14
|
+
const resource = encodeURIComponent(id);
|
|
15
|
+
if (kind == "document") {
|
|
16
|
+
if (typeof documentType != "string" ||
|
|
17
|
+
!["doc", "docx", "sheet", "bitable", "file", "folder", "slides"].includes(documentType)) {
|
|
18
|
+
throw new PermanentIntegrationError("A supported document type is required.");
|
|
19
|
+
}
|
|
20
|
+
return config.eventTypes.map((eventType) => {
|
|
21
|
+
const query = { file_type: documentType, event_type: eventType };
|
|
22
|
+
const prefix = `/drive/v1/files/${resource}`;
|
|
23
|
+
return {
|
|
24
|
+
key: JSON.stringify(["document", documentType, id, eventType]),
|
|
25
|
+
subscribe: { endpoint: `${prefix}/subscribe`, method: "POST", query },
|
|
26
|
+
unsubscribe: { endpoint: `${prefix}/delete_subscribe`, method: "DELETE", query },
|
|
27
|
+
inspect: { endpoint: `${prefix}/get_subscribe`, method: "GET", query },
|
|
28
|
+
};
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
if (kind == "calendar") {
|
|
32
|
+
const prefix = `/calendar/v4/calendars/${resource}/events`;
|
|
33
|
+
return [
|
|
34
|
+
{
|
|
35
|
+
key: JSON.stringify(["calendar", id]),
|
|
36
|
+
subscribe: { endpoint: `${prefix}/subscription`, method: "POST" },
|
|
37
|
+
unsubscribe: { endpoint: `${prefix}/unsubscription`, method: "POST" },
|
|
38
|
+
},
|
|
39
|
+
];
|
|
40
|
+
}
|
|
41
|
+
if (kind == "approval") {
|
|
42
|
+
if (provider != "feishu_app_bot")
|
|
43
|
+
throw new PermanentIntegrationError("Approval definition subscriptions require an application Connection.");
|
|
44
|
+
const prefix = `/approval/v4/approvals/${resource}`;
|
|
45
|
+
return [
|
|
46
|
+
{
|
|
47
|
+
key: JSON.stringify(["approval", id]),
|
|
48
|
+
subscribe: { endpoint: `${prefix}/subscribe`, method: "POST" },
|
|
49
|
+
unsubscribe: { endpoint: `${prefix}/unsubscribe`, method: "POST" },
|
|
50
|
+
},
|
|
51
|
+
];
|
|
52
|
+
}
|
|
53
|
+
throw new PermanentIntegrationError("Unsupported Feishu resource subscription.");
|
|
54
|
+
}
|
|
55
|
+
export function feishuResponse(result) {
|
|
56
|
+
if (!isJsonObject(result.data))
|
|
57
|
+
throw new TransientIntegrationError("Feishu returned an invalid response.");
|
|
58
|
+
const code = result.data.code;
|
|
59
|
+
if (result.status >= 200 && result.status < 300 && code === 0)
|
|
60
|
+
return isJsonObject(result.data.data) ? result.data.data : {};
|
|
61
|
+
const details = `HTTP ${result.status}${typeof code == "number" && Number.isSafeInteger(code) ? `, Feishu code ${code}` : ""}`;
|
|
62
|
+
if (result.status == 401 ||
|
|
63
|
+
result.status == 403 ||
|
|
64
|
+
[99991661, 99991663, 99991668, 99991671, 99991677].includes(Number(code))) {
|
|
65
|
+
throw new IntegrationConnectionError(`Feishu rejected the Connection (${details}).`);
|
|
66
|
+
}
|
|
67
|
+
if (result.status == 429 || result.status >= 500 || code === 99991400)
|
|
68
|
+
throw new TransientIntegrationError(`Feishu is temporarily unavailable (${details}).`);
|
|
69
|
+
throw new PermanentIntegrationError(`Feishu rejected the request (${details}). Check the application's API permissions and request parameters.`);
|
|
70
|
+
}
|
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
import type { CredentialValidators, ProviderExecutors, ProviderProxyExecutor } from "../../core/types.ts";
|
|
2
|
+
import type { IntegrationDefinition } from "../../triggers/common/integration.ts";
|
|
3
|
+
import type { PollDefinition } from "../../triggers/common/poll.ts";
|
|
2
4
|
export declare const executors: ProviderExecutors;
|
|
3
5
|
export declare const proxy: ProviderProxyExecutor;
|
|
4
6
|
export declare const credentialValidators: CredentialValidators;
|
|
7
|
+
export declare const triggers: readonly (IntegrationDefinition | PollDefinition)[];
|
|
@@ -6,6 +6,8 @@ import { releaseActionHandlers } from "./runtime-release.js";
|
|
|
6
6
|
import { repositoryActionHandlers } from "./runtime-repository.js";
|
|
7
7
|
import { searchActionHandlers } from "./runtime-search.js";
|
|
8
8
|
import { githubApiBaseUrl, githubApiVersion, githubDefaultAcceptHeader, githubRequestJson } from "./runtime-shared.js";
|
|
9
|
+
import { githubRepoEvent } from "./trigger-on-repo-event.js";
|
|
10
|
+
import { githubPullRequestListener } from "./trigger-watch-pull-request.js";
|
|
9
11
|
const service = "github";
|
|
10
12
|
export const executors = defineProviderExecutors({
|
|
11
13
|
service,
|
|
@@ -57,3 +59,7 @@ async function validateGitHubToken(accessToken, fetcher) {
|
|
|
57
59
|
},
|
|
58
60
|
};
|
|
59
61
|
}
|
|
62
|
+
export const triggers = [
|
|
63
|
+
githubRepoEvent,
|
|
64
|
+
githubPullRequestListener,
|
|
65
|
+
];
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { jsonSchema as s } from "../../core/json-schema.js";
|
|
2
|
+
const events = [
|
|
3
|
+
"*",
|
|
4
|
+
"branch_protection_configuration",
|
|
5
|
+
"branch_protection_rule",
|
|
6
|
+
"check_run",
|
|
7
|
+
"check_suite",
|
|
8
|
+
"code_scanning_alert",
|
|
9
|
+
"commit_comment",
|
|
10
|
+
"create",
|
|
11
|
+
"custom_property_values",
|
|
12
|
+
"delete",
|
|
13
|
+
"dependabot_alert",
|
|
14
|
+
"deploy_key",
|
|
15
|
+
"deployment",
|
|
16
|
+
"deployment_status",
|
|
17
|
+
"discussion",
|
|
18
|
+
"discussion_comment",
|
|
19
|
+
"fork",
|
|
20
|
+
"gollum",
|
|
21
|
+
"issue_comment",
|
|
22
|
+
"issue_dependencies",
|
|
23
|
+
"issues",
|
|
24
|
+
"label",
|
|
25
|
+
"member",
|
|
26
|
+
"meta",
|
|
27
|
+
"milestone",
|
|
28
|
+
"package",
|
|
29
|
+
"page_build",
|
|
30
|
+
"project",
|
|
31
|
+
"project_card",
|
|
32
|
+
"project_column",
|
|
33
|
+
"public",
|
|
34
|
+
"pull_request",
|
|
35
|
+
"pull_request_review",
|
|
36
|
+
"pull_request_review_comment",
|
|
37
|
+
"pull_request_review_thread",
|
|
38
|
+
"push",
|
|
39
|
+
"registry_package",
|
|
40
|
+
"release",
|
|
41
|
+
"repository",
|
|
42
|
+
"repository_advisory",
|
|
43
|
+
"repository_import",
|
|
44
|
+
"repository_ruleset",
|
|
45
|
+
"repository_vulnerability_alert",
|
|
46
|
+
"secret_scanning_alert",
|
|
47
|
+
"secret_scanning_alert_location",
|
|
48
|
+
"secret_scanning_scan",
|
|
49
|
+
"security_and_analysis",
|
|
50
|
+
"star",
|
|
51
|
+
"status",
|
|
52
|
+
"sub_issues",
|
|
53
|
+
"team_add",
|
|
54
|
+
"watch",
|
|
55
|
+
"workflow_job",
|
|
56
|
+
"workflow_run",
|
|
57
|
+
];
|
|
58
|
+
export const snapshot = {
|
|
59
|
+
configInputs: [
|
|
60
|
+
{
|
|
61
|
+
handle: "events",
|
|
62
|
+
jsonSchema: s.array(s.stringEnum(events), { minItems: 1, uniqueItems: true }),
|
|
63
|
+
nullable: false,
|
|
64
|
+
},
|
|
65
|
+
{ handle: "insecureSsl", jsonSchema: s.boolean(), nullable: false, value: false },
|
|
66
|
+
{
|
|
67
|
+
handle: "owner",
|
|
68
|
+
jsonSchema: s.string({ pattern: "^[a-zA-Z0-9](?:[a-zA-Z0-9]|-(?=[a-zA-Z0-9])){0,38}$" }),
|
|
69
|
+
nullable: false,
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
handle: "repo",
|
|
73
|
+
jsonSchema: s.string({ pattern: "^(?!\\.{1,2}$)[a-zA-Z0-9._-]{1,100}$" }),
|
|
74
|
+
nullable: false,
|
|
75
|
+
},
|
|
76
|
+
],
|
|
77
|
+
definitionVersion: 2,
|
|
78
|
+
description: "Triggers when selected GitHub webhook events occur in a repository.",
|
|
79
|
+
displayName: "Repository Event",
|
|
80
|
+
endpoint: {
|
|
81
|
+
body: { allowArray: false, allowEmpty: false, formats: ["json"] },
|
|
82
|
+
methods: ["POST"],
|
|
83
|
+
successStatus: 202,
|
|
84
|
+
},
|
|
85
|
+
key: "github.on_repo_event",
|
|
86
|
+
name: "on_repo_event",
|
|
87
|
+
outputs: [
|
|
88
|
+
{ handle: "body", jsonSchema: { type: "object" }, nullable: false },
|
|
89
|
+
{ handle: "deliveryId", jsonSchema: s.string(), nullable: false },
|
|
90
|
+
{ handle: "event", jsonSchema: s.string(), nullable: false },
|
|
91
|
+
],
|
|
92
|
+
provider: "github",
|
|
93
|
+
type: "integration",
|
|
94
|
+
};
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import { IntegrationConnectionError, PermanentIntegrationError, TransientIntegrationError, } from "../../triggers/common/integration.js";
|
|
2
|
+
import { verifyHexHmac } from "../../triggers/signature.js";
|
|
3
|
+
import { snapshot } from "./trigger-on-repo-event.definition.js";
|
|
4
|
+
export const githubRepoEvent = {
|
|
5
|
+
initialState: { checkpoint: null, subscription: {} },
|
|
6
|
+
snapshot,
|
|
7
|
+
async receive(context) {
|
|
8
|
+
const signature = context.header("x-hub-signature-256");
|
|
9
|
+
if (!signature?.startsWith("sha256=") ||
|
|
10
|
+
!(await verifyHexHmac(context.callbackSecret, [context.rawBody], signature.slice(7)))) {
|
|
11
|
+
return { body: "", contentType: "text/plain", outcome: "respond", status: 404 };
|
|
12
|
+
}
|
|
13
|
+
const event = context.header("x-github-event")?.trim();
|
|
14
|
+
if (!event)
|
|
15
|
+
return { outcome: "ignored", reason: "GitHub event header is missing." };
|
|
16
|
+
if (event == "ping")
|
|
17
|
+
return { outcome: "ignored", reason: "GitHub ping handshake." };
|
|
18
|
+
const config = resolveConfig(context.config);
|
|
19
|
+
if (!config.events.includes("*") && !config.events.includes(event)) {
|
|
20
|
+
return { outcome: "ignored", reason: "GitHub event is not subscribed." };
|
|
21
|
+
}
|
|
22
|
+
const deliveryId = context.header("x-github-delivery") ?? "";
|
|
23
|
+
return {
|
|
24
|
+
dedupeKey: deliveryId.length == 0 ? undefined : deliveryId,
|
|
25
|
+
outcome: "event",
|
|
26
|
+
outputs: { body: context.payload, deliveryId, event },
|
|
27
|
+
};
|
|
28
|
+
},
|
|
29
|
+
async reconcile(context) {
|
|
30
|
+
const state = requireState(context.state);
|
|
31
|
+
const config = resolveConfig(context.config);
|
|
32
|
+
let hookId = subscriptionId(state);
|
|
33
|
+
if (!context.active) {
|
|
34
|
+
if (hookId == null)
|
|
35
|
+
hookId = await findByUrl(context, config);
|
|
36
|
+
if (hookId != null) {
|
|
37
|
+
const result = await request(context, "hook delete", {
|
|
38
|
+
endpoint: `${endpoint(config)}/${hookId}`,
|
|
39
|
+
method: "DELETE",
|
|
40
|
+
});
|
|
41
|
+
if (result.status != 404)
|
|
42
|
+
success(result, "hook delete");
|
|
43
|
+
}
|
|
44
|
+
await state.saveSubscription({}, later(context.now));
|
|
45
|
+
return { outcome: "ready" };
|
|
46
|
+
}
|
|
47
|
+
const desired = body(context.endpointUrl, context.callbackSecret, config);
|
|
48
|
+
if (hookId == null) {
|
|
49
|
+
const result = await request(context, "hook create", {
|
|
50
|
+
body: desired,
|
|
51
|
+
endpoint: endpoint(config),
|
|
52
|
+
method: "POST",
|
|
53
|
+
});
|
|
54
|
+
if (result.status == 201)
|
|
55
|
+
hookId = id(result.data);
|
|
56
|
+
else if (result.status == 422) {
|
|
57
|
+
hookId = await findByUrl(context, config);
|
|
58
|
+
if (hookId == null)
|
|
59
|
+
throw new PermanentIntegrationError("GitHub rejected the webhook configuration.");
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
success(result, "hook create");
|
|
63
|
+
throw new TransientIntegrationError(`GitHub hook create returned unexpected status ${result.status}.`);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
await state.saveSubscription({ hookId }, context.now);
|
|
67
|
+
const aligned = await request(context, "hook update", {
|
|
68
|
+
body: desired,
|
|
69
|
+
endpoint: `${endpoint(config)}/${hookId}`,
|
|
70
|
+
method: "PATCH",
|
|
71
|
+
});
|
|
72
|
+
if (aligned.status == 404) {
|
|
73
|
+
await state.saveSubscription({}, context.now);
|
|
74
|
+
return { outcome: "pending" };
|
|
75
|
+
}
|
|
76
|
+
success(aligned, "hook update");
|
|
77
|
+
await state.saveSubscription({ hookId }, later(context.now));
|
|
78
|
+
return { outcome: "ready" };
|
|
79
|
+
},
|
|
80
|
+
};
|
|
81
|
+
function resolveConfig(value) {
|
|
82
|
+
return {
|
|
83
|
+
events: [...new Set(value.events)],
|
|
84
|
+
insecureSsl: value.insecureSsl,
|
|
85
|
+
owner: value.owner,
|
|
86
|
+
repo: value.repo,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
function endpoint(config) {
|
|
90
|
+
return `/repos/${encodeURIComponent(config.owner)}/${encodeURIComponent(config.repo)}/hooks`;
|
|
91
|
+
}
|
|
92
|
+
function body(url, secret, config) {
|
|
93
|
+
return {
|
|
94
|
+
active: true,
|
|
95
|
+
config: { content_type: "json", insecure_ssl: config.insecureSsl ? "1" : "0", secret, url },
|
|
96
|
+
events: config.events,
|
|
97
|
+
name: "web",
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
async function findByUrl(context, config) {
|
|
101
|
+
for (let page = 1; page <= 10; page += 1) {
|
|
102
|
+
const result = await request(context, "hook list", {
|
|
103
|
+
endpoint: endpoint(config),
|
|
104
|
+
method: "GET",
|
|
105
|
+
query: { page, per_page: 100 },
|
|
106
|
+
});
|
|
107
|
+
if (result.status == 404)
|
|
108
|
+
return null;
|
|
109
|
+
success(result, "hook list");
|
|
110
|
+
const hooks = Array.isArray(result.data) ? result.data : [];
|
|
111
|
+
for (const hook of hooks) {
|
|
112
|
+
const value = record(hook);
|
|
113
|
+
if (record(value?.config)?.url === context.endpointUrl &&
|
|
114
|
+
(typeof value?.id == "number" || typeof value?.id == "string")) {
|
|
115
|
+
return String(value.id);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
if (hooks.length < 100)
|
|
119
|
+
return null;
|
|
120
|
+
}
|
|
121
|
+
return null;
|
|
122
|
+
}
|
|
123
|
+
async function request(context, operation, value) {
|
|
124
|
+
try {
|
|
125
|
+
return await context.connector.execute(value, context.signal);
|
|
126
|
+
}
|
|
127
|
+
catch (cause) {
|
|
128
|
+
if (cause instanceof IntegrationConnectionError)
|
|
129
|
+
throw cause;
|
|
130
|
+
throw new TransientIntegrationError(`GitHub ${operation} request failed.`, { cause });
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
function success(result, operation) {
|
|
134
|
+
if (result.status >= 200 && result.status < 300)
|
|
135
|
+
return;
|
|
136
|
+
const message = record(result.data)?.message;
|
|
137
|
+
if (result.status == 403 && typeof message == "string" && /rate limit/i.test(message)) {
|
|
138
|
+
throw new TransientIntegrationError(`GitHub ${operation} was rate limited.`);
|
|
139
|
+
}
|
|
140
|
+
if ([401, 403].includes(result.status))
|
|
141
|
+
throw new IntegrationConnectionError(`GitHub ${operation} rejected the Connection.`);
|
|
142
|
+
if ([404, 422].includes(result.status))
|
|
143
|
+
throw new PermanentIntegrationError(`GitHub ${operation} rejected the subscription.`);
|
|
144
|
+
throw new TransientIntegrationError(`GitHub ${operation} failed with status ${result.status}.`);
|
|
145
|
+
}
|
|
146
|
+
function id(data) {
|
|
147
|
+
const value = record(data)?.id;
|
|
148
|
+
if (typeof value != "number" && typeof value != "string")
|
|
149
|
+
throw new TransientIntegrationError("GitHub hook response is missing its ID.");
|
|
150
|
+
return String(value);
|
|
151
|
+
}
|
|
152
|
+
function requireState(value) {
|
|
153
|
+
if (value == null)
|
|
154
|
+
throw new PermanentIntegrationError("GitHub Integration state is missing.");
|
|
155
|
+
return value;
|
|
156
|
+
}
|
|
157
|
+
function subscriptionId(state) {
|
|
158
|
+
const value = state.subscription.hookId;
|
|
159
|
+
return typeof value == "string" && value.length > 0 ? value : null;
|
|
160
|
+
}
|
|
161
|
+
function later(now) {
|
|
162
|
+
return new Date(now.getTime() + 30 * 24 * 60 * 60 * 1_000);
|
|
163
|
+
}
|
|
164
|
+
function record(value) {
|
|
165
|
+
return value != null && typeof value == "object" && !Array.isArray(value)
|
|
166
|
+
? value
|
|
167
|
+
: undefined;
|
|
168
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { jsonSchema as s } from "../../core/json-schema.js";
|
|
2
|
+
import { snapshot as githubRepoEventSnapshot } from "./trigger-on-repo-event.definition.js";
|
|
3
|
+
const pullRequestSchema = s.object({
|
|
4
|
+
id: s.integer(),
|
|
5
|
+
number: s.integer(),
|
|
6
|
+
title: s.string(),
|
|
7
|
+
url: s.string(),
|
|
8
|
+
state: s.stringEnum(["open", "closed"]),
|
|
9
|
+
draft: s.boolean(),
|
|
10
|
+
merged: s.boolean(),
|
|
11
|
+
updatedAt: s.string(),
|
|
12
|
+
headSha: s.string(),
|
|
13
|
+
baseSha: s.string(),
|
|
14
|
+
}, {
|
|
15
|
+
additionalProperties: false,
|
|
16
|
+
required: ["id", "number", "title", "url", "state", "draft", "merged", "updatedAt", "headSha", "baseSha"],
|
|
17
|
+
});
|
|
18
|
+
export const snapshot = {
|
|
19
|
+
configInputs: [
|
|
20
|
+
{
|
|
21
|
+
handle: "owner",
|
|
22
|
+
jsonSchema: s.string({ pattern: "^[a-zA-Z0-9](?:[a-zA-Z0-9]|-(?=[a-zA-Z0-9])){0,38}$" }),
|
|
23
|
+
nullable: false,
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
handle: "repo",
|
|
27
|
+
jsonSchema: s.string({ pattern: "^(?!\\.{1,2}$)[a-zA-Z0-9._-]{1,100}$" }),
|
|
28
|
+
nullable: false,
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
handle: "number",
|
|
32
|
+
jsonSchema: s.integer({ minimum: 1 }),
|
|
33
|
+
nullable: false,
|
|
34
|
+
description: "Number of the pull request to watch.",
|
|
35
|
+
},
|
|
36
|
+
],
|
|
37
|
+
definitionVersion: 2,
|
|
38
|
+
description: "Watches one pull request using notifications and periodic checks. Starts from its current state; reports observed changes, not every intermediate transition or review event.",
|
|
39
|
+
displayName: "Watch Pull Request",
|
|
40
|
+
endpoint: githubRepoEventSnapshot.endpoint,
|
|
41
|
+
key: "github.watch_pull_request",
|
|
42
|
+
name: "watch_pull_request",
|
|
43
|
+
provider: "github",
|
|
44
|
+
type: "integration",
|
|
45
|
+
outputs: [
|
|
46
|
+
{ handle: "pullRequest", jsonSchema: pullRequestSchema, nullable: false },
|
|
47
|
+
{ handle: "version", jsonSchema: s.string(), nullable: false },
|
|
48
|
+
],
|
|
49
|
+
};
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { canonicalJsonBytes, digestBytes } from "../../triggers/common/encoding.js";
|
|
2
|
+
import { IntegrationConnectionError, PermanentIntegrationError, TransientIntegrationError, } from "../../triggers/common/integration.js";
|
|
3
|
+
import { isJsonObject } from "../../triggers/common/json.js";
|
|
4
|
+
import { githubRepoEvent } from "./trigger-on-repo-event.js";
|
|
5
|
+
import { snapshot } from "./trigger-watch-pull-request.definition.js";
|
|
6
|
+
function hookConfig(config) {
|
|
7
|
+
return { owner: config.owner, repo: config.repo, events: ["pull_request"], insecureSsl: false };
|
|
8
|
+
}
|
|
9
|
+
export const githubPullRequestListener = {
|
|
10
|
+
snapshot,
|
|
11
|
+
initialState: { checkpoint: null, subscription: {} },
|
|
12
|
+
async reconcile(context) {
|
|
13
|
+
if (context.state == null)
|
|
14
|
+
throw new PermanentIntegrationError("GitHub listener state is missing.");
|
|
15
|
+
if (context.active && context.state.checkpoint == null) {
|
|
16
|
+
const current = await readPullRequest(context);
|
|
17
|
+
await context.state.saveCheckpoint({ version: current.version, sequence: 0 });
|
|
18
|
+
}
|
|
19
|
+
return await githubRepoEvent.reconcile({ ...context, config: hookConfig(context.config) });
|
|
20
|
+
},
|
|
21
|
+
async receive(context) {
|
|
22
|
+
const received = await githubRepoEvent.receive({
|
|
23
|
+
...context,
|
|
24
|
+
config: hookConfig(context.config),
|
|
25
|
+
});
|
|
26
|
+
if (received.outcome != "event")
|
|
27
|
+
return received;
|
|
28
|
+
if (!isJsonObject(context.payload) || context.payload.number !== context.config.number)
|
|
29
|
+
return { outcome: "ignored", reason: "Different pull request." };
|
|
30
|
+
return { outcome: "wake" };
|
|
31
|
+
},
|
|
32
|
+
listener: {
|
|
33
|
+
intervalMs: 300_000,
|
|
34
|
+
async read(context) {
|
|
35
|
+
const checkpoint = context.checkpoint;
|
|
36
|
+
if (!isJsonObject(checkpoint) ||
|
|
37
|
+
typeof checkpoint.version != "string" ||
|
|
38
|
+
!Number.isSafeInteger(checkpoint.sequence) ||
|
|
39
|
+
Number(checkpoint.sequence) < 0 ||
|
|
40
|
+
Number(checkpoint.sequence) >= Number.MAX_SAFE_INTEGER) {
|
|
41
|
+
throw new PermanentIntegrationError("GitHub listener checkpoint is invalid.");
|
|
42
|
+
}
|
|
43
|
+
const current = await readPullRequest(context);
|
|
44
|
+
if (current.version == checkpoint.version)
|
|
45
|
+
return { checkpoint, dedupeKey: current.version, hasMore: false, outputs: null };
|
|
46
|
+
const sequence = Number(checkpoint.sequence) + 1;
|
|
47
|
+
return {
|
|
48
|
+
checkpoint: { version: current.version, sequence },
|
|
49
|
+
dedupeKey: `${sequence}:${current.version}`,
|
|
50
|
+
hasMore: false,
|
|
51
|
+
outputs: current,
|
|
52
|
+
};
|
|
53
|
+
},
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
async function readPullRequest(context) {
|
|
57
|
+
const { owner, repo, number } = context.config;
|
|
58
|
+
if (typeof owner != "string" || typeof repo != "string" || !Number.isSafeInteger(number) || Number(number) < 1)
|
|
59
|
+
throw new PermanentIntegrationError("GitHub pull request configuration is invalid.");
|
|
60
|
+
const result = await context.connector.execute({
|
|
61
|
+
endpoint: `/repos/${encodeURIComponent(owner)}/${encodeURIComponent(repo)}/pulls/${number}`,
|
|
62
|
+
method: "GET",
|
|
63
|
+
}, context.signal);
|
|
64
|
+
context.signal?.throwIfAborted();
|
|
65
|
+
const value = result.data;
|
|
66
|
+
if (result.status == 429 ||
|
|
67
|
+
(result.status == 403 &&
|
|
68
|
+
isJsonObject(value) &&
|
|
69
|
+
typeof value.message == "string" &&
|
|
70
|
+
/rate limit/i.test(value.message)))
|
|
71
|
+
throw new TransientIntegrationError("GitHub pull request checks were rate limited.");
|
|
72
|
+
if (result.status == 401 || result.status == 403)
|
|
73
|
+
throw new IntegrationConnectionError("GitHub pull request access requires authorization.");
|
|
74
|
+
if (result.status == 404)
|
|
75
|
+
throw new PermanentIntegrationError("The pull request is unavailable; it may no longer be accessible.");
|
|
76
|
+
if (result.status != 200)
|
|
77
|
+
throw new TransientIntegrationError(`GitHub pull request check failed with status ${result.status}.`);
|
|
78
|
+
if (!isJsonObject(value) ||
|
|
79
|
+
!Number.isSafeInteger(value.id) ||
|
|
80
|
+
value.number !== number ||
|
|
81
|
+
typeof value.title != "string" ||
|
|
82
|
+
typeof value.html_url != "string" ||
|
|
83
|
+
(value.state != "open" && value.state != "closed") ||
|
|
84
|
+
typeof value.draft != "boolean" ||
|
|
85
|
+
typeof value.merged != "boolean" ||
|
|
86
|
+
typeof value.updated_at != "string" ||
|
|
87
|
+
!Number.isFinite(Date.parse(value.updated_at)) ||
|
|
88
|
+
!isJsonObject(value.head) ||
|
|
89
|
+
typeof value.head.sha != "string" ||
|
|
90
|
+
!isJsonObject(value.base) ||
|
|
91
|
+
typeof value.base.sha != "string")
|
|
92
|
+
throw new TransientIntegrationError("GitHub returned an invalid pull request.");
|
|
93
|
+
const pullRequest = {
|
|
94
|
+
id: Number(value.id),
|
|
95
|
+
number: Number(number),
|
|
96
|
+
title: value.title,
|
|
97
|
+
url: value.html_url,
|
|
98
|
+
state: value.state,
|
|
99
|
+
draft: value.draft,
|
|
100
|
+
merged: value.merged,
|
|
101
|
+
updatedAt: value.updated_at,
|
|
102
|
+
headSha: value.head.sha,
|
|
103
|
+
baseSha: value.base.sha,
|
|
104
|
+
};
|
|
105
|
+
return { pullRequest, version: await digestBytes(canonicalJsonBytes(pullRequest)) };
|
|
106
|
+
}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import type { CredentialValidators, ProviderExecutors, ProviderProxyExecutor } from "../../core/types.ts";
|
|
2
|
+
import type { IntegrationDefinition } from "../../triggers/common/integration.ts";
|
|
3
|
+
import type { PollDefinition } from "../../triggers/common/poll.ts";
|
|
2
4
|
import type { ProviderActionHandlers } from "../provider-runtime.ts";
|
|
3
5
|
type GitlabActionInput = Record<string, unknown>;
|
|
4
6
|
type GitlabActionHandler = (input: GitlabActionInput, context: GitlabActionContext) => Promise<unknown>;
|
|
@@ -23,4 +25,5 @@ export declare const credentialValidators: CredentialValidators;
|
|
|
23
25
|
* `allowPrivateNetwork` may be passed explicitly (used by tests).
|
|
24
26
|
*/
|
|
25
27
|
export declare function normalizeGitlabApiBaseUrl(value: unknown, allowPrivateNetwork?: boolean): string;
|
|
28
|
+
export declare const triggers: readonly (IntegrationDefinition | PollDefinition)[];
|
|
26
29
|
export {};
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { compactObject, optionalBoolean, optionalIntegerLike, optionalRecord, optionalString as asOptionalString, recordOrEmpty, } from "../../core/cast.js";
|
|
2
2
|
import { assertPublicHttpUrl, isPrivateNetworkAccessAllowed } from "../../core/request.js";
|
|
3
3
|
import { createProviderFetch, defineProviderExecutors, defineProviderProxy, providerInputError, ProviderRequestError, providerUserAgent, } from "../provider-runtime.js";
|
|
4
|
+
import { gitlabProjectEvent } from "./trigger-on-project-event.js";
|
|
4
5
|
const defaultGitlabApiBaseUrl = "https://gitlab.com/api/v4";
|
|
5
6
|
const service = "gitlab";
|
|
6
7
|
export const gitlabActionHandlers = {
|
|
@@ -515,3 +516,4 @@ function asOptionalPositiveInteger(value, fieldName) {
|
|
|
515
516
|
}
|
|
516
517
|
return parsed;
|
|
517
518
|
}
|
|
519
|
+
export const triggers = [gitlabProjectEvent];
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { jsonSchema as s } from "../../core/json-schema.js";
|
|
2
|
+
export const events = [
|
|
3
|
+
"push",
|
|
4
|
+
"tag_push",
|
|
5
|
+
"issues",
|
|
6
|
+
"confidential_issues",
|
|
7
|
+
"note",
|
|
8
|
+
"confidential_note",
|
|
9
|
+
"merge_requests",
|
|
10
|
+
"job",
|
|
11
|
+
"pipeline",
|
|
12
|
+
"wiki_page",
|
|
13
|
+
"deployment",
|
|
14
|
+
"feature_flag",
|
|
15
|
+
"releases",
|
|
16
|
+
"milestone",
|
|
17
|
+
"emoji",
|
|
18
|
+
"resource_access_token",
|
|
19
|
+
"resource_deploy_token",
|
|
20
|
+
];
|
|
21
|
+
export const snapshot = {
|
|
22
|
+
configInputs: [
|
|
23
|
+
{
|
|
24
|
+
handle: "events",
|
|
25
|
+
jsonSchema: s.array(s.stringEnum(events), { minItems: 1, uniqueItems: true }),
|
|
26
|
+
nullable: false,
|
|
27
|
+
},
|
|
28
|
+
{ handle: "insecureSsl", jsonSchema: s.boolean(), nullable: false, value: false },
|
|
29
|
+
{
|
|
30
|
+
handle: "project",
|
|
31
|
+
jsonSchema: s.string({
|
|
32
|
+
maxLength: 255,
|
|
33
|
+
minLength: 1,
|
|
34
|
+
pattern: "^(?:[0-9]+|(?!\\.{1,2}(?:/|$))[A-Za-z0-9_.][A-Za-z0-9_.-]*(?:/(?!\\.{1,2}(?:/|$))[A-Za-z0-9_.][A-Za-z0-9_.-]*)*)$",
|
|
35
|
+
}),
|
|
36
|
+
nullable: false,
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
handle: "pushBranchFilter",
|
|
40
|
+
jsonSchema: s.string({ maxLength: 255 }),
|
|
41
|
+
nullable: false,
|
|
42
|
+
value: "",
|
|
43
|
+
},
|
|
44
|
+
],
|
|
45
|
+
definitionVersion: 2,
|
|
46
|
+
description: "Triggers when selected GitLab webhook events occur in a project.",
|
|
47
|
+
displayName: "Project Event",
|
|
48
|
+
endpoint: {
|
|
49
|
+
body: { allowArray: false, allowEmpty: false, formats: ["json"] },
|
|
50
|
+
methods: ["POST"],
|
|
51
|
+
successStatus: 202,
|
|
52
|
+
},
|
|
53
|
+
key: "gitlab.on_project_event",
|
|
54
|
+
name: "on_project_event",
|
|
55
|
+
outputs: [
|
|
56
|
+
{ handle: "body", jsonSchema: { type: "object" }, nullable: false },
|
|
57
|
+
{ handle: "deliveryId", jsonSchema: s.string(), nullable: false },
|
|
58
|
+
{ handle: "event", jsonSchema: s.string(), nullable: false },
|
|
59
|
+
{ handle: "gitlabEvent", jsonSchema: s.string(), nullable: false },
|
|
60
|
+
],
|
|
61
|
+
provider: "gitlab",
|
|
62
|
+
type: "integration",
|
|
63
|
+
};
|