@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,129 @@
|
|
|
1
|
+
import { compactObject, optionalInteger, optionalRecord, optionalString } from "../../core/cast.js";
|
|
2
|
+
import { encodePathSegment, queryParams } from "../../core/request.js";
|
|
3
|
+
import { parseProviderJsonBodyText, providerUserAgent, ProviderRequestError, readProviderErrorTextBody, readProviderTextBody, requiredInputString, requiredResponseRecord, runProviderRequest, withRetryAfterSeconds, } from "../provider-runtime.js";
|
|
4
|
+
export const indexedApiBaseUrl = "https://indexed.vc/api/v1";
|
|
5
|
+
export const indexedActionHandlers = {
|
|
6
|
+
lookup_company_by_domain(input, context) {
|
|
7
|
+
return requestIndexed({
|
|
8
|
+
context,
|
|
9
|
+
path: "/companies",
|
|
10
|
+
query: { domain: requiredInputString(input.domain, "domain") },
|
|
11
|
+
});
|
|
12
|
+
},
|
|
13
|
+
lookup_companies_by_domains(input, context) {
|
|
14
|
+
return requestIndexed({ context, path: "/companies/lookup", body: { domains: input.domains } });
|
|
15
|
+
},
|
|
16
|
+
search_companies(input, context) {
|
|
17
|
+
return requestIndexed({
|
|
18
|
+
context,
|
|
19
|
+
path: "/companies",
|
|
20
|
+
query: {
|
|
21
|
+
q: optionalString(input.q),
|
|
22
|
+
industries: joinList(input.industries),
|
|
23
|
+
countries: joinList(input.countries),
|
|
24
|
+
employees: joinList(input.employees),
|
|
25
|
+
operatingStatus: joinList(input.operatingStatus),
|
|
26
|
+
minFunding: optionalInteger(input.minFunding),
|
|
27
|
+
maxFunding: optionalInteger(input.maxFunding),
|
|
28
|
+
minCompleteness: optionalInteger(input.minCompleteness),
|
|
29
|
+
updated_since: optionalString(input.updatedSince),
|
|
30
|
+
reveal_status: optionalString(input.revealStatus),
|
|
31
|
+
sort: optionalString(input.sort),
|
|
32
|
+
order: optionalString(input.order),
|
|
33
|
+
page: optionalInteger(input.page),
|
|
34
|
+
limit: optionalInteger(input.limit),
|
|
35
|
+
cursor: optionalString(input.cursor),
|
|
36
|
+
},
|
|
37
|
+
});
|
|
38
|
+
},
|
|
39
|
+
get_company(input, context) {
|
|
40
|
+
return requestIndexed({
|
|
41
|
+
context,
|
|
42
|
+
path: `/companies/${encodePathSegment(requiredInputString(input.slug, "slug"))}`,
|
|
43
|
+
query: { depth: optionalString(input.depth) },
|
|
44
|
+
});
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* Validate a key with GET /usage, which the API documents as free of credit charges.
|
|
49
|
+
*/
|
|
50
|
+
export async function validateIndexedCredential(input, options) {
|
|
51
|
+
const payload = await requestIndexed({
|
|
52
|
+
context: { apiKey: input.apiKey, fetcher: options.fetcher, signal: options.signal },
|
|
53
|
+
path: "/usage",
|
|
54
|
+
phase: "validate",
|
|
55
|
+
});
|
|
56
|
+
const usage = optionalRecord(payload.data);
|
|
57
|
+
const tier = optionalString(usage?.tier);
|
|
58
|
+
return {
|
|
59
|
+
profile: {
|
|
60
|
+
accountId: "indexed",
|
|
61
|
+
displayName: tier ? `Indexed API Key (${tier} plan)` : "Indexed API Key",
|
|
62
|
+
},
|
|
63
|
+
grantedScopes: [],
|
|
64
|
+
metadata: compactObject({
|
|
65
|
+
apiBaseUrl: indexedApiBaseUrl,
|
|
66
|
+
validationEndpoint: "/usage",
|
|
67
|
+
tier,
|
|
68
|
+
creditsRemaining: optionalInteger(usage?.credits_remaining),
|
|
69
|
+
}),
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
function joinList(value) {
|
|
73
|
+
return Array.isArray(value) && value.length > 0 ? value.join(",") : undefined;
|
|
74
|
+
}
|
|
75
|
+
async function requestIndexed(input) {
|
|
76
|
+
const { context } = input;
|
|
77
|
+
const url = new URL(`${indexedApiBaseUrl}${input.path}`);
|
|
78
|
+
for (const [key, value] of Object.entries(queryParams(input.query ?? {}))) {
|
|
79
|
+
url.searchParams.set(key, value);
|
|
80
|
+
}
|
|
81
|
+
return runProviderRequest({ signal: context.signal, label: "Indexed" }, async (signal) => {
|
|
82
|
+
const response = await context.fetcher(url, {
|
|
83
|
+
method: input.body ? "POST" : "GET",
|
|
84
|
+
headers: compactObject({
|
|
85
|
+
accept: "application/json",
|
|
86
|
+
"user-agent": providerUserAgent,
|
|
87
|
+
"x-api-key": context.apiKey,
|
|
88
|
+
"content-type": input.body ? "application/json" : undefined,
|
|
89
|
+
}),
|
|
90
|
+
body: input.body ? JSON.stringify(input.body) : undefined,
|
|
91
|
+
signal,
|
|
92
|
+
});
|
|
93
|
+
if (!response.ok) {
|
|
94
|
+
throw await readIndexedError(response, input.phase ?? "execute");
|
|
95
|
+
}
|
|
96
|
+
const payload = parseProviderJsonBodyText(await readProviderTextBody(response, "Indexed response"), {
|
|
97
|
+
emptyBody: {},
|
|
98
|
+
invalidJsonMessage: "Indexed returned malformed JSON",
|
|
99
|
+
});
|
|
100
|
+
return requiredResponseRecord(payload, "Indexed response");
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Read an Indexed error response and map it onto the runtime's status conventions.
|
|
105
|
+
* 402 is a billing state (credits exhausted), reported as insufficient_credit.
|
|
106
|
+
* 403 TIER_UPGRADE_REQUIRED is a plan limit rather than a credential failure, so
|
|
107
|
+
* it is reported as invalid input instead of prompting a reconnect. During key
|
|
108
|
+
* validation a 401 or 403 is a field error on the submitted key. Every other
|
|
109
|
+
* status keeps its upstream value, so a 404 stays a not-found result.
|
|
110
|
+
*/
|
|
111
|
+
export async function readIndexedError(response, phase = "execute") {
|
|
112
|
+
const status = response.status;
|
|
113
|
+
const payload = parseProviderJsonBodyText(await readProviderErrorTextBody(response, "Indexed error response"), {
|
|
114
|
+
emptyBody: {},
|
|
115
|
+
invalidJsonMessage: "Indexed returned malformed JSON",
|
|
116
|
+
invalidJsonFallback: () => ({}),
|
|
117
|
+
});
|
|
118
|
+
const body = optionalRecord(payload);
|
|
119
|
+
const message = optionalString(body?.error) ?? `Indexed request failed with HTTP ${status}`;
|
|
120
|
+
const details = withRetryAfterSeconds(response, payload);
|
|
121
|
+
if (status === 402) {
|
|
122
|
+
return new ProviderRequestError(402, message, details, "insufficient_credit");
|
|
123
|
+
}
|
|
124
|
+
if ((status === 401 || status === 403) &&
|
|
125
|
+
(phase === "validate" || optionalString(body?.code) === "TIER_UPGRADE_REQUIRED")) {
|
|
126
|
+
return new ProviderRequestError(400, message, details);
|
|
127
|
+
}
|
|
128
|
+
return new ProviderRequestError(status, message, details);
|
|
129
|
+
}
|
|
@@ -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
|
interface LinearActionContext {
|
|
4
6
|
authorization: string;
|
|
@@ -10,4 +12,5 @@ export declare const executors: ProviderExecutors;
|
|
|
10
12
|
export declare const proxy: ProviderProxyExecutor;
|
|
11
13
|
export declare const credentialValidators: CredentialValidators;
|
|
12
14
|
export declare function fetchLinearViewer(authorization: string, fetcher: typeof fetch): Promise<Record<string, unknown>>;
|
|
15
|
+
export declare const triggers: readonly (IntegrationDefinition | PollDefinition)[];
|
|
13
16
|
export {};
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { compactObject, optionalBoolean } from "../../core/cast.js";
|
|
2
2
|
import { createProviderFetch, createProviderProxyUrl, defineProviderExecutors, normalizeProviderProxyHeaders, ProviderRequestError, providerUserAgent, readProviderProxyErrorMessage, readProviderProxyResponse, toProviderProxyError, withRetryAfterSeconds, } from "../provider-runtime.js";
|
|
3
|
+
import { linearIssueChanged } from "./trigger-on-issue-changed.js";
|
|
3
4
|
const linearApiBaseUrl = "https://api.linear.app";
|
|
4
5
|
const linearGraphqlUrl = "https://api.linear.app/graphql";
|
|
5
6
|
const linearFetch = createProviderFetch({ skipDnsValidation: true });
|
|
@@ -1904,3 +1905,4 @@ function asOptionalObject(value) {
|
|
|
1904
1905
|
}
|
|
1905
1906
|
return value;
|
|
1906
1907
|
}
|
|
1908
|
+
export const triggers = [linearIssueChanged];
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { jsonSchema as s } from "../../core/json-schema.js";
|
|
2
|
+
export const uuidPattern = "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$";
|
|
3
|
+
const issueSchema = s.object({
|
|
4
|
+
id: s.string(),
|
|
5
|
+
identifier: s.string(),
|
|
6
|
+
title: s.string(),
|
|
7
|
+
url: s.string(),
|
|
8
|
+
teamId: s.string(),
|
|
9
|
+
createdAt: s.string(),
|
|
10
|
+
updatedAt: s.string(),
|
|
11
|
+
state: s.object({ id: s.string(), name: s.string(), type: s.string() }, { additionalProperties: false, required: ["id", "name", "type"] }),
|
|
12
|
+
}, {
|
|
13
|
+
additionalProperties: false,
|
|
14
|
+
required: ["id", "identifier", "title", "url", "teamId", "createdAt", "updatedAt", "state"],
|
|
15
|
+
});
|
|
16
|
+
export const snapshot = {
|
|
17
|
+
configInputs: [
|
|
18
|
+
{
|
|
19
|
+
handle: "teamId",
|
|
20
|
+
jsonSchema: { ...s.string({ pattern: uuidPattern }), title: "Team ID" },
|
|
21
|
+
nullable: false,
|
|
22
|
+
description: "Linear Team UUID. Use Copy model UUID in Linear to find it.",
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
handle: "stateIds",
|
|
26
|
+
jsonSchema: {
|
|
27
|
+
...s.array(s.string({ pattern: uuidPattern }), { uniqueItems: true, maxItems: 50 }),
|
|
28
|
+
title: "Issue statuses",
|
|
29
|
+
},
|
|
30
|
+
nullable: false,
|
|
31
|
+
value: [],
|
|
32
|
+
description: "Choose statuses from the selected Team. Empty means all statuses. Matches the current status, not every transition into it.",
|
|
33
|
+
},
|
|
34
|
+
],
|
|
35
|
+
definitionVersion: 2,
|
|
36
|
+
description: "Watches new and updated issues in a Linear team with periodic checks. Starts from now without running existing issues. Reports observed current states, not deletions or every intermediate status change.",
|
|
37
|
+
displayName: "Issue Created or Updated",
|
|
38
|
+
key: "linear.on_issue_changed",
|
|
39
|
+
name: "on_issue_changed",
|
|
40
|
+
outputs: [{ handle: "events", jsonSchema: s.array(issueSchema), nullable: false }],
|
|
41
|
+
provider: "linear",
|
|
42
|
+
type: "poll",
|
|
43
|
+
};
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
import { isJsonObject } from "../../triggers/common/json.js";
|
|
2
|
+
import { eventsPollOutputs, PermanentPollError, PollConnectionError, TransientPollError, } from "../../triggers/common/poll.js";
|
|
3
|
+
import { snapshot, uuidPattern } from "./trigger-on-issue-changed.definition.js";
|
|
4
|
+
const uuid = new RegExp(uuidPattern);
|
|
5
|
+
const overlapMs = 60_000;
|
|
6
|
+
const pageSize = 50;
|
|
7
|
+
export const linearIssueChanged = {
|
|
8
|
+
buildOutputs: eventsPollOutputs,
|
|
9
|
+
snapshot,
|
|
10
|
+
configOptions: options,
|
|
11
|
+
async poll(context) {
|
|
12
|
+
const teamId = typeof context.config.teamId == "string" ? context.config.teamId.toLowerCase() : context.config.teamId;
|
|
13
|
+
const stateIds = context.config.stateIds;
|
|
14
|
+
if (typeof teamId != "string" ||
|
|
15
|
+
!uuid.test(teamId) ||
|
|
16
|
+
!Array.isArray(stateIds) ||
|
|
17
|
+
stateIds.length > 50 ||
|
|
18
|
+
stateIds.some((name) => typeof name != "string" || !uuid.test(name)))
|
|
19
|
+
throw new PermanentPollError("Linear Issue configuration is invalid.");
|
|
20
|
+
if (context.checkpoint == null) {
|
|
21
|
+
const data = await query(context, "query LinearTeam($teamId: String!) { team(id: $teamId) { id } }", { teamId });
|
|
22
|
+
requireTeam(data.team, teamId);
|
|
23
|
+
const startedAt = context.now.toISOString();
|
|
24
|
+
return { checkpoint: { startedAt, since: startedAt }, events: [] };
|
|
25
|
+
}
|
|
26
|
+
const checkpoint = readCheckpoint(context.checkpoint);
|
|
27
|
+
const until = checkpoint.until ?? new Date(Math.max(context.now.getTime(), Date.parse(checkpoint.since))).toISOString();
|
|
28
|
+
const since = new Date(Math.max(Date.parse(checkpoint.startedAt), Date.parse(checkpoint.since) - overlapMs)).toISOString();
|
|
29
|
+
const data = await query(context, `query LinearIssueChanges($teamId: String!, $filter: IssueFilter!, $after: String) {
|
|
30
|
+
team(id: $teamId) {
|
|
31
|
+
id
|
|
32
|
+
issues(first: ${pageSize}, after: $after, orderBy: updatedAt, includeArchived: true, filter: $filter) {
|
|
33
|
+
nodes { id identifier title url createdAt updatedAt state { id name type } }
|
|
34
|
+
pageInfo { hasNextPage endCursor }
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}`, {
|
|
38
|
+
teamId,
|
|
39
|
+
after: checkpoint.after ?? null,
|
|
40
|
+
filter: {
|
|
41
|
+
updatedAt: { gte: since, lte: until },
|
|
42
|
+
...(stateIds.length == 0 ? {} : { state: { id: { in: stateIds } } }),
|
|
43
|
+
},
|
|
44
|
+
});
|
|
45
|
+
const team = requireTeam(data.team, teamId);
|
|
46
|
+
const page = team.issues;
|
|
47
|
+
if (!isJsonObject(page) ||
|
|
48
|
+
!Array.isArray(page.nodes) ||
|
|
49
|
+
page.nodes.length > pageSize ||
|
|
50
|
+
!isJsonObject(page.pageInfo) ||
|
|
51
|
+
typeof page.pageInfo.hasNextPage != "boolean") {
|
|
52
|
+
throw new TransientPollError("Linear returned an invalid Issue page.");
|
|
53
|
+
}
|
|
54
|
+
const { hasNextPage, endCursor } = page.pageInfo;
|
|
55
|
+
if (hasNextPage &&
|
|
56
|
+
(typeof endCursor != "string" ||
|
|
57
|
+
endCursor.length == 0 ||
|
|
58
|
+
endCursor.length > 4096 ||
|
|
59
|
+
endCursor == checkpoint.after ||
|
|
60
|
+
page.nodes.length == 0)) {
|
|
61
|
+
throw new TransientPollError("Linear returned an invalid continuation cursor.");
|
|
62
|
+
}
|
|
63
|
+
const events = page.nodes.map((value) => {
|
|
64
|
+
if (!isJsonObject(value) ||
|
|
65
|
+
typeof value.id != "string" ||
|
|
66
|
+
!uuid.test(value.id) ||
|
|
67
|
+
typeof value.identifier != "string" ||
|
|
68
|
+
value.identifier.length == 0 ||
|
|
69
|
+
typeof value.title != "string" ||
|
|
70
|
+
typeof value.url != "string" ||
|
|
71
|
+
!timestamp(value.createdAt) ||
|
|
72
|
+
!timestamp(value.updatedAt) ||
|
|
73
|
+
Date.parse(value.createdAt) > Date.parse(value.updatedAt) ||
|
|
74
|
+
Date.parse(value.updatedAt) < Date.parse(since) ||
|
|
75
|
+
Date.parse(value.updatedAt) > Date.parse(until) ||
|
|
76
|
+
!isJsonObject(value.state) ||
|
|
77
|
+
typeof value.state.id != "string" ||
|
|
78
|
+
!uuid.test(value.state.id) ||
|
|
79
|
+
typeof value.state.name != "string" ||
|
|
80
|
+
typeof value.state.type != "string" ||
|
|
81
|
+
(stateIds.length > 0 && !stateIds.includes(value.state.id)))
|
|
82
|
+
throw new TransientPollError("Linear returned an invalid Issue.");
|
|
83
|
+
return {
|
|
84
|
+
dedupeKey: `${value.id}:${value.updatedAt}`,
|
|
85
|
+
payload: {
|
|
86
|
+
id: value.id,
|
|
87
|
+
identifier: value.identifier,
|
|
88
|
+
title: value.title,
|
|
89
|
+
url: value.url,
|
|
90
|
+
teamId,
|
|
91
|
+
createdAt: value.createdAt,
|
|
92
|
+
updatedAt: value.updatedAt,
|
|
93
|
+
state: { id: value.state.id, name: value.state.name, type: value.state.type },
|
|
94
|
+
},
|
|
95
|
+
};
|
|
96
|
+
});
|
|
97
|
+
return {
|
|
98
|
+
checkpoint: hasNextPage
|
|
99
|
+
? { ...checkpoint, until, after: endCursor }
|
|
100
|
+
: { startedAt: checkpoint.startedAt, since: until },
|
|
101
|
+
events,
|
|
102
|
+
hasMore: hasNextPage,
|
|
103
|
+
};
|
|
104
|
+
},
|
|
105
|
+
};
|
|
106
|
+
function readCheckpoint(value) {
|
|
107
|
+
if (!isJsonObject(value) ||
|
|
108
|
+
!timestamp(value.startedAt) ||
|
|
109
|
+
!timestamp(value.since) ||
|
|
110
|
+
Date.parse(value.since) < Date.parse(value.startedAt) ||
|
|
111
|
+
(value.until != null && (!timestamp(value.until) || Date.parse(value.until) < Date.parse(value.since))) ||
|
|
112
|
+
(value.after != null &&
|
|
113
|
+
(typeof value.after != "string" || value.after.length == 0 || value.after.length > 4096 || value.until == null)))
|
|
114
|
+
throw new PermanentPollError("Linear Issue checkpoint is invalid.");
|
|
115
|
+
return {
|
|
116
|
+
startedAt: value.startedAt,
|
|
117
|
+
since: value.since,
|
|
118
|
+
...(typeof value.until == "string" ? { until: value.until } : {}),
|
|
119
|
+
...(typeof value.after == "string" ? { after: value.after } : {}),
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
function timestamp(value) {
|
|
123
|
+
return (typeof value == "string" &&
|
|
124
|
+
value.length <= 40 &&
|
|
125
|
+
/^\d{4}-\d{2}-\d{2}T/.test(value) &&
|
|
126
|
+
Number.isFinite(Date.parse(value)));
|
|
127
|
+
}
|
|
128
|
+
function requireTeam(value, teamId) {
|
|
129
|
+
if (value === null)
|
|
130
|
+
throw new PermanentPollError("The Linear team is unavailable or not accessible to this Connection.");
|
|
131
|
+
if (!isJsonObject(value) || value.id !== teamId)
|
|
132
|
+
throw new TransientPollError("Linear returned an invalid Team.");
|
|
133
|
+
return value;
|
|
134
|
+
}
|
|
135
|
+
async function query(context, document, variables) {
|
|
136
|
+
context.signal?.throwIfAborted();
|
|
137
|
+
const result = await context.connector.execute({ endpoint: "/graphql", method: "POST", body: { query: document, variables } }, context.signal);
|
|
138
|
+
context.signal?.throwIfAborted();
|
|
139
|
+
if (result.status == 401 || result.status == 403)
|
|
140
|
+
throw new PollConnectionError("Linear Issue access requires authorization.");
|
|
141
|
+
if (result.status == 429)
|
|
142
|
+
throw new TransientPollError("Linear Issue checks were rate limited.");
|
|
143
|
+
const body = result.data;
|
|
144
|
+
if (isJsonObject(body) && Array.isArray(body.errors) && body.errors.length > 0) {
|
|
145
|
+
const codes = new Set(body.errors.flatMap((error) => isJsonObject(error) && isJsonObject(error.extensions) ? [error.extensions.code] : []));
|
|
146
|
+
if (codes.has("UNAUTHENTICATED") || codes.has("FORBIDDEN") || codes.has("AUTHENTICATION_ERROR")) {
|
|
147
|
+
throw new PollConnectionError("Linear Issue access requires authorization.");
|
|
148
|
+
}
|
|
149
|
+
if (codes.has("RATELIMITED"))
|
|
150
|
+
throw new TransientPollError("Linear Issue checks were rate limited.");
|
|
151
|
+
if (codes.has("GRAPHQL_VALIDATION_FAILED") || codes.has("BAD_USER_INPUT"))
|
|
152
|
+
throw new PermanentPollError("Linear rejected the Issue query configuration.");
|
|
153
|
+
throw new TransientPollError("Linear Issue query failed; progress was retained.");
|
|
154
|
+
}
|
|
155
|
+
if (result.status != 200 ||
|
|
156
|
+
!isJsonObject(body) ||
|
|
157
|
+
!isJsonObject(body.data) ||
|
|
158
|
+
(body.errors != null && !Array.isArray(body.errors))) {
|
|
159
|
+
throw new TransientPollError(`Linear returned an invalid query response (HTTP ${result.status}).`);
|
|
160
|
+
}
|
|
161
|
+
return body.data;
|
|
162
|
+
}
|
|
163
|
+
async function options(context) {
|
|
164
|
+
const { field, config } = context;
|
|
165
|
+
if (field != "teamId" && field != "stateIds")
|
|
166
|
+
throw new PermanentPollError("Unknown Linear configuration field.");
|
|
167
|
+
if (field == "stateIds" && (typeof config.teamId != "string" || !uuid.test(config.teamId)))
|
|
168
|
+
throw new PermanentPollError("Select a Linear Team first.");
|
|
169
|
+
const choices = [];
|
|
170
|
+
const cursors = new Set();
|
|
171
|
+
let after = null;
|
|
172
|
+
for (let page = 0; page < 10; page++) {
|
|
173
|
+
const data = await query(context, field == "teamId"
|
|
174
|
+
? "query LinearTeams($after: String) { teams(first: 100, after: $after) { nodes { id name key } pageInfo { hasNextPage endCursor } } }"
|
|
175
|
+
: "query LinearStates($teamId: String!, $after: String) { team(id: $teamId) { id states(first: 100, after: $after) { nodes { id name color position } pageInfo { hasNextPage endCursor } } } }", { after, ...(field == "teamId" ? {} : { teamId: config.teamId }) });
|
|
176
|
+
const values = field == "teamId" ? data.teams : requireTeam(data.team, String(config.teamId)).states;
|
|
177
|
+
if (!isJsonObject(values) ||
|
|
178
|
+
!Array.isArray(values.nodes) ||
|
|
179
|
+
values.nodes.length > 100 ||
|
|
180
|
+
!isJsonObject(values.pageInfo) ||
|
|
181
|
+
typeof values.pageInfo.hasNextPage != "boolean") {
|
|
182
|
+
throw new TransientPollError("Linear returned invalid configuration options.");
|
|
183
|
+
}
|
|
184
|
+
for (const item of values.nodes) {
|
|
185
|
+
if (!isJsonObject(item) ||
|
|
186
|
+
typeof item.id != "string" ||
|
|
187
|
+
!uuid.test(item.id) ||
|
|
188
|
+
typeof item.name != "string" ||
|
|
189
|
+
item.name.length == 0 ||
|
|
190
|
+
(field == "teamId"
|
|
191
|
+
? typeof item.key != "string"
|
|
192
|
+
: typeof item.color != "string" || !/^#[0-9a-fA-F]{6}$/.test(item.color))) {
|
|
193
|
+
throw new TransientPollError("Linear returned an invalid configuration option.");
|
|
194
|
+
}
|
|
195
|
+
choices.push({
|
|
196
|
+
value: item.id,
|
|
197
|
+
label: field == "teamId" ? `${item.name} (${item.key})` : item.name,
|
|
198
|
+
...(field == "stateIds" ? { color: String(item.color) } : {}),
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
if (!values.pageInfo.hasNextPage)
|
|
202
|
+
return choices;
|
|
203
|
+
const cursor = values.pageInfo.endCursor;
|
|
204
|
+
if (typeof cursor != "string" ||
|
|
205
|
+
cursor.length == 0 ||
|
|
206
|
+
cursor.length > 4096 ||
|
|
207
|
+
cursors.has(cursor) ||
|
|
208
|
+
values.nodes.length == 0) {
|
|
209
|
+
throw new TransientPollError("Linear returned an invalid options cursor.");
|
|
210
|
+
}
|
|
211
|
+
cursors.add(cursor);
|
|
212
|
+
after = cursor;
|
|
213
|
+
}
|
|
214
|
+
throw new PermanentPollError("The Linear options list exceeds the supported limit of 1000 entries.");
|
|
215
|
+
}
|
|
@@ -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
|
interface NotionActionContext {
|
|
4
6
|
accessToken: string;
|
|
@@ -18,4 +20,5 @@ export declare const notionActionHandlers: ProviderActionHandlers<"notion", Noti
|
|
|
18
20
|
export declare const executors: ProviderExecutors;
|
|
19
21
|
export declare const proxy: ProviderProxyExecutor;
|
|
20
22
|
export declare const credentialValidators: CredentialValidators;
|
|
23
|
+
export declare const triggers: readonly (IntegrationDefinition | PollDefinition)[];
|
|
21
24
|
export {};
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { compactObject } from "../../core/cast.js";
|
|
2
2
|
import { createProviderFetch, createProviderProxyUrl, defineProviderExecutors, normalizeProviderProxyHeaders, providerInputError, ProviderRequestError, providerUserAgent, readProviderProxyErrorMessage, readProviderProxyResponse, requireBearerCredential, toProviderProxyError, withRetryAfterSeconds, } from "../provider-runtime.js";
|
|
3
|
+
import { notionDatabasePageEvent } from "./trigger-on-database-page-event.js";
|
|
3
4
|
const service = "notion";
|
|
4
5
|
const notionApiBaseUrl = "https://api.notion.com/v1";
|
|
5
6
|
const notionFetch = createProviderFetch({ skipDnsValidation: true });
|
|
@@ -805,3 +806,4 @@ function asNumber(value) {
|
|
|
805
806
|
function asNonEmptyString(value) {
|
|
806
807
|
return typeof value === "string" && value.length > 0 ? value : undefined;
|
|
807
808
|
}
|
|
809
|
+
export const triggers = [notionDatabasePageEvent];
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { jsonSchema as s } from "../../core/json-schema.js";
|
|
2
|
+
const idPattern = "^[0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12}$";
|
|
3
|
+
const eventSchema = s.object({
|
|
4
|
+
createdBy: { type: "object" },
|
|
5
|
+
createdTime: s.string(),
|
|
6
|
+
dataSourceId: s.string(),
|
|
7
|
+
databaseId: s.string(),
|
|
8
|
+
event: s.stringEnum(["page_added", "page_updated"]),
|
|
9
|
+
lastEditedBy: { type: "object" },
|
|
10
|
+
lastEditedTime: s.string(),
|
|
11
|
+
pageId: s.string(),
|
|
12
|
+
properties: { type: "object" },
|
|
13
|
+
title: s.string(),
|
|
14
|
+
url: s.string(),
|
|
15
|
+
}, {
|
|
16
|
+
additionalProperties: false,
|
|
17
|
+
required: [
|
|
18
|
+
"event",
|
|
19
|
+
"pageId",
|
|
20
|
+
"databaseId",
|
|
21
|
+
"dataSourceId",
|
|
22
|
+
"url",
|
|
23
|
+
"title",
|
|
24
|
+
"createdTime",
|
|
25
|
+
"lastEditedTime",
|
|
26
|
+
"createdBy",
|
|
27
|
+
"lastEditedBy",
|
|
28
|
+
],
|
|
29
|
+
});
|
|
30
|
+
export const snapshot = {
|
|
31
|
+
configInputs: [
|
|
32
|
+
{
|
|
33
|
+
handle: "dataSourceId",
|
|
34
|
+
jsonSchema: s.string({
|
|
35
|
+
pattern: "^(?:|[0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12})$",
|
|
36
|
+
}),
|
|
37
|
+
nullable: false,
|
|
38
|
+
value: "",
|
|
39
|
+
},
|
|
40
|
+
{ handle: "databaseId", jsonSchema: s.string({ pattern: idPattern }), nullable: false },
|
|
41
|
+
{
|
|
42
|
+
handle: "events",
|
|
43
|
+
jsonSchema: s.array(s.stringEnum(["page_added", "page_updated"]), { minItems: 1, uniqueItems: true }),
|
|
44
|
+
nullable: false,
|
|
45
|
+
value: ["page_added"],
|
|
46
|
+
},
|
|
47
|
+
{ handle: "includeProperties", jsonSchema: s.boolean(), nullable: false, value: true },
|
|
48
|
+
{
|
|
49
|
+
handle: "maxItemsPerPoll",
|
|
50
|
+
jsonSchema: s.integer({ maximum: 100, minimum: 1 }),
|
|
51
|
+
nullable: false,
|
|
52
|
+
value: 25,
|
|
53
|
+
},
|
|
54
|
+
],
|
|
55
|
+
definitionVersion: 2,
|
|
56
|
+
description: "Polls a Notion database and triggers when a page is added to it or an existing page is edited.",
|
|
57
|
+
displayName: "Database Page Added or Updated",
|
|
58
|
+
key: "notion.on_database_page_event",
|
|
59
|
+
name: "on_database_page_event",
|
|
60
|
+
outputs: [{ handle: "events", jsonSchema: s.array(eventSchema), nullable: false }],
|
|
61
|
+
provider: "notion",
|
|
62
|
+
type: "poll",
|
|
63
|
+
};
|