@robinpath/calendly
Advanced tools
| /** | ||
| * RobinPath Calendly Module (Node port) | ||
| * | ||
| * Calendly API v2 — users, organizations, event types, scheduled events, | ||
| * invitees, single-use scheduling links, and webhook subscriptions. Mirror | ||
| * of packages/php/calendly/src/index.php for the WordPress plugin; shares | ||
| * the same credential contract, metadata shape, and error taxonomy so the | ||
| * visual editor can render both identically. | ||
| * | ||
| * Authentication is a Bearer token on every request. Calendly supports two | ||
| * kinds of tokens: | ||
| * 1. Personal Access Token (PAT) — long-lived, scoped to a single user. | ||
| * Create one at calendly.com/integrations/api_webhooks (requires a | ||
| * Professional / Teams / Enterprise plan). PATs are JWTs and begin | ||
| * with `eyJ`. | ||
| * 2. OAuth 2.0 access token — short-lived, issued via the OAuth | ||
| * authorization-code flow. | ||
| * | ||
| * Every method takes a credential slug as its first argument; the module | ||
| * resolves the stored token at call time via the injected ModuleHost. | ||
| * | ||
| * --- URI quirk ----------------------------------------------------------- | ||
| * Calendly identifies most resources by URI rather than bare UUID | ||
| * (e.g. `https://api.calendly.com/users/AAAAAAAAAAAAAAAA`). Many list | ||
| * endpoints require a `user`, `organization`, or `event_type` URI as | ||
| * a query parameter. | ||
| * | ||
| * For convenience, every `*Uri` argument in this module accepts either: | ||
| * - a full URI: `https://api.calendly.com/users/AAAAAAAAAAAAAAAA` | ||
| * - a bare UUID: `AAAAAAAAAAAAAAAA` | ||
| * The module upgrades bare UUIDs to the full URI form internally, using | ||
| * a hint from the parameter name (`userUri` → `/users/`, `eventUri` → | ||
| * `/scheduled_events/`, etc.) before sending the request. | ||
| * | ||
| * Credential type declared by this module: | ||
| * - calendly : { token } | ||
| */ | ||
| import type { BuiltinHandler, CredentialTypeSchema, FunctionMetadata, ModuleHost, ModuleMetadata } from "@robinpath/core"; | ||
| export declare function configureCalendly(h: ModuleHost): void; | ||
| export declare const CalendlyFunctions: Record<string, BuiltinHandler>; | ||
| export declare const CalendlyCredentialTypes: CredentialTypeSchema[]; | ||
| export declare const CalendlyFunctionMetadata: Record<string, FunctionMetadata>; | ||
| export declare const CalendlyModuleMetadata: ModuleMetadata; | ||
| //# sourceMappingURL=calendly.d.ts.map |
| {"version":3,"file":"calendly.d.ts","sourceRoot":"","sources":["../src/calendly.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAEH,OAAO,KAAK,EACV,cAAc,EACd,oBAAoB,EACpB,gBAAgB,EAChB,UAAU,EACV,cAAc,EAEf,MAAM,iBAAiB,CAAC;AAezB,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,UAAU,GAAG,IAAI,CAErD;AAslBD,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAqB5D,CAAC;AAIF,eAAO,MAAM,uBAAuB,EAAE,oBAAoB,EAkBzD,CAAC;AAkFF,eAAO,MAAM,wBAAwB,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAofrE,CAAC;AAIF,eAAO,MAAM,sBAAsB,EAAE,cAiDpC,CAAC"} |
+1089
| /** | ||
| * RobinPath Calendly Module (Node port) | ||
| * | ||
| * Calendly API v2 — users, organizations, event types, scheduled events, | ||
| * invitees, single-use scheduling links, and webhook subscriptions. Mirror | ||
| * of packages/php/calendly/src/index.php for the WordPress plugin; shares | ||
| * the same credential contract, metadata shape, and error taxonomy so the | ||
| * visual editor can render both identically. | ||
| * | ||
| * Authentication is a Bearer token on every request. Calendly supports two | ||
| * kinds of tokens: | ||
| * 1. Personal Access Token (PAT) — long-lived, scoped to a single user. | ||
| * Create one at calendly.com/integrations/api_webhooks (requires a | ||
| * Professional / Teams / Enterprise plan). PATs are JWTs and begin | ||
| * with `eyJ`. | ||
| * 2. OAuth 2.0 access token — short-lived, issued via the OAuth | ||
| * authorization-code flow. | ||
| * | ||
| * Every method takes a credential slug as its first argument; the module | ||
| * resolves the stored token at call time via the injected ModuleHost. | ||
| * | ||
| * --- URI quirk ----------------------------------------------------------- | ||
| * Calendly identifies most resources by URI rather than bare UUID | ||
| * (e.g. `https://api.calendly.com/users/AAAAAAAAAAAAAAAA`). Many list | ||
| * endpoints require a `user`, `organization`, or `event_type` URI as | ||
| * a query parameter. | ||
| * | ||
| * For convenience, every `*Uri` argument in this module accepts either: | ||
| * - a full URI: `https://api.calendly.com/users/AAAAAAAAAAAAAAAA` | ||
| * - a bare UUID: `AAAAAAAAAAAAAAAA` | ||
| * The module upgrades bare UUIDs to the full URI form internally, using | ||
| * a hint from the parameter name (`userUri` → `/users/`, `eventUri` → | ||
| * `/scheduled_events/`, etc.) before sending the request. | ||
| * | ||
| * Credential type declared by this module: | ||
| * - calendly : { token } | ||
| */ | ||
| // ── Module-local state (populated by configure hook) ──────────────────── | ||
| const state = {}; | ||
| function host() { | ||
| if (!state.host) { | ||
| throw new Error("Calendly module not initialized. Pass the adapter to rp.installModule() so its configure() hook runs first."); | ||
| } | ||
| return state.host; | ||
| } | ||
| export function configureCalendly(h) { | ||
| state.host = h; | ||
| } | ||
| // ── Constants ────────────────────────────────────────────────────────── | ||
| const API_BASE = "https://api.calendly.com/"; | ||
| const CREDENTIAL_TYPE = "calendly"; | ||
| function errorReturn(error, code, extra = {}) { | ||
| return { error, code, ...extra }; | ||
| } | ||
| function isErrorReturn(v) { | ||
| return !!v && typeof v === "object" && "error" in v; | ||
| } | ||
| function isPlainObject(v) { | ||
| return !!v && typeof v === "object" && !Array.isArray(v); | ||
| } | ||
| // ── Credential resolver (mirrors PHP resolveToken) ───────────────────── | ||
| async function resolveToken(credentialSlug) { | ||
| if (!credentialSlug) { | ||
| return errorReturn("Credential slug is required.", "credential_not_found"); | ||
| } | ||
| let fields; | ||
| try { | ||
| fields = await host().credentials.get(credentialSlug); | ||
| } | ||
| catch (e) { | ||
| return errorReturn(e instanceof Error ? e.message : String(e), "credential_not_found"); | ||
| } | ||
| if (!fields) { | ||
| return errorReturn(`Credential '${credentialSlug}' not found.`, "credential_not_found"); | ||
| } | ||
| const token = String(fields.token ?? fields.access_token ?? fields.personal_access_token ?? ""); | ||
| if (!token) { | ||
| return errorReturn("Credential has no `token` field.", "token_missing"); | ||
| } | ||
| return { token }; | ||
| } | ||
| // ── HTTP helper (normalized envelope, never throws for API errors) ───── | ||
| async function http(token, method, pathAndQuery, body) { | ||
| const headers = { | ||
| Authorization: `Bearer ${token}`, | ||
| Accept: "application/json", | ||
| }; | ||
| if (body !== undefined && body !== null) { | ||
| headers["Content-Type"] = "application/json"; | ||
| } | ||
| const init = { method, headers }; | ||
| if (body !== undefined && body !== null) { | ||
| init.body = JSON.stringify(body); | ||
| } | ||
| let response; | ||
| try { | ||
| response = await fetch(`${API_BASE}${pathAndQuery.replace(/^\/+/, "")}`, init); | ||
| } | ||
| catch (e) { | ||
| return errorReturn(e instanceof Error ? e.message : String(e), "transport"); | ||
| } | ||
| const raw = await response.text(); | ||
| if (response.status === 204 || raw === "") { | ||
| if (response.status >= 200 && response.status < 300) { | ||
| return { ok: true }; | ||
| } | ||
| } | ||
| let decoded; | ||
| try { | ||
| decoded = raw ? JSON.parse(raw) : null; | ||
| } | ||
| catch { | ||
| decoded = { raw: raw.slice(0, 500) }; | ||
| } | ||
| if (response.status >= 200 && response.status < 300) { | ||
| if (decoded && typeof decoded === "object") | ||
| return decoded; | ||
| return { raw }; | ||
| } | ||
| return calendlyError(response.status, isPlainObject(decoded) | ||
| ? decoded | ||
| : { raw: typeof raw === "string" ? raw.slice(0, 500) : "" }); | ||
| } | ||
| function calendlyError(status, decoded) { | ||
| // Calendly errors come back as either { message, title, details: [...] } | ||
| // or occasionally { error: "...", error_description: "..." } for OAuth issues. | ||
| const message = String(decoded.message | ||
| ?? decoded.title | ||
| ?? decoded.error_description | ||
| ?? decoded.error | ||
| ?? `Calendly returned HTTP ${status}.`); | ||
| let code = "calendly_error"; | ||
| if (status === 404) | ||
| code = "not_found"; | ||
| else if (status === 429) | ||
| code = "rate_limited"; | ||
| return errorReturn(message, code, { | ||
| status, | ||
| calendly_error: decoded, | ||
| }); | ||
| } | ||
| // ── URI helpers ──────────────────────────────────────────────────────── | ||
| /** | ||
| * Upgrade a bare UUID to a full Calendly URI, using `resource` as the | ||
| * path hint. A value that already looks like a URI is returned as-is. | ||
| */ | ||
| function toUri(value, resource) { | ||
| if (value.startsWith("https://api.calendly.com/")) { | ||
| return value; | ||
| } | ||
| return `https://api.calendly.com/${resource}/${value}`; | ||
| } | ||
| /** | ||
| * Extract the trailing UUID segment from a URI or return the value as-is | ||
| * if it's already a bare UUID. | ||
| */ | ||
| function extractUuid(value, resource) { | ||
| if (value.startsWith("https://api.calendly.com/")) { | ||
| let trimmed = value.slice("https://api.calendly.com/".length).replace(/\/+$/, ""); | ||
| const prefix = `${resource}/`; | ||
| if (trimmed.startsWith(prefix)) { | ||
| trimmed = trimmed.slice(prefix.length); | ||
| } | ||
| if (trimmed.includes("/")) { | ||
| const parts = trimmed.split("/"); | ||
| trimmed = parts[parts.length - 1]; | ||
| } | ||
| return trimmed; | ||
| } | ||
| return value; | ||
| } | ||
| // ── Shared caller ────────────────────────────────────────────────────── | ||
| async function call(cred, method, path, body) { | ||
| const resolved = await resolveToken(cred); | ||
| if ("error" in resolved) | ||
| return resolved; | ||
| return http(resolved.token, method, path, body); | ||
| } | ||
| /** | ||
| * Resolve the current user's URI from /users/me. Used to default `user` | ||
| * filters on listEventTypes / listScheduledEvents etc. | ||
| */ | ||
| async function resolveCurrentUserUri(cred) { | ||
| const me = await call(cred, "GET", "users/me", null); | ||
| if (isErrorReturn(me)) | ||
| return me; | ||
| const uri = isPlainObject(me) && isPlainObject(me.resource) | ||
| ? String(me.resource.uri ?? "") | ||
| : ""; | ||
| if (!uri) { | ||
| return errorReturn("Could not resolve current user URI from /users/me response.", "calendly_error"); | ||
| } | ||
| return uri; | ||
| } | ||
| /** | ||
| * Resolve the current user's organization URI from /users/me. | ||
| */ | ||
| async function resolveCurrentOrganizationUri(cred) { | ||
| const me = await call(cred, "GET", "users/me", null); | ||
| if (isErrorReturn(me)) | ||
| return me; | ||
| const uri = isPlainObject(me) && isPlainObject(me.resource) | ||
| ? String(me.resource.current_organization ?? "") | ||
| : ""; | ||
| if (!uri) { | ||
| return errorReturn("Could not resolve current organization URI from /users/me response.", "calendly_error"); | ||
| } | ||
| return uri; | ||
| } | ||
| // ── Query-string helpers ─────────────────────────────────────────────── | ||
| function buildQueryString(params) { | ||
| const keys = Object.keys(params); | ||
| if (keys.length === 0) | ||
| return ""; | ||
| const sp = new URLSearchParams(); | ||
| for (const k of keys) | ||
| sp.set(k, params[k]); | ||
| return `?${sp.toString()}`; | ||
| } | ||
| // ── Handlers: Identity ───────────────────────────────────────────────── | ||
| const getCurrentUser = async (args) => { | ||
| const cred = String(args[0] ?? ""); | ||
| return (await call(cred, "GET", "users/me", null)); | ||
| }; | ||
| const getUser = async (args) => { | ||
| const cred = String(args[0] ?? ""); | ||
| const id = String(args[1] ?? ""); | ||
| if (!id) { | ||
| return errorReturn("`userUri` is required.", "not_found"); | ||
| } | ||
| const uuid = extractUuid(id, "users"); | ||
| return (await call(cred, "GET", `users/${encodeURIComponent(uuid)}`, null)); | ||
| }; | ||
| const getOrganization = async (args) => { | ||
| const cred = String(args[0] ?? ""); | ||
| const id = String(args[1] ?? ""); | ||
| if (!id) { | ||
| return errorReturn("`organizationUri` is required.", "not_found"); | ||
| } | ||
| const uuid = extractUuid(id, "organizations"); | ||
| return (await call(cred, "GET", `organizations/${encodeURIComponent(uuid)}`, null)); | ||
| }; | ||
| // ── Handlers: Event Types ────────────────────────────────────────────── | ||
| const listEventTypes = async (args) => { | ||
| const cred = String(args[0] ?? ""); | ||
| const opts = (isPlainObject(args[1]) ? args[1] : {}); | ||
| const query = {}; | ||
| if (opts.organization !== undefined && String(opts.organization) !== "") { | ||
| query.organization = toUri(String(opts.organization), "organizations"); | ||
| } | ||
| else if (opts.user !== undefined && String(opts.user) !== "") { | ||
| query.user = toUri(String(opts.user), "users"); | ||
| } | ||
| else { | ||
| const userUri = await resolveCurrentUserUri(cred); | ||
| if (typeof userUri !== "string") | ||
| return userUri; | ||
| query.user = userUri; | ||
| } | ||
| for (const k of ["active", "count", "page_token", "sort"]) { | ||
| if (opts[k] !== undefined) { | ||
| query[k] = typeof opts[k] === "boolean" | ||
| ? (opts[k] ? "true" : "false") | ||
| : String(opts[k]); | ||
| } | ||
| } | ||
| return (await call(cred, "GET", `event_types${buildQueryString(query)}`, null)); | ||
| }; | ||
| const getEventType = async (args) => { | ||
| const cred = String(args[0] ?? ""); | ||
| const id = String(args[1] ?? ""); | ||
| if (!id) { | ||
| return errorReturn("`eventTypeUri` is required.", "not_found"); | ||
| } | ||
| const uuid = extractUuid(id, "event_types"); | ||
| return (await call(cred, "GET", `event_types/${encodeURIComponent(uuid)}`, null)); | ||
| }; | ||
| // ── Handlers: Scheduled Events ───────────────────────────────────────── | ||
| const listScheduledEvents = async (args) => { | ||
| const cred = String(args[0] ?? ""); | ||
| const opts = (isPlainObject(args[1]) ? args[1] : {}); | ||
| const query = {}; | ||
| if (opts.organization !== undefined && String(opts.organization) !== "") { | ||
| query.organization = toUri(String(opts.organization), "organizations"); | ||
| } | ||
| else if (opts.user !== undefined && String(opts.user) !== "") { | ||
| query.user = toUri(String(opts.user), "users"); | ||
| } | ||
| else { | ||
| const userUri = await resolveCurrentUserUri(cred); | ||
| if (typeof userUri !== "string") | ||
| return userUri; | ||
| query.user = userUri; | ||
| } | ||
| for (const k of [ | ||
| "invitee_email", | ||
| "status", | ||
| "min_start_time", | ||
| "max_start_time", | ||
| "count", | ||
| "page_token", | ||
| "sort", | ||
| ]) { | ||
| if (opts[k] !== undefined) { | ||
| query[k] = String(opts[k]); | ||
| } | ||
| } | ||
| return (await call(cred, "GET", `scheduled_events${buildQueryString(query)}`, null)); | ||
| }; | ||
| const getScheduledEvent = async (args) => { | ||
| const cred = String(args[0] ?? ""); | ||
| const id = String(args[1] ?? ""); | ||
| if (!id) { | ||
| return errorReturn("`eventUri` is required.", "not_found"); | ||
| } | ||
| const uuid = extractUuid(id, "scheduled_events"); | ||
| return (await call(cred, "GET", `scheduled_events/${encodeURIComponent(uuid)}`, null)); | ||
| }; | ||
| const cancelScheduledEvent = async (args) => { | ||
| const cred = String(args[0] ?? ""); | ||
| const id = String(args[1] ?? ""); | ||
| const reason = args[2] !== undefined ? String(args[2]) : ""; | ||
| if (!id) { | ||
| return errorReturn("`eventUri` is required.", "not_found"); | ||
| } | ||
| const uuid = extractUuid(id, "scheduled_events"); | ||
| const body = {}; | ||
| if (reason !== "") { | ||
| body.reason = reason; | ||
| } | ||
| return (await call(cred, "POST", `scheduled_events/${encodeURIComponent(uuid)}/cancellation`, body)); | ||
| }; | ||
| // ── Handlers: Invitees ───────────────────────────────────────────────── | ||
| const listInvitees = async (args) => { | ||
| const cred = String(args[0] ?? ""); | ||
| const id = String(args[1] ?? ""); | ||
| const opts = (isPlainObject(args[2]) ? args[2] : {}); | ||
| if (!id) { | ||
| return errorReturn("`eventUri` is required.", "not_found"); | ||
| } | ||
| const uuid = extractUuid(id, "scheduled_events"); | ||
| const query = {}; | ||
| for (const k of ["email", "status", "count", "page_token", "sort"]) { | ||
| if (opts[k] !== undefined) { | ||
| query[k] = String(opts[k]); | ||
| } | ||
| } | ||
| const path = `scheduled_events/${encodeURIComponent(uuid)}/invitees${buildQueryString(query)}`; | ||
| return (await call(cred, "GET", path, null)); | ||
| }; | ||
| const getInvitee = async (args) => { | ||
| const cred = String(args[0] ?? ""); | ||
| const uri = String(args[1] ?? ""); | ||
| if (!uri) { | ||
| return errorReturn("`inviteeUri` is required.", "not_found"); | ||
| } | ||
| // Accept either a full URI or the `eventUuid:inviteeUuid` shorthand. | ||
| let path; | ||
| if (uri.startsWith("https://api.calendly.com/")) { | ||
| path = uri.slice("https://api.calendly.com/".length); | ||
| } | ||
| else if (uri.includes(":")) { | ||
| const [eventUuid, inviteeUuid] = uri.split(":", 2); | ||
| path = `scheduled_events/${encodeURIComponent(eventUuid)}/invitees/${encodeURIComponent(inviteeUuid)}`; | ||
| } | ||
| else { | ||
| return errorReturn("inviteeUri must be a full URI or `eventUuid:inviteeUuid` shorthand.", "not_found"); | ||
| } | ||
| return (await call(cred, "GET", path, null)); | ||
| }; | ||
| // ── Handlers: Scheduling Links ───────────────────────────────────────── | ||
| const createSchedulingLink = async (args) => { | ||
| const cred = String(args[0] ?? ""); | ||
| const id = String(args[1] ?? ""); | ||
| const opts = (isPlainObject(args[2]) ? args[2] : {}); | ||
| if (!id) { | ||
| return errorReturn("`eventTypeUri` is required.", "not_found"); | ||
| } | ||
| const eventTypeUri = toUri(id, "event_types"); | ||
| const body = { | ||
| max_event_count: opts.maxEventCount !== undefined | ||
| ? Number(opts.maxEventCount) | 0 | ||
| : 1, | ||
| // Calendly: the scheduling-link owner is the event type itself. | ||
| owner: opts.owner !== undefined && String(opts.owner) !== "" | ||
| ? toUri(String(opts.owner), "event_types") | ||
| : eventTypeUri, | ||
| owner_type: String(opts.ownerType ?? "EventType"), | ||
| }; | ||
| return (await call(cred, "POST", "scheduling_links", body)); | ||
| }; | ||
| // ── Handlers: Webhooks ───────────────────────────────────────────────── | ||
| const listWebhookSubscriptions = async (args) => { | ||
| const cred = String(args[0] ?? ""); | ||
| const opts = (isPlainObject(args[1]) ? args[1] : {}); | ||
| let scope = String(opts.scope ?? "user").toLowerCase(); | ||
| if (scope !== "user" && scope !== "organization") { | ||
| scope = "user"; | ||
| } | ||
| const query = { scope }; | ||
| if (scope === "organization") { | ||
| if (opts.organization === undefined || String(opts.organization) === "") { | ||
| return errorReturn('`organization` URI is required when scope is "organization".', "not_found"); | ||
| } | ||
| query.organization = toUri(String(opts.organization), "organizations"); | ||
| } | ||
| else { | ||
| // scope=user → need both user AND organization URIs per Calendly API. | ||
| let userUri = opts.user !== undefined && String(opts.user) !== "" | ||
| ? toUri(String(opts.user), "users") | ||
| : null; | ||
| if (userUri === null) { | ||
| const resolved = await resolveCurrentUserUri(cred); | ||
| if (typeof resolved !== "string") | ||
| return resolved; | ||
| userUri = resolved; | ||
| } | ||
| query.user = userUri; | ||
| if (opts.organization !== undefined && String(opts.organization) !== "") { | ||
| query.organization = toUri(String(opts.organization), "organizations"); | ||
| } | ||
| else { | ||
| const orgUri = await resolveCurrentOrganizationUri(cred); | ||
| if (typeof orgUri !== "string") | ||
| return orgUri; | ||
| query.organization = orgUri; | ||
| } | ||
| } | ||
| for (const k of ["count", "page_token", "sort"]) { | ||
| if (opts[k] !== undefined) { | ||
| query[k] = String(opts[k]); | ||
| } | ||
| } | ||
| return (await call(cred, "GET", `webhook_subscriptions${buildQueryString(query)}`, null)); | ||
| }; | ||
| const createWebhookSubscription = async (args) => { | ||
| const cred = String(args[0] ?? ""); | ||
| const callbackUrl = String(args[1] ?? ""); | ||
| const events = Array.isArray(args[2]) ? args[2] : []; | ||
| const opts = (isPlainObject(args[3]) ? args[3] : {}); | ||
| if (!callbackUrl) { | ||
| return errorReturn("`callbackUrl` is required.", "not_found"); | ||
| } | ||
| if (events.length === 0) { | ||
| return errorReturn("`events` is required (non-empty array).", "not_found"); | ||
| } | ||
| let scope = String(opts.scope ?? "user").toLowerCase(); | ||
| if (scope !== "user" && scope !== "organization") { | ||
| scope = "user"; | ||
| } | ||
| const body = { | ||
| url: callbackUrl, | ||
| events: events.map((e) => String(e)), | ||
| scope, | ||
| }; | ||
| // Organization URI is always required by the Calendly webhooks API. | ||
| if (opts.organization !== undefined && String(opts.organization) !== "") { | ||
| body.organization = toUri(String(opts.organization), "organizations"); | ||
| } | ||
| else { | ||
| const orgUri = await resolveCurrentOrganizationUri(cred); | ||
| if (typeof orgUri !== "string") | ||
| return orgUri; | ||
| body.organization = orgUri; | ||
| } | ||
| if (scope === "user") { | ||
| let userUri = opts.user !== undefined && String(opts.user) !== "" | ||
| ? toUri(String(opts.user), "users") | ||
| : null; | ||
| if (userUri === null) { | ||
| const resolved = await resolveCurrentUserUri(cred); | ||
| if (typeof resolved !== "string") | ||
| return resolved; | ||
| userUri = resolved; | ||
| } | ||
| body.user = userUri; | ||
| } | ||
| if (opts.signingKey !== undefined && String(opts.signingKey) !== "") { | ||
| body.signing_key = String(opts.signingKey); | ||
| } | ||
| return (await call(cred, "POST", "webhook_subscriptions", body)); | ||
| }; | ||
| const deleteWebhookSubscription = async (args) => { | ||
| const cred = String(args[0] ?? ""); | ||
| const id = String(args[1] ?? ""); | ||
| if (!id) { | ||
| return errorReturn("`webhookUri` is required.", "not_found"); | ||
| } | ||
| const uuid = extractUuid(id, "webhook_subscriptions"); | ||
| return (await call(cred, "DELETE", `webhook_subscriptions/${encodeURIComponent(uuid)}`, null)); | ||
| }; | ||
| // ── Exports: functions map ───────────────────────────────────────────── | ||
| export const CalendlyFunctions = { | ||
| // Identity. | ||
| getCurrentUser, | ||
| getUser, | ||
| getOrganization, | ||
| // Event types. | ||
| listEventTypes, | ||
| getEventType, | ||
| // Scheduled events. | ||
| listScheduledEvents, | ||
| getScheduledEvent, | ||
| cancelScheduledEvent, | ||
| // Invitees. | ||
| listInvitees, | ||
| getInvitee, | ||
| // Scheduling links. | ||
| createSchedulingLink, | ||
| // Webhooks. | ||
| listWebhookSubscriptions, | ||
| createWebhookSubscription, | ||
| deleteWebhookSubscription, | ||
| }; | ||
| // ── Exports: credential types ────────────────────────────────────────── | ||
| export const CalendlyCredentialTypes = [ | ||
| { | ||
| slug: CREDENTIAL_TYPE, | ||
| title: "Calendly API Token", | ||
| icon: "calendar", | ||
| fields: [ | ||
| { | ||
| name: "token", | ||
| title: "Access Token", | ||
| type: "password", | ||
| required: true, | ||
| placeholder: "eyJraWQiOi...", | ||
| description: "Personal Access Token from calendly.com/integrations/api_webhooks (Professional/Teams/Enterprise only), or an OAuth 2.0 access token obtained via the authorization-code flow. Calendly tokens are JWTs and start with `eyJ`.", | ||
| pattern: "^eyJ", | ||
| }, | ||
| ], | ||
| }, | ||
| ]; | ||
| // ── Shared parameter metadata ────────────────────────────────────────── | ||
| const credentialParam = { | ||
| name: "credential", | ||
| title: "Credential", | ||
| description: "Slug of a saved `calendly` credential.", | ||
| dataType: "string", | ||
| formInputType: "resource", | ||
| required: true, | ||
| allowExpression: true, | ||
| placeholder: "my_calendly", | ||
| resource: { | ||
| type: "credential", | ||
| listFn: "credential.list", | ||
| modes: ["list", "expression"], | ||
| searchable: true, | ||
| filter: { type: CREDENTIAL_TYPE }, | ||
| }, | ||
| }; | ||
| const userUriParam = { | ||
| name: "userUri", | ||
| title: "User URI or UUID", | ||
| description: "Full user URI (`https://api.calendly.com/users/AAAAAAAAAAAAAAAA`) OR bare UUID (`AAAAAAAAAAAAAAAA`). The module upgrades bare UUIDs internally. Use `getCurrentUser` to discover your own URI.", | ||
| dataType: "string", | ||
| formInputType: "text", | ||
| required: true, | ||
| allowExpression: true, | ||
| placeholder: "AAAAAAAAAAAAAAAA", | ||
| }; | ||
| const orgUriParam = { | ||
| name: "organizationUri", | ||
| title: "Organization URI or UUID", | ||
| description: "Full organization URI or bare UUID. Read from `getCurrentUser().resource.current_organization`.", | ||
| dataType: "string", | ||
| formInputType: "text", | ||
| required: true, | ||
| allowExpression: true, | ||
| placeholder: "BBBBBBBBBBBBBBBB", | ||
| }; | ||
| const eventTypeUriParam = { | ||
| name: "eventTypeUri", | ||
| title: "Event Type URI or UUID", | ||
| description: "Full event-type URI (`https://api.calendly.com/event_types/CCCCCCCCCCCCCCCC`) or bare UUID.", | ||
| dataType: "string", | ||
| formInputType: "text", | ||
| required: true, | ||
| allowExpression: true, | ||
| placeholder: "CCCCCCCCCCCCCCCC", | ||
| }; | ||
| const eventUriParam = { | ||
| name: "eventUri", | ||
| title: "Scheduled Event URI or UUID", | ||
| description: "Full scheduled-event URI (`https://api.calendly.com/scheduled_events/DDDDDDDDDDDDDDDD`) or bare UUID. Found in webhook payloads at `payload.event.uri` and in `listScheduledEvents` results.", | ||
| dataType: "string", | ||
| formInputType: "text", | ||
| required: true, | ||
| allowExpression: true, | ||
| placeholder: "DDDDDDDDDDDDDDDD", | ||
| }; | ||
| const commonErrors = { | ||
| credential_not_found: "No credential with that slug exists in the vault.", | ||
| token_missing: "The credential exists but has no `token` field.", | ||
| transport: "Network failure calling api.calendly.com.", | ||
| calendly_error: "Calendly returned an error — see `calendly_error.message` and `.details` in the response.", | ||
| rate_limited: "Hit Calendly rate limits. Slow down or review your plan limits.", | ||
| not_found: "No resource with that URI exists (or it was deleted).", | ||
| }; | ||
| // ── Exports: function metadata ───────────────────────────────────────── | ||
| export const CalendlyFunctionMetadata = { | ||
| // ===================== IDENTITY ===================== | ||
| getCurrentUser: { | ||
| title: "Get current user", | ||
| summary: "Fetch the user that owns the API token", | ||
| description: "Calls `GET /users/me`. Returns the authenticated user's profile including their URI, scheduling URL, timezone, and — importantly — `current_organization` (the organization URI you'll pass to most list endpoints).\n\nTypically the first call in any Calendly script: use the returned URI as the `user` filter for `listEventTypes` and `listScheduledEvents`.", | ||
| group: "identity", | ||
| action: "read", | ||
| icon: "user", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call"], | ||
| idempotent: true, | ||
| since: "1.0.0", | ||
| tags: ["calendly", "user", "me", "identity"], | ||
| parameters: [credentialParam], | ||
| returnType: "object", | ||
| returnDescription: "{resource: {uri, name, slug, email, scheduling_url, timezone, current_organization, created_at, updated_at}}.", | ||
| errors: commonErrors, | ||
| example: 'calendly.getCurrentUser "my_calendly"', | ||
| }, | ||
| getUser: { | ||
| title: "Get user", | ||
| summary: "Fetch a specific user by URI", | ||
| description: "Calls `GET /users/{uuid}`. Use to look up teammates within your organization. Returns the same shape as `getCurrentUser`.", | ||
| group: "identity", | ||
| action: "read", | ||
| icon: "user-search", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call"], | ||
| idempotent: true, | ||
| since: "1.0.0", | ||
| tags: ["calendly", "user", "lookup"], | ||
| parameters: [credentialParam, userUriParam], | ||
| returnType: "object", | ||
| returnDescription: "{resource: {uri, name, email, ...}}.", | ||
| errors: commonErrors, | ||
| example: 'calendly.getUser "my_calendly" "AAAAAAAAAAAAAAAA"', | ||
| }, | ||
| getOrganization: { | ||
| title: "Get organization", | ||
| summary: "Fetch an organization by URI", | ||
| description: "Calls `GET /organizations/{uuid}`. Returns organization name, plan, and settings. Use the URI from `getCurrentUser().resource.current_organization`.", | ||
| group: "identity", | ||
| action: "read", | ||
| icon: "building", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call"], | ||
| idempotent: true, | ||
| since: "1.0.0", | ||
| tags: ["calendly", "organization", "team"], | ||
| parameters: [credentialParam, orgUriParam], | ||
| returnType: "object", | ||
| returnDescription: "{resource: {uri, name, plan, stage, created_at}}.", | ||
| errors: commonErrors, | ||
| example: 'calendly.getOrganization "my_calendly" "BBBBBBBBBBBBBBBB"', | ||
| }, | ||
| // ===================== EVENT TYPES ===================== | ||
| listEventTypes: { | ||
| title: "List event types", | ||
| summary: "Page through bookable event types", | ||
| description: "Calls `GET /event_types`. Requires a `user` OR `organization` URI as a filter. This module defaults to the current user's URI if none is supplied (performs an implicit `getCurrentUser` call first).\n\nEvent types are the meeting templates you've configured in Calendly (e.g. \"30-minute intro\", \"60-minute strategy session\"). Each has a URI, name, duration, and `scheduling_url` that invitees can book.", | ||
| group: "eventTypes", | ||
| action: "query", | ||
| icon: "list", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call"], | ||
| idempotent: true, | ||
| since: "1.0.0", | ||
| tags: ["calendly", "event-type", "list"], | ||
| parameters: [ | ||
| credentialParam, | ||
| { | ||
| name: "options", | ||
| title: "Options", | ||
| description: "Recognized keys:\n user : user URI or UUID — filter to event types owned by this user (defaults to current user)\n organization : org URI or UUID — filter to event types in this org\n active : bool — only return active (published) event types\n count : 1–100 (default 20)\n page_token : pagination cursor from previous response's `pagination.next_page_token`\n sort : e.g. 'name:asc', 'created_at:desc'", | ||
| dataType: "object", | ||
| formInputType: "json", | ||
| required: false, | ||
| allowExpression: true, | ||
| language: "json", | ||
| rows: 6, | ||
| advanced: true, | ||
| }, | ||
| ], | ||
| returnType: "object", | ||
| returnDescription: "{collection: [{uri, name, slug, duration, active, scheduling_url, ...}], pagination: {next_page_token?}}.", | ||
| errors: commonErrors, | ||
| examples: [ | ||
| { title: "Current user", code: 'calendly.listEventTypes "my_calendly"' }, | ||
| { | ||
| title: "Org-wide", | ||
| code: 'calendly.listEventTypes "my_calendly" {organization: "BBBBBBBBBBBBBBBB", active: true, count: 100}', | ||
| }, | ||
| ], | ||
| example: 'calendly.listEventTypes "my_calendly"', | ||
| }, | ||
| getEventType: { | ||
| title: "Get event type", | ||
| summary: "Fetch a single event type by URI", | ||
| description: "Calls `GET /event_types/{uuid}`. Returns detailed metadata including custom questions, location options, and booking rules.", | ||
| group: "eventTypes", | ||
| action: "read", | ||
| icon: "calendar", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call"], | ||
| idempotent: true, | ||
| since: "1.0.0", | ||
| tags: ["calendly", "event-type", "lookup"], | ||
| parameters: [credentialParam, eventTypeUriParam], | ||
| returnType: "object", | ||
| returnDescription: "{resource: {uri, name, duration, scheduling_url, custom_questions, ...}}.", | ||
| errors: commonErrors, | ||
| example: 'calendly.getEventType "my_calendly" "CCCCCCCCCCCCCCCC"', | ||
| }, | ||
| // ===================== SCHEDULED EVENTS ===================== | ||
| listScheduledEvents: { | ||
| title: "List scheduled events", | ||
| summary: "Page through booked meetings", | ||
| description: "Calls `GET /scheduled_events`. Requires a `user` OR `organization` URI (defaults to current user).\n\nFilter by status (`active` = upcoming or completed; `canceled` = canceled), date range (`min_start_time` / `max_start_time`), and invitee email. Results are paginated via `page_token`.", | ||
| group: "events", | ||
| action: "query", | ||
| icon: "calendar-clock", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call"], | ||
| idempotent: true, | ||
| since: "1.0.0", | ||
| tags: ["calendly", "event", "scheduled", "booking", "list"], | ||
| parameters: [ | ||
| credentialParam, | ||
| { | ||
| name: "options", | ||
| title: "Options", | ||
| description: "Recognized keys:\n user : user URI or UUID (defaults to current user)\n organization : org URI or UUID — mutually exclusive with `user`\n invitee_email : filter to events booked by this email\n status : 'active' | 'canceled'\n min_start_time : ISO 8601 (e.g. '2026-04-01T00:00:00Z')\n max_start_time : ISO 8601\n count : 1–100 (default 20)\n page_token : pagination cursor\n sort : 'start_time:asc' (default) | 'start_time:desc'", | ||
| dataType: "object", | ||
| formInputType: "json", | ||
| required: false, | ||
| allowExpression: true, | ||
| language: "json", | ||
| rows: 7, | ||
| advanced: true, | ||
| }, | ||
| ], | ||
| returnType: "object", | ||
| returnDescription: "{collection: [{uri, name, status, start_time, end_time, event_type, location, ...}], pagination: {next_page_token?}}.", | ||
| errors: commonErrors, | ||
| examples: [ | ||
| { | ||
| title: "Upcoming only", | ||
| code: 'calendly.listScheduledEvents "my_calendly" {status: "active", min_start_time: "2026-04-18T00:00:00Z"}', | ||
| }, | ||
| { | ||
| title: "Invitee's bookings", | ||
| code: 'calendly.listScheduledEvents "my_calendly" {invitee_email: "ada@example.com"}', | ||
| }, | ||
| ], | ||
| example: 'calendly.listScheduledEvents "my_calendly" {count: 20, status: "active"}', | ||
| }, | ||
| getScheduledEvent: { | ||
| title: "Get scheduled event", | ||
| summary: "Fetch a single booking by URI", | ||
| description: "Calls `GET /scheduled_events/{uuid}`. Returns full event details including event memberships (hosts), location, and event type reference.", | ||
| group: "events", | ||
| action: "read", | ||
| icon: "calendar-check", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call"], | ||
| idempotent: true, | ||
| since: "1.0.0", | ||
| tags: ["calendly", "event", "scheduled", "lookup"], | ||
| parameters: [credentialParam, eventUriParam], | ||
| returnType: "object", | ||
| returnDescription: "{resource: {uri, name, status, start_time, end_time, event_type, event_memberships: [], location, ...}}.", | ||
| errors: commonErrors, | ||
| example: 'calendly.getScheduledEvent "my_calendly" "DDDDDDDDDDDDDDDD"', | ||
| }, | ||
| cancelScheduledEvent: { | ||
| title: "Cancel scheduled event", | ||
| summary: "Cancel a booking with an optional reason", | ||
| description: 'Calls `POST /scheduled_events/{uuid}/cancellation`. Calendly notifies the invitee by email and records the cancellation reason on the event. The event is not deleted — it remains with `status: "canceled"` and a populated `cancellation` object.', | ||
| group: "events", | ||
| action: "write", | ||
| icon: "calendar-x", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call", "notifies_user", "destructive"], | ||
| idempotent: true, | ||
| since: "1.0.0", | ||
| tags: ["calendly", "event", "cancel"], | ||
| parameters: [ | ||
| credentialParam, | ||
| eventUriParam, | ||
| { | ||
| name: "reason", | ||
| title: "Reason", | ||
| description: "Cancellation reason shown to the invitee in the notification email. Optional.", | ||
| dataType: "string", | ||
| formInputType: "textarea", | ||
| required: false, | ||
| allowExpression: true, | ||
| rows: 3, | ||
| placeholder: "Something urgent came up — please rebook at your convenience.", | ||
| }, | ||
| ], | ||
| returnType: "object", | ||
| returnDescription: "{resource: {cancellation: {canceled_by, reason, canceler_type, created_at}}}.", | ||
| errors: commonErrors, | ||
| example: 'calendly.cancelScheduledEvent "my_calendly" "DDDDDDDDDDDDDDDD" "Rescheduling"', | ||
| }, | ||
| // ===================== INVITEES ===================== | ||
| listInvitees: { | ||
| title: "List invitees", | ||
| summary: "List the people who booked a scheduled event", | ||
| description: "Calls `GET /scheduled_events/{uuid}/invitees`. Most event types are 1-on-1 (one invitee) but group events can have many. Each invitee has an email, name, timezone, cancellation status, custom question answers, and — if the booking came through tracking parameters — `tracking.utm_source` etc.", | ||
| group: "invitees", | ||
| action: "query", | ||
| icon: "users", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call"], | ||
| idempotent: true, | ||
| since: "1.0.0", | ||
| tags: ["calendly", "invitee", "list"], | ||
| parameters: [ | ||
| credentialParam, | ||
| eventUriParam, | ||
| { | ||
| name: "options", | ||
| title: "Options", | ||
| description: "Recognized keys:\n email : filter to a specific invitee email\n status : 'active' | 'canceled'\n count : 1–100 (default 20)\n page_token : pagination cursor\n sort : 'created_at:asc' | 'created_at:desc'", | ||
| dataType: "object", | ||
| formInputType: "json", | ||
| required: false, | ||
| allowExpression: true, | ||
| language: "json", | ||
| rows: 5, | ||
| advanced: true, | ||
| }, | ||
| ], | ||
| returnType: "object", | ||
| returnDescription: "{collection: [{uri, email, name, status, timezone, questions_and_answers: [], tracking: {}, ...}], pagination: {next_page_token?}}.", | ||
| errors: commonErrors, | ||
| example: 'calendly.listInvitees "my_calendly" "DDDDDDDDDDDDDDDD"', | ||
| }, | ||
| getInvitee: { | ||
| title: "Get invitee", | ||
| summary: "Fetch a single invitee by URI", | ||
| description: "Calls `GET /scheduled_events/{event_uuid}/invitees/{invitee_uuid}`. Accepts the full invitee URI (which encodes both UUIDs) OR `event_uuid:invitee_uuid` as a shorthand. Use the full URI from `listInvitees` or the `payload.invitee.uri` in a webhook.", | ||
| group: "invitees", | ||
| action: "read", | ||
| icon: "user", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call"], | ||
| idempotent: true, | ||
| since: "1.0.0", | ||
| tags: ["calendly", "invitee", "lookup"], | ||
| parameters: [ | ||
| credentialParam, | ||
| { | ||
| name: "inviteeUri", | ||
| title: "Invitee URI", | ||
| description: "Full invitee URI (`https://api.calendly.com/scheduled_events/EVT/invitees/INV`). Since an invitee is nested under an event, a bare UUID alone is not enough — pass the full URI.", | ||
| dataType: "string", | ||
| formInputType: "text", | ||
| required: true, | ||
| allowExpression: true, | ||
| placeholder: "https://api.calendly.com/scheduled_events/DDDDDDDDDDDDDDDD/invitees/EEEEEEEEEEEEEEEE", | ||
| }, | ||
| ], | ||
| returnType: "object", | ||
| returnDescription: "{resource: {uri, email, name, status, questions_and_answers, tracking, payment, ...}}.", | ||
| errors: commonErrors, | ||
| example: 'calendly.getInvitee "my_calendly" "https://api.calendly.com/scheduled_events/DDDD/invitees/EEEE"', | ||
| }, | ||
| // ===================== SCHEDULING LINKS ===================== | ||
| createSchedulingLink: { | ||
| title: "Create scheduling link", | ||
| summary: "Generate a single-use booking URL for an event type", | ||
| description: "Calls `POST /scheduling_links`. Produces a personalized, single-use (or limited-use) scheduling URL that can only be used `maxEventCount` times. Perfect for:\n - Outbound emails (\"here's a link to book time with me\")\n - Post-purchase onboarding calls\n - Customer support escalations\n\nThe link targets a specific event type; once booked, it becomes invalid (unless `maxEventCount` > 1).", | ||
| group: "links", | ||
| action: "write", | ||
| icon: "link", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call"], | ||
| idempotent: false, | ||
| since: "1.0.0", | ||
| tags: ["calendly", "scheduling-link", "booking", "single-use"], | ||
| parameters: [ | ||
| credentialParam, | ||
| eventTypeUriParam, | ||
| { | ||
| name: "options", | ||
| title: "Options", | ||
| description: "Recognized keys:\n maxEventCount : int — how many bookings this link permits (default 1; max typically 1000)\n owner : owner URI — defaults to the event type URI itself (which is what the API requires)\n ownerType : 'EventType' (default) — reserved for future types", | ||
| dataType: "object", | ||
| formInputType: "json", | ||
| required: false, | ||
| allowExpression: true, | ||
| language: "json", | ||
| rows: 4, | ||
| advanced: true, | ||
| }, | ||
| ], | ||
| returnType: "object", | ||
| returnDescription: "{resource: {booking_url, owner, owner_type}}. Email `booking_url` to your invitee.", | ||
| errors: commonErrors, | ||
| examples: [ | ||
| { | ||
| title: "One-shot link after a form submit", | ||
| code: 'let link = calendly.createSchedulingLink "my_calendly" "CCCCCCCCCCCCCCCC"\nemail.send {{ form.email }} "Book your call" "Pick a time: " + link.resource.booking_url', | ||
| }, | ||
| { | ||
| title: "Multi-use link for a campaign", | ||
| code: 'calendly.createSchedulingLink "my_calendly" "CCCCCCCCCCCCCCCC" {maxEventCount: 50}', | ||
| }, | ||
| ], | ||
| example: 'calendly.createSchedulingLink "my_calendly" "CCCCCCCCCCCCCCCC"', | ||
| }, | ||
| // ===================== WEBHOOKS ===================== | ||
| listWebhookSubscriptions: { | ||
| title: "List webhook subscriptions", | ||
| summary: "Show current webhook subscriptions for a user or org", | ||
| description: "Calls `GET /webhook_subscriptions`. Requires a `scope` ('user' or 'organization') plus the corresponding URI. Returns the active subscriptions including their callback URLs and which events they fire on.", | ||
| group: "webhooks", | ||
| action: "query", | ||
| icon: "webhook", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call"], | ||
| idempotent: true, | ||
| since: "1.0.0", | ||
| tags: ["calendly", "webhook", "list"], | ||
| parameters: [ | ||
| credentialParam, | ||
| { | ||
| name: "options", | ||
| title: "Options", | ||
| description: "Recognized keys:\n scope : 'user' (default) | 'organization'\n user : user URI or UUID — required if scope=user (defaults to current user)\n organization : org URI or UUID — required if scope=organization\n count : 1–100 (default 20)\n page_token : pagination cursor\n sort : 'created_at:asc' | 'created_at:desc'", | ||
| dataType: "object", | ||
| formInputType: "json", | ||
| required: false, | ||
| allowExpression: true, | ||
| language: "json", | ||
| rows: 6, | ||
| advanced: true, | ||
| }, | ||
| ], | ||
| returnType: "object", | ||
| returnDescription: "{collection: [{uri, callback_url, events, scope, state, creator, ...}], pagination: {next_page_token?}}.", | ||
| errors: commonErrors, | ||
| example: 'calendly.listWebhookSubscriptions "my_calendly"', | ||
| }, | ||
| createWebhookSubscription: { | ||
| title: "Create webhook subscription", | ||
| summary: "Subscribe to booking events with a callback URL", | ||
| description: "Calls `POST /webhook_subscriptions`. Calendly will `POST` a JSON payload to your `callbackUrl` every time one of the subscribed events fires.\n\nSupported events:\n - `invitee.created` — a new booking was made\n - `invitee.canceled` — a booking was canceled\n - `routing_form_submission.created` — a routing-form submission arrived\n\nFor signature verification, provide a `signingKey`; Calendly signs each payload with HMAC-SHA256 and sends the signature in the `Calendly-Webhook-Signature` header.", | ||
| group: "webhooks", | ||
| action: "write", | ||
| icon: "webhook", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call"], | ||
| idempotent: false, | ||
| since: "1.0.0", | ||
| tags: ["calendly", "webhook", "create", "subscription"], | ||
| parameters: [ | ||
| credentialParam, | ||
| { | ||
| name: "callbackUrl", | ||
| title: "Callback URL", | ||
| description: "HTTPS URL that Calendly will POST event payloads to. Must be publicly reachable.", | ||
| dataType: "string", | ||
| formInputType: "text", | ||
| required: true, | ||
| allowExpression: true, | ||
| placeholder: "https://example.com/webhooks/calendly", | ||
| }, | ||
| { | ||
| name: "events", | ||
| title: "Events", | ||
| description: "Array of event names to subscribe to. Supported: `invitee.created`, `invitee.canceled`, `routing_form_submission.created`.", | ||
| dataType: "array", | ||
| formInputType: "json", | ||
| required: true, | ||
| allowExpression: true, | ||
| language: "json", | ||
| rows: 3, | ||
| placeholder: '["invitee.created", "invitee.canceled"]', | ||
| }, | ||
| { | ||
| name: "options", | ||
| title: "Options", | ||
| description: "Recognized keys:\n scope : 'user' (default) | 'organization'\n user : user URI or UUID — required if scope=user (defaults to current user)\n organization : org URI or UUID — required — webhooks always need an organization URI per Calendly API\n signingKey : shared secret for HMAC-SHA256 signature verification\n", | ||
| dataType: "object", | ||
| formInputType: "json", | ||
| required: false, | ||
| allowExpression: true, | ||
| language: "json", | ||
| rows: 5, | ||
| advanced: true, | ||
| }, | ||
| ], | ||
| returnType: "object", | ||
| returnDescription: "{resource: {uri, callback_url, events, scope, state, creator, ...}}. Save the `uri` to delete later.", | ||
| errors: commonErrors, | ||
| examples: [ | ||
| { | ||
| title: "Subscribe to new bookings", | ||
| code: 'calendly.createWebhookSubscription "my_calendly" "https://example.com/hooks/calendly" ["invitee.created", "invitee.canceled"] {organization: "BBBBBBBBBBBBBBBB", signingKey: "shhh-secret"}', | ||
| }, | ||
| ], | ||
| example: 'calendly.createWebhookSubscription "my_calendly" "https://example.com/hook" ["invitee.created"] {organization: "BBBB"}', | ||
| }, | ||
| deleteWebhookSubscription: { | ||
| title: "Delete webhook subscription", | ||
| summary: "Unsubscribe a webhook by URI", | ||
| description: "Calls `DELETE /webhook_subscriptions/{uuid}`. Idempotent — deleting an already-deleted subscription returns `{ok: true}`.", | ||
| group: "webhooks", | ||
| action: "delete", | ||
| icon: "trash-2", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call", "destructive"], | ||
| idempotent: true, | ||
| since: "1.0.0", | ||
| tags: ["calendly", "webhook", "delete"], | ||
| parameters: [ | ||
| credentialParam, | ||
| { | ||
| name: "webhookUri", | ||
| title: "Webhook URI or UUID", | ||
| description: "Full webhook-subscription URI or bare UUID.", | ||
| dataType: "string", | ||
| formInputType: "text", | ||
| required: true, | ||
| allowExpression: true, | ||
| placeholder: "FFFFFFFFFFFFFFFF", | ||
| }, | ||
| ], | ||
| returnType: "object", | ||
| returnDescription: "{ok: true} on success.", | ||
| errors: commonErrors, | ||
| example: 'calendly.deleteWebhookSubscription "my_calendly" "FFFFFFFFFFFFFFFF"', | ||
| }, | ||
| }; | ||
| // ── Exports: module metadata ─────────────────────────────────────────── | ||
| export const CalendlyModuleMetadata = { | ||
| slug: "calendly", | ||
| title: "Calendly", | ||
| summary: "Event types, scheduled events, invitees, scheduling links, and webhooks — automate your Calendly workflows", | ||
| description: "Read event types and bookings, generate single-use scheduling links for personalized outreach, cancel appointments, and subscribe to webhook events (invitee.created, invitee.canceled) to trigger RobinPath automations the moment someone books time with you.\n\nAuthenticated with a **Personal Access Token** (Professional plan and above) or an OAuth 2.0 access token. Store it as a `calendly` credential and pass the slug as the first argument to every method.\n\n**URI vs UUID.** Calendly resources are identified by URI (e.g. `https://api.calendly.com/users/AAAAAAAAAAAAAAAA`). Every `*Uri` parameter in this module accepts either the full URI or the bare UUID — the module upgrades bare UUIDs internally based on the parameter name.", | ||
| category: "productivity", | ||
| icon: "icon.svg", | ||
| color: "#006BFF", | ||
| version: "0.2.0", | ||
| docsUrl: "https://docs.robinpath.com/modules/calendly", | ||
| status: "stable", | ||
| requires: [], | ||
| minNodeVersion: "18.0.0", | ||
| credentialsType: CREDENTIAL_TYPE, | ||
| operationGroups: { | ||
| identity: { | ||
| title: "Identity", | ||
| description: "Current user, teammates, and organizations.", | ||
| order: 1, | ||
| }, | ||
| eventTypes: { | ||
| title: "Event Types", | ||
| description: "Bookable meeting templates.", | ||
| order: 2, | ||
| }, | ||
| events: { | ||
| title: "Scheduled Events", | ||
| description: "Past and upcoming booked meetings.", | ||
| order: 3, | ||
| }, | ||
| invitees: { | ||
| title: "Invitees", | ||
| description: "The people who booked a scheduled event.", | ||
| order: 4, | ||
| }, | ||
| links: { | ||
| title: "Scheduling Links", | ||
| description: "Single-use booking URLs for personalized outreach.", | ||
| order: 5, | ||
| }, | ||
| webhooks: { | ||
| title: "Webhooks", | ||
| description: "Subscribe to booking events in real time.", | ||
| order: 6, | ||
| }, | ||
| }, | ||
| methods: Object.keys(CalendlyFunctions), | ||
| }; | ||
| //# sourceMappingURL=calendly.js.map |
| {"version":3,"file":"calendly.js","sourceRoot":"","sources":["../src/calendly.ts"],"names":[],"mappings":"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"} |
| import type { ModuleAdapter } from "@robinpath/core"; | ||
| declare const CalendlyModule: ModuleAdapter; | ||
| export default CalendlyModule; | ||
| export { CalendlyModule }; | ||
| export { CalendlyFunctions, CalendlyFunctionMetadata, CalendlyModuleMetadata, CalendlyCredentialTypes, } from "./calendly.js"; | ||
| //# sourceMappingURL=index.d.ts.map |
| {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AASrD,QAAA,MAAM,cAAc,EAAE,aAQrB,CAAC;AAEF,eAAe,cAAc,CAAC;AAC9B,OAAO,EAAE,cAAc,EAAE,CAAC;AAC1B,OAAO,EACL,iBAAiB,EACjB,wBAAwB,EACxB,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,eAAe,CAAC"} |
| import { CalendlyFunctions, CalendlyFunctionMetadata, CalendlyModuleMetadata, CalendlyCredentialTypes, configureCalendly, } from "./calendly.js"; | ||
| const CalendlyModule = { | ||
| name: "calendly", | ||
| functions: CalendlyFunctions, | ||
| functionMetadata: CalendlyFunctionMetadata, | ||
| moduleMetadata: CalendlyModuleMetadata, | ||
| credentialTypes: CalendlyCredentialTypes, | ||
| configure: configureCalendly, | ||
| global: false, | ||
| }; | ||
| export default CalendlyModule; | ||
| export { CalendlyModule }; | ||
| export { CalendlyFunctions, CalendlyFunctionMetadata, CalendlyModuleMetadata, CalendlyCredentialTypes, } from "./calendly.js"; | ||
| //# sourceMappingURL=index.js.map |
| {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,iBAAiB,EACjB,wBAAwB,EACxB,sBAAsB,EACtB,uBAAuB,EACvB,iBAAiB,GAClB,MAAM,eAAe,CAAC;AAEvB,MAAM,cAAc,GAAkB;IACpC,IAAI,EAAE,UAAU;IAChB,SAAS,EAAE,iBAAiB;IAC5B,gBAAgB,EAAE,wBAAwB;IAC1C,cAAc,EAAE,sBAAsB;IACtC,eAAe,EAAE,uBAAuB;IACxC,SAAS,EAAE,iBAAiB;IAC5B,MAAM,EAAE,KAAK;CACd,CAAC;AAEF,eAAe,cAAc,CAAC;AAC9B,OAAO,EAAE,cAAc,EAAE,CAAC;AAC1B,OAAO,EACL,iBAAiB,EACjB,wBAAwB,EACxB,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,eAAe,CAAC"} |
+21
-8
| { | ||
| "name": "@robinpath/calendly", | ||
| "version": "0.1.2", | ||
| "version": "0.3.0", | ||
| "publishConfig": { | ||
@@ -23,12 +23,19 @@ "access": "public" | ||
| "peerDependencies": { | ||
| "@robinpath/core": ">=0.20.0" | ||
| "@robinpath/core": ">=0.40.0" | ||
| }, | ||
| "devDependencies": { | ||
| "@robinpath/core": "^0.30.1", | ||
| "@robinpath/core": "^0.40.0", | ||
| "typescript": "^5.6.0" | ||
| }, | ||
| "description": "Calendly module for RobinPath.", | ||
| "description": "Calendly API v2 — event types, scheduled events, invitees, single-use scheduling links, and webhook subscriptions. Uses the encrypted credential vault for Personal Access Tokens or OAuth access tokens.", | ||
| "keywords": [ | ||
| "calendly", | ||
| "utility" | ||
| "utility", | ||
| "scheduling", | ||
| "calendar", | ||
| "meetings", | ||
| "booking", | ||
| "appointments", | ||
| "events", | ||
| "productivity" | ||
| ], | ||
@@ -38,7 +45,13 @@ "license": "MIT", | ||
| "category": "utility", | ||
| "type": "utility", | ||
| "auth": "api-key", | ||
| "type": "module", | ||
| "auth": "credential-vault", | ||
| "functionCount": 13, | ||
| "baseUrl": "https://api.calendly.com" | ||
| "baseUrl": "https://api.calendly.com", | ||
| "language": "nodejs", | ||
| "platforms": [ | ||
| "cloud", | ||
| "cli", | ||
| "desktop" | ||
| ] | ||
| } | ||
| } |
+1
-1
@@ -22,3 +22,3 @@ # @robinpath/calendly | ||
| ```bash | ||
| npm install @robinpath/calendly | ||
| robinpath add @robinpath/calendly | ||
| ``` | ||
@@ -25,0 +25,0 @@ |
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
Network access
Supply chain riskThis module accesses the network.
Found 1 instance in 1 package
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Found 1 instance in 1 package
Empty package
Supply chain riskPackage does not contain any code. It may be removed, is name squatting, or the result of a faulty package publish.
Found 1 instance in 1 package
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
88040
2600.61%10
400%1161
Infinity%2
100%