@robinpath/salesforce
Advanced tools
| import type { ModuleAdapter } from "@robinpath/core"; | ||
| declare const SalesforceModule: ModuleAdapter; | ||
| export default SalesforceModule; | ||
| export { SalesforceModule }; | ||
| export { SalesforceFunctions, SalesforceFunctionMetadata, SalesforceModuleMetadata, SalesforceCredentialTypes, configureSalesforce, } from "./salesforce.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,gBAAgB,EAAE,aAQvB,CAAC;AAEF,eAAe,gBAAgB,CAAC;AAChC,OAAO,EAAE,gBAAgB,EAAE,CAAC;AAC5B,OAAO,EACL,mBAAmB,EACnB,0BAA0B,EAC1B,wBAAwB,EACxB,yBAAyB,EACzB,mBAAmB,GACpB,MAAM,iBAAiB,CAAC"} |
| import { SalesforceFunctions, SalesforceFunctionMetadata, SalesforceModuleMetadata, SalesforceCredentialTypes, configureSalesforce, } from "./salesforce.js"; | ||
| const SalesforceModule = { | ||
| name: "salesforce", | ||
| functions: SalesforceFunctions, | ||
| functionMetadata: SalesforceFunctionMetadata, | ||
| moduleMetadata: SalesforceModuleMetadata, | ||
| credentialTypes: SalesforceCredentialTypes, | ||
| configure: configureSalesforce, | ||
| global: false, | ||
| }; | ||
| export default SalesforceModule; | ||
| export { SalesforceModule }; | ||
| export { SalesforceFunctions, SalesforceFunctionMetadata, SalesforceModuleMetadata, SalesforceCredentialTypes, configureSalesforce, } from "./salesforce.js"; | ||
| //# sourceMappingURL=index.js.map |
| {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,mBAAmB,EACnB,0BAA0B,EAC1B,wBAAwB,EACxB,yBAAyB,EACzB,mBAAmB,GACpB,MAAM,iBAAiB,CAAC;AAEzB,MAAM,gBAAgB,GAAkB;IACtC,IAAI,EAAE,YAAY;IAClB,SAAS,EAAE,mBAAmB;IAC9B,gBAAgB,EAAE,0BAA0B;IAC5C,cAAc,EAAE,wBAAwB;IACxC,eAAe,EAAE,yBAAyB;IAC1C,SAAS,EAAE,mBAAmB;IAC9B,MAAM,EAAE,KAAK;CACd,CAAC;AAEF,eAAe,gBAAgB,CAAC;AAChC,OAAO,EAAE,gBAAgB,EAAE,CAAC;AAC5B,OAAO,EACL,mBAAmB,EACnB,0BAA0B,EAC1B,wBAAwB,EACxB,yBAAyB,EACzB,mBAAmB,GACpB,MAAM,iBAAiB,CAAC"} |
| /** | ||
| * RobinPath Salesforce Module (Node port) | ||
| * | ||
| * Salesforce CRM integration via the REST API — leads, contacts, opportunities, | ||
| * and arbitrary SOQL queries / SOSL searches. Mirror of | ||
| * packages/php/salesforce/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. | ||
| * | ||
| * Salesforce uses OAuth 2.0 with a per-org instance URL. Each Salesforce org | ||
| * (production, sandbox, or scratch) lives at its own subdomain, returned in the | ||
| * `instance_url` field of the OAuth token response. Because of this, the | ||
| * credential must store BOTH the bearer access token AND the instance URL — | ||
| * there is no single global API host. | ||
| * | ||
| * Authentication uses the RobinPath credential vault. Every handler takes a | ||
| * credential slug as its first argument; the module resolves the stored token | ||
| * + instance URL at call time via the injected ModuleHost. If a | ||
| * `refreshToken` (plus `clientId` + `clientSecret`) is stored on the | ||
| * credential, 401 responses trigger a one-shot refresh against | ||
| * `https://login.salesforce.com/services/oauth2/token` and the new access | ||
| * token is written back into the vault. | ||
| * | ||
| * Credential type declared by this module: | ||
| * - salesforce_oauth2 : { accessToken, instanceUrl, refreshToken?, clientId?, clientSecret? } | ||
| */ | ||
| import type { BuiltinHandler, CredentialTypeSchema, FunctionMetadata, ModuleHost, ModuleMetadata } from "@robinpath/core"; | ||
| export declare function configureSalesforce(h: ModuleHost): void; | ||
| export declare const SalesforceFunctions: Record<string, BuiltinHandler>; | ||
| export declare const SalesforceCredentialTypes: CredentialTypeSchema[]; | ||
| export declare const SalesforceFunctionMetadata: Record<string, FunctionMetadata>; | ||
| export declare const SalesforceModuleMetadata: ModuleMetadata; | ||
| //# sourceMappingURL=salesforce.d.ts.map |
| {"version":3,"file":"salesforce.d.ts","sourceRoot":"","sources":["../src/salesforce.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,KAAK,EACV,cAAc,EACd,oBAAoB,EACpB,gBAAgB,EAChB,UAAU,EACV,cAAc,EAEf,MAAM,iBAAiB,CAAC;AAezB,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,UAAU,GAAG,IAAI,CAEvD;AA4ZD,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAa9D,CAAC;AAIF,eAAO,MAAM,yBAAyB,EAAE,oBAAoB,EAoC3D,CAAC;AAgFF,eAAO,MAAM,0BAA0B,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CA0QvE,CAAC;AAIF,eAAO,MAAM,wBAAwB,EAAE,cAuCtC,CAAC"} |
| /** | ||
| * RobinPath Salesforce Module (Node port) | ||
| * | ||
| * Salesforce CRM integration via the REST API — leads, contacts, opportunities, | ||
| * and arbitrary SOQL queries / SOSL searches. Mirror of | ||
| * packages/php/salesforce/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. | ||
| * | ||
| * Salesforce uses OAuth 2.0 with a per-org instance URL. Each Salesforce org | ||
| * (production, sandbox, or scratch) lives at its own subdomain, returned in the | ||
| * `instance_url` field of the OAuth token response. Because of this, the | ||
| * credential must store BOTH the bearer access token AND the instance URL — | ||
| * there is no single global API host. | ||
| * | ||
| * Authentication uses the RobinPath credential vault. Every handler takes a | ||
| * credential slug as its first argument; the module resolves the stored token | ||
| * + instance URL at call time via the injected ModuleHost. If a | ||
| * `refreshToken` (plus `clientId` + `clientSecret`) is stored on the | ||
| * credential, 401 responses trigger a one-shot refresh against | ||
| * `https://login.salesforce.com/services/oauth2/token` and the new access | ||
| * token is written back into the vault. | ||
| * | ||
| * Credential type declared by this module: | ||
| * - salesforce_oauth2 : { accessToken, instanceUrl, refreshToken?, clientId?, clientSecret? } | ||
| */ | ||
| // ── Module-local state (populated by configure hook) ──────────────────── | ||
| const state = {}; | ||
| function host() { | ||
| if (!state.host) { | ||
| throw new Error("Salesforce module not initialized. Pass the adapter to rp.registerModule() via loadModule so its configure() hook runs first."); | ||
| } | ||
| return state.host; | ||
| } | ||
| export function configureSalesforce(h) { | ||
| state.host = h; | ||
| } | ||
| // ── Constants ────────────────────────────────────────────────────────── | ||
| const API_VERSION = "v60.0"; | ||
| const TOKEN_URL = "https://login.salesforce.com/services/oauth2/token"; | ||
| const CREDENTIAL_TYPE = "salesforce_oauth2"; | ||
| function errorReturn(error, code, extra = {}) { | ||
| return { error, code, ...extra }; | ||
| } | ||
| function isErrorReturn(v) { | ||
| return !!v && typeof v === "object" && "error" in v && "code" in v; | ||
| } | ||
| async function resolveAuth(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.accessToken ?? ""); | ||
| if (!token) { | ||
| return errorReturn(`Credential '${credentialSlug}' has no \`accessToken\` field.`, "access_token_missing"); | ||
| } | ||
| const instanceUrl = String(fields.instanceUrl ?? "").replace(/\/+$/, ""); | ||
| if (!instanceUrl) { | ||
| return errorReturn(`Credential '${credentialSlug}' has no \`instanceUrl\` field.`, "instance_url_missing"); | ||
| } | ||
| return { token, instanceUrl, credentialSlug, fields }; | ||
| } | ||
| // ── OAuth refresh (used on 401) ──────────────────────────────────────── | ||
| async function refreshAccessToken(refreshToken, clientId, clientSecret, instanceUrl) { | ||
| const body = new URLSearchParams({ | ||
| grant_type: "refresh_token", | ||
| refresh_token: refreshToken, | ||
| client_id: clientId, | ||
| client_secret: clientSecret, | ||
| }).toString(); | ||
| // Prefer the org's token endpoint if the instance URL is available (sandbox | ||
| // vs prod etc.), falling back to the canonical login host. | ||
| const endpoints = [ | ||
| instanceUrl ? `${instanceUrl}/services/oauth2/token` : "", | ||
| TOKEN_URL, | ||
| ].filter(Boolean); | ||
| let lastError = null; | ||
| for (const url of endpoints) { | ||
| let response; | ||
| try { | ||
| response = await fetch(url, { | ||
| method: "POST", | ||
| headers: { "Content-Type": "application/x-www-form-urlencoded" }, | ||
| body, | ||
| }); | ||
| } | ||
| catch (e) { | ||
| lastError = errorReturn(e instanceof Error ? e.message : String(e), "transport"); | ||
| continue; | ||
| } | ||
| const raw = await response.text(); | ||
| let decoded = {}; | ||
| try { | ||
| decoded = raw ? JSON.parse(raw) : {}; | ||
| } | ||
| catch { | ||
| decoded = {}; | ||
| } | ||
| const status = response.status; | ||
| const accessToken = String(decoded.access_token ?? ""); | ||
| if (status >= 200 && status < 300 && accessToken) { | ||
| return { token: accessToken }; | ||
| } | ||
| const msg = String(decoded.error_description ?? decoded.error ?? "Refresh failed."); | ||
| lastError = errorReturn(msg, "token_exchange_failed", { status }); | ||
| } | ||
| return lastError ?? errorReturn("Refresh failed.", "token_exchange_failed"); | ||
| } | ||
| async function writeBackAccessToken(slug, fields, newToken) { | ||
| try { | ||
| await host().credentials.set(slug, CREDENTIAL_TYPE, { | ||
| ...fields, | ||
| accessToken: newToken, | ||
| }); | ||
| } | ||
| catch { | ||
| // Best-effort — the in-memory resolved auth still has the fresh token. | ||
| } | ||
| } | ||
| // ── HTTP helper (normalized envelope, never throws for API errors) ───── | ||
| async function httpWithToken(token, instanceUrl, method, path, body) { | ||
| const url = `${instanceUrl}/services/data/${API_VERSION}/${path.replace(/^\/+/, "")}`; | ||
| const headers = { | ||
| Authorization: `Bearer ${token}`, | ||
| Accept: "application/json", | ||
| }; | ||
| if (body !== null && body !== undefined) { | ||
| headers["Content-Type"] = "application/json"; | ||
| } | ||
| const init = { method, headers }; | ||
| if (body !== null && body !== undefined) { | ||
| 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 status = response.status; | ||
| const rawBody = await response.text(); | ||
| if (status === 204 || rawBody === "") { | ||
| if (status >= 200 && status < 300) { | ||
| return { ok: true }; | ||
| } | ||
| } | ||
| let decoded; | ||
| try { | ||
| decoded = rawBody ? JSON.parse(rawBody) : null; | ||
| } | ||
| catch { | ||
| decoded = { raw: rawBody.slice(0, 500) }; | ||
| } | ||
| if (status >= 200 && status < 300) { | ||
| if (decoded && typeof decoded === "object") | ||
| return decoded; | ||
| return { raw: rawBody }; | ||
| } | ||
| return salesforceError(status, decoded && typeof decoded === "object" ? decoded : { raw: rawBody.slice(0, 500) }); | ||
| } | ||
| function salesforceError(status, decoded) { | ||
| // Salesforce returns errors as either an array of {message, errorCode} or a single object. | ||
| let first = {}; | ||
| if (Array.isArray(decoded) && decoded.length > 0 && typeof decoded[0] === "object" && decoded[0] !== null) { | ||
| first = decoded[0]; | ||
| } | ||
| else if (decoded && typeof decoded === "object") { | ||
| first = decoded; | ||
| } | ||
| const message = String(first.message ?? `Salesforce returned HTTP ${status}.`); | ||
| const sfCode = String(first.errorCode ?? ""); | ||
| let code = "salesforce_error"; | ||
| if (status === 401) { | ||
| code = "unauthorized"; | ||
| } | ||
| else if (status === 404 || sfCode === "NOT_FOUND") { | ||
| code = "not_found"; | ||
| } | ||
| else if (status === 429 || sfCode === "REQUEST_LIMIT_EXCEEDED") { | ||
| code = "rate_limited"; | ||
| } | ||
| else if (sfCode === "DUPLICATES_DETECTED") { | ||
| code = "duplicates_detected"; | ||
| } | ||
| else if (sfCode === "MALFORMED_QUERY") { | ||
| code = "malformed_query"; | ||
| } | ||
| return errorReturn(message, code, { | ||
| status, | ||
| salesforce_error: decoded, | ||
| }); | ||
| } | ||
| /** | ||
| * Shared caller — resolves the credential, invokes httpWithToken, and on a 401 | ||
| * attempts a one-shot OAuth refresh + retry if the credential has the | ||
| * necessary refresh fields. | ||
| */ | ||
| async function call(credentialSlug, method, path, body) { | ||
| const resolved = await resolveAuth(credentialSlug); | ||
| if (isErrorReturn(resolved)) | ||
| return resolved; | ||
| const first = await httpWithToken(resolved.token, resolved.instanceUrl, method, path, body); | ||
| if (isErrorReturn(first) && first.status === 401) { | ||
| const refreshToken = String(resolved.fields.refreshToken ?? ""); | ||
| const clientId = String(resolved.fields.clientId ?? ""); | ||
| const clientSecret = String(resolved.fields.clientSecret ?? ""); | ||
| if (refreshToken && clientId && clientSecret) { | ||
| const refreshed = await refreshAccessToken(refreshToken, clientId, clientSecret, resolved.instanceUrl); | ||
| if (!isErrorReturn(refreshed)) { | ||
| await writeBackAccessToken(resolved.credentialSlug, resolved.fields, refreshed.token); | ||
| return httpWithToken(refreshed.token, resolved.instanceUrl, method, path, body); | ||
| } | ||
| } | ||
| } | ||
| return first; | ||
| } | ||
| // ── Handlers: Leads ──────────────────────────────────────────────────── | ||
| function isPlainObject(v) { | ||
| return !!v && typeof v === "object" && !Array.isArray(v); | ||
| } | ||
| const createLead = async (args) => { | ||
| const cred = String(args[0] ?? ""); | ||
| const fields = (isPlainObject(args[1]) ? args[1] : {}); | ||
| if (Object.keys(fields).length === 0) { | ||
| return { error: "`fields` is required." }; | ||
| } | ||
| return (await call(cred, "POST", "sobjects/Lead", fields)); | ||
| }; | ||
| const updateLead = async (args) => { | ||
| const cred = String(args[0] ?? ""); | ||
| const id = String(args[1] ?? ""); | ||
| const fields = (isPlainObject(args[2]) ? args[2] : {}); | ||
| if (!id) { | ||
| return { error: "`leadId` is required." }; | ||
| } | ||
| if (Object.keys(fields).length === 0) { | ||
| return { error: "`fields` is required." }; | ||
| } | ||
| return (await call(cred, "PATCH", `sobjects/Lead/${encodeURIComponent(id)}`, fields)); | ||
| }; | ||
| const getLead = async (args) => { | ||
| const cred = String(args[0] ?? ""); | ||
| const id = String(args[1] ?? ""); | ||
| if (!id) { | ||
| return { error: "`leadId` is required." }; | ||
| } | ||
| return (await call(cred, "GET", `sobjects/Lead/${encodeURIComponent(id)}`, null)); | ||
| }; | ||
| // ── Handlers: Contacts ───────────────────────────────────────────────── | ||
| const createContact = async (args) => { | ||
| const cred = String(args[0] ?? ""); | ||
| const fields = (isPlainObject(args[1]) ? args[1] : {}); | ||
| if (Object.keys(fields).length === 0) { | ||
| return { error: "`fields` is required." }; | ||
| } | ||
| return (await call(cred, "POST", "sobjects/Contact", fields)); | ||
| }; | ||
| const getContact = async (args) => { | ||
| const cred = String(args[0] ?? ""); | ||
| const id = String(args[1] ?? ""); | ||
| if (!id) { | ||
| return { error: "`contactId` is required." }; | ||
| } | ||
| return (await call(cred, "GET", `sobjects/Contact/${encodeURIComponent(id)}`, null)); | ||
| }; | ||
| // ── Handlers: Opportunities ──────────────────────────────────────────── | ||
| const createOpportunity = async (args) => { | ||
| const cred = String(args[0] ?? ""); | ||
| const fields = (isPlainObject(args[1]) ? args[1] : {}); | ||
| if (Object.keys(fields).length === 0) { | ||
| return { error: "`fields` is required." }; | ||
| } | ||
| return (await call(cred, "POST", "sobjects/Opportunity", fields)); | ||
| }; | ||
| // ── Handlers: Query / Search ─────────────────────────────────────────── | ||
| const query = async (args) => { | ||
| const cred = String(args[0] ?? ""); | ||
| const soql = String(args[1] ?? ""); | ||
| if (!soql) { | ||
| return { error: "`soql` is required." }; | ||
| } | ||
| return (await call(cred, "GET", `query?q=${encodeURIComponent(soql)}`, null)); | ||
| }; | ||
| const searchSosl = async (args) => { | ||
| const cred = String(args[0] ?? ""); | ||
| const sosl = String(args[1] ?? ""); | ||
| if (!sosl) { | ||
| return { error: "`sosl` is required." }; | ||
| } | ||
| return (await call(cred, "GET", `search?q=${encodeURIComponent(sosl)}`, null)); | ||
| }; | ||
| // ── Exports: functions map ───────────────────────────────────────────── | ||
| export const SalesforceFunctions = { | ||
| // Leads. | ||
| createLead, | ||
| updateLead, | ||
| getLead, | ||
| // Contacts. | ||
| createContact, | ||
| getContact, | ||
| // Opportunities. | ||
| createOpportunity, | ||
| // Query / search. | ||
| query, | ||
| searchSosl, | ||
| }; | ||
| // ── Exports: credential types ────────────────────────────────────────── | ||
| export const SalesforceCredentialTypes = [ | ||
| { | ||
| slug: CREDENTIAL_TYPE, | ||
| title: "Salesforce OAuth 2.0", | ||
| icon: "cloud", | ||
| fields: [ | ||
| { | ||
| name: "accessToken", | ||
| title: "Access Token", | ||
| type: "password", | ||
| required: true, | ||
| placeholder: "00D...!AQ...", | ||
| description: "Bearer access token issued by Salesforce OAuth 2.0. Obtain via the Connected App flow (web server, JWT bearer, username-password, or device flow). Tokens are short-lived (default 2 hours) — refresh out-of-band and update this credential.", | ||
| }, | ||
| { | ||
| name: "instanceUrl", | ||
| title: "Instance URL", | ||
| type: "text", | ||
| required: true, | ||
| placeholder: "https://your-org.my.salesforce.com", | ||
| description: "The per-org REST endpoint returned in the OAuth response's `instance_url`. Looks like `https://yourcompany.my.salesforce.com` or `https://test.salesforce.com` for sandboxes. No trailing slash needed.", | ||
| pattern: "^https://[a-zA-Z0-9.-]+\\.salesforce\\.com$", | ||
| }, | ||
| { | ||
| name: "refreshToken", | ||
| title: "Refresh Token", | ||
| type: "password", | ||
| required: false, | ||
| placeholder: "5Aep...", | ||
| description: "Optional long-lived refresh token from the OAuth response. Declared here for future auto-refresh support — not currently consumed by any method. Store it now so you do not have to re-create the credential later.", | ||
| }, | ||
| ], | ||
| }, | ||
| ]; | ||
| // ── Shared parameter metadata ────────────────────────────────────────── | ||
| const credentialParam = { | ||
| name: "credential", | ||
| title: "Credential", | ||
| description: "Slug of a saved `salesforce_oauth2` credential. Resolves to the bearer access token and per-org instance URL at call time.", | ||
| dataType: "string", | ||
| formInputType: "resource", | ||
| required: true, | ||
| allowExpression: true, | ||
| placeholder: "my_salesforce", | ||
| resource: { | ||
| type: "credential", | ||
| listFn: "credential.list", | ||
| modes: ["list", "expression"], | ||
| searchable: true, | ||
| filter: { type: CREDENTIAL_TYPE }, | ||
| }, | ||
| }; | ||
| const leadIdParam = { | ||
| name: "leadId", | ||
| title: "Lead ID", | ||
| description: "Salesforce Lead ID (15- or 18-character alphanumeric — e.g. `00Q5g00000ABCDE`).", | ||
| dataType: "string", | ||
| formInputType: "text", | ||
| required: true, | ||
| allowExpression: true, | ||
| placeholder: "00Q5g00000ABCDE", | ||
| validation: { pattern: "^[a-zA-Z0-9]{15,18}$" }, | ||
| }; | ||
| const contactIdParam = { | ||
| name: "contactId", | ||
| title: "Contact ID", | ||
| description: "Salesforce Contact ID (15- or 18-character alphanumeric — e.g. `0035g00000ABCDE`).", | ||
| dataType: "string", | ||
| formInputType: "text", | ||
| required: true, | ||
| allowExpression: true, | ||
| placeholder: "0035g00000ABCDE", | ||
| validation: { pattern: "^[a-zA-Z0-9]{15,18}$" }, | ||
| }; | ||
| function fieldsParam(object, example) { | ||
| return { | ||
| name: "fields", | ||
| title: "Fields", | ||
| description: `Flat object of ${object} field values. Field names are the API names from the Salesforce object — e.g. \`FirstName\`, \`LastName\`, \`Email\`, \`Company\`. Custom fields end with \`__c\`.\n\nExample: ${example}`, | ||
| dataType: "object", | ||
| formInputType: "json", | ||
| required: true, | ||
| allowExpression: true, | ||
| language: "json", | ||
| rows: 6, | ||
| }; | ||
| } | ||
| const commonErrors = { | ||
| credential_not_found: "No credential with that slug exists in the vault.", | ||
| access_token_missing: "The credential exists but has no `accessToken` field.", | ||
| instance_url_missing: "The credential exists but has no `instanceUrl` field.", | ||
| transport: "Network failure calling the Salesforce instance.", | ||
| salesforce_error: "Salesforce returned an error — see `salesforce_error` for the parsed response body.", | ||
| rate_limited: "Hit the org-level API request limit (HTTP 429 or REQUEST_LIMIT_EXCEEDED).", | ||
| not_found: "No record with that ID exists in this org.", | ||
| unauthorized: "Access token expired or invalid — refresh it and update the credential.", | ||
| }; | ||
| // ── Exports: function metadata ───────────────────────────────────────── | ||
| export const SalesforceFunctionMetadata = { | ||
| // ===================== LEADS ===================== | ||
| createLead: { | ||
| title: "Create lead", | ||
| summary: "Add a new lead to Salesforce", | ||
| description: "Calls `POST /services/data/v60.0/sobjects/Lead`. `LastName` and `Company` are required by the standard Lead object; everything else is optional. Returns `{id, success, errors}`. Note: if duplicate-management rules are enabled in the org, this can return a 400 with `DUPLICATES_DETECTED` — handle by querying first or using the upsert endpoint with an external ID.", | ||
| group: "leads", | ||
| action: "write", | ||
| icon: "user-plus", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call"], | ||
| idempotent: false, | ||
| since: "1.0.0", | ||
| tags: ["salesforce", "lead", "crm", "create"], | ||
| parameters: [ | ||
| credentialParam, | ||
| fieldsParam("Lead", '{FirstName: "Ada", LastName: "Lovelace", Company: "Analytical Engines", Email: "ada@example.com", Status: "Open - Not Contacted", LeadSource: "Web"}'), | ||
| ], | ||
| returnType: "object", | ||
| returnDescription: "{id, success, errors}.", | ||
| errors: { | ||
| ...commonErrors, | ||
| duplicates_detected: "Org duplicate rules matched — see errors[].", | ||
| }, | ||
| examples: [ | ||
| { | ||
| title: "Create a web lead", | ||
| code: 'salesforce.createLead "my_salesforce" {\n FirstName: {{ form.first_name }},\n LastName: {{ form.last_name }},\n Company: {{ form.company }},\n Email: {{ form.email }},\n LeadSource: "Website form"\n}', | ||
| }, | ||
| ], | ||
| example: 'salesforce.createLead "my_salesforce" {LastName:"Lovelace", Company:"Analytical Engines"}', | ||
| }, | ||
| updateLead: { | ||
| title: "Update lead", | ||
| summary: "Patch fields on an existing lead", | ||
| description: "Calls `PATCH /services/data/v60.0/sobjects/Lead/{id}`. Salesforce returns 204 No Content on success — this module returns `{ok: true}` to signal that. Only the fields you supply are changed.", | ||
| group: "leads", | ||
| action: "write", | ||
| icon: "user-check", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call"], | ||
| idempotent: true, | ||
| since: "1.0.0", | ||
| tags: ["salesforce", "lead", "update"], | ||
| parameters: [ | ||
| credentialParam, | ||
| leadIdParam, | ||
| fieldsParam("Lead", '{Status: "Working - Contacted", Rating: "Hot"}'), | ||
| ], | ||
| returnType: "object", | ||
| returnDescription: "{ok: true} on success (Salesforce returns 204 No Content).", | ||
| errors: commonErrors, | ||
| example: 'salesforce.updateLead "my_salesforce" "00Q5g00000ABCDE" {Status:"Working - Contacted"}', | ||
| }, | ||
| getLead: { | ||
| title: "Get lead", | ||
| summary: "Fetch a single lead by ID", | ||
| description: "Calls `GET /services/data/v60.0/sobjects/Lead/{id}`. Returns the full Lead record including all standard and custom fields the user has access to.", | ||
| group: "leads", | ||
| action: "read", | ||
| icon: "user", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call"], | ||
| idempotent: true, | ||
| since: "1.0.0", | ||
| tags: ["salesforce", "lead", "lookup"], | ||
| parameters: [credentialParam, leadIdParam], | ||
| returnType: "object", | ||
| returnDescription: 'Full Lead record or `{error: "not_found"}`.', | ||
| errors: commonErrors, | ||
| example: 'salesforce.getLead "my_salesforce" "00Q5g00000ABCDE"', | ||
| }, | ||
| // ===================== CONTACTS ===================== | ||
| createContact: { | ||
| title: "Create contact", | ||
| summary: "Add a new contact to Salesforce", | ||
| description: "Calls `POST /services/data/v60.0/sobjects/Contact`. `LastName` is required; `AccountId` ties the contact to an Account record. Returns `{id, success, errors}`.", | ||
| group: "contacts", | ||
| action: "write", | ||
| icon: "user-plus", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call"], | ||
| idempotent: false, | ||
| since: "1.0.0", | ||
| tags: ["salesforce", "contact", "create"], | ||
| parameters: [ | ||
| credentialParam, | ||
| fieldsParam("Contact", '{FirstName: "Ada", LastName: "Lovelace", Email: "ada@example.com", AccountId: "0015g00000ABCDE", Title: "CTO"}'), | ||
| ], | ||
| returnType: "object", | ||
| returnDescription: "{id, success, errors}.", | ||
| errors: commonErrors, | ||
| example: 'salesforce.createContact "my_salesforce" {LastName:"Lovelace", Email:"ada@example.com"}', | ||
| }, | ||
| getContact: { | ||
| title: "Get contact", | ||
| summary: "Fetch a single contact by ID", | ||
| description: "Calls `GET /services/data/v60.0/sobjects/Contact/{id}`. Returns the full Contact record.", | ||
| group: "contacts", | ||
| action: "read", | ||
| icon: "user", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call"], | ||
| idempotent: true, | ||
| since: "1.0.0", | ||
| tags: ["salesforce", "contact", "lookup"], | ||
| parameters: [credentialParam, contactIdParam], | ||
| returnType: "object", | ||
| returnDescription: 'Full Contact record or `{error: "not_found"}`.', | ||
| errors: commonErrors, | ||
| example: 'salesforce.getContact "my_salesforce" "0035g00000ABCDE"', | ||
| }, | ||
| // ===================== OPPORTUNITIES ===================== | ||
| createOpportunity: { | ||
| title: "Create opportunity", | ||
| summary: "Open a new sales opportunity", | ||
| description: "Calls `POST /services/data/v60.0/sobjects/Opportunity`. Required fields by the standard Opportunity object: `Name`, `StageName` (must match a stage from your sales process — e.g. `Prospecting`, `Qualification`, `Closed Won`), and `CloseDate` (ISO `YYYY-MM-DD`). Strongly recommended: `AccountId`, `Amount`.", | ||
| group: "opportunities", | ||
| action: "write", | ||
| icon: "dollar-sign", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call"], | ||
| idempotent: false, | ||
| since: "1.0.0", | ||
| tags: ["salesforce", "opportunity", "sales", "deal"], | ||
| parameters: [ | ||
| credentialParam, | ||
| fieldsParam("Opportunity", '{Name: "Acme Q4 Renewal", StageName: "Prospecting", CloseDate: "2026-06-30", Amount: 25000, AccountId: "0015g00000ABCDE"}'), | ||
| ], | ||
| returnType: "object", | ||
| returnDescription: "{id, success, errors}.", | ||
| errors: commonErrors, | ||
| examples: [ | ||
| { | ||
| title: "Create a renewal opportunity", | ||
| code: 'salesforce.createOpportunity "my_salesforce" {\n Name: "Acme Q4 renewal",\n StageName: "Prospecting",\n CloseDate: "2026-06-30",\n Amount: 25000,\n AccountId: "0015g00000ABCDE"\n}', | ||
| }, | ||
| ], | ||
| example: 'salesforce.createOpportunity "my_salesforce" {Name:"New Deal", StageName:"Prospecting", CloseDate:"2026-06-30"}', | ||
| }, | ||
| // ===================== QUERY / SEARCH ===================== | ||
| query: { | ||
| title: "SOQL query", | ||
| summary: "Run a Salesforce Object Query Language statement", | ||
| description: "Calls `GET /services/data/v60.0/query?q=<encoded SOQL>`. SOQL is Salesforce's SQL-like query language — supports SELECT, WHERE, ORDER BY, LIMIT, and relationship traversal via dot-notation (`Account.Name` from the Contact object) or subqueries.\n\nReturns the standard envelope `{totalSize, done, records, nextRecordsUrl?}`. For result sets larger than `LIMIT 200` (or 2000 by default), `done` will be false and you'll need to follow `nextRecordsUrl` for the next page.", | ||
| group: "query", | ||
| action: "query", | ||
| icon: "search", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call"], | ||
| idempotent: true, | ||
| since: "1.0.0", | ||
| tags: ["salesforce", "soql", "query", "search"], | ||
| parameters: [ | ||
| credentialParam, | ||
| { | ||
| name: "soql", | ||
| title: "SOQL statement", | ||
| description: "A Salesforce Object Query Language statement. Wrap field values in single quotes; backslash-escape special chars.", | ||
| dataType: "string", | ||
| formInputType: "textarea", | ||
| required: true, | ||
| allowExpression: true, | ||
| language: "sql", | ||
| rows: 4, | ||
| placeholder: "SELECT Id, Name, Email FROM Lead WHERE Status = 'Open - Not Contacted' LIMIT 50", | ||
| }, | ||
| ], | ||
| returnType: "object", | ||
| returnDescription: "{totalSize, done, records, nextRecordsUrl?}.", | ||
| errors: { | ||
| ...commonErrors, | ||
| malformed_query: "SOQL parse error — see salesforce_error for details.", | ||
| }, | ||
| examples: [ | ||
| { | ||
| title: "Recent leads", | ||
| code: 'salesforce.query "my_salesforce" "SELECT Id, Name, Email FROM Lead WHERE CreatedDate = LAST_N_DAYS:7"', | ||
| }, | ||
| { | ||
| title: "Open deals", | ||
| code: 'salesforce.query "my_salesforce" "SELECT Id, Name, Amount, StageName FROM Opportunity WHERE IsClosed = false ORDER BY CloseDate ASC LIMIT 100"', | ||
| }, | ||
| ], | ||
| example: 'salesforce.query "my_salesforce" "SELECT Id, Name FROM Account LIMIT 10"', | ||
| }, | ||
| searchSosl: { | ||
| title: "SOSL search", | ||
| summary: "Full-text search across multiple Salesforce objects", | ||
| description: "Calls `GET /services/data/v60.0/search?q=<encoded SOSL>`. SOSL is Salesforce's full-text search language — use it to find a term across many objects in one call.\n\nMinimal SOSL form: `FIND {searchTerm} IN ALL FIELDS RETURNING Account(Name), Contact(FirstName, LastName), Lead(Email)`. Returns `{searchRecords: [...]}` — a flat array tagged with each record's object type.", | ||
| group: "query", | ||
| action: "query", | ||
| icon: "search", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call"], | ||
| idempotent: true, | ||
| since: "1.0.0", | ||
| tags: ["salesforce", "sosl", "search", "full-text"], | ||
| parameters: [ | ||
| credentialParam, | ||
| { | ||
| name: "sosl", | ||
| title: "SOSL statement", | ||
| description: "A Salesforce Object Search Language statement. The search term goes in curly braces.", | ||
| dataType: "string", | ||
| formInputType: "textarea", | ||
| required: true, | ||
| allowExpression: true, | ||
| language: "sql", | ||
| rows: 4, | ||
| placeholder: "FIND {acme} IN ALL FIELDS RETURNING Account(Id, Name), Contact(Id, Email), Lead(Id, Email)", | ||
| }, | ||
| ], | ||
| returnType: "object", | ||
| returnDescription: "{searchRecords: [...]}.", | ||
| errors: commonErrors, | ||
| examples: [ | ||
| { | ||
| title: 'Find anything mentioning "acme"', | ||
| code: 'salesforce.searchSosl "my_salesforce" "FIND {acme} IN ALL FIELDS RETURNING Account(Id, Name), Contact(Id, Email), Lead(Id, Email)"', | ||
| }, | ||
| ], | ||
| example: 'salesforce.searchSosl "my_salesforce" "FIND {ada} RETURNING Contact(Id, Email)"', | ||
| }, | ||
| }; | ||
| // ── Exports: module metadata ─────────────────────────────────────────── | ||
| export const SalesforceModuleMetadata = { | ||
| slug: "salesforce", | ||
| title: "Salesforce", | ||
| summary: "Leads, contacts, opportunities, SOQL queries, and SOSL search via the Salesforce REST API", | ||
| description: "Pipe form submissions and webhook events into Salesforce. Create or update leads, look up contacts, open opportunities, and run arbitrary SOQL/SOSL queries from RobinPath scripts.\n\nSalesforce orgs each live at their own `https://{org}.my.salesforce.com` instance URL, returned in the OAuth token response. The `salesforce_oauth2` credential stores both the bearer access token and the instance URL together so methods can build the right base URL without per-call configuration.\n\nResponses are returned as parsed JSON exactly as Salesforce sends them. For create operations that means `{id, success, errors}`. For queries that means the full envelope `{totalSize, done, records}`.", | ||
| category: "crm", | ||
| icon: "icon.svg", | ||
| color: "#00A1E0", | ||
| version: "0.2.0", | ||
| docsUrl: "https://docs.robinpath.com/modules/salesforce", | ||
| status: "stable", | ||
| requires: [], | ||
| minNodeVersion: "18.0.0", | ||
| credentialsType: CREDENTIAL_TYPE, | ||
| operationGroups: { | ||
| leads: { | ||
| title: "Leads", | ||
| description: "Inbound prospect records before qualification.", | ||
| order: 1, | ||
| }, | ||
| contacts: { | ||
| title: "Contacts", | ||
| description: "People associated with accounts.", | ||
| order: 2, | ||
| }, | ||
| opportunities: { | ||
| title: "Opportunities", | ||
| description: "Open sales deals tied to accounts.", | ||
| order: 3, | ||
| }, | ||
| query: { | ||
| title: "Query", | ||
| description: "Run SOQL queries and SOSL searches.", | ||
| order: 4, | ||
| }, | ||
| }, | ||
| methods: Object.keys(SalesforceFunctions), | ||
| }; | ||
| //# sourceMappingURL=salesforce.js.map |
| {"version":3,"file":"salesforce.js","sourceRoot":"","sources":["../src/salesforce.ts"],"names":[],"mappings":"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"} |
+21
-8
| { | ||
| "name": "@robinpath/salesforce", | ||
| "version": "0.1.1", | ||
| "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": "Salesforce module for RobinPath.", | ||
| "description": "Salesforce CRM integration via the REST API — leads, contacts, opportunities, SOQL queries, and SOSL search. Uses the encrypted credential vault for OAuth 2.0 access tokens with a per-org instance URL.", | ||
| "keywords": [ | ||
| "salesforce", | ||
| "crm" | ||
| "crm", | ||
| "sales", | ||
| "lead", | ||
| "contact", | ||
| "opportunity", | ||
| "soql", | ||
| "sosl", | ||
| "oauth" | ||
| ], | ||
@@ -38,6 +45,12 @@ "license": "MIT", | ||
| "category": "crm", | ||
| "type": "integration", | ||
| "auth": "api-key", | ||
| "functionCount": 25 | ||
| "type": "module", | ||
| "auth": "credential-vault", | ||
| "functionCount": 25, | ||
| "language": "nodejs", | ||
| "platforms": [ | ||
| "cloud", | ||
| "cli", | ||
| "desktop" | ||
| ] | ||
| } | ||
| } |
+1
-1
@@ -22,3 +22,3 @@ # @robinpath/salesforce | ||
| ```bash | ||
| npm install @robinpath/salesforce | ||
| robinpath add @robinpath/salesforce | ||
| ``` | ||
@@ -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
58021
1350.16%10
400%735
Infinity%2
100%3
50%