@robinpath/zoho
Advanced tools
| import type { ModuleAdapter } from "@robinpath/core"; | ||
| declare const ZohoModule: ModuleAdapter; | ||
| export default ZohoModule; | ||
| export { ZohoModule }; | ||
| export { ZohoFunctions, ZohoFunctionMetadata, ZohoModuleMetadata, ZohoCredentialTypes, } from "./zoho.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,UAAU,EAAE,aAQjB,CAAC;AAEF,eAAe,UAAU,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,CAAC;AACtB,OAAO,EACL,aAAa,EACb,oBAAoB,EACpB,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,WAAW,CAAC"} |
| import { ZohoFunctions, ZohoFunctionMetadata, ZohoModuleMetadata, ZohoCredentialTypes, configureZoho, } from "./zoho.js"; | ||
| const ZohoModule = { | ||
| name: "zoho", | ||
| functions: ZohoFunctions, | ||
| functionMetadata: ZohoFunctionMetadata, | ||
| moduleMetadata: ZohoModuleMetadata, | ||
| credentialTypes: ZohoCredentialTypes, | ||
| configure: configureZoho, | ||
| global: false, | ||
| }; | ||
| export default ZohoModule; | ||
| export { ZohoModule }; | ||
| export { ZohoFunctions, ZohoFunctionMetadata, ZohoModuleMetadata, ZohoCredentialTypes, } from "./zoho.js"; | ||
| //# sourceMappingURL=index.js.map |
| {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,aAAa,EACb,oBAAoB,EACpB,kBAAkB,EAClB,mBAAmB,EACnB,aAAa,GACd,MAAM,WAAW,CAAC;AAEnB,MAAM,UAAU,GAAkB;IAChC,IAAI,EAAE,MAAM;IACZ,SAAS,EAAE,aAAa;IACxB,gBAAgB,EAAE,oBAAoB;IACtC,cAAc,EAAE,kBAAkB;IAClC,eAAe,EAAE,mBAAmB;IACpC,SAAS,EAAE,aAAa;IACxB,MAAM,EAAE,KAAK;CACd,CAAC;AAEF,eAAe,UAAU,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,CAAC;AACtB,OAAO,EACL,aAAa,EACb,oBAAoB,EACpB,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,WAAW,CAAC"} |
| /** | ||
| * RobinPath Zoho CRM Module (Node port) | ||
| * | ||
| * Zoho CRM API v2 — modules, records. Mirror of the canonical | ||
| * credential-vault adapter shape so the visual editor renders it | ||
| * identically to every other module. | ||
| * | ||
| * Authentication is OAuth 2.0 with per-region data centers. The stored | ||
| * credential carries `client_id`, `client_secret`, `access_token`, | ||
| * `refresh_token`, and an optional `api_domain` that pins the regional | ||
| * base. Zoho's consent flow returns both `api_domain` | ||
| * (e.g. `https://www.zohoapis.com` for US, `https://www.zohoapis.eu` | ||
| * for EU) and `accounts-server` URLs; if `api_domain` is present the | ||
| * module uses it verbatim for every API call AND for refresh | ||
| * (`<api_domain>/oauth/v2/token`). Without it, we fall back to the | ||
| * global `zohoapis.com` + `accounts.zoho.com`. | ||
| * | ||
| * On 401 the module posts to `<api_domain>/oauth/v2/token` and writes | ||
| * the rotated access token back to the vault before retrying once. | ||
| * Zoho does NOT rotate refresh tokens on refresh. | ||
| * | ||
| * Credential type declared by this module: | ||
| * - zoho : { client_id, client_secret, access_token, refresh_token, api_domain? } | ||
| */ | ||
| import type { BuiltinHandler, CredentialTypeSchema, FunctionMetadata, ModuleHost, ModuleMetadata } from "@robinpath/core"; | ||
| export declare function configureZoho(h: ModuleHost): void; | ||
| export declare const ZohoFunctions: Record<string, BuiltinHandler>; | ||
| export declare const ZohoCredentialTypes: CredentialTypeSchema[]; | ||
| export declare const ZohoFunctionMetadata: Record<string, FunctionMetadata>; | ||
| export declare const ZohoModuleMetadata: ModuleMetadata; | ||
| //# sourceMappingURL=zoho.d.ts.map |
| {"version":3,"file":"zoho.d.ts","sourceRoot":"","sources":["../src/zoho.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,EACV,cAAc,EACd,oBAAoB,EACpB,gBAAgB,EAChB,UAAU,EACV,cAAc,EAEf,MAAM,iBAAiB,CAAC;AAezB,wBAAgB,aAAa,CAAC,CAAC,EAAE,UAAU,GAAG,IAAI,CAEjD;AAgbD,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAKxD,CAAC;AAIF,eAAO,MAAM,mBAAmB,EAAE,oBAAoB,EAoDrD,CAAC;AAsDF,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CA6IjE,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,cAqBhC,CAAC"} |
+593
| /** | ||
| * RobinPath Zoho CRM Module (Node port) | ||
| * | ||
| * Zoho CRM API v2 — modules, records. Mirror of the canonical | ||
| * credential-vault adapter shape so the visual editor renders it | ||
| * identically to every other module. | ||
| * | ||
| * Authentication is OAuth 2.0 with per-region data centers. The stored | ||
| * credential carries `client_id`, `client_secret`, `access_token`, | ||
| * `refresh_token`, and an optional `api_domain` that pins the regional | ||
| * base. Zoho's consent flow returns both `api_domain` | ||
| * (e.g. `https://www.zohoapis.com` for US, `https://www.zohoapis.eu` | ||
| * for EU) and `accounts-server` URLs; if `api_domain` is present the | ||
| * module uses it verbatim for every API call AND for refresh | ||
| * (`<api_domain>/oauth/v2/token`). Without it, we fall back to the | ||
| * global `zohoapis.com` + `accounts.zoho.com`. | ||
| * | ||
| * On 401 the module posts to `<api_domain>/oauth/v2/token` and writes | ||
| * the rotated access token back to the vault before retrying once. | ||
| * Zoho does NOT rotate refresh tokens on refresh. | ||
| * | ||
| * Credential type declared by this module: | ||
| * - zoho : { client_id, client_secret, access_token, refresh_token, api_domain? } | ||
| */ | ||
| // ── Module-local state (populated by configure hook) ──────────────────── | ||
| const state = {}; | ||
| function host() { | ||
| if (!state.host) { | ||
| throw new Error("Zoho module not initialized. Pass the adapter to rp.installModule() so its configure() hook runs first."); | ||
| } | ||
| return state.host; | ||
| } | ||
| export function configureZoho(h) { | ||
| state.host = h; | ||
| } | ||
| // ── Constants ────────────────────────────────────────────────────────── | ||
| const DEFAULT_API_DOMAIN = "https://www.zohoapis.com"; | ||
| const API_PATH = "/crm/v2/"; | ||
| const CREDENTIAL_TYPE = "zoho"; | ||
| function errorReturn(error, code, extra = {}) { | ||
| return { error, code, ...extra }; | ||
| } | ||
| function isErr(x) { | ||
| return (typeof x === "object" && | ||
| x !== null && | ||
| "error" in x && | ||
| "code" in x); | ||
| } | ||
| async function readCredential(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"); | ||
| } | ||
| return fields; | ||
| } | ||
| function requireCredentialFields(slug, fields) { | ||
| const clientId = String(fields.client_id ?? ""); | ||
| const clientSecret = String(fields.client_secret ?? ""); | ||
| const accessToken = String(fields.access_token ?? ""); | ||
| const refreshToken = String(fields.refresh_token ?? ""); | ||
| const rawDomain = String(fields.api_domain ?? "").trim(); | ||
| const apiDomain = rawDomain !== "" ? rawDomain.replace(/\/+$/, "") : DEFAULT_API_DOMAIN; | ||
| if (!clientId) { | ||
| return errorReturn("Credential has no `client_id` field.", "client_id_missing"); | ||
| } | ||
| if (!clientSecret) { | ||
| return errorReturn("Credential has no `client_secret` field.", "client_secret_missing"); | ||
| } | ||
| if (!accessToken) { | ||
| return errorReturn("Credential has no `access_token` field.", "access_token_missing"); | ||
| } | ||
| if (!refreshToken) { | ||
| return errorReturn("Credential has no `refresh_token` field.", "refresh_token_missing"); | ||
| } | ||
| return { | ||
| slug, | ||
| clientId, | ||
| clientSecret, | ||
| accessToken, | ||
| refreshToken, | ||
| apiDomain, | ||
| }; | ||
| } | ||
| async function persistTokens(slug, fields, patch) { | ||
| try { | ||
| await host().credentials.set(slug, CREDENTIAL_TYPE, { ...fields, ...patch }); | ||
| } | ||
| catch { | ||
| // Best-effort. | ||
| } | ||
| } | ||
| // ── OAuth token refresh ──────────────────────────────────────────────── | ||
| async function refreshAccessToken(resolved, originalFields) { | ||
| const body = new URLSearchParams(); | ||
| body.set("grant_type", "refresh_token"); | ||
| body.set("refresh_token", resolved.refreshToken); | ||
| body.set("client_id", resolved.clientId); | ||
| body.set("client_secret", resolved.clientSecret); | ||
| // Zoho refresh lives at <api_domain>/oauth/v2/token — same regional root. | ||
| const tokenUrl = `${resolved.apiDomain}/oauth/v2/token`; | ||
| let response; | ||
| try { | ||
| response = await fetch(tokenUrl, { | ||
| method: "POST", | ||
| headers: { | ||
| "Content-Type": "application/x-www-form-urlencoded", | ||
| Accept: "application/json", | ||
| }, | ||
| body: body.toString(), | ||
| }); | ||
| } | ||
| catch (e) { | ||
| return errorReturn(e instanceof Error ? e.message : String(e), "transport"); | ||
| } | ||
| const raw = await response.text(); | ||
| let decoded; | ||
| try { | ||
| decoded = raw ? JSON.parse(raw) : null; | ||
| } | ||
| catch { | ||
| decoded = { raw }; | ||
| } | ||
| if (response.status < 200 || response.status >= 300) { | ||
| return errorReturn("Zoho refused the refresh token — re-authorize the connection.", "refresh_failed", { status: response.status, zoho_error: decoded }); | ||
| } | ||
| const tok = (decoded ?? {}); | ||
| const newAccess = String(tok.access_token ?? ""); | ||
| // Zoho does NOT rotate refresh tokens; keep the existing one. | ||
| if (!newAccess) { | ||
| return errorReturn("Refresh response had no `access_token`.", "refresh_failed", { zoho_error: decoded }); | ||
| } | ||
| // Zoho may echo `api_domain` — honor it if present. | ||
| const returnedDomain = String(tok.api_domain ?? "").trim(); | ||
| const newDomain = returnedDomain !== "" | ||
| ? returnedDomain.replace(/\/+$/, "") | ||
| : resolved.apiDomain; | ||
| const patch = { access_token: newAccess }; | ||
| if (returnedDomain !== "") | ||
| patch.api_domain = newDomain; | ||
| await persistTokens(resolved.slug, originalFields, patch); | ||
| return { ...resolved, accessToken: newAccess, apiDomain: newDomain }; | ||
| } | ||
| // ── HTTP helper with single-shot 401 refresh-and-retry ───────────────── | ||
| async function request(resolved, method, pathAndQuery, body) { | ||
| const url = resolved.apiDomain + API_PATH + pathAndQuery.replace(/^\/+/, ""); | ||
| const headers = { | ||
| // NOTE: Zoho uses `Zoho-oauthtoken <token>`, NOT `Bearer`. | ||
| Authorization: `Zoho-oauthtoken ${resolved.accessToken}`, | ||
| 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(url, init); | ||
| } | ||
| catch (e) { | ||
| return errorReturn(e instanceof Error ? e.message : String(e), "transport"); | ||
| } | ||
| const raw = await response.text(); | ||
| let decoded; | ||
| try { | ||
| decoded = raw ? JSON.parse(raw) : null; | ||
| } | ||
| catch { | ||
| decoded = { raw }; | ||
| } | ||
| return { status: response.status, decoded, raw }; | ||
| } | ||
| /** | ||
| * Zoho returns `INVALID_TOKEN` as a 401 body with a successful-looking | ||
| * top-level structure. Treat either a 401 status OR the sentinel code | ||
| * as "refresh needed". | ||
| */ | ||
| function isAuthError(resp) { | ||
| if (resp.status === 401) | ||
| return true; | ||
| if (resp.decoded && | ||
| typeof resp.decoded === "object" && | ||
| "code" in resp.decoded) { | ||
| const c = String(resp.decoded.code ?? ""); | ||
| if (c === "INVALID_TOKEN" || c === "AUTHENTICATION_FAILURE") | ||
| return true; | ||
| } | ||
| return false; | ||
| } | ||
| async function http(credentialSlug, method, pathAndQuery, body) { | ||
| const fields = await readCredential(credentialSlug); | ||
| if (isErr(fields)) | ||
| return fields; | ||
| let resolved = requireCredentialFields(credentialSlug, fields); | ||
| if (isErr(resolved)) | ||
| return resolved; | ||
| let originalFields = fields; | ||
| let response = await request(resolved, method, pathAndQuery, body); | ||
| if (isErr(response)) | ||
| return response; | ||
| if (isAuthError(response)) { | ||
| const refreshed = await refreshAccessToken(resolved, originalFields); | ||
| if (isErr(refreshed)) | ||
| return refreshed; | ||
| resolved = refreshed; | ||
| originalFields = { | ||
| ...originalFields, | ||
| access_token: refreshed.accessToken, | ||
| api_domain: refreshed.apiDomain, | ||
| }; | ||
| response = await request(resolved, method, pathAndQuery, body); | ||
| if (isErr(response)) | ||
| return response; | ||
| } | ||
| if (response.status >= 200 && response.status < 300) { | ||
| return response.decoded ?? { ok: true }; | ||
| } | ||
| // Zoho errors: { code, details: {...}, message, status } or { data: [{ code, message, status }] } | ||
| let message = `Zoho returned HTTP ${response.status}.`; | ||
| const d = response.decoded; | ||
| if (d && typeof d === "object") { | ||
| const obj = d; | ||
| if (typeof obj.message === "string") | ||
| message = obj.message; | ||
| else if (Array.isArray(obj.data) && obj.data.length > 0) { | ||
| const first = obj.data[0]; | ||
| if (typeof first.message === "string") | ||
| message = first.message; | ||
| } | ||
| } | ||
| let code = "zoho_error"; | ||
| if (response.status === 429) | ||
| code = "rate_limited"; | ||
| else if (response.status === 404) | ||
| code = "not_found"; | ||
| else if (response.status === 403 || response.status === 401) | ||
| code = "unauthorized"; | ||
| return errorReturn(message, code, { | ||
| status: response.status, | ||
| zoho_error: response.decoded, | ||
| }); | ||
| } | ||
| // ── Helpers ──────────────────────────────────────────────────────────── | ||
| function asString(v) { | ||
| if (v === undefined || v === null) | ||
| return ""; | ||
| return String(v); | ||
| } | ||
| function asOpts(v) { | ||
| return v && typeof v === "object" && !Array.isArray(v) | ||
| ? v | ||
| : {}; | ||
| } | ||
| function buildQuery(opts) { | ||
| const params = new URLSearchParams(); | ||
| for (const [k, v] of Object.entries(opts)) { | ||
| if (v === undefined || v === null || v === "") | ||
| continue; | ||
| if (Array.isArray(v)) { | ||
| params.set(k, v.map((x) => String(x)).join(",")); | ||
| } | ||
| else { | ||
| params.set(k, String(v)); | ||
| } | ||
| } | ||
| const qs = params.toString(); | ||
| return qs ? `?${qs}` : ""; | ||
| } | ||
| /** | ||
| * Zoho's write endpoints expect a top-level `{data: [...]}` envelope. | ||
| * Normalize single-record inputs and pass-through pre-wrapped envelopes. | ||
| */ | ||
| function buildWriteBody(input) { | ||
| if (input === undefined || input === null) { | ||
| return errorReturn("Payload is required.", "fields_missing"); | ||
| } | ||
| if (Array.isArray(input)) { | ||
| return { data: input }; | ||
| } | ||
| if (typeof input === "object") { | ||
| const obj = input; | ||
| if (Array.isArray(obj.data)) | ||
| return obj; | ||
| return { data: [obj] }; | ||
| } | ||
| return errorReturn("Payload must be an object or array.", "fields_missing"); | ||
| } | ||
| // ── Handlers: Modules (schema) ───────────────────────────────────────── | ||
| const listModules = async (args) => { | ||
| const cred = asString(args[0]); | ||
| return (await http(cred, "GET", "settings/modules")); | ||
| }; | ||
| // ── Handlers: Records ────────────────────────────────────────────────── | ||
| const listRecords = async (args) => { | ||
| const cred = asString(args[0]); | ||
| const moduleName = asString(args[1]); | ||
| const opts = asOpts(args[2]); | ||
| if (!moduleName) { | ||
| return errorReturn("`moduleName` is required (e.g. 'Leads', 'Contacts', 'Deals').", "module_missing"); | ||
| } | ||
| const path = `${encodeURIComponent(moduleName)}${buildQuery(opts)}`; | ||
| return (await http(cred, "GET", path)); | ||
| }; | ||
| const createRecord = async (args) => { | ||
| const cred = asString(args[0]); | ||
| const moduleName = asString(args[1]); | ||
| const input = args[2]; | ||
| if (!moduleName) { | ||
| return errorReturn("`moduleName` is required.", "module_missing"); | ||
| } | ||
| const body = buildWriteBody(input); | ||
| if (isErr(body)) | ||
| return body; | ||
| return (await http(cred, "POST", encodeURIComponent(moduleName), body)); | ||
| }; | ||
| const updateRecord = async (args) => { | ||
| const cred = asString(args[0]); | ||
| const moduleName = asString(args[1]); | ||
| const recordId = asString(args[2]); | ||
| const input = args[3]; | ||
| if (!moduleName) { | ||
| return errorReturn("`moduleName` is required.", "module_missing"); | ||
| } | ||
| if (!recordId) { | ||
| return errorReturn("`recordId` is required.", "record_id_missing"); | ||
| } | ||
| const body = buildWriteBody(input); | ||
| if (isErr(body)) | ||
| return body; | ||
| const path = `${encodeURIComponent(moduleName)}/${encodeURIComponent(recordId)}`; | ||
| return (await http(cred, "PUT", path, body)); | ||
| }; | ||
| // ── Exports: functions map ───────────────────────────────────────────── | ||
| export const ZohoFunctions = { | ||
| listModules, | ||
| listRecords, | ||
| createRecord, | ||
| updateRecord, | ||
| }; | ||
| // ── Exports: credential types ────────────────────────────────────────── | ||
| export const ZohoCredentialTypes = [ | ||
| { | ||
| slug: CREDENTIAL_TYPE, | ||
| title: "Zoho CRM (OAuth 2.0)", | ||
| icon: "briefcase", | ||
| fields: [ | ||
| { | ||
| name: "client_id", | ||
| title: "Client ID", | ||
| type: "text", | ||
| required: true, | ||
| placeholder: "1000.…", | ||
| description: "From your Zoho self-client or server app at api-console.zoho.com.", | ||
| }, | ||
| { | ||
| name: "client_secret", | ||
| title: "Client Secret", | ||
| type: "password", | ||
| required: true, | ||
| placeholder: "•••••…", | ||
| description: "Paired secret for the client id above.", | ||
| }, | ||
| { | ||
| name: "access_token", | ||
| title: "Access Token", | ||
| type: "password", | ||
| required: true, | ||
| placeholder: "1000.…", | ||
| description: "Short-lived bearer token (~1 hour). Obtained via the Zoho OAuth consent flow. The module refreshes this automatically on 401.", | ||
| }, | ||
| { | ||
| name: "refresh_token", | ||
| title: "Refresh Token", | ||
| type: "password", | ||
| required: true, | ||
| placeholder: "1000.…", | ||
| description: "Long-lived refresh token from the same consent flow. Zoho does NOT rotate it on refresh.", | ||
| }, | ||
| { | ||
| name: "api_domain", | ||
| title: "API Domain", | ||
| type: "text", | ||
| required: false, | ||
| placeholder: "https://www.zohoapis.com", | ||
| description: "Regional data center root. Returned by the OAuth flow as `api_domain` (e.g. `https://www.zohoapis.com` for US, `.eu` for EU, `.in` for India, `.com.cn` for China, `.com.au` for AU). Defaults to the US root.", | ||
| }, | ||
| ], | ||
| }, | ||
| ]; | ||
| // ── Exports: metadata ────────────────────────────────────────────────── | ||
| const credentialParam = { | ||
| name: "credential", | ||
| title: "Credential", | ||
| description: "Slug of a saved `zoho` credential (OAuth client + tokens).", | ||
| dataType: "string", | ||
| formInputType: "resource", | ||
| required: true, | ||
| allowExpression: true, | ||
| placeholder: "my_zoho", | ||
| resource: { | ||
| type: "credential", | ||
| listFn: "credential.list", | ||
| modes: ["list", "expression"], | ||
| searchable: true, | ||
| filter: { type: CREDENTIAL_TYPE }, | ||
| }, | ||
| }; | ||
| const moduleNameParam = { | ||
| name: "moduleName", | ||
| title: "Module", | ||
| description: "Zoho module API name. Built-ins: Leads, Contacts, Accounts, Deals, Tasks, Events, Calls, Products, Quotes, Invoices, Vendors. Custom modules use their API Name from Setup → Developer Space.", | ||
| dataType: "string", | ||
| formInputType: "text", | ||
| required: true, | ||
| allowExpression: true, | ||
| placeholder: "Leads", | ||
| }; | ||
| const commonErrors = { | ||
| credential_not_found: "No credential with that slug exists in the vault.", | ||
| client_id_missing: "The credential exists but has no `client_id` field.", | ||
| client_secret_missing: "The credential exists but has no `client_secret` field.", | ||
| access_token_missing: "The credential exists but has no `access_token` field.", | ||
| refresh_token_missing: "The credential exists but has no `refresh_token` field.", | ||
| module_missing: "`moduleName` is required.", | ||
| record_id_missing: "`recordId` is required.", | ||
| refresh_failed: "Refresh token rejected — run the Zoho OAuth consent flow again to mint a fresh pair.", | ||
| fields_missing: "Payload is required.", | ||
| transport: "Network failure calling the Zoho API domain.", | ||
| zoho_error: "Zoho returned an error — see `zoho_error` for detail.", | ||
| rate_limited: "Zoho rate limited the request (per-day and per-minute caps vary by plan).", | ||
| not_found: "Record or module not found.", | ||
| unauthorized: "Zoho rejected the credential — check the OAuth scopes on your Zoho app.", | ||
| }; | ||
| export const ZohoFunctionMetadata = { | ||
| listModules: { | ||
| title: "List modules", | ||
| summary: "Enumerate CRM modules (entities) visible to this token", | ||
| description: "Calls `GET /crm/v2/settings/modules`. Returns both built-in and custom modules with their API names — essential for picker UIs and discovering custom entities.", | ||
| group: "schema", | ||
| action: "query", | ||
| icon: "layers", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call"], | ||
| idempotent: true, | ||
| since: "1.0.0", | ||
| tags: ["zoho", "schema", "modules"], | ||
| parameters: [credentialParam], | ||
| returnType: "object", | ||
| returnDescription: "{ modules: [{ api_name, singular_label, plural_label, module_name, ... }] }", | ||
| errors: commonErrors, | ||
| example: 'zoho.listModules "my_zoho"', | ||
| }, | ||
| listRecords: { | ||
| title: "List records", | ||
| summary: "List records from a module with optional filtering", | ||
| description: "Calls `GET /crm/v2/{moduleName}`. Supports per_page/page pagination, field projection, sorting, and scoping to a custom view.", | ||
| group: "records", | ||
| action: "query", | ||
| icon: "list", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call"], | ||
| idempotent: true, | ||
| since: "1.0.0", | ||
| tags: ["zoho", "records", "list"], | ||
| parameters: [ | ||
| credentialParam, | ||
| moduleNameParam, | ||
| { | ||
| name: "options", | ||
| title: "Options", | ||
| description: "Recognized keys:\n fields : comma list — projection, e.g. 'Last_Name,Email'\n ids : comma-separated record IDs\n sort_by : field API name\n sort_order : 'asc' | 'desc'\n page : 1-indexed (default 1)\n per_page : 1–200 (default 200)\n cvid : custom view id\n territory_id\n include_child : bool — include records in child territories", | ||
| dataType: "object", | ||
| formInputType: "json", | ||
| required: false, | ||
| allowExpression: true, | ||
| language: "json", | ||
| rows: 5, | ||
| advanced: true, | ||
| }, | ||
| ], | ||
| returnType: "object", | ||
| returnDescription: "{ data: [...], info: { per_page, count, page, more_records } }", | ||
| errors: commonErrors, | ||
| example: 'zoho.listRecords "my_zoho" "Leads" {per_page: 50, sort_by: "Created_Time", sort_order: "desc"}', | ||
| }, | ||
| createRecord: { | ||
| title: "Create record(s)", | ||
| summary: "Create one or many records in a module", | ||
| description: "Calls `POST /crm/v2/{moduleName}`. Accepts a single record object (wrapped automatically), an array of records (bulk — max 100), or a pre-wrapped `{data: [...]}` envelope.", | ||
| group: "records", | ||
| action: "write", | ||
| icon: "plus", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call"], | ||
| idempotent: false, | ||
| since: "1.0.0", | ||
| tags: ["zoho", "records", "create"], | ||
| parameters: [ | ||
| credentialParam, | ||
| moduleNameParam, | ||
| { | ||
| name: "record", | ||
| title: "Record payload", | ||
| description: "ONE of:\n • single record object (e.g. for Leads: {Last_Name, Email, Company})\n • array of record objects (bulk, max 100)\n • {data: [...]} — pre-wrapped envelope\n\nLookup fields use the referenced record id as a plain string (e.g. {Account_Name: '4150868000000123456'}) — Zoho resolves it server-side.", | ||
| dataType: "any", | ||
| formInputType: "json", | ||
| required: true, | ||
| allowExpression: true, | ||
| language: "json", | ||
| rows: 8, | ||
| placeholder: '{\n "Last_Name": "Smith",\n "Email": "jane@example.com",\n "Company": "Acme Corp"\n}', | ||
| }, | ||
| ], | ||
| returnType: "object", | ||
| returnDescription: "{ data: [{ code, details: {id, ...}, message, status }] }", | ||
| errors: commonErrors, | ||
| example: 'zoho.createRecord "my_zoho" "Leads" {Last_Name: "Smith", Email: "jane@acme.com", Company: "Acme"}', | ||
| }, | ||
| updateRecord: { | ||
| title: "Update record", | ||
| summary: "Partially update a single record", | ||
| description: "Calls `PUT /crm/v2/{moduleName}/{recordId}`. Only fields you supply are changed. For bulk updates, call with a pre-wrapped `{data: [{id, …}]}` envelope and omit the recordId.", | ||
| group: "records", | ||
| action: "write", | ||
| icon: "edit-3", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call"], | ||
| idempotent: true, | ||
| since: "1.0.0", | ||
| tags: ["zoho", "records", "update"], | ||
| parameters: [ | ||
| credentialParam, | ||
| moduleNameParam, | ||
| { | ||
| name: "recordId", | ||
| title: "Record ID", | ||
| description: "Zoho record ID (numeric string), e.g. '4150868000000123456'.", | ||
| dataType: "string", | ||
| formInputType: "text", | ||
| required: true, | ||
| allowExpression: true, | ||
| placeholder: "4150868000000123456", | ||
| }, | ||
| { | ||
| name: "fields", | ||
| title: "Fields to update", | ||
| description: "Object of field API name → new value. Only fields supplied are changed.", | ||
| dataType: "object", | ||
| formInputType: "json", | ||
| required: true, | ||
| allowExpression: true, | ||
| language: "json", | ||
| rows: 6, | ||
| placeholder: '{\n "Lead_Status": "Contacted",\n "Description": "Followed up by phone."\n}', | ||
| }, | ||
| ], | ||
| returnType: "object", | ||
| returnDescription: "{ data: [{ code, details: {id, ...}, message, status }] }", | ||
| errors: commonErrors, | ||
| example: 'zoho.updateRecord "my_zoho" "Leads" "4150868000000123456" {Lead_Status: "Contacted"}', | ||
| }, | ||
| }; | ||
| export const ZohoModuleMetadata = { | ||
| slug: "zoho", | ||
| title: "Zoho CRM", | ||
| summary: "Read and write Zoho CRM records — leads, contacts, deals, accounts, and custom modules", | ||
| description: "Zoho CRM API v2 — module schema and record CRUD. Works with both built-in modules (Leads, Contacts, Accounts, Deals, Tasks, …) and custom modules using their API name.\n\nAuth is OAuth 2.0 with per-region data centers. The credential stores `client_id`, `client_secret`, an access token, and a long-lived refresh token; set `api_domain` to the regional root returned by consent (`https://www.zohoapis.com`, `.eu`, `.in`, `.com.cn`, `.com.au`). On 401 the module refreshes at `<api_domain>/oauth/v2/token` and retries once. Note that Zoho uses `Authorization: Zoho-oauthtoken <token>`, not `Bearer`.\n\nFor operations not covered here (bulk APIs, related lists, attachments, blueprint, COQL queries) drop to `http.*` with the same credential via `credential.field`.", | ||
| category: "crm", | ||
| icon: "icon.svg", | ||
| color: "#E42527", | ||
| version: "0.2.0", | ||
| docsUrl: "https://docs.robinpath.com/modules/zoho", | ||
| status: "stable", | ||
| requires: [], | ||
| minNodeVersion: "18.0.0", | ||
| credentialsType: CREDENTIAL_TYPE, | ||
| operationGroups: { | ||
| schema: { title: "Schema", description: "Module discovery.", order: 1 }, | ||
| records: { title: "Records", description: "Record CRUD.", order: 2 }, | ||
| }, | ||
| methods: Object.keys(ZohoFunctions), | ||
| }; | ||
| //# sourceMappingURL=zoho.js.map |
| {"version":3,"file":"zoho.js","sourceRoot":"","sources":["../src/zoho.ts"],"names":[],"mappings":"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"} |
+19
-9
| { | ||
| "name": "@robinpath/zoho", | ||
| "version": "0.1.1", | ||
| "version": "0.3.0", | ||
| "publishConfig": { | ||
@@ -23,12 +23,15 @@ "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": "Zoho module for RobinPath.", | ||
| "description": "Zoho CRM API v2 — modules and record CRUD. OAuth 2.0 with per-region data centers and auto-refresh via the encrypted credential vault.", | ||
| "keywords": [ | ||
| "zoho", | ||
| "crm" | ||
| "crm", | ||
| "leads", | ||
| "contacts", | ||
| "deals" | ||
| ], | ||
@@ -38,7 +41,14 @@ "license": "MIT", | ||
| "category": "crm", | ||
| "type": "integration", | ||
| "auth": "api-key", | ||
| "functionCount": 21, | ||
| "baseUrl": "https://www.zohoapis.com" | ||
| "type": "module", | ||
| "auth": "credential-vault", | ||
| "credentialType": "zoho", | ||
| "functionCount": 4, | ||
| "baseUrl": "https://www.zohoapis.com/crm/v2", | ||
| "language": "nodejs", | ||
| "platforms": [ | ||
| "cloud", | ||
| "cli", | ||
| "desktop" | ||
| ] | ||
| } | ||
| } |
+1
-1
@@ -22,3 +22,3 @@ # @robinpath/zoho | ||
| ```bash | ||
| npm install @robinpath/zoho | ||
| robinpath add @robinpath/zoho | ||
| ``` | ||
@@ -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.
Network access
Supply chain riskThis module accesses the network.
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
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.
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.
49318
1230.04%10
400%644
Infinity%2
100%3
50%