@bonsae/node-red-salesforce 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../src/server/schemas/salesforce-connection.ts","../src/server/lib/pkce.ts","../src/server/api/routes/auth.ts","../src/server/api/connection.ts","../src/server/services/salesforce.ts","../src/server/api/routes/apex.ts","../src/server/api/routes/streaming.ts","../src/server/api/index.ts","../src/server/nodes/salesforce-connection.ts","../src/server/schemas/salesforce-soql.ts","../src/server/nodes/salesforce-soql.ts","../src/server/schemas/salesforce-dml.ts","../src/server/nodes/salesforce-dml.ts","../src/server/schemas/salesforce-bulk.ts","../src/server/nodes/salesforce-bulk.ts","../src/server/schemas/salesforce-describe.ts","../src/server/nodes/salesforce-describe.ts","../src/server/schemas/salesforce-streaming.ts","../src/server/nodes/salesforce-streaming.ts","../src/server/schemas/salesforce-apex-invocation.ts","../src/server/nodes/salesforce-apex-invocation.ts","../src/server/schemas/salesforce-apex-code.ts","../src/server/lib/apex-class-manager.ts","../src/server/lib/apex-templates.ts","../src/server/nodes/salesforce-apex-code.ts","../src/server/index.ts"],"sourcesContent":["import { defineSchema, SchemaType } from \"@bonsae/nrg/server\";\n\nexport const ConfigsSchema = defineSchema(\n {\n name: SchemaType.String({ default: \"\" }),\n loginUrl: SchemaType.String({\n default: \"https://login.salesforce.com\",\n \"x-nrg-form\": { icon: \"globe\" },\n }),\n clientId: SchemaType.String({\n default: \"\",\n \"x-nrg-form\": { icon: \"key\" },\n }),\n apiVersion: SchemaType.Union(\n [\n SchemaType.Literal(\"62.0\"),\n SchemaType.Literal(\"61.0\"),\n SchemaType.Literal(\"60.0\"),\n SchemaType.Literal(\"59.0\"),\n SchemaType.Literal(\"58.0\"),\n SchemaType.Literal(\"57.0\"),\n SchemaType.Literal(\"56.0\"),\n SchemaType.Literal(\"55.0\"),\n ],\n { default: \"62.0\", \"x-nrg-form\": { icon: \"code-fork\" } },\n ),\n callbackUrl: SchemaType.Optional(\n SchemaType.String({\n default: \"\",\n \"x-nrg-form\": { icon: \"exchange\" },\n }),\n ),\n },\n { $id: \"salesforce-connection:config\" },\n);\n\nexport const CredentialsSchema = defineSchema(\n {\n accessToken: SchemaType.String({ default: \"\", format: \"password\" }),\n refreshToken: SchemaType.String({ default: \"\", format: \"password\" }),\n instanceUrl: SchemaType.String({ default: \"\" }),\n },\n { $id: \"salesforce-connection:credentials\" },\n);\n","import crypto from \"node:crypto\";\n\nconst AUTH_STATE_TTL = 10 * 60 * 1000; // 10 minutes\n\ninterface PendingAuthState {\n codeVerifier: string;\n nodeId: string;\n clientId: string;\n loginUrl: string;\n callbackUrl: string;\n timestamp: number;\n}\n\nconst pendingAuthStates = new Map<string, PendingAuthState>();\n\nexport function generateCodeVerifier(): string {\n return crypto.randomBytes(32).toString(\"base64url\");\n}\n\nexport function generateCodeChallenge(verifier: string): string {\n return crypto.createHash(\"sha256\").update(verifier).digest(\"base64url\");\n}\n\nexport function createAuthState(params: {\n nodeId: string;\n clientId: string;\n loginUrl: string;\n callbackUrl: string;\n}): { state: string; codeChallenge: string } {\n const state = crypto.randomUUID();\n const codeVerifier = generateCodeVerifier();\n const codeChallenge = generateCodeChallenge(codeVerifier);\n\n pendingAuthStates.set(state, {\n codeVerifier,\n nodeId: params.nodeId,\n clientId: params.clientId,\n loginUrl: params.loginUrl,\n callbackUrl: params.callbackUrl,\n timestamp: Date.now(),\n });\n\n // Cleanup stale entries\n for (const [key, value] of pendingAuthStates) {\n if (Date.now() - value.timestamp > AUTH_STATE_TTL) {\n pendingAuthStates.delete(key);\n }\n }\n\n return { state, codeChallenge };\n}\n\nexport function consumeAuthState(state: string): PendingAuthState | null {\n const entry = pendingAuthStates.get(state);\n if (!entry) return null;\n pendingAuthStates.delete(state);\n if (Date.now() - entry.timestamp > AUTH_STATE_TTL) return null;\n return entry;\n}\n","import type { RED } from \"@bonsae/nrg/server\";\nimport { createAuthState, consumeAuthState } from \"../../lib/pkce\";\n\ninterface TokenResponse {\n access_token: string;\n refresh_token: string;\n instance_url: string;\n}\n\nfunction escapeHtml(str: string): string {\n return str\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\");\n}\n\nfunction errorPage(message: string, autoClose = true): string {\n const script = autoClose\n ? \"<script>setTimeout(function(){window.close()},3000)</script>\"\n : \"\";\n return `<html><body><h2>Authorization Failed</h2><p>${escapeHtml(message)}</p>${script}</body></html>`;\n}\n\nfunction initAuthRoutes(RED: RED): void {\n const adminRoot = ((RED.settings as any).httpAdminRoot || \"\").replace(\n /\\/$/,\n \"\",\n );\n\n RED.httpAdmin.post(\"/salesforce/auth/start\", (req, res) => {\n try {\n const {\n nodeId,\n loginUrl,\n clientId,\n callbackUrl: overrideCallbackUrl,\n } = req.body;\n\n if (!nodeId || !loginUrl || !clientId) {\n res\n .status(400)\n .json({ error: \"nodeId, loginUrl, and clientId are required\" });\n return;\n }\n\n const callbackUrl =\n overrideCallbackUrl ||\n `${req.protocol}://${req.get(\"host\")}${adminRoot}/salesforce/auth/callback`;\n\n const { state, codeChallenge } = createAuthState({\n nodeId,\n clientId,\n loginUrl,\n callbackUrl,\n });\n\n const params = new URLSearchParams({\n response_type: \"code\",\n client_id: clientId,\n redirect_uri: callbackUrl,\n state,\n code_challenge: codeChallenge,\n code_challenge_method: \"S256\",\n });\n\n res.json({\n authorizationUrl: `${loginUrl}/services/oauth2/authorize?${params.toString()}`,\n });\n } catch (error) {\n RED.log.error(\n `salesforce-connection: auth/start error: ${error instanceof Error ? error.message : String(error)}`,\n );\n res.status(500).json({ error: \"Failed to start authorization\" });\n }\n });\n\n RED.httpAdmin.get(\"/salesforce/auth/callback\", async (req, res) => {\n try {\n const { code, state, error: oauthError, error_description } = req.query;\n\n if (oauthError) {\n RED.log.error(\n `salesforce-connection: OAuth error: ${oauthError} - ${error_description}`,\n );\n res\n .status(400)\n .send(errorPage(String(error_description || oauthError)));\n return;\n }\n\n if (!code || !state) {\n res.status(400).send(errorPage(\"Missing code or state parameter\"));\n return;\n }\n\n const entry = consumeAuthState(state as string);\n if (!entry) {\n res\n .status(400)\n .send(\n errorPage(\n \"Invalid or expired authorization state. Please try again.\",\n ),\n );\n return;\n }\n\n const tokenResponse = await fetch(\n `${entry.loginUrl}/services/oauth2/token`,\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n body: new URLSearchParams({\n grant_type: \"authorization_code\",\n code: code as string,\n client_id: entry.clientId,\n redirect_uri: entry.callbackUrl,\n code_verifier: entry.codeVerifier,\n }),\n },\n );\n\n if (!tokenResponse.ok) {\n const errorBody = await tokenResponse.text();\n RED.log.error(\n `salesforce-connection: Token exchange failed: ${errorBody}`,\n );\n res\n .status(500)\n .send(\n errorPage(\n \"Token exchange failed. Check the Node-RED logs for details.\",\n ),\n );\n return;\n }\n\n const tokens = (await tokenResponse.json()) as TokenResponse;\n\n (RED.nodes as any).addCredentials(entry.nodeId, {\n accessToken: tokens.access_token,\n refreshToken: tokens.refresh_token,\n instanceUrl: tokens.instance_url,\n });\n\n RED.log.info(\n `salesforce-connection: Successfully authorized node ${entry.nodeId} for ${tokens.instance_url}`,\n );\n\n const messageData = JSON.stringify({\n type: \"salesforce-auth-success\",\n nodeId: entry.nodeId,\n accessToken: tokens.access_token,\n refreshToken: tokens.refresh_token,\n instanceUrl: tokens.instance_url,\n });\n\n res.send(`<!DOCTYPE html>\n<html>\n<body>\n<h2>Authorization Successful</h2>\n<p>You can close this window.</p>\n<script>\n if (window.opener) {\n window.opener.postMessage(${messageData}, \"*\");\n }\n setTimeout(function() { window.close(); }, 1500);\n</script>\n</body>\n</html>`);\n } catch (error) {\n RED.log.error(\n `salesforce-connection: auth/callback error: ${error instanceof Error ? error.message : String(error)}`,\n );\n res.status(500).send(errorPage(\"An unexpected error occurred.\"));\n }\n });\n\n RED.httpAdmin.get(\"/salesforce/auth/status/:nodeId\", (req, res) => {\n try {\n const credentials = RED.nodes.getCredentials(req.params.nodeId);\n const authenticated = !!(\n credentials?.accessToken && credentials?.instanceUrl\n );\n res.json({\n authenticated,\n instanceUrl: authenticated ? credentials.instanceUrl : undefined,\n });\n } catch {\n res.json({ authenticated: false });\n }\n });\n}\n\nexport { initAuthRoutes };\n","import type { RED } from \"@bonsae/nrg/server\";\nimport jsforce, { type Connection } from \"jsforce\";\n\nexport function getConnection(RED: RED, nodeId: string): Connection {\n const credentials = RED.nodes.getCredentials(nodeId);\n if (!credentials?.accessToken || !credentials?.instanceUrl) {\n throw new Error(\"Connection not authenticated\");\n }\n return new jsforce.Connection({\n instanceUrl: credentials.instanceUrl,\n accessToken: credentials.accessToken,\n });\n}\n","import type { Connection } from \"jsforce\";\n\n// --- Types ---\n\nexport interface ApexClassRecord {\n Id: string;\n Name: string;\n Body: string;\n}\n\nexport interface InvocableActionResult {\n actionName: string;\n errors: Array<{\n statusCode: string;\n message: string;\n fields: string[];\n }>;\n isSuccess: boolean;\n outputValues: { result: string } | null;\n}\n\nexport interface ChannelInfo {\n value: string;\n label: string;\n group: string;\n}\n\n// --- Client ---\n\nexport class SalesforceClient {\n private static readonly MAX_RETRIES = 3;\n private static readonly RETRY_DELAY_MS = 1000;\n\n private conn: Connection;\n\n constructor(conn: Connection) {\n this.conn = conn;\n }\n\n // --- Apex REST ---\n\n async invoke(\n fullClassName: string,\n payload: unknown,\n ): Promise<InvocableActionResult> {\n const version = this.conn.version || \"62.0\";\n\n const results = (await this.conn.request({\n method: \"POST\",\n url: `/services/data/v${version}/actions/custom/apex/${fullClassName}`,\n body: JSON.stringify({\n inputs: [{ payload: JSON.stringify(payload) }],\n }),\n headers: { \"Content-Type\": \"application/json\" },\n })) as InvocableActionResult[];\n\n const action = results[0];\n if (!action.isSuccess) {\n const errors = action.errors.map((e) => e.message).join(\"; \");\n throw new Error(`Invocable action failed: ${errors}`);\n }\n\n return action;\n }\n\n async post(path: string, payload: unknown): Promise<string> {\n return (await this.conn.apex.post(\n path,\n payload as Record<string, unknown>,\n )) as string;\n }\n\n async get(path: string): Promise<string> {\n return (await this.conn.apex.get(path)) as string;\n }\n\n async put(path: string, payload: unknown): Promise<string> {\n return (await this.conn.apex.put(\n path,\n payload as Record<string, unknown>,\n )) as string;\n }\n\n async patch(path: string, payload: unknown): Promise<string> {\n return (await this.conn.apex.patch(\n path,\n payload as Record<string, unknown>,\n )) as string;\n }\n\n async delete(path: string): Promise<string> {\n return (await this.conn.apex.delete(path)) as string;\n }\n\n // --- Tooling API ---\n\n async queryApexClassesByName(\n names: string[],\n ): Promise<Map<string, ApexClassRecord>> {\n const namesList = names.map((n) => `'${n}'`).join(\",\");\n const result = await this.conn.tooling.query(\n `SELECT Id, Name, Body FROM ApexClass WHERE Name IN (${namesList})`,\n );\n\n const map = new Map<string, ApexClassRecord>();\n for (const record of result.records as any[]) {\n map.set(record.Name, {\n Id: record.Id,\n Name: record.Name,\n Body: record.Body,\n });\n }\n return map;\n }\n\n async createApexClass(name: string, body: string): Promise<{ id: string }> {\n return this.withRetry(async () => {\n const result = await this.conn.tooling.create(\"ApexClass\" as any, {\n Name: name,\n Body: body,\n });\n if (!result.success) {\n const errors = result.errors?.map((e: any) => e.message).join(\"; \");\n throw new Error(`Apex create failed: ${errors}`);\n }\n return { id: result.id };\n }, `create ${name}`);\n }\n\n async deleteApexClass(id: string): Promise<void> {\n await this.withRetry(\n () => this.conn.tooling.destroy(\"ApexClass\" as any, id),\n `delete ${id}`,\n );\n }\n\n async queryApexRestAndInvocableClasses(): Promise<{\n rest: Array<{ name: string; urlMapping?: string }>;\n invocable: Array<{ name: string }>;\n }> {\n const result = await this.conn.tooling.query(\n \"SELECT Name, Body FROM ApexClass ORDER BY Name\",\n );\n\n const rest: Array<{ name: string; urlMapping?: string }> = [];\n const invocable: Array<{ name: string }> = [];\n\n for (const r of result.records as any[]) {\n if (r.Body?.includes(\"@RestResource\")) {\n const match = r.Body.match(\n /@RestResource\\s*\\(\\s*urlMapping\\s*=\\s*'([^']+)'/,\n );\n rest.push({ name: r.Name, urlMapping: match ? match[1] : undefined });\n }\n if (r.Body?.includes(\"@InvocableMethod\")) {\n invocable.push({ name: r.Name });\n }\n }\n\n return { rest, invocable };\n }\n\n // --- Streaming ---\n\n async queryStreamingChannels(): Promise<ChannelInfo[]> {\n const result = await this.conn.describeGlobal();\n const channels: ChannelInfo[] = [];\n\n for (const sobject of result.sobjects) {\n if (sobject.name.endsWith(\"__e\")) {\n channels.push({\n value: `/event/${sobject.name}`,\n label: `${sobject.label} (${sobject.name})`,\n group: \"Platform Events\",\n });\n } else if (sobject.name.endsWith(\"ChangeEvent\")) {\n channels.push({\n value: `/data/${sobject.name}`,\n label: `${sobject.label} (${sobject.name})`,\n group: \"Change Data Capture\",\n });\n }\n }\n\n channels.push({\n value: \"/data/ChangeEvents\",\n label: \"All Change Events\",\n group: \"Change Data Capture\",\n });\n\n return channels;\n }\n\n // --- Retry ---\n\n private async withRetry<T>(fn: () => Promise<T>, label: string): Promise<T> {\n for (let attempt = 1; attempt <= SalesforceClient.MAX_RETRIES; attempt++) {\n try {\n return await fn();\n } catch (err) {\n if (attempt === SalesforceClient.MAX_RETRIES) throw err;\n const delay = SalesforceClient.RETRY_DELAY_MS * attempt;\n console.warn(\n `[SalesforceClient] ${label} failed (attempt ${attempt}/${SalesforceClient.MAX_RETRIES}), retrying in ${delay}ms...`,\n );\n await new Promise((r) => setTimeout(r, delay));\n }\n }\n throw new Error(\"unreachable\");\n }\n}\n","import type { RED } from \"@bonsae/nrg/server\";\nimport { getConnection } from \"../connection\";\nimport { SalesforceClient } from \"../../services/salesforce\";\n\nfunction initApexRoutes(RED: RED): void {\n RED.httpAdmin.get(\n \"/salesforce/list-apex-classes/:nodeId\",\n async (req, res) => {\n try {\n const conn = getConnection(RED, req.params.nodeId);\n const sf = new SalesforceClient(conn);\n res.json(await sf.queryApexRestAndInvocableClasses());\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n res.status(500).json({ error: message });\n }\n },\n );\n}\n\nexport { initApexRoutes };\n","import type { RED } from \"@bonsae/nrg/server\";\nimport { getConnection } from \"../connection\";\nimport { SalesforceClient } from \"../../services/salesforce\";\n\nfunction initStreamingRoutes(RED: RED): void {\n RED.httpAdmin.get(\n \"/salesforce/list-streaming-channels/:nodeId\",\n async (req, res) => {\n try {\n const conn = getConnection(RED, req.params.nodeId);\n const client = new SalesforceClient(conn);\n res.json(await client.queryStreamingChannels());\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n res.status(500).json({ error: message });\n }\n },\n );\n}\n\nexport { initStreamingRoutes };\n","import type { RED } from \"@bonsae/nrg/server\";\nimport { initAuthRoutes } from \"./routes/auth\";\nimport { initApexRoutes } from \"./routes/apex\";\nimport { initStreamingRoutes } from \"./routes/streaming\";\n\nfunction initRoutes(RED: RED): void {\n initAuthRoutes(RED);\n initApexRoutes(RED);\n initStreamingRoutes(RED);\n}\n\nexport { initRoutes };\n","import {\n ConfigNode,\n type Schema,\n type Infer,\n type RED,\n} from \"@bonsae/nrg/server\";\nimport jsforce, { type Connection } from \"jsforce\";\nimport {\n ConfigsSchema,\n CredentialsSchema,\n} from \"../schemas/salesforce-connection\";\nimport { initRoutes } from \"../api\";\n\ntype Config = Infer<typeof ConfigsSchema>;\ntype Credentials = Infer<typeof CredentialsSchema>;\n\nexport default class SalesforceConnection extends ConfigNode<\n Config,\n Credentials\n> {\n static override readonly type = \"salesforce-connection\";\n static override readonly configSchema: Schema = ConfigsSchema;\n static override readonly credentialsSchema: Schema = CredentialsSchema;\n\n private conn: Connection | null = null;\n\n static override async registered(RED: RED) {\n initRoutes(RED);\n }\n\n async getConnection(): Promise<Connection> {\n if (this.conn) return this.conn;\n\n const credentials = this.credentials;\n if (!credentials?.accessToken || !credentials?.instanceUrl) {\n throw new Error(\n \"Salesforce connection not authorized. Please authorize in the node configuration.\",\n );\n }\n\n this.conn = new jsforce.Connection({\n oauth2: {\n clientId: this.config.clientId,\n loginUrl: this.config.loginUrl,\n },\n instanceUrl: credentials.instanceUrl,\n accessToken: credentials.accessToken,\n refreshToken: credentials.refreshToken,\n version: this.config.apiVersion,\n });\n\n this.conn.on(\"refresh\", (newAccessToken: string) => {\n (this.RED.nodes as any).addCredentials(this.id, {\n ...this.credentials,\n accessToken: newAccessToken,\n });\n });\n\n return this.conn;\n }\n\n getAccessToken(): string | undefined {\n return this.credentials?.accessToken;\n }\n\n getInstanceUrl(): string | undefined {\n return this.credentials?.instanceUrl;\n }\n\n override async closed() {\n this.conn = null;\n }\n}\n","import { defineSchema, SchemaType } from \"@bonsae/nrg/server\";\nimport SalesforceConnection from \"../nodes/salesforce-connection\";\n\nexport const ConfigsSchema = defineSchema(\n {\n name: SchemaType.String({ default: \"\", \"x-nrg-form\": { icon: \"tag\" } }),\n connection: SchemaType.NodeRef(SalesforceConnection, {\n \"x-nrg-form\": { icon: \"cloud\" },\n }),\n query: SchemaType.TypedInput<string>({\n \"x-nrg-form\": {\n icon: \"search\",\n typedInputTypes: [\"str\", \"msg\", \"flow\", \"global\"],\n },\n }),\n errorPort: SchemaType.Boolean({ default: false }),\n completePort: SchemaType.Boolean({ default: false }),\n statusPort: SchemaType.Boolean({ default: false }),\n },\n { $id: \"salesforce-soql:config\" },\n);\n\nexport const InputSchema = defineSchema(\n {\n payload: SchemaType.Any(),\n },\n { $id: \"salesforce-soql:input\" },\n);\n\nexport const OutputSchema = defineSchema(\n {\n payload: SchemaType.Array(SchemaType.Any()),\n totalSize: SchemaType.Number(),\n done: SchemaType.Boolean(),\n },\n { $id: \"salesforce-soql:output\" },\n);\n","import { IONode, type Schema, type Infer } from \"@bonsae/nrg/server\";\nimport {\n ConfigsSchema,\n InputSchema,\n OutputSchema,\n} from \"../schemas/salesforce-soql\";\n\ntype Config = Infer<typeof ConfigsSchema>;\ntype Input = Infer<typeof InputSchema>;\ntype Output = Infer<typeof OutputSchema>;\n\nexport default class SalesforceSoql extends IONode<Config, any, Input, Output> {\n static override readonly type = \"salesforce-soql\";\n static override readonly category = \"salesforce\";\n static override readonly color: `#${string}` = \"#FFFFFF\";\n static override readonly configSchema: Schema = ConfigsSchema;\n static override readonly inputSchema: Schema = InputSchema;\n static override readonly outputsSchema: Schema = OutputSchema;\n\n override async input(msg: Input) {\n const connection = this.config.connection;\n if (!connection) {\n this.error(\"No Salesforce connection configured\", msg);\n return;\n }\n\n try {\n this.status({ fill: \"green\", shape: \"dot\", text: \"querying...\" });\n\n const conn = await connection.getConnection();\n const query = await this.config.query.resolve(msg);\n\n const result = await conn.query(query);\n\n this.status({\n fill: \"green\",\n shape: \"dot\",\n text: `${result.totalSize} records`,\n });\n this.send({\n ...msg,\n payload: result.records,\n totalSize: result.totalSize,\n done: result.done,\n });\n } catch (error) {\n this.status({\n fill: \"red\",\n shape: \"dot\",\n text: error instanceof Error ? error.message : String(error),\n });\n this.error(\n `SOQL query failed: ${error instanceof Error ? error.message : String(error)}`,\n msg,\n );\n }\n }\n}\n","import { defineSchema, SchemaType } from \"@bonsae/nrg/server\";\nimport SalesforceConnection from \"../nodes/salesforce-connection\";\n\nexport const ConfigsSchema = defineSchema(\n {\n name: SchemaType.String({ default: \"\", \"x-nrg-form\": { icon: \"tag\" } }),\n connection: SchemaType.NodeRef(SalesforceConnection, {\n \"x-nrg-form\": { icon: \"cloud\" },\n }),\n operation: SchemaType.Union(\n [\n SchemaType.Literal(\"create\"),\n SchemaType.Literal(\"read\"),\n SchemaType.Literal(\"update\"),\n SchemaType.Literal(\"delete\"),\n SchemaType.Literal(\"upsert\"),\n ],\n { default: \"create\", \"x-nrg-form\": { icon: \"pencil\" } },\n ),\n sObjectType: SchemaType.TypedInput<string>({\n \"x-nrg-form\": {\n icon: \"cube\",\n typedInputTypes: [\"str\", \"msg\"],\n },\n }),\n record: SchemaType.TypedInput<any>({\n \"x-nrg-form\": {\n icon: \"file-code-o\",\n typedInputTypes: [\"json\", \"msg\"],\n },\n }),\n externalIdField: SchemaType.Optional(\n SchemaType.String({\n default: \"\",\n \"x-nrg-form\": { icon: \"key\" },\n }),\n ),\n errorPort: SchemaType.Boolean({ default: false }),\n completePort: SchemaType.Boolean({ default: false }),\n statusPort: SchemaType.Boolean({ default: false }),\n },\n {\n $id: \"salesforce-dml:config\",\n if: SchemaType.Object({\n operation: SchemaType.Literal(\"upsert\"),\n }),\n then: SchemaType.Object({\n externalIdField: SchemaType.String({ minLength: 1 }),\n }),\n errorMessage: {\n properties: {\n externalIdField: \"External ID Field is required for upsert operations\",\n },\n },\n },\n);\n\nexport const InputSchema = defineSchema(\n {\n payload: SchemaType.Any(),\n },\n { $id: \"salesforce-dml:input\" },\n);\n\nexport const OutputSchema = defineSchema(\n {\n payload: SchemaType.Any(),\n },\n { $id: \"salesforce-dml:output\" },\n);\n","import { IONode, type Schema, type Infer } from \"@bonsae/nrg/server\";\nimport {\n ConfigsSchema,\n InputSchema,\n OutputSchema,\n} from \"../schemas/salesforce-dml\";\n\ntype Config = Infer<typeof ConfigsSchema>;\ntype Input = Infer<typeof InputSchema>;\ntype Output = Infer<typeof OutputSchema>;\n\nexport default class SalesforceDml extends IONode<Config, any, Input, Output> {\n static override readonly type = \"salesforce-dml\";\n static override readonly category = \"salesforce\";\n static override readonly color: `#${string}` = \"#FFFFFF\";\n static override readonly configSchema: Schema = ConfigsSchema;\n static override readonly inputSchema: Schema = InputSchema;\n static override readonly outputsSchema: Schema = OutputSchema;\n\n override async input(msg: Input) {\n const connection = this.config.connection;\n if (!connection) {\n this.error(\"No Salesforce connection configured\", msg);\n return;\n }\n\n try {\n const operation = this.config.operation;\n this.status({ fill: \"green\", shape: \"dot\", text: `${operation}...` });\n\n const conn = await connection.getConnection();\n const sObjectType = await this.config.sObjectType.resolve(msg);\n const sobject = conn.sobject(sObjectType);\n\n // Use record from config if set, otherwise fall back to msg.payload\n const data = (await this.config.record.resolve(msg)) ?? msg.payload;\n\n let result: any;\n\n switch (operation) {\n case \"create\":\n result = await sobject.create(data);\n break;\n case \"read\":\n result = await sobject.retrieve(data);\n break;\n case \"update\":\n result = await sobject.update(data);\n break;\n case \"delete\":\n result = await sobject.destroy(data);\n break;\n case \"upsert\":\n result = await sobject.upsert(data, this.config.externalIdField!);\n break;\n default:\n throw new Error(`Unknown operation: ${operation}`);\n }\n\n this.status({ fill: \"green\", shape: \"dot\", text: `${operation} done` });\n this.send({ ...msg, payload: result });\n } catch (error) {\n this.status({\n fill: \"red\",\n shape: \"dot\",\n text: error instanceof Error ? error.message : String(error),\n });\n this.error(\n `DML ${this.config.operation} failed: ${error instanceof Error ? error.message : String(error)}`,\n msg,\n );\n }\n }\n}\n","import { defineSchema, SchemaType } from \"@bonsae/nrg/server\";\nimport SalesforceConnection from \"../nodes/salesforce-connection\";\n\nexport const ConfigsSchema = defineSchema(\n {\n name: SchemaType.String({ default: \"\", \"x-nrg-form\": { icon: \"tag\" } }),\n connection: SchemaType.NodeRef(SalesforceConnection, {\n \"x-nrg-form\": { icon: \"cloud\" },\n }),\n operation: SchemaType.Union(\n [\n SchemaType.Literal(\"insert\"),\n SchemaType.Literal(\"update\"),\n SchemaType.Literal(\"upsert\"),\n SchemaType.Literal(\"delete\"),\n SchemaType.Literal(\"hardDelete\"),\n SchemaType.Literal(\"query\"),\n ],\n { default: \"insert\", \"x-nrg-form\": { icon: \"database\" } },\n ),\n sObjectType: SchemaType.TypedInput<string>({\n \"x-nrg-form\": {\n icon: \"cube\",\n typedInputTypes: [\"str\", \"msg\"],\n },\n }),\n query: SchemaType.TypedInput<string>({\n \"x-nrg-form\": {\n icon: \"search\",\n typedInputTypes: [\"str\", \"msg\", \"jsonata\"],\n },\n }),\n externalIdField: SchemaType.Optional(\n SchemaType.String({\n default: \"\",\n \"x-nrg-form\": { icon: \"key\" },\n }),\n ),\n assignmentRuleId: SchemaType.Optional(\n SchemaType.String({\n default: \"\",\n \"x-nrg-form\": { icon: \"gavel\" },\n }),\n ),\n columnDelimiter: SchemaType.Union(\n [\n SchemaType.Literal(\"COMMA\"),\n SchemaType.Literal(\"TAB\"),\n SchemaType.Literal(\"PIPE\"),\n SchemaType.Literal(\"SEMICOLON\"),\n SchemaType.Literal(\"CARET\"),\n SchemaType.Literal(\"BACKQUOTE\"),\n ],\n { default: \"COMMA\", \"x-nrg-form\": { icon: \"columns\" } },\n ),\n lineEnding: SchemaType.Union(\n [SchemaType.Literal(\"LF\"), SchemaType.Literal(\"CRLF\")],\n { default: \"LF\", \"x-nrg-form\": { icon: \"level-down\" } },\n ),\n pollInterval: SchemaType.Number({\n default: 5000,\n minimum: 1000,\n \"x-nrg-form\": { icon: \"clock-o\" },\n }),\n pollTimeout: SchemaType.Number({\n default: 60000,\n minimum: 5000,\n \"x-nrg-form\": { icon: \"hourglass\" },\n }),\n errorPort: SchemaType.Boolean({ default: false }),\n completePort: SchemaType.Boolean({ default: false }),\n statusPort: SchemaType.Boolean({ default: false }),\n },\n {\n $id: \"salesforce-bulk:config\",\n if: SchemaType.Object({\n operation: SchemaType.Literal(\"upsert\"),\n }),\n then: SchemaType.Object({\n externalIdField: SchemaType.String({ minLength: 1 }),\n }),\n errorMessage: {\n properties: {\n externalIdField: \"External ID Field is required for upsert operations\",\n },\n },\n },\n);\n\nexport const InputSchema = defineSchema(\n {\n payload: SchemaType.Any({\n description:\n \"Records array, CSV string, readable stream (ingest) or SOQL string (query)\",\n }),\n },\n { $id: \"salesforce-bulk:input\" },\n);\n\nexport const OutputSchema = defineSchema(\n {\n payload: SchemaType.Any({\n description:\n \"Query: individual record. Ingest: { successfulResults, failedResults, unprocessedRecords }\",\n }),\n },\n { $id: \"salesforce-bulk:output\" },\n);\n","import { IONode, type Schema, type Infer } from \"@bonsae/nrg/server\";\nimport type { Connection } from \"jsforce\";\nimport type { Readable } from \"stream\";\nimport {\n ConfigsSchema,\n InputSchema,\n OutputSchema,\n} from \"../schemas/salesforce-bulk\";\n\ntype Config = Infer<typeof ConfigsSchema>;\ntype Input = { payload: string | Record<string, unknown>[] | Readable };\n\nexport default class SalesforceBulk extends IONode<Config, any, Input> {\n static override readonly type = \"salesforce-bulk\";\n static override readonly category = \"salesforce\";\n static override readonly color: `#${string}` = \"#FFFFFF\";\n static override readonly configSchema: Schema = ConfigsSchema;\n static override readonly inputSchema: Schema = InputSchema;\n static override readonly outputsSchema: Schema = OutputSchema;\n\n override async input(msg: Input) {\n try {\n const connection = this.config.connection;\n if (!connection) {\n throw new Error(\"No Salesforce connection configured\");\n }\n\n const conn = await connection.getConnection();\n const operation = this.config.operation;\n\n if (operation === \"query\") {\n await this.executeQuery(conn, msg);\n } else {\n await this.executeIngest(conn, msg, operation);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n this.status({ fill: \"red\", shape: \"dot\", text: message });\n throw error;\n }\n }\n\n private async executeQuery(conn: Connection, msg: Input) {\n this.status({ fill: \"green\", shape: \"dot\", text: \"query starting...\" });\n\n const soql = await this.config.query.resolve(msg);\n const stream = await conn.bulk2.query(soql, {\n pollTimeout: this.config.pollTimeout,\n pollInterval: this.config.pollInterval,\n columnDelimiter: this.config.columnDelimiter,\n lineEnding: this.config.lineEnding,\n });\n\n let count = 0;\n await new Promise<void>((resolve, reject) => {\n stream.on(\"data\", (record: unknown) => {\n count++;\n this.send({ ...msg, payload: record });\n if (count % 1000 === 0) {\n this.status({\n fill: \"green\",\n shape: \"dot\",\n text: `query: ${count} records...`,\n });\n }\n });\n stream.on(\"end\", () => resolve());\n stream.on(\"error\", reject);\n });\n\n this.status({\n fill: \"green\",\n shape: \"dot\",\n text: `query complete: ${count} records`,\n });\n }\n\n private async executeIngest(\n conn: Connection,\n msg: Input,\n operation: \"insert\" | \"update\" | \"upsert\" | \"delete\" | \"hardDelete\",\n ) {\n const sObjectType = await this.config.sObjectType.resolve(msg);\n\n this.status({\n fill: \"green\",\n shape: \"dot\",\n text: `creating ${operation} job...`,\n });\n\n const job = conn.bulk2.createJob({\n operation,\n object: sObjectType,\n columnDelimiter: this.config.columnDelimiter,\n lineEnding: this.config.lineEnding,\n ...(operation === \"upsert\" && this.config.externalIdField\n ? { externalIdFieldName: this.config.externalIdField }\n : {}),\n ...(this.config.assignmentRuleId\n ? { assignmentRuleId: this.config.assignmentRuleId }\n : {}),\n });\n\n await job.open();\n this.status({\n fill: \"green\",\n shape: \"dot\",\n text: `uploading data...`,\n });\n\n // jsforce accepts Record[], string (CSV), or Readable stream\n await job.uploadData(msg.payload);\n\n this.status({\n fill: \"green\",\n shape: \"dot\",\n text: `processing...`,\n });\n\n await job.close();\n await job.poll(this.config.pollInterval, this.config.pollTimeout);\n\n this.status({\n fill: \"green\",\n shape: \"dot\",\n text: `retrieving results...`,\n });\n\n const results = await job.getAllResults();\n const successCount = results.successfulResults?.length ?? 0;\n const failureCount = results.failedResults?.length ?? 0;\n const totalRecords =\n successCount + failureCount + (results.unprocessedRecords?.length ?? 0);\n\n this.send({ ...msg, payload: results });\n\n this.status({\n fill: failureCount > 0 ? \"red\" : \"green\",\n shape: \"dot\",\n text: `${operation} complete: ${successCount} ok, ${failureCount} failed, ${totalRecords} total`,\n });\n }\n}\n","import { defineSchema, SchemaType } from \"@bonsae/nrg/server\";\nimport SalesforceConnection from \"../nodes/salesforce-connection\";\n\nexport const ConfigsSchema = defineSchema(\n {\n name: SchemaType.String({ default: \"\", \"x-nrg-form\": { icon: \"tag\" } }),\n connection: SchemaType.NodeRef(SalesforceConnection, {\n \"x-nrg-form\": { icon: \"cloud\" },\n }),\n sObjectType: SchemaType.TypedInput<string>({\n \"x-nrg-form\": {\n icon: \"cube\",\n typedInputTypes: [\"str\", \"msg\"],\n },\n }),\n errorPort: SchemaType.Boolean({ default: false }),\n completePort: SchemaType.Boolean({ default: false }),\n statusPort: SchemaType.Boolean({ default: false }),\n },\n { $id: \"salesforce-describe:config\" },\n);\n\nexport const InputSchema = defineSchema(\n {\n payload: SchemaType.Any(),\n },\n { $id: \"salesforce-describe:input\" },\n);\n\nexport const OutputSchema = defineSchema(\n {\n payload: SchemaType.Object({\n name: SchemaType.String(),\n fields: SchemaType.Array(SchemaType.Any()),\n childRelationships: SchemaType.Array(SchemaType.Any()),\n recordTypeInfos: SchemaType.Array(SchemaType.Any()),\n }),\n },\n { $id: \"salesforce-describe:output\" },\n);\n","import { IONode, type Schema, type Infer } from \"@bonsae/nrg/server\";\nimport {\n ConfigsSchema,\n InputSchema,\n OutputSchema,\n} from \"../schemas/salesforce-describe\";\n\ntype Config = Infer<typeof ConfigsSchema>;\ntype Input = Infer<typeof InputSchema>;\ntype Output = Infer<typeof OutputSchema>;\n\nexport default class SalesforceDescribe extends IONode<\n Config,\n any,\n Input,\n Output\n> {\n static override readonly type = \"salesforce-describe\";\n static override readonly category = \"salesforce\";\n static override readonly color: `#${string}` = \"#FFFFFF\";\n static override readonly configSchema: Schema = ConfigsSchema;\n static override readonly inputSchema: Schema = InputSchema;\n static override readonly outputsSchema: Schema = OutputSchema;\n\n override async input(msg: Input) {\n const connection = this.config.connection;\n if (!connection) {\n this.error(\"No Salesforce connection configured\", msg);\n return;\n }\n\n try {\n this.status({ fill: \"green\", shape: \"dot\", text: \"describing...\" });\n\n const conn = await connection.getConnection();\n const sObjectType = await this.config.sObjectType.resolve(msg);\n const result = await conn.sobject(sObjectType).describe();\n\n this.status({\n fill: \"green\",\n shape: \"dot\",\n text: `${result.name}: ${result.fields.length} fields`,\n });\n this.send({\n ...msg,\n payload: {\n name: result.name,\n fields: result.fields,\n childRelationships: result.childRelationships,\n recordTypeInfos: result.recordTypeInfos,\n },\n });\n } catch (error) {\n this.status({\n fill: \"red\",\n shape: \"dot\",\n text: error instanceof Error ? error.message : String(error),\n });\n this.error(\n `Describe failed: ${error instanceof Error ? error.message : String(error)}`,\n msg,\n );\n }\n }\n}\n","import { defineSchema, SchemaType } from \"@bonsae/nrg/server\";\nimport SalesforceConnection from \"../nodes/salesforce-connection\";\n\nexport const ConfigsSchema = defineSchema(\n {\n name: SchemaType.String({ default: \"\", \"x-nrg-form\": { icon: \"tag\" } }),\n connection: SchemaType.NodeRef(SalesforceConnection, {\n \"x-nrg-form\": { icon: \"cloud\" },\n }),\n channelName: SchemaType.String({\n default: \"\",\n \"x-nrg-form\": { icon: \"rss\" },\n }),\n subscribeType: SchemaType.Union(\n [\n SchemaType.Literal(\"LATEST\"),\n SchemaType.Literal(\"EARLIEST\"),\n SchemaType.Literal(\"CUSTOM\"),\n ],\n { default: \"LATEST\", \"x-nrg-form\": { icon: \"history\" } },\n ),\n replayId: SchemaType.Optional(\n SchemaType.String({\n default: \"\",\n \"x-nrg-form\": { icon: \"bookmark\" },\n }),\n ),\n numRequested: SchemaType.Number({\n default: 100,\n minimum: 1,\n maximum: 100,\n \"x-nrg-form\": { icon: \"sort-numeric-asc\" },\n }),\n errorPort: SchemaType.Boolean({ default: false }),\n completePort: SchemaType.Boolean({ default: false }),\n statusPort: SchemaType.Boolean({ default: false }),\n },\n {\n $id: \"salesforce-streaming:config\",\n if: SchemaType.Object({\n subscribeType: SchemaType.Literal(\"CUSTOM\"),\n }),\n then: SchemaType.Object({\n replayId: SchemaType.String({ minLength: 1 }),\n }),\n errorMessage: {\n properties: {\n replayId: \"Replay ID is required when Subscribe Type is CUSTOM\",\n },\n },\n },\n);\n\nexport const OutputSchema = defineSchema(\n {\n payload: SchemaType.Any(),\n replayId: SchemaType.Any(),\n channel: SchemaType.String(),\n topic: SchemaType.String(),\n },\n { $id: \"salesforce-streaming:output\" },\n);\n","import { IONode, type Schema, type Infer } from \"@bonsae/nrg/server\";\nimport type { Connection } from \"jsforce\";\nimport { ConfigsSchema, OutputSchema } from \"../schemas/salesforce-streaming\";\nimport type SalesforceConnection from \"./salesforce-connection\";\n\ntype Config = Infer<typeof ConfigsSchema>;\ntype Output = Infer<typeof OutputSchema>;\n\nexport default class SalesforceStreaming extends IONode<\n Config,\n any,\n any,\n Output\n> {\n static override readonly type = \"salesforce-streaming\";\n static override readonly category = \"salesforce\";\n static override readonly color: `#${string}` = \"#FFFFFF\";\n static override readonly configSchema: Schema = ConfigsSchema;\n static override readonly outputsSchema: Schema = OutputSchema;\n\n private client: any = null;\n private reconnectAttempt = 0;\n private maxReconnectDelay = 60000;\n private maxReconnectAttempts = 10;\n private grpcErrorHandler: ((err: Error) => void) | null = null;\n private stopped = false;\n\n override async created() {\n const connection = this.config.connection as SalesforceConnection;\n if (!connection) {\n this.status({ fill: \"red\", shape: \"dot\", text: \"no connection\" });\n this.error(\"No Salesforce connection configured\");\n return;\n }\n\n await this.subscribe(connection);\n }\n\n private async subscribe(connection: SalesforceConnection) {\n if (this.stopped) return;\n try {\n this.status({ fill: \"green\", shape: \"dot\", text: \"connecting...\" });\n\n // Refresh the jsforce connection to get a fresh token\n // (jsforce auto-refreshes expired tokens via the refresh event)\n let conn: Connection;\n try {\n conn = await connection.getConnection();\n // Validate the token is still valid with a lightweight API call\n await conn.identity();\n } catch {\n this.status({ fill: \"red\", shape: \"dot\", text: \"auth expired\" });\n this.error(\"Salesforce token expired. Re-authorize the connection.\");\n return;\n }\n\n // Use the token from the jsforce connection directly — it may have been\n // refreshed during conn.identity() and the credentials snapshot could be stale\n const accessToken = conn.accessToken;\n const instanceUrl = conn.instanceUrl;\n\n if (!accessToken || !instanceUrl) {\n this.status({ fill: \"red\", shape: \"dot\", text: \"not authorized\" });\n this.error(\"Salesforce connection not authorized\");\n return;\n }\n\n const PubSubApiClient = (await import(\"salesforce-pubsub-api-client\"))\n .default;\n\n this.client = new PubSubApiClient({\n authType: \"user-supplied\",\n accessToken,\n instanceUrl,\n });\n\n await this.client.connect();\n\n const numRequested = this.config.numRequested || null;\n const channelName = this.config.channelName;\n\n const callback = (\n _subscription: any,\n callbackType: string,\n data?: any,\n ) => {\n if (callbackType === \"event\" || callbackType === \"lastevent\") {\n this.send({\n payload: data?.payload ?? data,\n replayId: data?.replayId,\n channel: channelName,\n topic: channelName,\n });\n } else if (callbackType === \"error\") {\n const errorMsg =\n data instanceof Error\n ? data.message\n : String(data ?? \"stream error\");\n this.warn(`Streaming error: ${errorMsg}`);\n\n // Stop retrying on auth errors — token is expired\n if (\n errorMsg.includes(\"UNAUTHENTICATED\") ||\n errorMsg.includes(\"authentication\")\n ) {\n this.stopped = true;\n this.status({\n fill: \"red\",\n shape: \"dot\",\n text: \"auth expired — re-authorize\",\n });\n this.error(\n \"Salesforce token expired. Re-authorize the connection.\",\n );\n this.cleanup();\n return;\n }\n\n this.status({ fill: \"red\", shape: \"dot\", text: errorMsg });\n this.scheduleReconnect(connection);\n } else if (callbackType === \"end\") {\n if (this.stopped) return;\n this.log(\"Streaming subscription ended\");\n this.status({ fill: \"red\", shape: \"dot\", text: \"disconnected\" });\n this.scheduleReconnect(connection);\n }\n };\n\n // Guard against uncaught gRPC errors that crash the process.\n // The @grpc/grpc-js library can throw before the pubsub client\n // attaches its own error handler to the bidi stream.\n if (this.grpcErrorHandler) {\n process.removeListener(\"uncaughtException\", this.grpcErrorHandler);\n }\n this.grpcErrorHandler = (err: Error) => {\n if (\n err.message?.includes(\"UNAUTHENTICATED\") ||\n err.message?.includes(\"authentication\")\n ) {\n this.stopped = true;\n this.warn(`Caught gRPC auth error: ${err.message}`);\n this.status({\n fill: \"red\",\n shape: \"dot\",\n text: \"auth expired — re-authorize\",\n });\n this.cleanup();\n // Don't rethrow — we handled it\n }\n };\n process.on(\"uncaughtException\", this.grpcErrorHandler);\n\n if (this.config.subscribeType === \"EARLIEST\") {\n this.client.subscribeFromEarliestEvent(\n channelName,\n callback,\n numRequested,\n );\n } else if (\n this.config.subscribeType === \"CUSTOM\" &&\n this.config.replayId\n ) {\n const replayId = parseInt(this.config.replayId, 10);\n this.client.subscribeFromReplayId(\n channelName,\n callback,\n numRequested,\n replayId,\n );\n } else {\n this.client.subscribe(channelName, callback, numRequested);\n }\n\n this.status({\n fill: \"green\",\n shape: \"dot\",\n text: `subscribed: ${channelName}`,\n });\n this.reconnectAttempt = 0;\n } catch (error) {\n this.status({\n fill: \"red\",\n shape: \"dot\",\n text: error instanceof Error ? error.message : String(error),\n });\n this.error(\n `Streaming subscription failed: ${error instanceof Error ? error.message : String(error)}`,\n );\n this.scheduleReconnect(connection);\n }\n }\n\n private scheduleReconnect(connection: SalesforceConnection) {\n if (this.stopped) return;\n this.reconnectAttempt++;\n\n if (this.reconnectAttempt > this.maxReconnectAttempts) {\n this.error(\n `Streaming: max reconnect attempts (${this.maxReconnectAttempts}) reached. Giving up.`,\n );\n this.status({\n fill: \"red\",\n shape: \"dot\",\n text: \"reconnect failed — re-deploy to retry\",\n });\n return;\n }\n\n const delay = Math.min(\n 1000 * Math.pow(2, this.reconnectAttempt),\n this.maxReconnectDelay,\n );\n this.log(\n `Scheduling reconnect in ${delay}ms (attempt ${this.reconnectAttempt}/${this.maxReconnectAttempts})`,\n );\n this.status({\n fill: \"green\",\n shape: \"dot\",\n text: `reconnecting in ${Math.round(delay / 1000)}s`,\n });\n this.setTimeout(async () => {\n await this.cleanup();\n await this.subscribe(connection);\n }, delay);\n }\n\n private async cleanup() {\n try {\n if (this.grpcErrorHandler) {\n process.removeListener(\"uncaughtException\", this.grpcErrorHandler);\n this.grpcErrorHandler = null;\n }\n if (this.client) {\n await this.client.close?.();\n this.client = null;\n }\n } catch {\n // Ignore cleanup errors\n }\n }\n\n override async closed() {\n await this.cleanup();\n }\n}\n","import { defineSchema, SchemaType } from \"@bonsae/nrg/server\";\nimport SalesforceConnection from \"../nodes/salesforce-connection\";\n\nexport const ConfigsSchema = defineSchema(\n {\n name: SchemaType.String({ default: \"\", \"x-nrg-form\": { icon: \"tag\" } }),\n connection: SchemaType.NodeRef(SalesforceConnection, {\n \"x-nrg-form\": { icon: \"cloud\" },\n }),\n apexType: SchemaType.Union(\n [SchemaType.Literal(\"rest\"), SchemaType.Literal(\"invocable\")],\n { default: \"rest\", \"x-nrg-form\": { icon: \"cog\" } },\n ),\n // REST fields\n method: SchemaType.Union(\n [\n SchemaType.Literal(\"GET\"),\n SchemaType.Literal(\"POST\"),\n SchemaType.Literal(\"PUT\"),\n SchemaType.Literal(\"PATCH\"),\n SchemaType.Literal(\"DELETE\"),\n ],\n { default: \"POST\", \"x-nrg-form\": { icon: \"random\" } },\n ),\n path: SchemaType.TypedInput<string>({\n \"x-nrg-form\": {\n icon: \"link\",\n typedInputTypes: [\"str\", \"msg\"],\n },\n }),\n // Invocable field\n actionName: SchemaType.String({\n default: \"\",\n \"x-nrg-form\": { icon: \"bolt\" },\n }),\n errorPort: SchemaType.Boolean({ default: false }),\n completePort: SchemaType.Boolean({ default: false }),\n statusPort: SchemaType.Boolean({ default: false }),\n },\n { $id: \"salesforce-apex-invocation:config\" },\n);\n\nexport const InputSchema = defineSchema(\n { payload: SchemaType.Any() },\n { $id: \"salesforce-apex-invocation:input\" },\n);\n\nexport const OutputSchema = defineSchema(\n { payload: SchemaType.Any() },\n { $id: \"salesforce-apex-invocation:output\" },\n);\n","import { IONode, type Schema, type Infer } from \"@bonsae/nrg/server\";\nimport {\n ConfigsSchema,\n InputSchema,\n OutputSchema,\n} from \"../schemas/salesforce-apex-invocation\";\nimport { SalesforceClient } from \"../services/salesforce\";\n\ntype Config = Infer<typeof ConfigsSchema>;\ntype Input = Infer<typeof InputSchema>;\ntype Output = Infer<typeof OutputSchema>;\n\nexport default class SalesforceApex extends IONode<Config, any, Input, Output> {\n static override readonly type = \"salesforce-apex-invocation\";\n static override readonly category = \"salesforce\";\n static override readonly color: `#${string}` = \"#FFFFFF\";\n static override readonly configSchema: Schema = ConfigsSchema;\n static override readonly inputSchema: Schema = InputSchema;\n static override readonly outputsSchema: Schema = OutputSchema;\n\n override async input(msg: Input) {\n const connection = this.config.connection;\n if (!connection) {\n this.error(\"No Salesforce connection configured\", msg);\n return;\n }\n\n try {\n const conn = await connection.getConnection();\n this.status({ fill: \"green\", shape: \"dot\", text: \"executing...\" });\n\n if (this.config.apexType === \"rest\") {\n const path = await this.config.path.resolve(msg);\n const method = this.config.method.toLowerCase() as\n | \"get\"\n | \"post\"\n | \"put\"\n | \"patch\"\n | \"delete\";\n\n let result: any;\n if (method === \"get\" || method === \"delete\") {\n result = await conn.apex[method](path);\n } else {\n result = await conn.apex[method](path, msg.payload);\n }\n\n this.status({\n fill: \"green\",\n shape: \"dot\",\n text: `${this.config.method} done`,\n });\n this.send({ ...msg, payload: result });\n } else {\n const client = new SalesforceClient(conn);\n const action = await client.invoke(this.config.actionName, msg.payload);\n this.status({ fill: \"green\", shape: \"dot\", text: \"done\" });\n this.send({ ...msg, payload: action.outputValues });\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n this.status({ fill: \"red\", shape: \"dot\", text: message });\n this.error(`Apex failed: ${message}`, msg);\n }\n }\n}\n","import { defineSchema, SchemaType } from \"@bonsae/nrg/server\";\nimport SalesforceConnection from \"../nodes/salesforce-connection\";\n\nexport const ConfigsSchema = defineSchema(\n {\n name: SchemaType.String({ default: \"\", \"x-nrg-form\": { icon: \"tag\" } }),\n connection: SchemaType.NodeRef(SalesforceConnection, {\n \"x-nrg-form\": { icon: \"cloud\" },\n }),\n apexType: SchemaType.Union(\n [SchemaType.Literal(\"invocable\"), SchemaType.Literal(\"rest\")],\n { default: \"invocable\", \"x-nrg-form\": { icon: \"cog\" } },\n ),\n className: SchemaType.String({\n default: \"\",\n \"x-nrg-form\": { icon: \"file-code-o\" },\n }),\n urlMapping: SchemaType.String({\n default: \"\",\n \"x-nrg-form\": { icon: \"link\" },\n }),\n httpMethod: SchemaType.Union(\n [\n SchemaType.Literal(\"HttpGet\"),\n SchemaType.Literal(\"HttpPost\"),\n SchemaType.Literal(\"HttpPut\"),\n SchemaType.Literal(\"HttpPatch\"),\n SchemaType.Literal(\"HttpDelete\"),\n ],\n { default: \"HttpPost\", \"x-nrg-form\": { icon: \"random\" } },\n ),\n code: SchemaType.String({\n default: \"\",\n \"x-nrg-form\": { editorLanguage: \"java\" },\n }),\n errorPort: SchemaType.Boolean({ default: false }),\n completePort: SchemaType.Boolean({ default: false }),\n statusPort: SchemaType.Boolean({ default: false }),\n },\n { $id: \"salesforce-apex-code:config\" },\n);\n\nexport const SettingsSchema = defineSchema(\n {\n classPrefix: SchemaType.String({ default: \"NRG_\" }),\n },\n { $id: \"salesforce-apex-code:settings\" },\n);\n\nexport const InputSchema = defineSchema(\n { payload: SchemaType.Any() },\n { $id: \"salesforce-apex-code:input\" },\n);\n\nexport const OutputSchema = defineSchema(\n { payload: SchemaType.Any() },\n { $id: \"salesforce-apex-code:output\" },\n);\n","import type { Connection } from \"jsforce\";\nimport { SalesforceClient } from \"../services/salesforce\";\n\ninterface DeployRequest {\n className: string;\n body: string;\n resolve: (result: { id: string }) => void;\n reject: (error: Error) => void;\n}\n\ninterface ConnectionProvider {\n getConnection(): Promise<Connection>;\n}\n\nexport class ApexClassManager {\n private static instances = new Map<string, ApexClassManager>();\n private static readonly FLUSH_DELAY_MS = 500;\n\n private pendingDeploys = new Map<string, DeployRequest>();\n private pendingDeletes = new Set<string>();\n private flushTimer: ReturnType<typeof setTimeout> | null = null;\n private connectionProvider: ConnectionProvider;\n\n private constructor(connectionProvider: ConnectionProvider) {\n this.connectionProvider = connectionProvider;\n }\n\n static getInstance(\n connectionId: string,\n connectionProvider: ConnectionProvider,\n ): ApexClassManager {\n if (!ApexClassManager.instances.has(connectionId)) {\n ApexClassManager.instances.set(\n connectionId,\n new ApexClassManager(connectionProvider),\n );\n }\n return ApexClassManager.instances.get(connectionId)!;\n }\n\n static removeInstance(connectionId: string): void {\n ApexClassManager.instances.delete(connectionId);\n }\n\n register(className: string, body: string): Promise<{ id: string }> {\n this.pendingDeletes.delete(className);\n\n return new Promise((resolve, reject) => {\n this.pendingDeploys.set(className, { className, body, resolve, reject });\n this.scheduleFlush();\n });\n }\n\n unregister(className: string): void {\n const pending = this.pendingDeploys.get(className);\n if (pending) {\n pending.reject(new Error(\"Deploy cancelled — node was removed\"));\n this.pendingDeploys.delete(className);\n }\n\n this.pendingDeletes.add(className);\n this.scheduleFlush();\n }\n\n private scheduleFlush(): void {\n if (this.flushTimer) return;\n this.flushTimer = setTimeout(() => {\n this.flushTimer = null;\n this.flush().catch((err) => {\n console.error(\"[ApexClassManager] flush error:\", err);\n });\n }, ApexClassManager.FLUSH_DELAY_MS);\n }\n\n private async flush(): Promise<void> {\n const deletes = new Set(this.pendingDeletes);\n const deploys = new Map(this.pendingDeploys);\n this.pendingDeletes.clear();\n this.pendingDeploys.clear();\n\n if (deletes.size === 0 && deploys.size === 0) return;\n\n const conn = await this.connectionProvider.getConnection();\n const sf = new SalesforceClient(conn);\n\n const allNames = [...deletes, ...deploys.keys()];\n const existingByName = await sf.queryApexClassesByName(allNames);\n\n // Phase 1: Deletions first\n for (const className of deletes) {\n const record = existingByName.get(className);\n if (!record) continue;\n try {\n await sf.deleteApexClass(record.Id);\n } catch (err) {\n console.error(`[ApexClassManager] Failed to delete ${className}:`, err);\n }\n }\n\n // Phase 2: Creates (delete + recreate if body changed)\n for (const [className, request] of deploys) {\n try {\n const record = existingByName.get(className);\n\n if (record) {\n if (record.Body === request.body) {\n request.resolve({ id: record.Id });\n continue;\n }\n await sf.deleteApexClass(record.Id);\n }\n\n const { id } = await sf.createApexClass(className, request.body);\n request.resolve({ id });\n } catch (err) {\n request.reject(err instanceof Error ? err : new Error(String(err)));\n }\n }\n }\n}\n","export function buildInvocableClass(\n fullClassName: string,\n userCode: string,\n): string {\n return `public class ${fullClassName} {\n public class Input {\n @InvocableVariable(required=true)\n public String payload;\n }\n\n public class Output {\n @InvocableVariable\n public String result;\n }\n\n @InvocableMethod(label='${fullClassName}' description='Generated by NRG')\n public static List<Output> execute(List<Input> inputs) {\n Output out = new Output();\n Object returnValue = run(inputs[0].payload);\n out.result = returnValue instanceof String\n ? (String) returnValue\n : JSON.serialize(returnValue);\n return new List<Output>{ out };\n }\n\n private static Object run(String payload) {\n ${userCode}\n }\n}`;\n}\n\nexport type RestMethod =\n | \"HttpGet\"\n | \"HttpPost\"\n | \"HttpPut\"\n | \"HttpPatch\"\n | \"HttpDelete\";\n\nconst REST_METHOD_NAMES: Record<RestMethod, string> = {\n HttpGet: \"doGet\",\n HttpPost: \"doPost\",\n HttpPut: \"doPut\",\n HttpPatch: \"doPatch\",\n HttpDelete: \"doDelete\",\n};\n\nconst HAS_REQUEST_BODY: Record<RestMethod, boolean> = {\n HttpGet: false,\n HttpPost: true,\n HttpPut: true,\n HttpPatch: true,\n HttpDelete: false,\n};\n\nexport function buildRestClass(\n fullClassName: string,\n urlMapping: string,\n method: RestMethod,\n userCode: string,\n): string {\n const methodName = REST_METHOD_NAMES[method];\n const hasBody = HAS_REQUEST_BODY[method];\n\n const payloadLine = hasBody\n ? ` String payload = RestContext.request.requestBody != null\n ? RestContext.request.requestBody.toString()\n : null;`\n : ` String payload = RestContext.request.params != null\n ? JSON.serialize(RestContext.request.params)\n : null;`;\n\n return `@RestResource(urlMapping='${urlMapping}')\nglobal class ${fullClassName} {\n @${method}\n global static String ${methodName}() {\n${payloadLine}\n Object returnValue = run(payload);\n return returnValue instanceof String\n ? (String) returnValue\n : JSON.serialize(returnValue);\n }\n\n private static Object run(String payload) {\n ${userCode}\n }\n}`;\n}\n","import { IONode, type Schema, type Infer } from \"@bonsae/nrg/server\";\nimport {\n ConfigsSchema,\n InputSchema,\n OutputSchema,\n SettingsSchema,\n} from \"../schemas/salesforce-apex-code\";\nimport { ApexClassManager } from \"../lib/apex-class-manager\";\nimport { SalesforceClient } from \"../services/salesforce\";\nimport {\n buildInvocableClass,\n buildRestClass,\n type RestMethod,\n} from \"../lib/apex-templates\";\n\ntype Config = Infer<typeof ConfigsSchema>;\ntype Input = Infer<typeof InputSchema>;\ntype Output = Infer<typeof OutputSchema>;\ntype Settings = Infer<typeof SettingsSchema>;\n\nexport default class SalesforceApexCode extends IONode<\n Config,\n any,\n Input,\n Output,\n Settings\n> {\n static override readonly type = \"salesforce-apex-code\";\n static override readonly category = \"salesforce\";\n static override readonly color: `#${string}` = \"#FFFFFF\";\n static override readonly configSchema: Schema = ConfigsSchema;\n static override readonly inputSchema: Schema = InputSchema;\n static override readonly outputsSchema: Schema = OutputSchema;\n static override readonly settingsSchema: Schema = SettingsSchema;\n\n private deployed = false;\n\n private getFullClassName(): string {\n return `${this.settings.classPrefix}${this.config.className}`;\n }\n\n private buildApexBody(): string {\n const fullClassName = this.getFullClassName();\n if (this.config.apexType === \"rest\") {\n return buildRestClass(\n fullClassName,\n this.config.urlMapping,\n this.config.httpMethod as RestMethod,\n this.config.code,\n );\n }\n return buildInvocableClass(fullClassName, this.config.code);\n }\n\n override async created() {\n const connection = this.config.connection;\n if (!connection) {\n this.status({ fill: \"red\", shape: \"dot\", text: \"no connection\" });\n return;\n }\n if (!this.config.className) {\n this.status({ fill: \"red\", shape: \"dot\", text: \"class name required\" });\n return;\n }\n\n const manager = ApexClassManager.getInstance(\n (connection as any).id,\n connection,\n );\n\n this.status({ fill: \"green\", shape: \"dot\", text: \"deploying...\" });\n\n manager\n .register(this.getFullClassName(), this.buildApexBody())\n .then(() => {\n this.deployed = true;\n this.status({ fill: \"green\", shape: \"dot\", text: \"deployed\" });\n })\n .catch((err) => {\n const message = err instanceof Error ? err.message : String(err);\n this.status({ fill: \"red\", shape: \"dot\", text: message });\n this.error(`Apex deploy failed: ${message}`);\n });\n }\n\n override async input(msg: Input) {\n if (!this.deployed) {\n this.error(\n \"Apex class not yet deployed — wait for deployment to complete\",\n msg,\n );\n return;\n }\n\n const connection = this.config.connection;\n if (!connection) {\n this.error(\"No Salesforce connection configured\", msg);\n return;\n }\n\n try {\n const conn = await connection.getConnection();\n const client = new SalesforceClient(conn);\n this.status({ fill: \"green\", shape: \"dot\", text: \"executing...\" });\n\n if (this.config.apexType === \"invocable\") {\n const action = await client.invoke(\n this.getFullClassName(),\n msg.payload,\n );\n this.status({ fill: \"green\", shape: \"dot\", text: \"done\" });\n this.send({ ...msg, payload: action.outputValues });\n } else {\n const path = this.config.urlMapping;\n const method = this.config.httpMethod;\n let result: string;\n\n if (method === \"HttpGet\" || method === \"HttpDelete\") {\n result =\n method === \"HttpGet\"\n ? await client.get(path)\n : await client.delete(path);\n } else {\n const fn =\n method === \"HttpPut\"\n ? \"put\"\n : method === \"HttpPatch\"\n ? \"patch\"\n : \"post\";\n result = await client[fn](path, msg.payload);\n }\n\n this.status({ fill: \"green\", shape: \"dot\", text: \"done\" });\n this.send({ ...msg, payload: result });\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n this.status({ fill: \"red\", shape: \"dot\", text: message });\n this.error(`Apex execution failed: ${message}`, msg);\n }\n }\n\n override async closed(removed?: boolean) {\n if (removed) {\n const connection = this.config.connection;\n if (connection) {\n const manager = ApexClassManager.getInstance(\n (connection as any).id,\n connection,\n );\n manager.unregister(this.getFullClassName());\n }\n }\n this.deployed = false;\n }\n}\n","import { defineModule } from \"@bonsae/nrg/server\";\nimport SalesforceConnection from \"./nodes/salesforce-connection\";\nimport SalesforceSoql from \"./nodes/salesforce-soql\";\nimport SalesforceDml from \"./nodes/salesforce-dml\";\nimport SalesforceBulk from \"./nodes/salesforce-bulk\";\nimport SalesforceDescribe from \"./nodes/salesforce-describe\";\nimport SalesforceStreaming from \"./nodes/salesforce-streaming\";\nimport SalesforceApexInvocation from \"./nodes/salesforce-apex-invocation\";\nimport SalesforceApexCode from \"./nodes/salesforce-apex-code\";\n\nexport default defineModule({\n nodes: [\n SalesforceConnection,\n SalesforceSoql,\n SalesforceDml,\n SalesforceBulk,\n SalesforceDescribe,\n SalesforceStreaming,\n SalesforceApexInvocation,\n SalesforceApexCode,\n ],\n});\n"],"names":["ConfigsSchema","__nrgRegisterTypes","defineSchema","SchemaType","ConfigNode","IONode","defineModule","jsforce","crypto","ConfigsSchema$7","CredentialsSchema","AUTH_STATE_TTL","generateCodeVerifier","__name","generateCodeChallenge","verifier","createAuthState","params","state","codeVerifier","codeChallenge","pendingAuthStates","key","value","consumeAuthState","entry","escapeHtml","str","errorPage","message","autoClose","script","initAuthRoutes","RED","adminRoot","req","res","nodeId","loginUrl","clientId","overrideCallbackUrl","callbackUrl","error","code","oauthError","error_description","tokenResponse","errorBody","tokens","messageData","credentials","authenticated","getConnection","_SalesforceClient","__publicField","fullClassName","payload","version","action","errors","e","path","names","namesList","n","result","map","record","name","body","_a","id","rest","invocable","r","match","_b","channels","sobject","label","attempt","fn","err","delay","SalesforceClient","initApexRoutes","conn","sf","initStreamingRoutes","client","_SalesforceConnection","initRoutes","newAccessToken","SalesforceConnection","ConfigsSchema$6","InputSchema","InputSchema$5","OutputSchema$6","_SalesforceSoql","msg","connection","query","SalesforceSoql","ConfigsSchema$5","InputSchema$4","OutputSchema$5","_SalesforceDml","operation","sObjectType","data","SalesforceDml","ConfigsSchema$4","InputSchema$3","OutputSchema","OutputSchema$4","_SalesforceBulk","soql","stream","count","resolve","reject","job","results","successCount","failureCount","totalRecords","_c","SalesforceBulk","ConfigsSchema$3","InputSchema$2","OutputSchema$3","_SalesforceDescribe","SalesforceDescribe","ConfigsSchema$2","OutputSchema$2","_SalesforceStreaming","accessToken","instanceUrl","PubSubApiClient","numRequested","channelName","callback","_subscription","callbackType","errorMsg","replayId","SalesforceStreaming","ConfigsSchema$1","InputSchema$1","OutputSchema$1","_SalesforceApex","method","SalesforceApex","SettingsSchema","_ApexClassManager","connectionProvider","connectionId","className","pending","deletes","deploys","allNames","existingByName","request","ApexClassManager","buildInvocableClass","userCode","buildRestClass","urlMapping","methodName","REST_METHOD_NAMES","payloadLine","HAS_REQUEST_BODY","_SalesforceApexCode","manager","removed","SalesforceApexCode","index","SalesforceApexInvocation"],"mappings":";;;;;;AAEO,SAAMA,iBAAgBC,SAAA;AAAA,SAC3B,gBAAAC,GAAA,cAAAC,GAAA,cAAAC,GAAA,UAAAC,GAAA,gBAAAC,SAAA;AAAA,OACEC,OAAM;AAAiC,OACvCC,OAAU;;AACC,MACTC,KAAgBP;AAAA,EAAc;AAAA,IAEhC,MAAAC,EAAU,kBAAkB,GAAA,CAAA;AAAA,IAAA,YACjB,OAAA;AAAA,MACT,SAAA;AAAA,MACD,cAAA,EAAA,MAAA,QAAA;AAAA,IACD,CAAA;AAAA,IAAuB,UACrBA,EAAA,OAAA;AAAA,MAAA,SACE;AAAA,MAAyB,cACd,EAAA,YAAc;AAAA,IAAA,CAAA;AAAA,IACA,YACzBA,EAAmB;AAAA,MAAM;AAAA,QAEzBA,EAAW,QAAQ,MAAM;AAAA,QACzBA,EAAW,QAAQ,MAAM;AAAA,QACzBA,EAAW,QAAQ,MAAM;AAAA,QAC3BA,EAAA,QAAA,MAAA;AAAA,QACEA,EAAS,QAAQ,MAAA;AAAA,QACrBA,EAAA,QAAA,MAAA;AAAA,QACAA,EAAa,QAAA,MAAW;AAAA,QACtBA,EAAW,QAAO,MAAA;AAAA,MAAA;AAAA,MACP,EACT,SAAA,QAAgB,cAAM,EAAA,MAAA,YAAA,EAAA;AAAA,IAAW;AAAA,IAClC,aAAAA,EAAA;AAAA,MAELA,EAAA,OAAA;AAAA,iBACO;AAAA,QACT,cAAA,EAAA,MAAA,WAAA;AAAA,MAEa,CAAA;AAAA,IACX;AAAA,EAAA;AAAA,EACoE,EAClE,KAAA,+BAAkC;AAAiC,GAErEO,KAAAR;AAAA,EACA;AAAA,IACF,aAAAC,EAAA,OAAA,EAAA,SAAA,IAAA,QAAA,WAAA,CAAA;AAAA;ICzCA,eAA4B,OAAK,EAAA,SAAA,GAAA,CAAA;AAAA,EAWjC;AAAA,EAEO,EAAA,KAAS,oCAA+B;AAC7C,GAGKQ,IAAS,MAAsB,SACD;AACrC,SAAAC,KAAA;AAEO,SAASJ,EAAA,YAAgB,EAAA,EAAA,SAKa,WAAA;AAC3C;AARFK,EAAAD,IAAA;AASE,SAAME,GAAeC,GAAA;AACrB,SAAMP,EAAA,WAAgB,QAAA,EAAA,OAAAO,UAAkC,WAAA;AAExD;AAHMF,EAAAC,IAAA;AAGuB,SAC3BE,GAAAC,GAAA;AAAA,QACAC,IAAQV,EAAO,WAAA,GACfW,IAAiBP,GAAA,GACjBQ,IAAiBN,GAAAK,CAAA;AAAA,EAAAE,EACJ,IAAOH,GAAA;AAAA,IACpB,cAAAC;AAAA,IACD,QAAAF,EAAA;AAAA,IAGD,UAAYA,EAAK;AAAA,IACf,UAASA,EAAQ;AAAA,IACf,aAAAA,EAAkB;AAAA,IACpB,WAAA,KAAA,IAAA;AAAA,EACF,CAAA;AAEA,aAAS,CAAAK;AACX,IAAA,KAAA,IAAA,IAAAC,EAAA,YAAAZ,KAEOU,EAAS,OAAiBC,CAAwC;AAGvE,SAAA,EAAA,OAAAJ,GAAA,eAAAE,EAA8B;AAC9B;AAtBEP,EAAAG,IAAA;AAuBF,SAAOQ,GAAAN,GAAA;AACT,QAAAO,IAAAJ,EAAA,IAAAH,CAAA;AChDE,gBADFG,EAAoB,OAAqBH,CAAA,GACvC,KAAO,IACJ,IAAAO,EAAQ,YACRd,KACA,OAELc;AAEA;ADwCSZ,EAAAW,IAAA;ACpCP,SAAOE,GAAAC,GAAA;AACT,SAAAA,EAAA,QAAA,MAAA,OAAA,EAAA,QAAA,MAAA,MAAA,EAAA,QAAA,MAAA,MAAA,EAAA,QAAA,MAAA,QAAA;AAEA;AAHSd,EAAAa,IAAA;AAIP,SAAME,EAAAC,GAAkBC,IAAiB,IAAA;AAAqB,QAC5DC,IAAAD,IAAA,iEAAA;AAAA,SACA,+CAAAJ,GAAAG,CAAA,CAAA,OAAAE,CAAA;AAAA;AAFIlB,EAAAe,GAAA;AAKN,SAAII,GAAeC,GAAA;AACjB,QAAIC,KAAAD,EAAA,SAAA,iBAAA,IAAA;AAAA,IACF;AAAA,IAAM;AAAA,EACJ;AACA,EAAAA,EAAA,UACA,KAAA,0BAAA,CAAAE,GAAAC,MAAA;AAAA,QACA;AAAa,YACX;AAAA,QAEJ,QAAAC;AAAA,QACE,UAAAC;AAAA,QAGA,UAAAC;AAAA,QACF,aAAAC;AAAA,MAEA,IAAAL,EAAM;AAIN,UAAA,CAAAE,KAAe,MAAA,CAAAE;AACb,QAAAH,EAAA,OAAA,GAAA,EAAA,KAAA,EAAA,OAAA,8CAAA,CAAA;AACA;AAAA,MAAA;AACA,YACAK,IAAAD,KAAA,GAAAL,EAAA,QAAA,MAAAA,EAAA,IAAA,MAAA,CAAA,GAAAD,CAAA,6BACD,EAAA,OAAAhB,GAAA,eAAAE,EAAA,IAAAJ,GAAA;AAAA,QAED,QAAAqB;AAAA,QACE,UAAAE;AAAA,QACA,UAAAD;AAAA,QACA,aAAAG;AAAA,MAAc,CAAA,GAEdxB,IAAA,IAAgB,gBAAA;AAAA,QAChB;QACD,WAAAsB;AAAA,QAED,cAASE;AAAA,QACP,OAAAvB;AAAA,QACD,gBAAAE;AAAA,+BACa;AAAA,MACd,CAAA;AAAQ,MAAAgB;QAER,kBAAA,GAAAE,CAAA,8BAAArB,EAAA,SAAA,CAAA;AAAA,MACA,CAAA;AAAA,IACF,SAAAyB,GAAA;AACD,MAAAT,EAAA,IAAA;AAAA,QAEG,4CAA2CS,aAAoB,QAAAA,EAAA,UAAA,OAAAA,CAAA,CAAA;AAAA,MACjE,GACEN,EAAA,OAAQ,GAAM,OAAO,EAAA,OAAO,gCAAkC,CAAA;AAAA,IAE9D;AAAA,EACE,CAAA,GAAQH,EAAA,2CACiC,OAAAE,GAAUC;AAAuB,QAAA;AAE1E,YACG,EAAA,MAAAO,GAAO,OAAAzB,GACP,OAAK0B,GAAiB,mBAAAC,MAAqBV,EAAA;AAC9C,UAAAS,GAAA;AACF,QAAAX,EAAA,IAAA;AAAA,UAEI,uCAAiBW,CAAA,MAAAC,CAAA;AAAA,QACnB,GACAT,EAAA,OAAA,GAAA,EAAA,KAAAR,EAAA,OAAAiB,KAAAD,CAAA,CAAA,CAAA;AACF;AAAA,MAEA;AACA,UAAI,CAACD,KAAO,CAAAzB,GAAA;AACV,QAAAkB,EACG,OAAO,GAAG,EACV,KAAAR,EAAA,iCAAA,CAAA;AAAA;AAAA,MACC;AACE,YAAAH,IAAAD,GAAAN,CAAA;AACF,UACF,CAAAO,GAAA;AACF,QAAAW,EAAA,OAAA,GAAA,EAAA;AAAA,UACFR;AAAA,YAEM;AAAA,UACJ;AAAA,QACA;AAAA;AAAA,MACU;AACuD,YAC/DkB,IAAU,MAAA;AAAA,QAAgB,GAAArB,EACxB,QAAY;AAAA,QAAA;AAAA,UACZ,QACA;AAAA,UAAiB,SACjB,EAAA,gBAAoB,oCAAA;AAAA,UAAA,MACpB,IAAA,gBAAqB;AAAA,YACtB,YAAA;AAAA,YAAA,MAAAkB;AAAA,YAEL,WAAAlB,EAAA;AAAA,YAEK,gBAAkB;AAAA,6BACG;AAAA,UACxB,CAAA;AAAA,QAAQ;AAAA,MACoD;AAE5D,WAAAqB,EAEG,IAAA;AAAA,cACCC,IAAA,MAAAD,EAAA,KAAA;AAAA,QAAAb,EACE,IAAA;AAAA,UAAA,iDAAAc,CAAA;AAAA,QACF,GAEJX,EAAA,OAAA,GAAA,EAAA;AAAA,UACFR;AAAA,YAEM;AAAA,UAED;AAAA,QACH;AACA;AAAA,MAAqB;AACD,YACrBoB,IAAA,MAAAF,EAAA,KAAA;AAED,MAAAb,EAAI,MAAI,eAAAR,EAAA,QAAA;AAAA,QACN,aAAAuB,EAAA;AAAA,QACF,cAAAA,EAAA;AAAA,qBAEMA,EAAc;AAAA,MAAe,CAAA,GAC3Bf,EACN;QACA,uDAAoBR,EAAA,MAAA,QAAAuB,EAAA,YAAA;AAAA,MAAA;AACC,YACrBC,IAAa,KAAO,UAAA;AAAA,QACrB,MAAA;AAAA,QAED,QAASxB,EAAA;AAAA,QAAA,aAAAuB,EAAA;AAAA,QAAA,cAAAA,EAAA;AAAA,QAAA,aAAAA,EAAA;AAAA,MAAA,CAAA;AAAA,MAAAZ,EAAA,KAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gCAYPa,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAKF;AAAA,IACF,SAAAP,GAAA;AACD,MAAAT,EAAA,IAAA;AAAA,QAEG,+CAAiDS,aAAc,QAAAA,EAAA,UAAA,OAAAA,CAAA,CAAA;AAAA,MACjE,GACEN,EAAA,OAAM,GAAA,EAAA,KAAcR,EAAU,+BAAgC,CAAA;AAAA,IAC9D;AAAA,EAGA,CAAA,GAASK,EAAA,UACP,IAAA,mCAAA,CAAAE,GAAAC,MAAA;AAAA,QACA;AAAuD,YACxDc,IAAAjB,EAAA,MAAA,eAAAE,EAAA,OAAA,MAAA,GACKgB,IAAA,CAAA,EAAAD,KAAA,QAAAA,EAAA,gBAAAA,KAAA,QAAAA,EAAA;AACN,MAAAd,EAAI,KAAK;AAAA,QACX,eAAAe;AAAA,QACD,aAAAA,IAAAD,EAAA,cAAA;AAAA,MACH,CAAA;AAAA;AC9LO,MAAAd,EAAS,KAAA,EAAA,kBAAoD,CAAA;AAAA,IAClE;AAAA,EACA,CAAA;AACE;ADwBEvB,EAAAmB,IAAA;ACtBJ,SAAOoB,QAAuB;AAAA,QAC5BF,IAAajB,EAAA,MAAY,eAAAI,CAAA;AAAA,MACzB,EAAAa,KAAA,QAAAA,EAAa,gBAAY,EAAAA,KAAA,QAAAA,EAAA;AAC1B,UAAA,IAAA,MAAA,8BAAA;;ICkBI,eAAuB;AAAA,IAC5B,aAAwBA,EAAc;AAAA,EACtC,CAAA;AAAyC;ADvBlCrC,EAAAuC,GAAA;AC4BL,MAAAC,IAAA,MAAAA,EAAY;AAAA,EASZ,eAAgB;AAJlB,IAAAC,EAAA;AAME,SAAA;EAAyC;AAAA;AAAA,EAE6B,MACpE,OAAMC,GAAeC,GAAA;AAAA,UACnBC,IAAW,KAAA,KAAS,WAAK,aAC1B,MAAA,KAAA,KAAA,QAAA;AAAA,MACD,QAAA;AAAA,MACD,KAAA,mBAAAA,CAAA,wBAAAF,CAAA;AAAA,YAEK,KAAA,UAAiB;AAAA,QACnB,QAAQ,YAAW,KAAA,UAAAC,CAAA,EAAA,CAAA;AAAA,MACrB,CAAA;AAAA,MACA,SAAM,EAAI,mCAAkC;AAAA,IAC9C,CAAA,GAEO,CAAA;AACT,QAAA,CAAAE,EAAA,WAAA;YAEMC,MAAsD,OAAA,IAAA,CAAAC,MAAAA,EAAA,OAAA,EAAA,KAAA,IAAA;AAC1D,sBAAmB,4BAAUD,CAAA,EAAA;AAAA,IAAA;AAC3B,WACAD;AAAA,EAAA;AAAA,EAEJ,MAAA,KAAAG,GAAAL,GAAA;AAEA,iBAAU,KAA+B,KAAA,KAAA;AAAA,MACvCK;AAAA,MACFL;AAAA;EAGE;AAAA,EAA6B,MAC3B,IAAAK,GAAA;AAAA,WACA,MAAA,KAAA,KAAA,KAAA,IAAAA,CAAA;AAAA,EAAA;AAAA,EAEJ,MAAA,IAAAA,GAAAL,GAAA;WAEM,MAAM,UAAc,KAAmC;AAAA,MAC3DK;AAAA,MACEL;AAAA,IAAA;AAAA,EACA;AAAA,EAEJ,MAAA,MAAAK,GAAAL,GAAA;AAEA,WAAM,MAAO,KAA+B,KAAA,KAAA;AAAA,MAC1CK;AAAA,MACFL;AAAA,IAAA;AAAA,EAIA;AAAA,EAGE,MAAA,UAAM;AACN,WAAM,MAAA,KAAS,KAAM,KAAK,OAAKK,CAAQ;AAAA,EAAA;AAAA;AAAA,EAIvC,MAAA,uBAAMC;AACN,UAAAC,MAAqB,IAAO,OAAA,IAAkBC,CAAA,GAAA,EAAA,KAAA,GAAA,GACxCC,IAAI,MAAO,KAAM,KAAA,QAAA;AAAA,MAAA,uDACRF,CAAA;AAAA,IAAA,GAEXG,IAAa,oBAAA,IAAA;AAAA,eACdC,KAAAF,EAAA;AACH,MAAAC,EAAA,IAAAC,EAAA,MAAA;AAAA,YACOA,EAAA;AAAA,QACT,MAAAA,EAAA;AAAA,QAEM,MAAAA,EAAA;AAAA,MACJ,CAAA;AACoE,WAChED;AAAA,EAAM;AAAA,EACA,MACP,gBAAAE,GAAAC,GAAA;AACD,WAAK,KAAA,UAAO,YAAS;;AACnB,YAAAJ,IAAM,MAAS,KAAO,KAAA,eAA0B,aAAc;AAAA,QAC9D,MAAMG;AAAA,QACR,MAAAC;AAAA,MACA;UACC,CAAAJ,EAAU,SAAM;AACrB,cAAAN,KAAAW,IAAAL,EAAA,WAAA,gBAAAK,EAAA,IAAA,CAAAV,MAAAA,EAAA,SAAA,KAAA;AAEM,cAAA,IAAA,MAAgB,uBAA2BD,CAAA,EAAA;AAAA,MAC/C;AACE,aAAM,EAAA,IAAKM,EAAK,GAAA;AAAA,IAAsC,aAC5CG,CAAE,EAAA;AAAA,EAAA;AAAA,EAEhB,MAAA,gBAAAG,GAAA;AAEA;MAIE,MAAM,KAAA,KAAS,QAAW,QAAK,aAAQA,CAAA;AAAA,MACrC,UAAAA,CAAA;AAAA,IAAA;AAAA,EAGF;AAAA,EACA,MAAA,mCAA4C;;AAE5C,UAAAN,UAAgB,UAAO,QAAkB;AAAA,MACvC;AAAA,IACE,GACEO,IAAA,CAAA,GACFC,IAAA,CAAA;AACA,eAAKC,KAAOT,EAAM;AACpB,WAAAK,IAAAI,EAAA,SAAA,QAAAJ,EAAA,SAAA,kBAAA;AACA,cAAMK,IAAMD,EAAA,KAAS;AAAA,UACnB;AAAA,QACF;AACF,QAAAF,EAAA,KAAA,EAAA,MAAAE,EAAA,MAAA,YAAAC,IAAAA,EAAA,CAAA,IAAA,OAAA,CAAA;AAAA,MAEA;AACF,OAAAC,IAAAF,EAAA,SAAA,QAAAE,EAAA,SAAA,uBAAAH,EAAA,KAAA,EAAA,MAAAC,EAAA,KAAA,CAAA;AAAA,IAKE;AACA,WAAM,EAAA,MAAAF,gBAA2B;AAAA,EAEjC;AAAA;AAAA,EAEI,MAAA,yBAAc;AAAA,UACZP,IAAO,MAAA,KAAU,KAAQ,eAAI,GAC7BY;AAAwC,eACxCC,KAAOb,EAAA;AAAA,MACRa,EAAA,KAAA,SAAA,KAAA,IACHD,EAAW,KAAA;AAAA,QACT,OAAS,UAAKC,EAAA,IAAA;AAAA,QACZ,OAAO,GAAAA,EAAS,KAAA,KAAYA,EAAA,IAAA;AAAA,QAC5B,OAAO;AAAA,MAAiC,CAAA,IAEzCA,EAAA,KAAA,SAAA,aAAA,KACHD,EAAA,KAAA;AAAA,QACF,OAAA,SAAAC,EAAA,IAAA;AAAA,QAEA,OAAS,GAAKA,EAAA,KAAA,KAAAA,EAAA,IAAA;AAAA,QACZ,OAAO;AAAA,MACP,CAAA;AAIF,WAAAD,EAAO,KAAA;AAAA,MACT,OAAA;AAAA,MAAA,OAAA;AAAA,aAIc;AAAA,IACZ,CAAA,GACMA;AAAA,EACF;AAAA;AAAA,EAEA,MAAA,aAAIE,GAAY;AAChB,wCAAgDC;AAChD,UAAA;AAAQ,eACN,MAAAC,EAAA;AAAA,MAA6G,SAC/GC,GAAA;AACA,YAAAF,MAAU3B,EAAe,YAAoB,OAAA6B;AAC/C,cAAAC,IAAA9B,EAAA,iBAAA2B;AACF,gBAAA;AAAA,UACM,uBAAuB,oBAAAA,CAAA,IAAA3B,EAAA,WAAA,kBAAA8B,CAAA;AAAA,QAC/B,GACF,MAAA,IAAA,QAAA,CAAAT,MAAA,WAAAA,GAAAS,CAAA,CAAA;AAAA;AC7ME,UAAI,IAAA,MAAU,aAAA;AAAA,EAAA;AACZ;AD8BYtE,EAAAwC,GAAA,qBACdC,EADED,GACF,eAAA,IAAAC,EADED,GACF,kBAAA;AADE,IAAA+B,IAAA/B;AC3BI,SAAAgC,GAAapD,GAAA;AACb,EAAAA,EAAA,UAAM;AAAA,IACN;AAAA,IAAoD,UAC7CG,MAAK;AACZ,UAAA;AACA,cAAIkD,MAAmBrD,GAAOE,EAAA,OAAS,MAAA,GACzCoD,IAAA,IAAAH,EAAAE,CAAA;AACF,QAAAlD,EAAA,KAAA,MAAAmD,EAAA,iCAAA,CAAA;AAAA,MACF,SAAAL,GAAA;AACF,cAAArD,IAAAqD,aAAA,QAAAA,EAAA,UAAA,OAAAA,CAAA;;MCdA;AAAA,IACE;AAAA,EAAc;AACZ;ADGIrE,EAAAwE,IAAA;ACAA,SAAAG,GAAavD,GAAA;AACb,EAAAA,EAAA,UAAM;AAAA,IACN;AAAA,IAA8C,UACvCG,MAAK;AACZ,UAAA;AACA,cAAIkD,MAAmBrD,GAAOE,EAAA,OAAS,MAAA,GACzCsD,IAAA,IAAAL,EAAAE,CAAA;AACF,QAAAlD,EAAA,KAAA,MAAAqD,EAAA,uBAAA,CAAA;AAAA,MACF,SAAAP,GAAA;AACF,cAAArD,IAAAqD,aAAA,QAAAA,EAAA,UAAA,OAAAA,CAAA;;MCbA;AAAA,IACE;AAAA,EACA;AACA;ADCMrE,EAAA2E,IAAA;;AEOR,EAAAxD,GAAqBC,CAAA,GAInBoD,GAAgCpD,CAAA,GAChCuD,GAAyBvD,CAAuBjC;AAAA;;AAGd,MAElC0F,IAFkC,MAElCA,UAA2CtF,EAAA;AAAA,EAFT;AAAA;AAOhC,IAAAkD,EAAA;;EAEA,aAAM,WAAcrB,GAAK;AACzB,IAAA0D,GAAK1D,CAAA;AAAA,EACH;AAAA,EAAU,MACR,gBAAA;AAAA,QACF,KAAA,KAAA,QAAA,KAAA;AACF,UAAAiB,IAAA,KAAA;AAEA,QAAA,EAAKA,KAAA,QAAAA,EAAW,kBAAQA,KAAA,QAAAA,EAAW;AACjC,YAAA,IAAQ;AAAA,QACN;AAAA,MAAsB;AAExB,gBACA,OAAA,IAAa3C,EAAA,WAAY;AAAA,MACzB,QAAA;AAAA,QACA,eAAc,OAAA;AAAA,QACd,UAAS,YAAY;AAAA,MACtB;AAAA,MAED,aAAa2C,EAAY;AAAA,MACtB,aAASA,EAAc;AAAA,MAAwB,cACtCA,EAAA;AAAA,MAAA,cACR,OAAa;AAAA,IAAA,CAAA,GAEjB,KAAC,KAAA,GAAA,WAAA,CAAA0C,MAAA;AAED,WAAO,IAAA,MAAK,eAAA,KAAA,IAAA;AAAA,QACd,GAAA,KAAA;AAAA,qBAEqCA;AAAA,MACnC,CAAA;AAAA,IACF,CAAA,QAEA;AAAA,EACE;AAAA,EACF,iBAAA;;AAEA,qBAAe,kCAAS;AAAA,EACtB;AAAA,EACF,iBAAA;;AACF,YAAAtB,IAAA,KAAA,gBAAA,gBAAAA,EAAA;AAAA;ECrEO,MAAMtE,SAAAA;AACX,SAAA,OAAA;AAAA,EAAA;AACwE;ADqB7Ba,EAAA6E,GAAA,yBACzCpC,EADFoC,GACE,QAAW,0BACbpC,EAFAoC,GAEA,gBAAAjF,KAEA6C,EAJAoC,wBAI2ChF;AANT,IAElCmF,IAFkCH;ACjBA,MAC/BI,KAAA5F;AAAA,EAAA;AAAA,IACoC,QACrB,OAAA,EAAA,SAAA,IAAA,cAAA,EAAA,MAAA,MAAA,EAAA,CAAA;AAAA,IAAA,YACNC,EAAA,QAAA0F,GAAA;AAAA,MAAA,cACN,EAAA,MAAkB,QAAO;AAAA,IAAuB,CAAA;AAAA,IAClD,OACD1F,EAAA,WAAA;AAAA,MACD,cAAW;AAAA,QACX,MAAA;AAAA,QACA,iBAAY,CAAA,OAAW,OAAU,QAAS,QAAO;AAAA,MACnD;AAAA,IACE,CAAA;AAAA,IACJ,WAAAA,EAAA,QAAA,EAAA,SAAA,GAAA,CAAA;AAAA,IAEO,cAAM4F,EAAc,QAAA,EAAA,SAAA,GAAA,CAAA;AAAA,IACzB,YAAA5F,EAAA,QAAA,EAAA,SAAA,GAAA,CAAA;AAAA,EAAA;AAAA,EAC0B,EAC1B,KAAA,yBAAA;AAAA,GAEF6F,KAAA9F;AAAA,EAEO;AAAA,IACL,SAAAC,EAAA,IAAA;AAAA,EAAA;AAAA,EAC4C,EAC1C,KAAA,wBAAsB;AAAO,GAE/B8F,KAAA/F;AAAA,EACA;AAAA,IACF,SAAAC,EAAA,MAAAA,EAAA,IAAA,CAAA;AAAA;ICzBA,MAAqBA,UAAuB;AAAA,EAC1C;AAAA,EACA,EAAA,KAAyB,yBAAW;AAAA,GAGpC+F,IADgD,MAChDA,UAA+CH,EAAA;AAAA,EAO3C,MACF,MAAAI,GAAA;AAEA,UAAIC,IAAA,KAAA,OAAA;AACF;AAEA,iBAAM,uCAAsCD,CAAA;AAC5C;AAAA,IAEA;AAEA,QAAA;AAAY,WACV,OAAM,EAAA,MAAA,SAAA,OAAA,OAAA,MAAA,cAAA,CAAA;AAAA,YACNb,IAAO,MAAAc,EAAA,cAAA,GACPC,UAAgB,KAAA,OAAS,MAAA,QAAAF,CAAA,GAC1BlC,IAAA,MAAAqB,EAAA,MAAAe,CAAA;AACD,WAAK,OAAK;AAAA,QACR,MAAG;AAAA,QACH;QACA,MAAA,KAAW,SAAO;AAAA,MAAA,CAAA,GACL,KACd,KAAA;AAAA;QAED,SAAKpC,EAAO;AAAA,QACV,WAAMA,EAAA;AAAA,QACN,QAAO;AAAA,MAAA,CAAA;AAAA,IACoD,SAC5DvB,GAAA;AACD,WAAK,OAAA;AAAA,QACH;QACA,OAAA;AAAA,QACF,MAAAA,aAAA,QAAAA,EAAA,UAAA,OAAAA,CAAA;AAAA,MACF,CAAA,GACF,KAAA;AAAA,QACF,sBAAAA,aAAA,QAAAA,EAAA,UAAA,OAAAA,CAAA,CAAA;AAAA;MCtDa1C;AAAAA,IACX;AAAA,EAAA;AACwE;ADWzBa,EAAAqF,GAAA,mBAC/C5C,EADA4C,GACyB,QAAA,oBAEzB5C,EAHA4C,GAGe,YAAkB,eAC/B5C,EAJF4C,YAIQ,YACN5C,EALF4C,GAKO,gBAAYJ,KACfxC,EANJ4C,kBAMeF,KACX1C,EAPJ4C,GAOI,iBAAAD;AAR4C,IAChDK,IADgDJ;ACRd,MAC/BK,KAAArG;AAAA,EAAA;AAAA,IACqB,MACpBC,EAAA,OAAA,EAAA,SAAA,IAAA,cAAA,EAAA,MAAA,MAAA,EAAA,CAAA;AAAA,IAAA,YACEA,EAAmB,QAAQ0F,GAAA;AAAA,MAAA,cAChB,EAAA,cAAc;AAAA,IAAA,CAAA;AAAA,IACE,WAC3B1F;MAA2B;AAAA,QAE7BA,EAAA,QAAA,QAAA;AAAA,QACEA,EAAS,QAAU,MAAA;AAAA,QACvBA,EAAA,QAAA,QAAA;AAAA,QACAA,EAAa;UACX,QAAc,QAAA;AAAA,MAAA;AAAA,MACN,EACN,SAAA,UAAkB,cAAY,EAAA,MAAA,SAAA,EAAA;AAAA,IAAA;AAAA,IAChC,aACDA,EAAA,WAAA;AAAA,MACD,cAAQ;AAAA;QAEJ,iBAAM,CAAA,OAAA,KAAA;AAAA,MAAA;AAAA,IACyB,CAAA;AAAA,IACjC,QACDA,EAAA,WAAA;AAAA,MACD;QACE,MAAA;AAAA,QACE,iBAAS,CAAA,QAAA,KAAA;AAAA,MAAA;AAAA,IACmB,CAAA;AAAA,IAC7B,iBACHA,EAAA;AAAA,MACAA,EAAW,OAAA;AAAA,QACX;QACA,cAAY,EAAA,MAAW,MAAQ;AAAA,MACjC,CAAA;AAAA,IACA;AAAA,IACE,WAAKA,EAAA,QAAA,EAAA,SAAA,GAAA,CAAA;AAAA,IACL,gBAAsB,QAAA,EAAA,SAAA,GAAA,CAAA;AAAA,IAAA,YACpBA,EAAW,QAAW,EAAQ,SAAQ,GAAA,CAAA;AAAA,EAAA;AAAA,EACvC;AAAA,IACuB,KACtB;AAAA,IAAmD,IACpDA,EAAA,OAAA;AAAA,iBACDA,EAAc,QAAA,QAAA;AAAA,IAAA,CAAA;AAAA,IACA,eACO;AAAA,MAAA,iBAAAA,EAAA,OAAA,EAAA,WAAA,EAAA,CAAA;AAAA,IACnB,CAAA;AAAA,IACF,cAAA;AAAA,MAEJ,YAAA;AAAA,QAEa4F,iBAAc;AAAA,MACzB;AAAA,IACE;AAAA,EAAwB;AAC1B,GAEFS,KAAAtG;AAAA,EAEO;AAAA,IACL,SAAAC,EAAA,IAAA;AAAA,EAAA;AAAA,EAC0B,EAC1B,KAAA,uBAAA;AAAA,GAEFsG,KAAAvG;AAAA;IC1DA,SAAqBC,MAAsB;AAAA,EACzC;AAAA,EACA,EAAA,KAAyB,wBAAW;AAAA,GAGpCuG,IADgD,MAChDA,UAA+CX,EAAAA;AAAAA,EAO3C,MACF,MAAAI,GAAA;AAEA,UAAIC,IAAA,KAAA,OAAA;AACF,YAAM;AACN,WAAK,MAAA,uCAA4CD;AAEjD;AAAA,IACA;AACA,QAAA;AAGA,YAAMQ,IAAQ,KAAM,OAAK;AAEzB,WAAI,OAAA,EAAA,MAAA,SAAA,OAAA,OAAA,MAAA,GAAAA,CAAA,MAAA,CAAA;AAEJ,gBAAQ,MAAAP,EAAA,cAAA,OACD,MAAA,KAAA,OAAA,YAAA,QAAAD,CAAA,GACHrB,IAASQ,EAAM,QAAQsB,CAAW,GAClCC,IAAA,MAAA,KAAA,OAAA,OAAA,QAAAV,CAAA,KAAAA,EAAA;AAAA;AAEA,cAAAQ,GAAe;AAAA,QACf,KAAA;cACG,MAAA7B,EAAA,OAAA+B,CAAA;AACH;AAAA,QACA,KAAA;cACG,MAAA/B,EAAA,SAAA+B,CAAA;AACH;AAAA,QACA,KAAA;cACG,MAAA/B,EAAA,OAAA+B,CAAA;AACH;AAAA,QACA,KAAA;AACF,UAAA5C,IAAA,MAAAa,EAAA,QAAA+B,CAAA;AACE;AAAA,QAAiD,KAAA;AAGrD,UAAA5C,UAAca,EAAM,OAAS+B,QAAc,OAAS,eAAS;AAC7D;AAAA;AAEA,gBAAK,IAAO,MAAA,sBAAAF,CAAA,EAAA;AAAA,MAAA;AACJ,WACN,OAAO,EAAA,MAAA,SAAA,OAAA,OAAA,MAAA,GAAAA,CAAA,QAAA,CAAA,GAAA,KACP,KAAM,EAAA,GAAAR,GAAA,SAAiBlC,EAAQ,CAAA;AAAA,IAA4B,SAC5DvB,GAAA;AACD,WAAK,OAAA;AAAA,QACH,MAAA;AAAA,QACA,OAAA;AAAA,QACF,MAAAA,aAAA,QAAAA,EAAA,UAAA,OAAAA,CAAA;AAAA,MACF,CAAA,GACF,KAAA;AAAA,QACF,OAAA,KAAA,OAAA,SAAA,YAAAA,aAAA,QAAAA,EAAA,UAAA,OAAAA,CAAA,CAAA;AAAA;MCtEa1C;AAAAA,IACX;AAAA,EAAA;AACwE;ADWzB+F,EAAAA,GAAAA,kBAC/CzC,EADAoD,GACyB,QAAA,mBAEzBpD,EAHAoD,GAGe,YAAkB,eAC/BpD,EAJFoD,YAIQ,YACNpD,EALFoD,GAKO,gBAAYH,KACfjD,EANJoD,kBAMeF,KACXlD,EAPJoD,GAOI,iBAAAD;AAR4C,IAChDK,IADgDJ;ACRd,MAC/BK,KAAA7G;AAAA,EAAA;AAAA,IACqB,MACpBC,EAAA,OAAA,EAAA,SAAA,IAAA,cAAA,EAAA,MAAA,MAAA,EAAA,CAAA;AAAA,IAAA,YACEA,EAAmB,QAAQ0F,GAAA;AAAA,MAAA,cAChB,EAAA,cAAgB;AAAA,IAAA,CAAA;AAAA,IACA,WAC3B1F;MAA2B;AAAA,QAE3BA,EAAW,QAAQ,QAAO;AAAA,QAC5BA,EAAA,QAAA,QAAA;AAAA,QACEA,EAAS,QAAU,QAAA;AAAA,QACvBA,EAAA,QAAA,QAAA;AAAA,QACAA,EAAa,oBAA8B;AAAA,UACzC,QAAc,OAAA;AAAA,MAAA;AAAA,MACN,EACN,SAAA,UAAkB,cAAY,EAAA,MAAA,WAAA,EAAA;AAAA,IAAA;AAAA,IAChC,aACDA,EAAA,WAAA;AAAA,MACD,cAAO;AAAA;QAEH,iBAAM,CAAA,OAAA,KAAA;AAAA,MAAA;AAAA,IACmC,CAAA;AAAA,IAC3C,OACDA,EAAA,WAAA;AAAA,MACD;QACE,MAAA;AAAA,QACE,iBAAS,CAAA,OAAA,OAAA,SAAA;AAAA,MAAA;AAAA,IACmB,CAAA;AAAA,IAC7B,iBACHA,EAAA;AAAA,MACAA,EAAA,OAAkB;AAAA,QAChB,SAAW;AAAA,QACT,cAAS,EAAA,MAAA,MAAA;AAAA,MAAA,CAAA;AAAA,IACqB;AAAA,IAC/B,kBACHA,EAAA;AAAA,MACAA,EAAA,OAAiB;AAAA,QACf,SAAA;AAAA,QACE,cAAW,EAAA,cAAe;AAAA,MAAA,CAAA;AAAA,IACF;AAAA,IACC,iBACdA;MAAmB;AAAA,QAE9BA,EAAW,QAAQ,OAAA;AAAA,QACrBA,EAAA,QAAA,KAAA;AAAA,QACEA,EAAS,QAAS,MAAA;AAAA,QACtBA,EAAA,QAAA,WAAA;AAAA,QACAA,EAAY,QAAW,OAAA;AAAA,QACpBA,EAAW,QAAQ,WAAO;AAAA,MAC3B;AAAA,MACF,EAAA,SAAA,SAAA,cAAA,EAAA,MAAA,UAAA,EAAA;AAAA,IACA;AAAA,IAAgC,YACrBA,EAAA;AAAA,MACT,CAAAA,EAAS,QAAA,IAAA,GAAAA,EAAA,QAAA,MAAA,CAAA;AAAA,MACT,EAAA,SAAA,MAAgB,cAAM,EAAA,MAAA,aAAA,EAAA;AAAA,IAAU;AAAA,IAElC,cAAaA,SAAkB;AAAA,MAC7B,SAAS;AAAA,MACT,SAAS;AAAA,MACT,cAAc,EAAE,MAAM,UAAA;AAAA,IAAY,CACnC;AAAA,IACD,aAAWA,EAAW,OAAQ;AAAA,MAC9B,SAAA;AAAA,MACA;MACF,cAAA,EAAA,MAAA,YAAA;AAAA,IACA,CAAA;AAAA,IACE,WAAKA,EAAA,QAAA,EAAA,SAAA,GAAA,CAAA;AAAA,IACL,gBAAsB,QAAA,EAAA,SAAA,GAAA,CAAA;AAAA,IAAA,YACpBA,EAAW,QAAW,EAAQ,SAAQ,GAAA,CAAA;AAAA,EAAA;AAAA,EACvC;AAAA,IACuB,KACtB;AAAA,IAAmD,IACpDA,EAAA,OAAA;AAAA,iBACDA,EAAc,QAAA,QAAA;AAAA,IAAA,CAAA;AAAA,IACA,eACO;AAAA,MAAA,iBAAAA,EAAA,OAAA,EAAA,WAAA,EAAA,CAAA;AAAA,IACnB,CAAA;AAAA,IACF,cAAA;AAAA,MAEJ,YAAA;AAAA,QAEa4F,iBAAc;AAAA,MACzB;AAAA,IACE;AAAA,EAAwB;AAEpB,GAENiB,KAAA9G;AAAA,EACA;AAAA,IACF,SAAAC,EAAA,IAAA;AAAA,MAEa8G,aAAAA;AAAAA,IACX,CAAA;AAAA,EAAA;AAAA,EAC0B,EAAA,6BAEpB;AAAA,GAENC,KAAAhH;AAAA,EACA;AAAA,IACF,SAAAC,EAAA,IAAA;AAAA;IC/FA,CAAA;AAAA,EACE;AAAA,EACA,EAAA,KAAyB,yBAAW;AAAA,GAGpCgH,IADgD,MAChDA,UAA+CpB,EAAA;AAAA,EAOY,MACvD,MAAAI,GAAA;AAEA;AACA,YAAMC,SAAiB,OAAO;AAE9B,UAAI,CAAAA;AACF,cAAM,IAAA,MAAK,qCAAsB;AAEjC,YAAAd,IAAW,MAAAc,gBAAyB,GACtCO,IAAA,KAAA,OAAA;YACc,UACd,MAAM,sBAA2B,UAE3B,KAAA,cAAArB,GAAAa,GAAAQ,CAAA;AAAA,IAEV,SAAAjE,GAAA;YAEcb,IAAaa,aAA8B,QAAAA,EAAA,UAAA,OAAAA,CAAA;iBAClD,OAAS,QAAM,OAAS,OAAO,OAAO,MAAMb,EAAA,CAAA,GAE3Ca;AAAA,IACN;AAAA,EAA4C;AAAA,EACjB,mBACX4C,GAAKa,GAAO;AAAA,wBACT,SAAK,OAAO,OAAA,MAAA,oBAAA,CAAA;AAAA,UAC7BiB,IAAA,MAAiB,YAAO,MAAA,QAAAjB,CAAA,GACzBkB,IAAA,MAAA/B,EAAA,MAAA,MAAA8B,GAAA;AAAA,MAED,aAAY,KAAA,OAAA;AAAA,MACZ,cAAU,KAAe,OAAS;AAAA,MAChC,iBAAU,YAAS;AAAA,MACjB,YAAA,KAAA,OAAA;AAAA,IACA,CAAA;AACA,QAAAE,IAAI;AACF,UAAA,IAAA,QAAY,CAAAC,GAAAC,MAAA;AAAA,MAAAH,EACV,GAAA,QAAM,CAAAlD,MAAA;AAAA,QAAAmD,KACC,UACD,QAAU,SAAKnD,EAAA,CAAA,GACtBmD,IAAA,QAAA,KACH,KAAA,OAAA;AAAA,UACD,MAAA;AAAA,UACD;UACA,MAAU,WAAe;AAAA,QAC1B,CAAA;AAAA,MAGC,CAAA,GACAD,EAAO,GAAA,OAAA,MAAAE,EAAA,CAAA,GACPF,eAAyB;AAAA,IAAK,CAC/B,GACH,KAAA,OAAA;AAAA,MAEA;MAKE,OAAM;AAAA,MAEN,MAAK,mBAAOC,CAAA;AAAA,IAAA,CAAA;AAAA,EACJ;AAAA,EACC,uBACWnB,GAASQ,GAAA;;AAAA,UAC5BC,IAAA,MAAA,KAAA,OAAA,YAAA,QAAAT,CAAA;AAED,SAAA,OAAY;AAAA,MACV,MAAA;AAAA,MACA;MACA,kBAAiBQ,CAAK;AAAA,IAAO,CAAA;AACL,gBACpB,MAAc,UAAY;AAAA,MAG9B,WAAAA;AAAA,MAGD,QAAAC;AAAA,MAED,iBAAe,KAAA,OAAA;AAAA,MACf,YAAY,KAAA,OAAA;AAAA,MACV,GAAAD,MAAM,YAAA,KAAA,OAAA,kBAAA,EAAA,qBAAA,KAAA,OAAA,gBAAA,IAAA,CAAA;AAAA,MACN,GAAA,KAAO,OAAA,mBAAA,EAAA,kBAAA,KAAA,OAAA,iBAAA,IAAA,CAAA;AAAA,IAAA,CAAA;AACD,UACPc,EAAA,KAAA,GAGD,KAAA,OAAU;AAAA,MAEV,MAAK;AAAA,MACH,OAAM;AAAA,MACN;IAAO,CAAA,GACD,MACPA,EAAA,WAAAtB,EAAA,OAAA,GAED,KAAA,OAAU;AAAA,YACJ;AAAA,MAEN,OAAK;AAAA,MACH,MAAM;AAAA,IAAA,CAAA,GACC,MACPsB,EAAM,MAAA,GAAA,MACPA,EAAA,KAAA,KAAA,OAAA,cAAA,KAAA,OAAA,WAAA,GAED,YAAM;AAAA,MACN;MACA;MACA,MAAM;AAAA,IAGN,CAAA;AAEA,UAAKC,IAAO,MAAAD,EAAA,cAAA,GACVE,MAAMrD,IAAAoD,EAAmB,sBAAnB,gBAAApD,EAA2B,WAAA,GACjCsD,MAAOhD,IAAA8C,EAAA,kBAAA,gBAAA9C,EAAA,WAAA,GACPiD,IAAkBF,IAAcC,OAAYE,IAAAJ,EAAQ,uBAAR,gBAAAI,EAAgC,WAAY;AAAA,SACzF,KAAA,EAAA,GAAA3B,GAAA,SAAAuB,EAAA,CAAA,GACH,KAAA,OAAA;AAAA,MACF,MAAAE,IAAA,IAAA,QAAA;AAAA;MC3Ia5H,MAAAA,GAAAA,CAAgB,cAAA2H,CAAA,QAAAC,CAAA,YAAAC,CAAA;AAAA,IAC3B,CAAA;AAAA,EAAA;AACwE;ADYzBhH,EAAAsG,GAAA,mBAC/C7D,EADA6D,GACyB,QAAA,oBAEzB7D,EAHA6D,GAGe,YAAkB,eAC/B7D,EAJF6D,GAIM,SAAA,YACF7D,EALJ6D,mBAKUJ,KACNzD,EANJ6D,GAMI,eAAiBH,KACf1D,EAPN6D,GAOM;AAR0C,IAChDY,IADgDZ;ACTd,MAC/Ba,KAAA9H;AAAA,EAAA;AAAA,IAC0C,QAC3B,OAAA,EAAA,SAAA,IAAA,cAAA,EAAA,MAAA,MAAA,EAAA,CAAA;AAAA,IAAA,YACNC,EAAA,QAAA0F,GAAA;AAAA,MAAA,cACN,EAAA,MAAkB,QAAO;AAAA,IAAK,CAAA;AAAA,IAChC,aACD1F,EAAA,WAAA;AAAA,MACD,cAAW;AAAA,QACX,MAAA;AAAA,QACA,iBAAY,CAAA,OAAW,KAAU;AAAA,MACnC;AAAA,IACE,CAAA;AAAA,IACJ,WAAAA,EAAA,QAAA,EAAA,SAAA,GAAA,CAAA;AAAA,IAEO,cAAM4F,EAAc,QAAA,EAAA,SAAA,GAAA,CAAA;AAAA,IACzB,YAAA5F,EAAA,QAAA,EAAA,SAAA,GAAA,CAAA;AAAA,EAAA;AAAA,EAC0B,EAC1B,KAAA,6BAAA;AAAA,GAEF8H,KAAA/H;AAAA,EAEO;AAAA,IACL,SAAAC,EAAA,IAAA;AAAA,EAAA;AAAA,EAC6B,EAAA,KACzB,4BAAwB;AAAA,GAExB+H,KAAAhI;AAAA,EAAqD;AAAA,IACH,SACnDC,EAAA,OAAA;AAAA,MACH,MAAAA,EAAA,OAAA;AAAA,MACE,QAAKA,EAAA,MAAAA,EAAA,IAAA,CAAA;AAAA,MACT,oBAAAA,EAAA,MAAAA,EAAA,IAAA,CAAA;AAAA;IC5BA,CAAA;AAAA,EAME;AAAA,EACA,EAAA,KAAyB,6BAAW;AAAA,GAGpCgI,IADgD,MAChDA,UAA+CpC,EAAA;AAAA,EAO3C,MACF,MAAAI,GAAA;AAEA,UAAIC,IAAA,KAAA,OAAA;AACF;AAEA,iBAAM,uCAAsCD,CAAA;AAC5C;AAAA,IACA;AAEA,QAAA;AAAY,WACV,OAAM,EAAA,MAAA,SAAA,OAAA,OAAA,MAAA,gBAAA,CAAA;AAAA,YACNb,IAAO,MAAAc,EAAA,cAAA,OACS,MAAI,YAAY,YAAa,QAAAD,CAAA,GAC9ClC,IAAA,MAAAqB,EAAA,QAAAsB,CAAA,EAAA,SAAA;AACD,WAAK,OAAK;AAAA,QACR,MAAG;AAAA,QACH,OAAA;AAAA,QAAS,SACD3C,EAAO,IAAA,KAAAA,EAAA,OAAA,MAAA;AAAA,MAAA,CAAA,GACE,KACf,KAAA;AAAA,QAA2B,GAC3BkC;AAAA,QAAwB,SAAA;AAAA,UAE3B,MAAAlC,EAAA;AAAA,kBACMA,EAAO;AAAA,UACd,oBAAYA,EAAA;AAAA,UACV,iBAAMA,EAAA;AAAA,QACN;AAAA,MAAO,CAAA;AAAA,IACoD,SAC5DvB,GAAA;AACD,WAAK,OAAA;AAAA,QACH;QACA,OAAA;AAAA,QACF,MAAAA,aAAA,QAAAA,EAAA,UAAA,OAAAA,CAAA;AAAA,MACF,CAAA,GACF,KAAA;AAAA,QACF,oBAAAA,aAAA,QAAAA,EAAA,UAAA,OAAAA,CAAA,CAAA;AAAA;MC7Da1C;AAAAA,IACX;AAAA,EAAA;AACwE;ADgBzBa,EAAAsH,GAAA,uBAC/C7E,EADA6E,GACyB,QAAA,wBAEzB7E,EAHA6E,GAGe,YAAkB,eAC/B7E,EAJF6E,YAIQ,YACN7E,EALF6E,GAKO,gBAAYH,KACf1E,EANJ6E,kBAMeF,KACX3E,EAPJ6E,GAOI,iBAAAD;AAR4C,IAChDE,IADgDD;ACbd,MAC/BE,KAAAnI;AAAA,EAAA;AAAA,IAC8B,MAC7BC,EAAS,OAAA,EAAA,SAAA,IAAA,cAAA,EAAA,MAAA,MAAA,EAAA,CAAA;AAAA,IAAA,YACTA,UAAsB0F,GAAA;AAAA,MACvB,cAAA,EAAA,MAAA,QAAA;AAAA,IACD,CAAA;AAAA,IAA0B,aACxB1F,EAAA,OAAA;AAAA,MAAA,SACE;AAAA,MAA2B,cAChB,EAAA;IAAkB,CAAA;AAAA,IACF,eAC7BA,EAAA;AAAA,MACA;AAAA,QACFA,EAAA,QAAA,QAAA;AAAA,QACAA,EAAU,QAAW,UAAA;AAAA,QACnBA,EAAW,QAAO,QAAA;AAAA,MAAA;AAAA,MACP,EACT,SAAA,UAAgB,cAAM,EAAA,MAAA,UAAA,EAAA;AAAA,IAAW;AAAA,IAClC,UACHA,EAAA;AAAA,MACAA,EAAA,OAAc;AAAA,QACZ,SAAS;AAAA,QACT,cAAS,EAAA,MAAA,WAAA;AAAA,MACT,CAAA;AAAA,IAAS;AAAA,IACgC,cAC1CA,EAAA,OAAA;AAAA,MACD,SAAW;AAAA,MACX,SAAA;AAAA,MACA;MACF,cAAA,EAAA,MAAA,mBAAA;AAAA,IACA,CAAA;AAAA,IACE,WAAKA,EAAA,QAAA,EAAA,SAAA,GAAA,CAAA;AAAA,IACL,gBAAsB,QAAA,EAAA,SAAA,GAAA,CAAA;AAAA,IAAA,cACL,QAAW,EAAA,SAAQ,GAAQ,CAAA;AAAA,EAAA;AAAA,EAC3C;AAAA,IACuB,KACtB;AAAA,IAA4C,IAC7CA,EAAA,OAAA;AAAA,qBACaA,EAAA,QAAA,QAAA;AAAA,IAAA,CAAA;AAAA,IACA,QACA,OAAA;AAAA,MAAA,UAAAA,EAAA,OAAA,EAAA,WAAA,EAAA,CAAA;AAAA,IACZ,CAAA;AAAA,IACF,cAAA;AAAA,MAEJ,YAAA;AAAA,QAEa8G,UAAAA;AAAAA,MACX;AAAA,IACE;AAAA,EAAwB;AACC,GAEzBqB,KAAkBpI;AAAA,EAAO;AAAA,IAEzB,SAAKC,EAAA,IAAA;AAAA,IACT,UAAAA,EAAA,IAAA;AAAA;ICrDA,OAAqBA,EAAA;EAMnB;AAAA,EACA,EAAA,KAAyB,8BAAW;AAAA,GAGpCoI,IADgD,MAChDA,UAAiDtB,EAAA;AAAA,EADD;AAAA;AAQxC,IAAA3D,EAAA;AAER,IAAAA,EAAA,0BAAyB;AACvB,IAAAA,EAAA,2BAAM;AACN,IAAAA,EAAA,8BAAiB;AACf,IAAAA,EAAA;AACA,IAAAA,EAAA,iBAAK;AAAA;AAAA,EACL,MAAA,UAAA;AACF,UAAA8C,IAAA,KAAA,OAAA;AAEA,YAAW;AACb,WAAA,OAAA,EAAA,MAAA,OAAA,OAAA,OAAA,MAAA,gBAAA,CAAA,GAEA,KAAc,2CAA4C;AACxD;AAAA,IACA;AACE,UAAA,KAAK,UAASA,CAAe;AAAA,EAI7B;AAAA,EACA,MAAA,UAAIA,GAAA;AACF,QAAA,MAAA;AAEA,UAAA;AACF,aAAA,OAAQ,EAAA,MAAA,SAAA,OAAA,OAAA,MAAA,gBAAA,CAAA;AACN;AACA,YAAA;AACA,UAAAd,IAAA,MAAAc,EAAA,cAAA,GACF,MAAAd,EAAA,SAAA;AAAA,QAIA,QAAM;AACN,eAAM,OAAA,EAAA,MAAc,OAAK,OAAA,OAAA,MAAA,eAAA,CAAA,QAEpB,MAAA,wDAA6B;AAChC;AAAA,QACA;AACA,cAAAkD,IAAAlD,EAAA,aACFmD,IAAAnD,EAAA;AAEA,YAAA,CAAAkD,MAAMC,GAAyB;eAG1B,OAAS,EAAA,oBAAoB,OAAA,MAAA,iBAAA,CAAA,GAChC,KAAA,MAAU,sCAAA;AACV;AAAA,QAAA;AACA,cACDC,KAAA,MAAA,OAAA,8BAAA,GAAA;AAED,sBAAW,IAAOA,EAAQ;AAAA,UAE1B;;UAGA,aAAAD;AAAA,QAKE,CAAA,GACE,MAAA,KAAK,OAAK,QAAA;AAAA,cACRE,IAAe,KAAA,OAAW,gBAAA,MAC1BC,IAAU,KAAM,OAAA,aAChBC,IAAS,gBAAAhI,EAAA,CAAAiI,GAAAC,GAAAlC,MAAA;AAAA,cACTkC,MAAO,WAAAA,MAAA;AAAA,iBACR,KAAA;AAAA,cACH,UAAWlC,KAAA,gBAAAA,EAAA;wBACHA,KAAA,gBAAAA,EACJ;AAAA,cAGF,SAAU+B;AAAA,cAGV,OACEA;AAAA,YAGA,CAAA;AAAA,mBACKG,MAAO,SAAA;AAAA,kBACVC,IAAMnC,aAAA,QAAAA,EAAA,UAAA,OAAAA,KAAA,cAAA;AACC,gBADD,KACN,yBAAOmC,CAAA,EAAA,GACPA,EAAM,SAAA,iBAAA,KAAAA,EAAA,SAAA,gBAAA,GAAA;AAAA,mBACP,UAAA,IACD,KAAK,OAAA;AAAA,gBACH,MAAA;AAAA,gBACF,OAAA;AAAA,gBACA,MAAK;AAAA,cACL,CAAA,GACF,KAAA;AAAA,gBAEA;AAAA,cACA,GACF,KAAA,QAAW;AACT;AAAA,YACA;AACA,iBAAK,OAAO,EAAE,MAAM,OAAO,OAAO,OAAO,MAAMA,EAAA,CAAA,GAC/C,KAAK,kBAAkB5C,CAAU;AAAA,UACnC,WAAA2C,MAAA,OAAA;AACF,gBAAA,KAAA,QAAA;AAKI,iBAAK,IAAA,8BAAkB,GACzB,KAAA,OAAQ,EAAA,MAAA,qBAAe,MAA0B,eAAA,CAAgB,GACnE,KAAA,kBAAA3C,CAAA;AAAA;QAEE,GA7Ca;AAkEX,YAjBA,KAAK,oBACL,QAAK,eAAK,qBAA+B,KAAA,gBAAS,GACtC,KAAA,mBACJ,CAAAlB,MAAA;;AAAA,YACNZ,IAAAY,EAAA,YAAA,QAAAZ,EAAO,SAAA,uBAAAM,IAAAM,EAAA,YAAA,QAAAN,EAAA,SAAA,uBAAA,eACD,IAAA,KACP,KAAA,2BAAAM,EAAA,OAAA,EAAA,GACD,KAAK,OAAA;AAAA,YAEP,MAAA;AAAA,YACF,OAAA;AAAA,YACA;UAEI,IACF,KAAK,QAAO;AAAA,QACV,GACA,QACA,GAAA,qBAAA,KAAA,gBAAA,GACF,KAAA,OAAA,kBAAA;sBAEA;AAAA,YAGA0D;AAAA,YACAC;AAAA,YACEF;AAAA,UAAA;AAAA,iBAEA,KAAA,OAAA,kBAAA,YAAA,KAAA,OAAA,UAAA;AAAA,gBACAM,IAAA,SAAA,KAAA,OAAA,UAAA,EAAA;AAAA,eACF,OAAA;AAAA,YACFL;AAAA,YACEC;AAAA,YACFF;AAAA,YAEAM;AAAA,UACE;AAAA,QAAM;AAEN,eAAA,oBAAgCJ,GAAAF,CAAA;AAElC,aAAK,OAAA;AAAA,gBACE;AAAA,UACP,OAAK;AAAA,UACH,MAAM,eAAAC,CAAA;AAAA,QAAA,CAAA,GACC,KACP,mBAAM;AAAA,MAAqD,SAC5DlG,GAAA;AACD,aAAK,OAAA;AAAA,UACH;UACF,OAAA;AAAA,UACA,MAAKA,qBAA4BA,EAAA,UAAA,OAAAA,CAAA;AAAA,QACnC,CAAA,GACF,KAAA;AAAA,UAEQ,kCAAoDA,aAAA,QAAAA,EAAA,UAAA,OAAAA,CAAA,CAAA;AAAA,QAC1D,GACA,KAAK,kBAAA0D,CAAA;AAAA,MAEL;AAAA,EACE;AAAA,EAAK,kBACHA,GAAA;AAA+D,QACjE,KAAA,QAAA;AACY,QAAZ,KAAA,oBACE,wBAAM,KAAA,sBAAA;AAAA,WACN;AAAA,QACA,sCAAM,KAAA,oBAAA;AAAA,MAAA,GAER,KAAA,OAAA;AAAA,QACF,MAAA;AAAA,QAEA;QACE,MAAO;AAAA,MACP;AACF;AAAA,IACA;AAAK;MAEL,MAAA,KAAA,IAAA,GAAA,KAAA,gBAAA;AAAA,MACA,KAAK;AAAA,IAAO;AACJ,SACN;AAAA,MACA,2BAAyBjB,CAAK,eAAkB,KAAC,gBAAA,IAAA,KAAA,oBAAA;AAAA,IAAA,GAEnD,KAAK,OAAA;AAAA,MACH,MAAM;AAAA,MACN,OAAM;AAAA,YACA,mBAAA,KAAA,MAAAA,IAAA,GAAA,CAAA;AAAA,IACV,CAAA,GAEA,gBAAwB,YAAA;AACtB,YAAI,KAAA,QAAA,GACF,MAAI,KAAK,UAAAiB,CAAkB;AAAA,IACzB,GAAAjB,CAAA;AAAA,EACA;AAAA,EAAwB,MAC1B,UAAA;;AACA,QAAA;AACE,WAAM,qBACN,QAAK,eAAS,qBAAA,KAAA,gBAAA,GAChB,KAAA,mBAAA,OAGF,KAAA,WACF,QAAAP,KAAAN,IAAA,KAAA,QAAA,UAAA,gBAAAM,EAAA,KAAAN,KAEe,cAAS;AAAA,IAExB,QAAA;AAAA,IACF;AAAA;ECjPO,MAAMtE,SAAAA;AACX,UAAA,KAAA,QAAA;AAAA,EAAA;AACwE;ADavBa,EAAA0H,GAAA,wBAEzCjF,EAFRiF,WAEsB,yBACdjF,EAHRiF,GAGQ,2BACAjF,EAJRiF,GAIQ,SAAA,YACAjF,EALRiF,GAKQ,qBACAjF,EANRiF,GAMQ,iBAAkDD;AAPV,IAChDY,IADgDX;ACVd,MAC/BY,KAAAjJ;AAAA,EAAA;AAAA,IACoB,MAClBC,EAAW,OAAQ,EAAA,SAAS,IAAA,cAAmB,EAAA,MAAW,MAAC,EAAA,CAAA;AAAA,IAAA,YAC1DA,EAAiB,QAAA0F,GAA4B;AAAA,MACjD,cAAA,EAAA,MAAA,QAAA;AAAA,IAAA,CAAA;AAAA,IAEA,UAAQ1F,EAAW;AAAA,MACjB,CAAAA,EAAA,QAAA,MAAA,GAAAA,EAAA,QAAA,WAAA,CAAA;AAAA,MAAA,EACE,SAAA,QAAW,cAAa,EAAA,MAAA,MAAA,EAAA;AAAA,IAAA;AAAA;AAAA,IAEA,QACxBA,EAAW;AAAA,MAAe;AAAA,QAE5BA,EAAA,QAAA,KAAA;AAAA,QACEA,EAAS,QAAQ,MAAA;AAAA,QACrBA,EAAA,QAAA,KAAA;AAAA,QACAA,EAAM,eAA8B;AAAA,UAClC,QAAc,QAAA;AAAA,MAAA;AAAA,MACN,EACN,SAAA,QAAiB,cAAa,EAAA,MAAA,SAAA,EAAA;AAAA,IAAA;AAAA,IAChC,MACDA,EAAA,WAAA;AAAA,MAAA,cAAA;AAAA,QAED,MAAA;AAAA,QACE,iBAAS,CAAA,OAAA,KAAA;AAAA,MACT;AAAA,IAA6B,CAC9B;AAAA;AAAA,IAED,cAAc,OAAW;AAAA,MACzB;MACF,cAAA,EAAA,MAAA,OAAA;AAAA,IACE,CAAA;AAAA,IACJ,WAAAA,EAAA,QAAA,EAAA,SAAA,GAAA,CAAA;AAAA,IAEO,cAAM4F,EAAc,QAAA,EAAA,SAAA,GAAA,CAAA;AAAA,IACvB,cAAoB,QAAM,EAAA,SAAA,GAAA,CAAA;AAAA,EAC5B;AAAA,EACF,EAAA,KAAA,oCAAA;AAEO,GACHqD;EACF,EAAE,SAAKjJ,EAAA,IAAA,EAAA;AAAA,EACT,EAAA,KAAA,mCAAA;GCtCqBkJ;EACnB,EAAA,SAAyBlJ,EAAO,IAAA,EAAA;AAAA,EAChC,EAAA,KAAyB,oCAAW;AAAA,GAGpCmJ,IADgD,MAChDA,UAA+CvD,EAAA;AAAA,EAO3C,MACF,MAAAI,GAAA;AAEA,UAAIC,IAAA,KAAA,OAAA;AACF;AACA,WAAK,MAAA,uCAA4CD,CAAA;AAEjD;AAAA,IACE;AACA,QAAA;AAOA,YAAIb,IAAA,MAAAc,EAAA,cAAA;AAEF,UADF,KAAA,OAAI,EAAA,MAAW,SAAS,OAAA,aAAqB,eAAA,CAAA,GAC3C,KAAA,OAAS,aAAgB,QAAQ;AACnC,cAAAvC,IAAO,MAAA,KAAA,OAAA,KAAA,QAAAsC,CAAA,GACLoD,IAAS,KAAM,OAAU,OAAM;AACjC,YAAAtF;AAEA,QAAAsF,MAAY,SAAAA,MAAA,WACVtF,IAAM,MAAAqB,EAAA,KAAAiE,CAAA,EAAA1F,CAAA,IAENI,IAAS,MAAKqB,EAAA,KAAOiE,CAAM,EAAA1F,GAAAsC,EAAA,OAAA,GAE7B,KAAK,OAAO;AAAA,UACd,MAAO;AAAA,iBACC;AAAA,gBACA,GAAA,KAAS,OAAM,MAAO;AAAA,QAC5B,IACA,KAAK,KAAK,EAAE,GAAGA,GAAK,SAASlC,EAAO,CAAA;AAAA,MACtC,OAAA;AAEA,cAAMP,IAAU,MADF,IAAA0B,EAAAE,CAAA,SACmB,KAAQ,OAAM,YAAUa,SAAY;aAChE,OAAS,QAAM,SAAO,OAAO,OAAO,MAAM,OAAS,CAAA,GACxD,KAAK,KAAM,EAAA,GAAAA,GAAA,SAAgBzC,EAAW,aAAG,CAAA;AAAA,MAC3C;AAAA,IACF,SAAAhB,GAAA;AACF,YAAAb,IAAAa,aAAA,QAAAA,EAAA,UAAA,OAAAA,CAAA;2DC9Da,KAAA,MAAA,gBAAgBb,CAAA,IAAAsE,CAAA;AAAA,IAC3B;AAAA,EAAA;AACwE;ADYzBtF,EAAAyI,GAAA,mBAC/ChG,EADAgG,GACyB,QAAA,+BAEzBhG,EAHAgG,GAGe,YAAkB,eAC/BhG,EAJFgG,YAIQ,YACNhG,EALFgG,GAKO,gBAAYH,KACf7F,EANJgG,kBAMeF,KACX9F,EAPJgG,GAOI,iBAAAD;AAR4C,IAChDG,IADgDF;ACTd,MAC/BtJ,KAAAE;AAAA,EAAA;AAAA,IACoB,MAClBC,EAAW,OAAQ,EAAA,aAAc,cAAW,EAAQ,MAAM,MAAC,EAAA,CAAA;AAAA,IAAA,YAC1DA,EAAS,QAAa0F;MAC1B,cAAA,EAAA,MAAA,QAAA;AAAA,IACA,CAAA;AAAA,IAA6B,YAClB;AAAA,MACT,CAAA1F,EAAA,QAAgB,WAAM,GAAAA,EAAA,QAAA,MAAA,CAAA;AAAA,MACvB,EAAA,SAAA,aAAA,cAAA,EAAA,MAAA,MAAA,EAAA;AAAA,IACD;AAAA,IAA8B,WACnBA,EAAA,OAAA;AAAA,MACT,SAAA;AAAA,MACD,cAAA,EAAA,MAAA,cAAA;AAAA,IACD,CAAA;AAAA,IAAuB,YACrBA,EAAA,OAAA;AAAA,MAAA,SACE;AAAA,MAA4B,cACjB,EAAA;IAAkB,CAAA;AAAA,IACD,YAC5BA,EAAmB;AAAA,MAAW;AAAA,QAEhCA,EAAA,QAAA,SAAA;AAAA,QACEA,EAAS,QAAA,UAAY;AAAA,QACzBA,EAAA,QAAA,SAAA;AAAA,QACAA,EAAM,QAAW,WAAO;AAAA,QACtBA,EAAS,QAAA,YAAA;AAAA,MACT;AAAA,MACD,EAAA,SAAA,YAAA,cAAA,EAAA,MAAA,SAAA,EAAA;AAAA,IACD;AAAA,IACA,MAAAA,EAAc,OAAA;AAAA,MACd;MACF,cAAA,EAAA,gBAAA,OAAA;AAAA,IACE,CAAA;AAAA,IACJ,WAAAA,EAAA,QAAA,EAAA,SAAA,GAAA,CAAA;AAAA,IAEO,cAAMA,EAAiB,QAAA,EAAA,SAAA,GAAA,CAAA;AAAA,IAC5B,YAAAA,EAAA,QAAA,EAAA,SAAA,GAAA,CAAA;AAAA,EAAA;AAAA,EACoD,EACpD,KAAA,8BAAA;AAAA,GAEFsJ,KAAAvJ;AAAA,EAEO;AAAA,IACH,sBAA0B,EAAA,SAAA,OAAA,CAAA;AAAA,EAC5B;AAAA,EACF,EAAA,KAAA,gCAAA;AAEO,GACH6F;EACF,EAAE,SAAK5F,EAAA,IAAA,EAAA;AAAA,EACT,EAAA,KAAA,6BAAA;GC3Ca8G;EACX,EAAA,SAAe9G,EAAA,IAAA,EAAA;AAAA,EACf,EAAA,KAAwB,8BAAiB;AAAA,GAIjCuJ,IADiC,MACjCA,EAAmD;AAAA,EAYvD,YAAAC,GAA2B;AAR7B,IAAArG,EAAA,wBAA0B,oBAAA,IAAA;AAC5B,IAAAA,EAAA,wBAAA,oBAAA,IAAA;AAEA,IAAAA,EAAA,oBAAO;AAIL,IAAAA,EAAA;AAC6B,SACzB,qBAAAqG;AAAA,EAAA;AAAA,EACuC,OACzC,YAAAC,GAAAD,GAAA;AACF,WAAAD,EAAA,UAAA,IAAAE,CAAA,KACAF,YAAwB;AAAA,MAC1BE;AAAA,MAEA,IAAOF,EAAeC,CAA4B;AAAA,OAIzCD,EAA0D,UAAA,IAAAE,CAAA;AAAA,EACjE;AAAA,EAEA,OAAA,eAAoBA;AAClB,IAAAF,EAAK,UAAmB,OAAAE,CAAa;AAAA,EACrC;AAAA,EAAmB,SACpBC,GAAAxF,GAAA;AACH,gBAAA,eAAA,OAAAwF,CAAA,GAEA,IAAW,QAAA,CAAyBtC,GAAAC,MAAA;AAClC,WAAM,sBAA8B,EAAA,WAAAqC,GAAa,MAAAxF,GAAA,SAAAkD,GAAA,QAAAC,EAAA,CAAA,GACjD,mBAAa;AAAA,IACX,CAAA;AAAA,EACA;AAAA,EAAoC,WACtCqC,GAAA;AAEA,UAAKC,IAAA,KAAe,eAAa,IAAAD,CAAA;AACjC,IAAAC,MACFA,EAAA,OAAA,IAAA,MAAA,qCAAA,CAAA,uBAE8B,OAAAD,CAAA,IAE5B,KAAK,eAAa,IAAAA,CAAW,GAC3B,KAAA,cAAK;AAAA,EACL;AAAA,EACE,gBAAQ;AAA4C,IACrD,KAAA,eACH,KAAG,aAAA,iBAA+B;AACpC,WAAA,aAAA,MAEA,WAAqC,EAAA,MAAA,CAAA3E,MAAA;AACnC,sBAAgB,mCAA2BA,CAAA;AAAA,MAC3C,CAAA;AAAA,IACA,GAAAwE,EAAoB,cAAM;AAAA,EAC1B;AAAA,EAEA,MAAI,QAAQ;AAEZ,UAAMK,IAAO,QAAW,KAAA,cAAmB,GACrCC,IAAS,IAAA,IAAA,KAAA,cAAqB;AAMpC,QAJA,KAAA,eAAkB,MAAG,GACrB,KAAA,eAAM,MAAiB,GAGvBD,EAAW,gBAAsB,SAAA,EAAA;AAC/B,UAAAzE,UAAe,KAAA,iCAA4B,GACvCC,IAAC,IAAQH,EAAAE,CAAA,GACT2E,IAAA,CAAA,GAAAF,GAAA,GAAAC,EAAA,KAAA,CAAA,GACFE,IAAS,MAAgB3E,EAAA,uBAAS0E,CAAA;AAAA,eAC3BJ,KAAKE,GAAA;AACZ,YAAA5F,IAAQ+F,EAAM,IAAAL,CAAA;AAChB,UAAA1F;AACF,YAAA;AAGA,kBAAY,gBAAWA,EAAY,EAAA;AAAA,QACjC,SAAIe,GAAA;AACF,wBAAM,uCAAqC2E,CAAA,KAAA3E,CAAA;AAAA,QAE3C;AAAA,IACE;AACE,eAAA,CAAA2E,GAAQM,CAAc,KAAAH;AACtB,UAAA;AAAA,cACF7F,IAAA+F,EAAA,IAAAL,CAAA;AACA,YAAA1F,GAAS;AACX,cAAAA,EAAA,SAAAgG,EAAA,MAAA;AAEA,YAAAA,EAAW,QAAI,EAAM,IAAGhG,EAAA,GAAA,CAAA;;;gBAGhBoB,EAAA,oBAAsB;AAAA,QAChC;AACF,cAAA,EAAA,IAAAhB,EAAA,IAAA,MAAAgB,EAAA,gBAAAsE,GAAAM,EAAA,IAAA;AACF,QAAAA,EAAA,QAAA,EAAA,IAAA5F,EAAA,CAAA;AAAA,MACF,SAAAW,GAAA;;MCvHO;AAAA,EAI+B;AAAA;ADgBuBrE,EAAA6I,GAAA,qBACnDpG,EADAoG,GACA,aAAA,oBAAA,IAAA,IAEApG,EAHAoG,GAGA,kBAAY;AAJqB,IACjCU,IADiCV;ACfL,SAAAW,GAAA9G,GAAA+G,GAAA;;;;;;;;;;;;8BAWK/G,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,WAwBhC;AAAA;AAAA;AAEA;AArC2B1C,EAAAwJ,IAAA;AAsCzB,WACC;AAAA,EACd,SAAA;AAAA,EAEA;EACE,SAAS;AAAA,EACT,WAAU;AAAA,EACV,YAAS;AAAA,QAEG;AAAA,EACd,SAAA;AAAA,EAEO,UAAS;AAAA,EAMd,SAAM;AAAA,EACN,WAAM;AAAA,EAEN,YAAM;AACF;AAAA,SAAAE,GAGAhH,GAAAiH,GAAAjB,GAAAe,GAAA;AAAA,QAAAG,IAAAC,GAAAnB,CAAA,GAIJoB,IAJIC,GAAArB,CAAA;;uBAMO;AAAA;AAAA;AAEA,SAAA,6BAAAiB,CAAA;AAAA,eAAAjH,CAAA;AAAA,OAAAgG,CAAA;AAAA,2BAAAkB,CAAA;AAAA,EAAAE,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UCvDQL,CAAA;AAAA;AAAA;AAQiB;ADoChCzJ,EAAA0J,IAAA;AClC4C,MAChDM,IADgD,MAChDA,UAA+CxK,EAAA;AAAA,EADC;AAAA;AAY9C,IAAAiD,EAAA,kBAAM;AAAA;AAAA,EACN,mBAAgB;AACd,cAAO,KAAA,SAAA,WAAA,GAAA,KAAA,OAAA,SAAA;AAAA,EAAA;AAAA,EACL,gBACK;AAAO,UACZC,IAAY,KAAA,iBAAA;AAAA,WACZ,KAAK,OAAO,aAAA,SACdgH;AAAA,MACFhH;AAAA,MACA,KAAO,OAAA;AAAA,MACT,KAAA,OAAA;AAAA,MAEe,YAAU;AAAA,QAGhB8G,GAAe9G,GAAc,KAAO,OAAM,IAAA;AAAA,EAC/C;AAAA,EAAA,MACF,UAAA;AACA,UAAK6C,gBAAuB;AAC1B;AACA,WAAA,OAAA,EAAA,MAAA,OAAA,OAAA,OAAA,MAAA,gBAAA,CAAA;AACF;AAAA,IAEA;AAAiC,QAC9B,CAAA,KAAA,OAAmB,WAAA;AACpB,WAAA,OAAA,EAAA,MAAA,OAAA,OAAA,OAAA,MAAA,sBAAA,CAAA;AACF;AAAA,IAEA;AAEA,cACGgE,EAAc;AAAA,MAEbhE,EAAK;AAAA,MACLA;AAAA,IACF;AAEE,SAAA,OAAM,EAAA,MAAU,gBAAe,OAAQ,MAAI,gBAAoB,GAC/D0E,EAAK,cAAe,iBAAc,GAAA,KAAO,cAAe,CAAA,EAAA,KAAA,MAAA;AACxD,WAAK,eACN,KAAA,OAAA,EAAA,MAAA,SAAA,OAAA,OAAA,MAAA,WAAA,CAAA;AAAA,IACL,CAAA,EAAA,MAAA,CAAA5F,MAAA;AAEA,YAAerD,IAAkBqD,aAAA,QAAAA,EAAA,UAAA,OAAAA,CAAA;AAC/B,WAAK,eAAe,OAAA,OAAA,OAAA,MAAArD,EAAA,CAAA,GAClB,KAAK,MAAA,uBAAAA,CAAA,EAAA;AAAA,IAAA,CAAA;AAAA,EACH;AAAA,EACA,MACF,MAAAsE,GAAA;AACA,QAAA,CAAA,KAAA,UAAA;AACF,WAAA;AAAA;QAGIA;AAAA,MACF;AACA;AAAA,IACF;AAEA,UAAIC,IAAA,KAAA,OAAA;AACF;AACA,iBAAM,uCAAkCD,CAAA;AACxC;AAAA,IAEA;AACE,QAAA;AAA4B,YAC1Bb,IAAK,MAAAc,EAAiB,cAAA,OAClB,IAAAhB,EAAAE,CAAA;AAEN,UAFM,KACN,OAAA,EAAA,MAAA,SAAA,OAAA,OAAA,MAAA,eAAA,CAAA,QACK,OAAS,aAAM,aAAgB;AACpC,cAAK5B,IAAU,MAAK+B,EAAA;AAAA,UACtB,KAAO,iBAAA;AAAA,YACC;AAAA,QACN;AACA,aAAI,OAAA,EAAA,MAAA,SAAA,OAAA,OAAA,MAAA,OAAA,CAAA,GAEJ,UAAI,EAAA,GAAWU,GAAA,SAAazC,EAAA;MAC1B,OAAA;AAIF,cAAAG,IAAO,KAAA,OAAA,YACL0F,IACE,YAAW;AAKb,YAAAtF;AACF,QAAAsF,MAAA,aAAAA,MAAA,mBAEKA,MAAe,kBAAgB9D,EAAO,IAAM5B,KAAQ,MAAA4B,EAAA,OAAA5B,CAAA,QAGpD,MAAO4B,EADd8D,MAAA,YAAA,QAAAA,MAAA,cAAA,UAAA,MACc,EAAA1F,GAAAsC,EAAA,OAAA,QAET,OAAS,QAAM,SAAO,OAAO,OAAO,MAAM,OAAS,CAAA,GACxD,KAAK,KAAM,EAAA,GAAAA,GAAA,SAAAlC,EAA0B,CAAA;AAAA,MACvC;AAAA,IACF,SAAAvB,GAAA;AAEA,YAAeb,IAAOa,aAAmB,QAAAA,EAAA,UAAA,OAAAA,CAAA;AACvC,kBAAa,EAAA,MAAA,OAAA,OAAA,OAAA,MAAAb,EAAA,CAAA,GACX,WAAM,0BAAyBA,CAAA,IAAAsE,CAAA;AAAA,IAC/B;AAAA,EACE;AAAA,EAAiC,MAAA,OAC9B4E,GAAmB;AAAA,QAAAA,GACpB;AAAA,YACF3E,IAAA,KAAA,OAAA;AACA,MAAAA,KACFgE,EAAA;AAAA,QACFhE,EAAA;AAAA,QACKA;AAAA,MACP,EACF,WAAA,KAAA,iBAAA,CAAA;AAAA,ICjJA;SACS,WAAA;AAAA,EAAA;AACL;ADmB6CvF,EAAAgK,GAAA,uBAC/CvH,EADAuH,GACyB,QAAA,yBACzBvH,EAFAuH,GAEyB,YAAA,eAEjBvH,EAJRuH,GAIQ,SAAW,YAEXvH,EANRuH,mBAMmC7K,KACjCsD,EAPFuH,uBAQAvH,EARAuH,GAQA,iBAAA5D,KAEQ3D,EAVRuH,qBAUgCpB;AAXgB,IAChDuB,IADgDH;AChB9C,MACAI,KAAA3K,EAAA;AAAA,EAAA,OACA;AAAA,IACAuF;AAAA,IACAqF;AAAAA,IACApE;AAAA,IAAAiB;AAAA,IAEHK;AAAA;;;;;;;"}
1
+ {"version":3,"file":"index.mjs","sources":["../src/server/schemas/salesforce-connection.ts","../src/server/lib/pkce.ts","../src/server/api/routes/auth.ts","../src/server/api/connection.ts","../src/server/services/salesforce.ts","../src/server/lib/sobject-faux.ts","../src/server/api/routes/apex.ts","../src/server/api/routes/streaming.ts","../src/server/api/index.ts","../src/server/nodes/salesforce-connection.ts","../src/server/schemas/salesforce-soql.ts","../src/server/nodes/salesforce-soql.ts","../src/server/schemas/salesforce-dml.ts","../src/server/nodes/salesforce-dml.ts","../src/server/schemas/salesforce-bulk.ts","../src/server/nodes/salesforce-bulk.ts","../src/server/schemas/salesforce-describe.ts","../src/server/nodes/salesforce-describe.ts","../src/server/schemas/salesforce-streaming.ts","../src/server/nodes/salesforce-streaming.ts","../src/server/schemas/salesforce-apex-invocation.ts","../src/server/nodes/salesforce-apex-invocation.ts","../src/shared/apex-templates.ts","../src/server/schemas/salesforce-apex-code.ts","../src/server/lib/apex-class-manager.ts","../src/server/nodes/salesforce-apex-code.ts","../src/server/index.ts"],"sourcesContent":["import { defineSchema, SchemaType } from \"@bonsae/nrg/server\";\n\nexport const ConfigsSchema = defineSchema(\n {\n name: SchemaType.String({ default: \"\" }),\n loginUrl: SchemaType.String({\n default: \"https://login.salesforce.com\",\n \"x-nrg-form\": { icon: \"globe\" },\n }),\n clientId: SchemaType.String({\n default: \"\",\n \"x-nrg-form\": { icon: \"key\" },\n }),\n apiVersion: SchemaType.Union(\n [\n SchemaType.Literal(\"62.0\"),\n SchemaType.Literal(\"61.0\"),\n SchemaType.Literal(\"60.0\"),\n SchemaType.Literal(\"59.0\"),\n SchemaType.Literal(\"58.0\"),\n SchemaType.Literal(\"57.0\"),\n SchemaType.Literal(\"56.0\"),\n SchemaType.Literal(\"55.0\"),\n ],\n { default: \"62.0\", \"x-nrg-form\": { icon: \"code-fork\" } },\n ),\n callbackUrl: SchemaType.Optional(\n SchemaType.String({\n default: \"\",\n \"x-nrg-form\": { icon: \"exchange\" },\n }),\n ),\n },\n { $id: \"salesforce-connection:config\" },\n);\n\nexport const CredentialsSchema = defineSchema(\n {\n accessToken: SchemaType.String({ default: \"\", format: \"password\" }),\n refreshToken: SchemaType.String({ default: \"\", format: \"password\" }),\n instanceUrl: SchemaType.String({ default: \"\" }),\n },\n { $id: \"salesforce-connection:credentials\" },\n);\n","import crypto from \"node:crypto\";\n\nconst AUTH_STATE_TTL = 10 * 60 * 1000; // 10 minutes\n\ninterface PendingAuthState {\n codeVerifier: string;\n nodeId: string;\n clientId: string;\n loginUrl: string;\n callbackUrl: string;\n timestamp: number;\n}\n\nconst pendingAuthStates = new Map<string, PendingAuthState>();\n\nexport function generateCodeVerifier(): string {\n return crypto.randomBytes(32).toString(\"base64url\");\n}\n\nexport function generateCodeChallenge(verifier: string): string {\n return crypto.createHash(\"sha256\").update(verifier).digest(\"base64url\");\n}\n\nexport function createAuthState(params: {\n nodeId: string;\n clientId: string;\n loginUrl: string;\n callbackUrl: string;\n}): { state: string; codeChallenge: string } {\n const state = crypto.randomUUID();\n const codeVerifier = generateCodeVerifier();\n const codeChallenge = generateCodeChallenge(codeVerifier);\n\n pendingAuthStates.set(state, {\n codeVerifier,\n nodeId: params.nodeId,\n clientId: params.clientId,\n loginUrl: params.loginUrl,\n callbackUrl: params.callbackUrl,\n timestamp: Date.now(),\n });\n\n // Cleanup stale entries\n for (const [key, value] of pendingAuthStates) {\n if (Date.now() - value.timestamp > AUTH_STATE_TTL) {\n pendingAuthStates.delete(key);\n }\n }\n\n return { state, codeChallenge };\n}\n\nexport function consumeAuthState(state: string): PendingAuthState | null {\n const entry = pendingAuthStates.get(state);\n if (!entry) return null;\n pendingAuthStates.delete(state);\n if (Date.now() - entry.timestamp > AUTH_STATE_TTL) return null;\n return entry;\n}\n","import type { RED } from \"@bonsae/nrg/server\";\nimport { createAuthState, consumeAuthState } from \"../../lib/pkce\";\n\ninterface TokenResponse {\n access_token: string;\n refresh_token: string;\n instance_url: string;\n}\n\nfunction escapeHtml(str: string): string {\n return str\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\");\n}\n\nfunction errorPage(message: string, autoClose = true): string {\n const script = autoClose\n ? \"<script>setTimeout(function(){window.close()},3000)</script>\"\n : \"\";\n return `<html><body><h2>Authorization Failed</h2><p>${escapeHtml(message)}</p>${script}</body></html>`;\n}\n\nfunction initAuthRoutes(RED: RED): void {\n const adminRoot = ((RED.settings as any).httpAdminRoot || \"\").replace(\n /\\/$/,\n \"\",\n );\n\n RED.httpAdmin.post(\"/salesforce/auth/start\", (req, res) => {\n try {\n const {\n nodeId,\n loginUrl,\n clientId,\n callbackUrl: overrideCallbackUrl,\n } = req.body;\n\n if (!nodeId || !loginUrl || !clientId) {\n res\n .status(400)\n .json({ error: \"nodeId, loginUrl, and clientId are required\" });\n return;\n }\n\n const callbackUrl =\n overrideCallbackUrl ||\n `${req.protocol}://${req.get(\"host\")}${adminRoot}/salesforce/auth/callback`;\n\n const { state, codeChallenge } = createAuthState({\n nodeId,\n clientId,\n loginUrl,\n callbackUrl,\n });\n\n const params = new URLSearchParams({\n response_type: \"code\",\n client_id: clientId,\n redirect_uri: callbackUrl,\n state,\n code_challenge: codeChallenge,\n code_challenge_method: \"S256\",\n });\n\n res.json({\n authorizationUrl: `${loginUrl}/services/oauth2/authorize?${params.toString()}`,\n });\n } catch (error) {\n RED.log.error(\n `salesforce-connection: auth/start error: ${error instanceof Error ? error.message : String(error)}`,\n );\n res.status(500).json({ error: \"Failed to start authorization\" });\n }\n });\n\n RED.httpAdmin.get(\"/salesforce/auth/callback\", async (req, res) => {\n try {\n const { code, state, error: oauthError, error_description } = req.query;\n\n if (oauthError) {\n RED.log.error(\n `salesforce-connection: OAuth error: ${oauthError} - ${error_description}`,\n );\n res\n .status(400)\n .send(errorPage(String(error_description || oauthError)));\n return;\n }\n\n if (!code || !state) {\n res.status(400).send(errorPage(\"Missing code or state parameter\"));\n return;\n }\n\n const entry = consumeAuthState(state as string);\n if (!entry) {\n res\n .status(400)\n .send(\n errorPage(\n \"Invalid or expired authorization state. Please try again.\",\n ),\n );\n return;\n }\n\n const tokenResponse = await fetch(\n `${entry.loginUrl}/services/oauth2/token`,\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n body: new URLSearchParams({\n grant_type: \"authorization_code\",\n code: code as string,\n client_id: entry.clientId,\n redirect_uri: entry.callbackUrl,\n code_verifier: entry.codeVerifier,\n }),\n },\n );\n\n if (!tokenResponse.ok) {\n const errorBody = await tokenResponse.text();\n RED.log.error(\n `salesforce-connection: Token exchange failed: ${errorBody}`,\n );\n res\n .status(500)\n .send(\n errorPage(\n \"Token exchange failed. Check the Node-RED logs for details.\",\n ),\n );\n return;\n }\n\n const tokens = (await tokenResponse.json()) as TokenResponse;\n\n (RED.nodes as any).addCredentials(entry.nodeId, {\n accessToken: tokens.access_token,\n refreshToken: tokens.refresh_token,\n instanceUrl: tokens.instance_url,\n });\n\n RED.log.info(\n `salesforce-connection: Successfully authorized node ${entry.nodeId} for ${tokens.instance_url}`,\n );\n\n const messageData = JSON.stringify({\n type: \"salesforce-auth-success\",\n nodeId: entry.nodeId,\n accessToken: tokens.access_token,\n refreshToken: tokens.refresh_token,\n instanceUrl: tokens.instance_url,\n });\n\n res.send(`<!DOCTYPE html>\n<html>\n<body>\n<h2>Authorization Successful</h2>\n<p>You can close this window.</p>\n<script>\n if (window.opener) {\n window.opener.postMessage(${messageData}, \"*\");\n }\n setTimeout(function() { window.close(); }, 1500);\n</script>\n</body>\n</html>`);\n } catch (error) {\n RED.log.error(\n `salesforce-connection: auth/callback error: ${error instanceof Error ? error.message : String(error)}`,\n );\n res.status(500).send(errorPage(\"An unexpected error occurred.\"));\n }\n });\n\n RED.httpAdmin.get(\"/salesforce/auth/status/:nodeId\", (req, res) => {\n try {\n const credentials = RED.nodes.getCredentials(req.params.nodeId);\n const authenticated = !!(\n credentials?.accessToken && credentials?.instanceUrl\n );\n res.json({\n authenticated,\n instanceUrl: authenticated ? credentials.instanceUrl : undefined,\n });\n } catch {\n res.json({ authenticated: false });\n }\n });\n}\n\nexport { initAuthRoutes };\n","import type { RED } from \"@bonsae/nrg/server\";\nimport jsforce, { type Connection } from \"jsforce\";\n\nexport function getConnection(RED: RED, nodeId: string): Connection {\n const credentials = RED.nodes.getCredentials(nodeId);\n if (!credentials?.accessToken || !credentials?.instanceUrl) {\n throw new Error(\"Connection not authenticated\");\n }\n return new jsforce.Connection({\n instanceUrl: credentials.instanceUrl,\n accessToken: credentials.accessToken,\n });\n}\n","import type { Connection } from \"jsforce\";\n\n// --- Types ---\n\nexport interface ApexClassRecord {\n Id: string;\n Name: string;\n Body: string;\n}\n\nexport interface InvocableActionResult {\n actionName: string;\n errors: Array<{\n statusCode: string;\n message: string;\n fields: string[];\n }>;\n isSuccess: boolean;\n outputValues: { result: string } | null;\n}\n\nexport interface ChannelInfo {\n value: string;\n label: string;\n group: string;\n}\n\n// --- Client ---\n\nexport class SalesforceClient {\n private static readonly MAX_RETRIES = 3;\n private static readonly RETRY_DELAY_MS = 1000;\n\n private conn: Connection;\n\n constructor(conn: Connection) {\n this.conn = conn;\n }\n\n // --- Apex REST ---\n\n async invoke(\n fullClassName: string,\n payload: unknown,\n ): Promise<InvocableActionResult> {\n const version = this.conn.version || \"62.0\";\n\n const results = (await this.conn.request({\n method: \"POST\",\n url: `/services/data/v${version}/actions/custom/apex/${fullClassName}`,\n body: JSON.stringify({\n inputs: [{ payload: JSON.stringify(payload) }],\n }),\n headers: { \"Content-Type\": \"application/json\" },\n })) as InvocableActionResult[];\n\n const action = results[0];\n if (!action.isSuccess) {\n const errors = action.errors.map((e) => e.message).join(\"; \");\n throw new Error(`Invocable action failed: ${errors}`);\n }\n\n return action;\n }\n\n async post(path: string, payload: unknown): Promise<string> {\n return (await this.conn.apex.post(\n path,\n payload as Record<string, unknown>,\n )) as string;\n }\n\n async get(path: string): Promise<string> {\n return (await this.conn.apex.get(path)) as string;\n }\n\n async put(path: string, payload: unknown): Promise<string> {\n return (await this.conn.apex.put(\n path,\n payload as Record<string, unknown>,\n )) as string;\n }\n\n async patch(path: string, payload: unknown): Promise<string> {\n return (await this.conn.apex.patch(\n path,\n payload as Record<string, unknown>,\n )) as string;\n }\n\n async delete(path: string): Promise<string> {\n return (await this.conn.apex.delete(path)) as string;\n }\n\n // --- Tooling API ---\n\n async queryApexClassesByName(\n names: string[],\n ): Promise<Map<string, ApexClassRecord>> {\n const namesList = names.map((n) => `'${n}'`).join(\",\");\n const result = await this.conn.tooling.query(\n `SELECT Id, Name, Body FROM ApexClass WHERE Name IN (${namesList})`,\n );\n\n const map = new Map<string, ApexClassRecord>();\n for (const record of result.records as any[]) {\n map.set(record.Name, {\n Id: record.Id,\n Name: record.Name,\n Body: record.Body,\n });\n }\n return map;\n }\n\n async createApexClass(name: string, body: string): Promise<{ id: string }> {\n return this.withRetry(async () => {\n const result = await this.conn.tooling.create(\"ApexClass\" as any, {\n Name: name,\n Body: body,\n });\n if (!result.success) {\n const errors = result.errors?.map((e: any) => e.message).join(\"; \");\n throw new Error(`Apex create failed: ${errors}`);\n }\n return { id: result.id };\n }, `create ${name}`);\n }\n\n async deleteApexClass(id: string): Promise<void> {\n await this.withRetry(\n () => this.conn.tooling.destroy(\"ApexClass\" as any, id),\n `delete ${id}`,\n );\n }\n\n async queryApexRestAndInvocableClasses(): Promise<{\n rest: Array<{ name: string; urlMapping?: string }>;\n invocable: Array<{ name: string }>;\n }> {\n const result = await this.conn.tooling.query(\n \"SELECT Name, Body FROM ApexClass ORDER BY Name\",\n );\n\n const rest: Array<{ name: string; urlMapping?: string }> = [];\n const invocable: Array<{ name: string }> = [];\n\n for (const r of result.records as any[]) {\n if (r.Body?.includes(\"@RestResource\")) {\n const match = r.Body.match(\n /@RestResource\\s*\\(\\s*urlMapping\\s*=\\s*'([^']+)'/,\n );\n rest.push({ name: r.Name, urlMapping: match ? match[1] : undefined });\n }\n if (r.Body?.includes(\"@InvocableMethod\")) {\n invocable.push({ name: r.Name });\n }\n }\n\n return { rest, invocable };\n }\n\n // --- Streaming ---\n\n async queryStreamingChannels(): Promise<ChannelInfo[]> {\n const result = await this.conn.describeGlobal();\n const channels: ChannelInfo[] = [];\n\n for (const sobject of result.sobjects) {\n if (sobject.name.endsWith(\"__e\")) {\n channels.push({\n value: `/event/${sobject.name}`,\n label: `${sobject.label} (${sobject.name})`,\n group: \"Platform Events\",\n });\n } else if (sobject.name.endsWith(\"ChangeEvent\")) {\n channels.push({\n value: `/data/${sobject.name}`,\n label: `${sobject.label} (${sobject.name})`,\n group: \"Change Data Capture\",\n });\n }\n }\n\n channels.push({\n value: \"/data/ChangeEvents\",\n label: \"All Change Events\",\n group: \"Change Data Capture\",\n });\n\n return channels;\n }\n\n // --- Retry ---\n\n private async withRetry<T>(fn: () => Promise<T>, label: string): Promise<T> {\n for (let attempt = 1; attempt <= SalesforceClient.MAX_RETRIES; attempt++) {\n try {\n return await fn();\n } catch (err) {\n if (attempt === SalesforceClient.MAX_RETRIES) throw err;\n const delay = SalesforceClient.RETRY_DELAY_MS * attempt;\n console.warn(\n `[SalesforceClient] ${label} failed (attempt ${attempt}/${SalesforceClient.MAX_RETRIES}), retrying in ${delay}ms...`,\n );\n await new Promise((r) => setTimeout(r, delay));\n }\n }\n throw new Error(\"unreachable\");\n }\n}\n","// Maps Salesforce field types to Apex types for faux class generation\nexport function sfTypeToApex(sfType: string): string {\n switch (sfType) {\n case \"boolean\":\n return \"Boolean\";\n case \"int\":\n return \"Integer\";\n case \"long\":\n return \"Long\";\n case \"double\":\n return \"Double\";\n case \"currency\":\n case \"percent\":\n return \"Decimal\";\n case \"date\":\n return \"Date\";\n case \"datetime\":\n return \"Datetime\";\n case \"time\":\n return \"Time\";\n case \"id\":\n return \"Id\";\n case \"reference\":\n return \"Id\";\n case \"base64\":\n return \"Blob\";\n case \"location\":\n return \"Location\";\n case \"address\":\n return \"Address\";\n default:\n // string, textarea, phone, email, url, picklist,\n // multipicklist, combobox, encryptedstring, anyType, etc.\n return \"String\";\n }\n}\n\n// Generates a faux Apex class from a Salesforce SObject describe result.\n// The Apex LSP indexes these to provide field-level completions.\nexport function buildFauxClass(desc: {\n name: string;\n fields: { name: string; type: string }[];\n}): string {\n const lines = [`global class ${desc.name} {`];\n for (const field of desc.fields) {\n const apexType = sfTypeToApex(field.type);\n lines.push(` global ${apexType} ${field.name};`);\n }\n lines.push(\"}\");\n return lines.join(\"\\n\");\n}\n","import type { RED } from \"@bonsae/nrg/server\";\nimport { getConnection } from \"../connection\";\nimport { SalesforceClient } from \"../../services/salesforce\";\nimport { buildFauxClass } from \"../../lib/sobject-faux\";\n\nfunction initApexRoutes(RED: RED): void {\n RED.httpAdmin.get(\n \"/salesforce/list-apex-classes/:nodeId\",\n async (req, res) => {\n try {\n const conn = getConnection(RED, req.params.nodeId);\n const sf = new SalesforceClient(conn);\n res.json(await sf.queryApexRestAndInvocableClasses());\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n res.status(500).json({ error: message });\n }\n },\n );\n\n // Returns SObject field definitions for the LSP workspace.\n // Generates faux Apex classes that the Apex LSP can index.\n // Uses describeGlobal to get field info without individual describe calls.\n RED.httpAdmin.get(\n \"/salesforce/describe-sobjects/:nodeId\",\n async (req, res) => {\n try {\n const conn = getConnection(RED, req.params.nodeId);\n\n // Check server-side cache first (30 min TTL)\n const cacheKey = req.params.nodeId;\n const cached = sobjectCache.get(cacheKey);\n if (cached && Date.now() - cached.timestamp < SOBJECT_CACHE_TTL) {\n res.json({ sobjects: cached.data });\n return;\n }\n\n const global = await conn.describeGlobal();\n\n const sobjectNames = global.sobjects\n .filter((s) => s.queryable)\n .map((s) => s.name);\n\n // Describe in sequential batches of 25 to stay within rate limits.\n // With filtering, typically ~200-300 SObjects instead of 700+.\n const batchSize = 25;\n const fauxClasses: Record<string, string> = {};\n\n for (let i = 0; i < sobjectNames.length; i += batchSize) {\n const batch = sobjectNames.slice(i, i + batchSize);\n const results = await Promise.all(\n batch.map((name) => conn.describe(name).catch(() => null)),\n );\n for (const desc of results) {\n if (desc) fauxClasses[desc.name] = buildFauxClass(desc);\n }\n }\n\n // Cache the results server-side\n sobjectCache.set(cacheKey, {\n data: fauxClasses,\n timestamp: Date.now(),\n });\n\n res.json({ sobjects: fauxClasses });\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n res.status(500).json({ error: message });\n }\n },\n );\n}\n\n// Server-side SObject cache (30 min TTL)\nconst SOBJECT_CACHE_TTL = 30 * 60 * 1000;\nconst sobjectCache = new Map<\n string,\n { data: Record<string, string>; timestamp: number }\n>();\n\nexport { initApexRoutes };\n","import type { RED } from \"@bonsae/nrg/server\";\nimport { getConnection } from \"../connection\";\nimport { SalesforceClient } from \"../../services/salesforce\";\n\nfunction initStreamingRoutes(RED: RED): void {\n RED.httpAdmin.get(\n \"/salesforce/list-streaming-channels/:nodeId\",\n async (req, res) => {\n try {\n const conn = getConnection(RED, req.params.nodeId);\n const client = new SalesforceClient(conn);\n res.json(await client.queryStreamingChannels());\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n res.status(500).json({ error: message });\n }\n },\n );\n}\n\nexport { initStreamingRoutes };\n","import type { RED } from \"@bonsae/nrg/server\";\nimport { initAuthRoutes } from \"./routes/auth\";\nimport { initApexRoutes } from \"./routes/apex\";\nimport { initStreamingRoutes } from \"./routes/streaming\";\n\nfunction initRoutes(RED: RED): void {\n initAuthRoutes(RED);\n initApexRoutes(RED);\n initStreamingRoutes(RED);\n}\n\nexport { initRoutes };\n","import {\n ConfigNode,\n type Schema,\n type Infer,\n type RED,\n} from \"@bonsae/nrg/server\";\nimport jsforce, { type Connection } from \"jsforce\";\nimport {\n ConfigsSchema,\n CredentialsSchema,\n} from \"../schemas/salesforce-connection\";\nimport { initRoutes } from \"../api\";\n\ntype Config = Infer<typeof ConfigsSchema>;\ntype Credentials = Infer<typeof CredentialsSchema>;\n\nexport default class SalesforceConnection extends ConfigNode<\n Config,\n Credentials\n> {\n static override readonly type = \"salesforce-connection\";\n static override readonly configSchema: Schema = ConfigsSchema;\n static override readonly credentialsSchema: Schema = CredentialsSchema;\n\n private conn: Connection | null = null;\n\n static override async registered(RED: RED) {\n initRoutes(RED);\n }\n\n async getConnection(): Promise<Connection> {\n if (this.conn) return this.conn;\n\n const credentials = this.credentials;\n if (!credentials?.accessToken || !credentials?.instanceUrl) {\n throw new Error(\n \"Salesforce connection not authorized. Please authorize in the node configuration.\",\n );\n }\n\n this.conn = new jsforce.Connection({\n oauth2: {\n clientId: this.config.clientId,\n loginUrl: this.config.loginUrl,\n },\n instanceUrl: credentials.instanceUrl,\n accessToken: credentials.accessToken,\n refreshToken: credentials.refreshToken,\n version: this.config.apiVersion,\n });\n\n this.conn.on(\"refresh\", (newAccessToken: string) => {\n (this.RED.nodes as any).addCredentials(this.id, {\n ...this.credentials,\n accessToken: newAccessToken,\n });\n });\n\n return this.conn;\n }\n\n getAccessToken(): string | undefined {\n return this.credentials?.accessToken;\n }\n\n getInstanceUrl(): string | undefined {\n return this.credentials?.instanceUrl;\n }\n\n override async closed() {\n this.conn = null;\n }\n}\n","import { defineSchema, SchemaType } from \"@bonsae/nrg/server\";\nimport SalesforceConnection from \"../nodes/salesforce-connection\";\n\nexport const ConfigsSchema = defineSchema(\n {\n name: SchemaType.String({ default: \"\", \"x-nrg-form\": { icon: \"tag\" } }),\n connection: SchemaType.NodeRef(SalesforceConnection, {\n \"x-nrg-form\": { icon: \"cloud\" },\n }),\n query: SchemaType.TypedInput<string>({\n \"x-nrg-form\": {\n icon: \"search\",\n typedInputTypes: [\"str\", \"msg\", \"flow\", \"global\"],\n },\n }),\n errorPort: SchemaType.Boolean({ default: false }),\n completePort: SchemaType.Boolean({ default: false }),\n statusPort: SchemaType.Boolean({ default: false }),\n },\n { $id: \"salesforce-soql:config\" },\n);\n\nexport const InputSchema = defineSchema(\n {\n payload: SchemaType.Any(),\n },\n { $id: \"salesforce-soql:input\" },\n);\n\nexport const OutputSchema = defineSchema(\n {\n payload: SchemaType.Array(SchemaType.Any()),\n totalSize: SchemaType.Number(),\n done: SchemaType.Boolean(),\n },\n { $id: \"salesforce-soql:output\" },\n);\n","import { IONode, type Schema, type Infer } from \"@bonsae/nrg/server\";\nimport {\n ConfigsSchema,\n InputSchema,\n OutputSchema,\n} from \"../schemas/salesforce-soql\";\n\ntype Config = Infer<typeof ConfigsSchema>;\ntype Input = Infer<typeof InputSchema>;\ntype Output = Infer<typeof OutputSchema>;\n\nexport default class SalesforceSoql extends IONode<Config, any, Input, Output> {\n static override readonly type = \"salesforce-soql\";\n static override readonly category = \"salesforce\";\n static override readonly color: `#${string}` = \"#FFFFFF\";\n static override readonly configSchema: Schema = ConfigsSchema;\n static override readonly inputSchema: Schema = InputSchema;\n static override readonly outputsSchema: Schema = OutputSchema;\n\n override async input(msg: Input) {\n const connection = this.config.connection;\n if (!connection) {\n this.error(\"No Salesforce connection configured\", msg);\n return;\n }\n\n try {\n this.status({ fill: \"green\", shape: \"dot\", text: \"querying...\" });\n\n const conn = await connection.getConnection();\n const query = await this.config.query.resolve(msg);\n\n const result = await conn.query(query);\n\n this.status({\n fill: \"green\",\n shape: \"dot\",\n text: `${result.totalSize} records`,\n });\n this.send({\n ...msg,\n payload: result.records,\n totalSize: result.totalSize,\n done: result.done,\n });\n } catch (error) {\n this.status({\n fill: \"red\",\n shape: \"dot\",\n text: error instanceof Error ? error.message : String(error),\n });\n this.error(\n `SOQL query failed: ${error instanceof Error ? error.message : String(error)}`,\n msg,\n );\n }\n }\n}\n","import { defineSchema, SchemaType } from \"@bonsae/nrg/server\";\nimport SalesforceConnection from \"../nodes/salesforce-connection\";\n\nexport const ConfigsSchema = defineSchema(\n {\n name: SchemaType.String({ default: \"\", \"x-nrg-form\": { icon: \"tag\" } }),\n connection: SchemaType.NodeRef(SalesforceConnection, {\n \"x-nrg-form\": { icon: \"cloud\" },\n }),\n operation: SchemaType.Union(\n [\n SchemaType.Literal(\"create\"),\n SchemaType.Literal(\"read\"),\n SchemaType.Literal(\"update\"),\n SchemaType.Literal(\"delete\"),\n SchemaType.Literal(\"upsert\"),\n ],\n { default: \"create\", \"x-nrg-form\": { icon: \"pencil\" } },\n ),\n sObjectType: SchemaType.TypedInput<string>({\n \"x-nrg-form\": {\n icon: \"cube\",\n typedInputTypes: [\"str\", \"msg\"],\n },\n }),\n record: SchemaType.TypedInput<any>({\n \"x-nrg-form\": {\n icon: \"file-code-o\",\n typedInputTypes: [\"json\", \"msg\"],\n },\n }),\n externalIdField: SchemaType.Optional(\n SchemaType.String({\n default: \"\",\n \"x-nrg-form\": { icon: \"key\" },\n }),\n ),\n errorPort: SchemaType.Boolean({ default: false }),\n completePort: SchemaType.Boolean({ default: false }),\n statusPort: SchemaType.Boolean({ default: false }),\n },\n {\n $id: \"salesforce-dml:config\",\n if: SchemaType.Object({\n operation: SchemaType.Literal(\"upsert\"),\n }),\n then: SchemaType.Object({\n externalIdField: SchemaType.String({ minLength: 1 }),\n }),\n errorMessage: {\n properties: {\n externalIdField: \"External ID Field is required for upsert operations\",\n },\n },\n },\n);\n\nexport const InputSchema = defineSchema(\n {\n payload: SchemaType.Any(),\n },\n { $id: \"salesforce-dml:input\" },\n);\n\nexport const OutputSchema = defineSchema(\n {\n payload: SchemaType.Any(),\n },\n { $id: \"salesforce-dml:output\" },\n);\n","import { IONode, type Schema, type Infer } from \"@bonsae/nrg/server\";\nimport {\n ConfigsSchema,\n InputSchema,\n OutputSchema,\n} from \"../schemas/salesforce-dml\";\n\ntype Config = Infer<typeof ConfigsSchema>;\ntype Input = Infer<typeof InputSchema>;\ntype Output = Infer<typeof OutputSchema>;\n\nexport default class SalesforceDml extends IONode<Config, any, Input, Output> {\n static override readonly type = \"salesforce-dml\";\n static override readonly category = \"salesforce\";\n static override readonly color: `#${string}` = \"#FFFFFF\";\n static override readonly configSchema: Schema = ConfigsSchema;\n static override readonly inputSchema: Schema = InputSchema;\n static override readonly outputsSchema: Schema = OutputSchema;\n\n override async input(msg: Input) {\n const connection = this.config.connection;\n if (!connection) {\n this.error(\"No Salesforce connection configured\", msg);\n return;\n }\n\n try {\n const operation = this.config.operation;\n this.status({ fill: \"green\", shape: \"dot\", text: `${operation}...` });\n\n const conn = await connection.getConnection();\n const sObjectType = await this.config.sObjectType.resolve(msg);\n const sobject = conn.sobject(sObjectType);\n\n // Use record from config if set, otherwise fall back to msg.payload\n const data = (await this.config.record.resolve(msg)) ?? msg.payload;\n\n let result: any;\n\n switch (operation) {\n case \"create\":\n result = await sobject.create(data);\n break;\n case \"read\":\n result = await sobject.retrieve(data);\n break;\n case \"update\":\n result = await sobject.update(data);\n break;\n case \"delete\":\n result = await sobject.destroy(data);\n break;\n case \"upsert\":\n result = await sobject.upsert(data, this.config.externalIdField!);\n break;\n default:\n throw new Error(`Unknown operation: ${operation}`);\n }\n\n this.status({ fill: \"green\", shape: \"dot\", text: `${operation} done` });\n this.send({ ...msg, payload: result });\n } catch (error) {\n this.status({\n fill: \"red\",\n shape: \"dot\",\n text: error instanceof Error ? error.message : String(error),\n });\n this.error(\n `DML ${this.config.operation} failed: ${error instanceof Error ? error.message : String(error)}`,\n msg,\n );\n }\n }\n}\n","import { defineSchema, SchemaType } from \"@bonsae/nrg/server\";\nimport SalesforceConnection from \"../nodes/salesforce-connection\";\n\nexport const ConfigsSchema = defineSchema(\n {\n name: SchemaType.String({ default: \"\", \"x-nrg-form\": { icon: \"tag\" } }),\n connection: SchemaType.NodeRef(SalesforceConnection, {\n \"x-nrg-form\": { icon: \"cloud\" },\n }),\n operation: SchemaType.Union(\n [\n SchemaType.Literal(\"insert\"),\n SchemaType.Literal(\"update\"),\n SchemaType.Literal(\"upsert\"),\n SchemaType.Literal(\"delete\"),\n SchemaType.Literal(\"hardDelete\"),\n SchemaType.Literal(\"query\"),\n ],\n { default: \"insert\", \"x-nrg-form\": { icon: \"database\" } },\n ),\n sObjectType: SchemaType.TypedInput<string>({\n \"x-nrg-form\": {\n icon: \"cube\",\n typedInputTypes: [\"str\", \"msg\"],\n },\n }),\n query: SchemaType.TypedInput<string>({\n \"x-nrg-form\": {\n icon: \"search\",\n typedInputTypes: [\"str\", \"msg\", \"jsonata\"],\n },\n }),\n externalIdField: SchemaType.Optional(\n SchemaType.String({\n default: \"\",\n \"x-nrg-form\": { icon: \"key\" },\n }),\n ),\n assignmentRuleId: SchemaType.Optional(\n SchemaType.String({\n default: \"\",\n \"x-nrg-form\": { icon: \"gavel\" },\n }),\n ),\n columnDelimiter: SchemaType.Union(\n [\n SchemaType.Literal(\"COMMA\"),\n SchemaType.Literal(\"TAB\"),\n SchemaType.Literal(\"PIPE\"),\n SchemaType.Literal(\"SEMICOLON\"),\n SchemaType.Literal(\"CARET\"),\n SchemaType.Literal(\"BACKQUOTE\"),\n ],\n { default: \"COMMA\", \"x-nrg-form\": { icon: \"columns\" } },\n ),\n lineEnding: SchemaType.Union(\n [SchemaType.Literal(\"LF\"), SchemaType.Literal(\"CRLF\")],\n { default: \"LF\", \"x-nrg-form\": { icon: \"level-down\" } },\n ),\n pollInterval: SchemaType.Number({\n default: 5000,\n minimum: 1000,\n \"x-nrg-form\": { icon: \"clock-o\" },\n }),\n pollTimeout: SchemaType.Number({\n default: 60000,\n minimum: 5000,\n \"x-nrg-form\": { icon: \"hourglass\" },\n }),\n errorPort: SchemaType.Boolean({ default: false }),\n completePort: SchemaType.Boolean({ default: false }),\n statusPort: SchemaType.Boolean({ default: false }),\n },\n {\n $id: \"salesforce-bulk:config\",\n if: SchemaType.Object({\n operation: SchemaType.Literal(\"upsert\"),\n }),\n then: SchemaType.Object({\n externalIdField: SchemaType.String({ minLength: 1 }),\n }),\n errorMessage: {\n properties: {\n externalIdField: \"External ID Field is required for upsert operations\",\n },\n },\n },\n);\n\nexport const InputSchema = defineSchema(\n {\n payload: SchemaType.Any({\n description:\n \"Records array, CSV string, readable stream (ingest) or SOQL string (query)\",\n }),\n },\n { $id: \"salesforce-bulk:input\" },\n);\n\nexport const OutputSchema = defineSchema(\n {\n payload: SchemaType.Any({\n description:\n \"Query: individual record. Ingest: { successfulResults, failedResults, unprocessedRecords }\",\n }),\n },\n { $id: \"salesforce-bulk:output\" },\n);\n","import { IONode, type Schema, type Infer } from \"@bonsae/nrg/server\";\nimport type { Connection } from \"jsforce\";\nimport type { Readable } from \"stream\";\nimport {\n ConfigsSchema,\n InputSchema,\n OutputSchema,\n} from \"../schemas/salesforce-bulk\";\n\ntype Config = Infer<typeof ConfigsSchema>;\ntype Input = { payload: string | Record<string, unknown>[] | Readable };\n\nexport default class SalesforceBulk extends IONode<Config, any, Input> {\n static override readonly type = \"salesforce-bulk\";\n static override readonly category = \"salesforce\";\n static override readonly color: `#${string}` = \"#FFFFFF\";\n static override readonly configSchema: Schema = ConfigsSchema;\n static override readonly inputSchema: Schema = InputSchema;\n static override readonly outputsSchema: Schema = OutputSchema;\n\n override async input(msg: Input) {\n try {\n const connection = this.config.connection;\n if (!connection) {\n throw new Error(\"No Salesforce connection configured\");\n }\n\n const conn = await connection.getConnection();\n const operation = this.config.operation;\n\n if (operation === \"query\") {\n await this.executeQuery(conn, msg);\n } else {\n await this.executeIngest(conn, msg, operation);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n this.status({ fill: \"red\", shape: \"dot\", text: message });\n throw error;\n }\n }\n\n private async executeQuery(conn: Connection, msg: Input) {\n this.status({ fill: \"green\", shape: \"dot\", text: \"query starting...\" });\n\n const soql = await this.config.query.resolve(msg);\n const stream = await conn.bulk2.query(soql, {\n pollTimeout: this.config.pollTimeout,\n pollInterval: this.config.pollInterval,\n columnDelimiter: this.config.columnDelimiter,\n lineEnding: this.config.lineEnding,\n });\n\n let count = 0;\n await new Promise<void>((resolve, reject) => {\n stream.on(\"data\", (record: unknown) => {\n count++;\n this.send({ ...msg, payload: record });\n if (count % 1000 === 0) {\n this.status({\n fill: \"green\",\n shape: \"dot\",\n text: `query: ${count} records...`,\n });\n }\n });\n stream.on(\"end\", () => resolve());\n stream.on(\"error\", reject);\n });\n\n this.status({\n fill: \"green\",\n shape: \"dot\",\n text: `query complete: ${count} records`,\n });\n }\n\n private async executeIngest(\n conn: Connection,\n msg: Input,\n operation: \"insert\" | \"update\" | \"upsert\" | \"delete\" | \"hardDelete\",\n ) {\n const sObjectType = await this.config.sObjectType.resolve(msg);\n\n this.status({\n fill: \"green\",\n shape: \"dot\",\n text: `creating ${operation} job...`,\n });\n\n const job = conn.bulk2.createJob({\n operation,\n object: sObjectType,\n columnDelimiter: this.config.columnDelimiter,\n lineEnding: this.config.lineEnding,\n ...(operation === \"upsert\" && this.config.externalIdField\n ? { externalIdFieldName: this.config.externalIdField }\n : {}),\n ...(this.config.assignmentRuleId\n ? { assignmentRuleId: this.config.assignmentRuleId }\n : {}),\n });\n\n await job.open();\n this.status({\n fill: \"green\",\n shape: \"dot\",\n text: `uploading data...`,\n });\n\n // jsforce accepts Record[], string (CSV), or Readable stream\n await job.uploadData(msg.payload);\n\n this.status({\n fill: \"green\",\n shape: \"dot\",\n text: `processing...`,\n });\n\n await job.close();\n await job.poll(this.config.pollInterval, this.config.pollTimeout);\n\n this.status({\n fill: \"green\",\n shape: \"dot\",\n text: `retrieving results...`,\n });\n\n const results = await job.getAllResults();\n const successCount = results.successfulResults?.length ?? 0;\n const failureCount = results.failedResults?.length ?? 0;\n const totalRecords =\n successCount + failureCount + (results.unprocessedRecords?.length ?? 0);\n\n this.send({ ...msg, payload: results });\n\n this.status({\n fill: failureCount > 0 ? \"red\" : \"green\",\n shape: \"dot\",\n text: `${operation} complete: ${successCount} ok, ${failureCount} failed, ${totalRecords} total`,\n });\n }\n}\n","import { defineSchema, SchemaType } from \"@bonsae/nrg/server\";\nimport SalesforceConnection from \"../nodes/salesforce-connection\";\n\nexport const ConfigsSchema = defineSchema(\n {\n name: SchemaType.String({ default: \"\", \"x-nrg-form\": { icon: \"tag\" } }),\n connection: SchemaType.NodeRef(SalesforceConnection, {\n \"x-nrg-form\": { icon: \"cloud\" },\n }),\n sObjectType: SchemaType.TypedInput<string>({\n \"x-nrg-form\": {\n icon: \"cube\",\n typedInputTypes: [\"str\", \"msg\"],\n },\n }),\n errorPort: SchemaType.Boolean({ default: false }),\n completePort: SchemaType.Boolean({ default: false }),\n statusPort: SchemaType.Boolean({ default: false }),\n },\n { $id: \"salesforce-describe:config\" },\n);\n\nexport const InputSchema = defineSchema(\n {\n payload: SchemaType.Any(),\n },\n { $id: \"salesforce-describe:input\" },\n);\n\nexport const OutputSchema = defineSchema(\n {\n payload: SchemaType.Object({\n name: SchemaType.String(),\n fields: SchemaType.Array(SchemaType.Any()),\n childRelationships: SchemaType.Array(SchemaType.Any()),\n recordTypeInfos: SchemaType.Array(SchemaType.Any()),\n }),\n },\n { $id: \"salesforce-describe:output\" },\n);\n","import { IONode, type Schema, type Infer } from \"@bonsae/nrg/server\";\nimport {\n ConfigsSchema,\n InputSchema,\n OutputSchema,\n} from \"../schemas/salesforce-describe\";\n\ntype Config = Infer<typeof ConfigsSchema>;\ntype Input = Infer<typeof InputSchema>;\ntype Output = Infer<typeof OutputSchema>;\n\nexport default class SalesforceDescribe extends IONode<\n Config,\n any,\n Input,\n Output\n> {\n static override readonly type = \"salesforce-describe\";\n static override readonly category = \"salesforce\";\n static override readonly color: `#${string}` = \"#FFFFFF\";\n static override readonly configSchema: Schema = ConfigsSchema;\n static override readonly inputSchema: Schema = InputSchema;\n static override readonly outputsSchema: Schema = OutputSchema;\n\n override async input(msg: Input) {\n const connection = this.config.connection;\n if (!connection) {\n this.error(\"No Salesforce connection configured\", msg);\n return;\n }\n\n try {\n this.status({ fill: \"green\", shape: \"dot\", text: \"describing...\" });\n\n const conn = await connection.getConnection();\n const sObjectType = await this.config.sObjectType.resolve(msg);\n const result = await conn.sobject(sObjectType).describe();\n\n this.status({\n fill: \"green\",\n shape: \"dot\",\n text: `${result.name}: ${result.fields.length} fields`,\n });\n this.send({\n ...msg,\n payload: {\n name: result.name,\n fields: result.fields,\n childRelationships: result.childRelationships,\n recordTypeInfos: result.recordTypeInfos,\n },\n });\n } catch (error) {\n this.status({\n fill: \"red\",\n shape: \"dot\",\n text: error instanceof Error ? error.message : String(error),\n });\n this.error(\n `Describe failed: ${error instanceof Error ? error.message : String(error)}`,\n msg,\n );\n }\n }\n}\n","import { defineSchema, SchemaType } from \"@bonsae/nrg/server\";\nimport SalesforceConnection from \"../nodes/salesforce-connection\";\n\nexport const ConfigsSchema = defineSchema(\n {\n name: SchemaType.String({ default: \"\", \"x-nrg-form\": { icon: \"tag\" } }),\n connection: SchemaType.NodeRef(SalesforceConnection, {\n \"x-nrg-form\": { icon: \"cloud\" },\n }),\n channelName: SchemaType.String({\n default: \"\",\n \"x-nrg-form\": { icon: \"rss\" },\n }),\n subscribeType: SchemaType.Union(\n [\n SchemaType.Literal(\"LATEST\"),\n SchemaType.Literal(\"EARLIEST\"),\n SchemaType.Literal(\"CUSTOM\"),\n ],\n { default: \"LATEST\", \"x-nrg-form\": { icon: \"history\" } },\n ),\n replayId: SchemaType.Optional(\n SchemaType.String({\n default: \"\",\n \"x-nrg-form\": { icon: \"bookmark\" },\n }),\n ),\n numRequested: SchemaType.Number({\n default: 100,\n minimum: 1,\n maximum: 100,\n \"x-nrg-form\": { icon: \"sort-numeric-asc\" },\n }),\n errorPort: SchemaType.Boolean({ default: false }),\n completePort: SchemaType.Boolean({ default: false }),\n statusPort: SchemaType.Boolean({ default: false }),\n },\n {\n $id: \"salesforce-streaming:config\",\n if: SchemaType.Object({\n subscribeType: SchemaType.Literal(\"CUSTOM\"),\n }),\n then: SchemaType.Object({\n replayId: SchemaType.String({ minLength: 1 }),\n }),\n errorMessage: {\n properties: {\n replayId: \"Replay ID is required when Subscribe Type is CUSTOM\",\n },\n },\n },\n);\n\nexport const OutputSchema = defineSchema(\n {\n payload: SchemaType.Any(),\n replayId: SchemaType.Any(),\n channel: SchemaType.String(),\n topic: SchemaType.String(),\n },\n { $id: \"salesforce-streaming:output\" },\n);\n","import { IONode, type Schema, type Infer } from \"@bonsae/nrg/server\";\nimport type { Connection } from \"jsforce\";\nimport { ConfigsSchema, OutputSchema } from \"../schemas/salesforce-streaming\";\nimport type SalesforceConnection from \"./salesforce-connection\";\n\ntype Config = Infer<typeof ConfigsSchema>;\ntype Output = Infer<typeof OutputSchema>;\n\nexport default class SalesforceStreaming extends IONode<\n Config,\n any,\n any,\n Output\n> {\n static override readonly type = \"salesforce-streaming\";\n static override readonly category = \"salesforce\";\n static override readonly color: `#${string}` = \"#FFFFFF\";\n static override readonly configSchema: Schema = ConfigsSchema;\n static override readonly outputsSchema: Schema = OutputSchema;\n\n private client: any = null;\n private reconnectAttempt = 0;\n private maxReconnectDelay = 60000;\n private maxReconnectAttempts = 10;\n private grpcErrorHandler: ((err: Error) => void) | null = null;\n private stopped = false;\n\n override async created() {\n const connection = this.config.connection as SalesforceConnection;\n if (!connection) {\n this.status({ fill: \"red\", shape: \"dot\", text: \"no connection\" });\n this.error(\"No Salesforce connection configured\");\n return;\n }\n\n await this.subscribe(connection);\n }\n\n private async subscribe(connection: SalesforceConnection) {\n if (this.stopped) return;\n try {\n this.status({ fill: \"green\", shape: \"dot\", text: \"connecting...\" });\n\n // Refresh the jsforce connection to get a fresh token\n // (jsforce auto-refreshes expired tokens via the refresh event)\n let conn: Connection;\n try {\n conn = await connection.getConnection();\n // Validate the token is still valid with a lightweight API call\n await conn.identity();\n } catch {\n this.status({ fill: \"red\", shape: \"dot\", text: \"auth expired\" });\n this.error(\"Salesforce token expired. Re-authorize the connection.\");\n return;\n }\n\n // Use the token from the jsforce connection directly — it may have been\n // refreshed during conn.identity() and the credentials snapshot could be stale\n const accessToken = conn.accessToken;\n const instanceUrl = conn.instanceUrl;\n\n if (!accessToken || !instanceUrl) {\n this.status({ fill: \"red\", shape: \"dot\", text: \"not authorized\" });\n this.error(\"Salesforce connection not authorized\");\n return;\n }\n\n const PubSubApiClient = (await import(\"salesforce-pubsub-api-client\"))\n .default;\n\n this.client = new PubSubApiClient({\n authType: \"user-supplied\",\n accessToken,\n instanceUrl,\n });\n\n await this.client.connect();\n\n const numRequested = this.config.numRequested || null;\n const channelName = this.config.channelName;\n\n const callback = (\n _subscription: any,\n callbackType: string,\n data?: any,\n ) => {\n if (callbackType === \"event\" || callbackType === \"lastevent\") {\n this.send({\n payload: data?.payload ?? data,\n replayId: data?.replayId,\n channel: channelName,\n topic: channelName,\n });\n } else if (callbackType === \"error\") {\n const errorMsg =\n data instanceof Error\n ? data.message\n : String(data ?? \"stream error\");\n this.warn(`Streaming error: ${errorMsg}`);\n\n // Stop retrying on auth errors — token is expired\n if (\n errorMsg.includes(\"UNAUTHENTICATED\") ||\n errorMsg.includes(\"authentication\")\n ) {\n this.stopped = true;\n this.status({\n fill: \"red\",\n shape: \"dot\",\n text: \"auth expired — re-authorize\",\n });\n this.error(\n \"Salesforce token expired. Re-authorize the connection.\",\n );\n this.cleanup();\n return;\n }\n\n this.status({ fill: \"red\", shape: \"dot\", text: errorMsg });\n this.scheduleReconnect(connection);\n } else if (callbackType === \"end\") {\n if (this.stopped) return;\n this.log(\"Streaming subscription ended\");\n this.status({ fill: \"red\", shape: \"dot\", text: \"disconnected\" });\n this.scheduleReconnect(connection);\n }\n };\n\n // Guard against uncaught gRPC errors that crash the process.\n // The @grpc/grpc-js library can throw before the pubsub client\n // attaches its own error handler to the bidi stream.\n if (this.grpcErrorHandler) {\n process.removeListener(\"uncaughtException\", this.grpcErrorHandler);\n }\n this.grpcErrorHandler = (err: Error) => {\n if (\n err.message?.includes(\"UNAUTHENTICATED\") ||\n err.message?.includes(\"authentication\")\n ) {\n this.stopped = true;\n this.warn(`Caught gRPC auth error: ${err.message}`);\n this.status({\n fill: \"red\",\n shape: \"dot\",\n text: \"auth expired — re-authorize\",\n });\n this.cleanup();\n // Don't rethrow — we handled it\n }\n };\n process.on(\"uncaughtException\", this.grpcErrorHandler);\n\n if (this.config.subscribeType === \"EARLIEST\") {\n this.client.subscribeFromEarliestEvent(\n channelName,\n callback,\n numRequested,\n );\n } else if (\n this.config.subscribeType === \"CUSTOM\" &&\n this.config.replayId\n ) {\n const replayId = parseInt(this.config.replayId, 10);\n this.client.subscribeFromReplayId(\n channelName,\n callback,\n numRequested,\n replayId,\n );\n } else {\n this.client.subscribe(channelName, callback, numRequested);\n }\n\n this.status({\n fill: \"green\",\n shape: \"dot\",\n text: `subscribed: ${channelName}`,\n });\n this.reconnectAttempt = 0;\n } catch (error) {\n this.status({\n fill: \"red\",\n shape: \"dot\",\n text: error instanceof Error ? error.message : String(error),\n });\n this.error(\n `Streaming subscription failed: ${error instanceof Error ? error.message : String(error)}`,\n );\n this.scheduleReconnect(connection);\n }\n }\n\n private scheduleReconnect(connection: SalesforceConnection) {\n if (this.stopped) return;\n this.reconnectAttempt++;\n\n if (this.reconnectAttempt > this.maxReconnectAttempts) {\n this.error(\n `Streaming: max reconnect attempts (${this.maxReconnectAttempts}) reached. Giving up.`,\n );\n this.status({\n fill: \"red\",\n shape: \"dot\",\n text: \"reconnect failed — re-deploy to retry\",\n });\n return;\n }\n\n const delay = Math.min(\n 1000 * Math.pow(2, this.reconnectAttempt),\n this.maxReconnectDelay,\n );\n this.log(\n `Scheduling reconnect in ${delay}ms (attempt ${this.reconnectAttempt}/${this.maxReconnectAttempts})`,\n );\n this.status({\n fill: \"green\",\n shape: \"dot\",\n text: `reconnecting in ${Math.round(delay / 1000)}s`,\n });\n this.setTimeout(async () => {\n await this.cleanup();\n await this.subscribe(connection);\n }, delay);\n }\n\n private async cleanup() {\n try {\n if (this.grpcErrorHandler) {\n process.removeListener(\"uncaughtException\", this.grpcErrorHandler);\n this.grpcErrorHandler = null;\n }\n if (this.client) {\n await this.client.close?.();\n this.client = null;\n }\n } catch {\n // Ignore cleanup errors\n }\n }\n\n override async closed() {\n await this.cleanup();\n }\n}\n","import { defineSchema, SchemaType } from \"@bonsae/nrg/server\";\nimport SalesforceConnection from \"../nodes/salesforce-connection\";\n\nexport const ConfigsSchema = defineSchema(\n {\n name: SchemaType.String({ default: \"\", \"x-nrg-form\": { icon: \"tag\" } }),\n connection: SchemaType.NodeRef(SalesforceConnection, {\n \"x-nrg-form\": { icon: \"cloud\" },\n }),\n apexType: SchemaType.Union(\n [SchemaType.Literal(\"rest\"), SchemaType.Literal(\"invocable\")],\n { default: \"rest\", \"x-nrg-form\": { icon: \"cog\" } },\n ),\n // REST fields\n method: SchemaType.Union(\n [\n SchemaType.Literal(\"GET\"),\n SchemaType.Literal(\"POST\"),\n SchemaType.Literal(\"PUT\"),\n SchemaType.Literal(\"PATCH\"),\n SchemaType.Literal(\"DELETE\"),\n ],\n { default: \"POST\", \"x-nrg-form\": { icon: \"random\" } },\n ),\n path: SchemaType.TypedInput<string>({\n \"x-nrg-form\": {\n icon: \"link\",\n typedInputTypes: [\"str\", \"msg\"],\n },\n }),\n // Invocable field\n actionName: SchemaType.String({\n default: \"\",\n \"x-nrg-form\": { icon: \"bolt\" },\n }),\n errorPort: SchemaType.Boolean({ default: false }),\n completePort: SchemaType.Boolean({ default: false }),\n statusPort: SchemaType.Boolean({ default: false }),\n },\n { $id: \"salesforce-apex-invocation:config\" },\n);\n\nexport const InputSchema = defineSchema(\n { payload: SchemaType.Any() },\n { $id: \"salesforce-apex-invocation:input\" },\n);\n\nexport const OutputSchema = defineSchema(\n { payload: SchemaType.Any() },\n { $id: \"salesforce-apex-invocation:output\" },\n);\n","import { IONode, type Schema, type Infer } from \"@bonsae/nrg/server\";\nimport {\n ConfigsSchema,\n InputSchema,\n OutputSchema,\n} from \"../schemas/salesforce-apex-invocation\";\nimport { SalesforceClient } from \"../services/salesforce\";\n\ntype Config = Infer<typeof ConfigsSchema>;\ntype Input = Infer<typeof InputSchema>;\ntype Output = Infer<typeof OutputSchema>;\n\nexport default class SalesforceApex extends IONode<Config, any, Input, Output> {\n static override readonly type = \"salesforce-apex-invocation\";\n static override readonly category = \"salesforce\";\n static override readonly color: `#${string}` = \"#FFFFFF\";\n static override readonly configSchema: Schema = ConfigsSchema;\n static override readonly inputSchema: Schema = InputSchema;\n static override readonly outputsSchema: Schema = OutputSchema;\n\n override async input(msg: Input) {\n const connection = this.config.connection;\n if (!connection) {\n this.error(\"No Salesforce connection configured\", msg);\n return;\n }\n\n try {\n const conn = await connection.getConnection();\n this.status({ fill: \"green\", shape: \"dot\", text: \"executing...\" });\n\n if (this.config.apexType === \"rest\") {\n const path = await this.config.path.resolve(msg);\n const method = this.config.method.toLowerCase() as\n | \"get\"\n | \"post\"\n | \"put\"\n | \"patch\"\n | \"delete\";\n\n let result: any;\n if (method === \"get\" || method === \"delete\") {\n result = await conn.apex[method](path);\n } else {\n result = await conn.apex[method](path, msg.payload);\n }\n\n this.status({\n fill: \"green\",\n shape: \"dot\",\n text: `${this.config.method} done`,\n });\n this.send({ ...msg, payload: result });\n } else {\n const client = new SalesforceClient(conn);\n const action = await client.invoke(this.config.actionName, msg.payload);\n this.status({ fill: \"green\", shape: \"dot\", text: \"done\" });\n this.send({ ...msg, payload: action.outputValues });\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n this.status({ fill: \"red\", shape: \"dot\", text: message });\n this.error(`Apex failed: ${message}`, msg);\n }\n }\n}\n","export const DEFAULT_USER_CODE = `private static Object run(String payload) {\n // Your code here\n return payload;\n }`;\n\nexport function buildInvocableClass(\n fullClassName: string,\n userCode: string,\n): string {\n return `public class ${fullClassName} {\n public class Input {\n @InvocableVariable(required=true)\n public String payload;\n }\n\n public class Output {\n @InvocableVariable\n public String result;\n }\n\n @InvocableMethod(label='${fullClassName}' description='Generated by NRG')\n public static List<Output> execute(List<Input> inputs) {\n Output out = new Output();\n Object returnValue = run(inputs[0].payload);\n out.result = returnValue instanceof String\n ? (String) returnValue\n : JSON.serialize(returnValue);\n return new List<Output>{ out };\n }\n\n ${userCode}\n}`;\n}\n\nexport type RestMethod =\n | \"HttpGet\"\n | \"HttpPost\"\n | \"HttpPut\"\n | \"HttpPatch\"\n | \"HttpDelete\";\n\nconst REST_METHOD_NAMES: Record<RestMethod, string> = {\n HttpGet: \"doGet\",\n HttpPost: \"doPost\",\n HttpPut: \"doPut\",\n HttpPatch: \"doPatch\",\n HttpDelete: \"doDelete\",\n};\n\nconst HAS_REQUEST_BODY: Record<RestMethod, boolean> = {\n HttpGet: false,\n HttpPost: true,\n HttpPut: true,\n HttpPatch: true,\n HttpDelete: false,\n};\n\nexport function buildRestClass(\n fullClassName: string,\n urlMapping: string,\n method: RestMethod,\n userCode: string,\n): string {\n const methodName = REST_METHOD_NAMES[method];\n const hasBody = HAS_REQUEST_BODY[method];\n\n const payloadLine = hasBody\n ? ` String payload = RestContext.request.requestBody != null\n ? RestContext.request.requestBody.toString()\n : null;`\n : ` String payload = RestContext.request.params != null\n ? JSON.serialize(RestContext.request.params)\n : null;`;\n\n return `@RestResource(urlMapping='${urlMapping}')\nglobal class ${fullClassName} {\n @${method}\n global static String ${methodName}() {\n${payloadLine}\n Object returnValue = run(payload);\n return returnValue instanceof String\n ? (String) returnValue\n : JSON.serialize(returnValue);\n }\n\n ${userCode}\n}`;\n}\n","import { defineSchema, SchemaType } from \"@bonsae/nrg/server\";\nimport SalesforceConnection from \"../nodes/salesforce-connection\";\nimport { DEFAULT_USER_CODE } from \"../../shared/apex-templates\";\n\nexport const ConfigsSchema = defineSchema(\n {\n name: SchemaType.String({ default: \"\", \"x-nrg-form\": { icon: \"tag\" } }),\n connection: SchemaType.NodeRef(SalesforceConnection, {\n \"x-nrg-form\": { icon: \"cloud\" },\n }),\n apexType: SchemaType.Union(\n [SchemaType.Literal(\"invocable\"), SchemaType.Literal(\"rest\")],\n { default: \"invocable\", \"x-nrg-form\": { icon: \"cog\" } },\n ),\n className: SchemaType.String({\n default: \"\",\n \"x-nrg-form\": { icon: \"file-code-o\" },\n }),\n urlMapping: SchemaType.String({\n default: \"\",\n \"x-nrg-form\": { icon: \"link\" },\n }),\n httpMethod: SchemaType.Union(\n [\n SchemaType.Literal(\"HttpGet\"),\n SchemaType.Literal(\"HttpPost\"),\n SchemaType.Literal(\"HttpPut\"),\n SchemaType.Literal(\"HttpPatch\"),\n SchemaType.Literal(\"HttpDelete\"),\n ],\n { default: \"HttpPost\", \"x-nrg-form\": { icon: \"random\" } },\n ),\n code: SchemaType.String({\n default: DEFAULT_USER_CODE,\n \"x-nrg-form\": { editorLanguage: \"apex\" },\n }),\n errorPort: SchemaType.Boolean({ default: false }),\n completePort: SchemaType.Boolean({ default: false }),\n statusPort: SchemaType.Boolean({ default: false }),\n },\n { $id: \"salesforce-apex-code:config\" },\n);\n\nexport const SettingsSchema = defineSchema(\n {\n classPrefix: SchemaType.String({ default: \"NRG_\" }),\n languageServerUrl: SchemaType.String({\n default: \"\",\n exportable: true,\n }),\n },\n { $id: \"salesforce-apex-code:settings\" },\n);\n\nexport const InputSchema = defineSchema(\n { payload: SchemaType.Any() },\n { $id: \"salesforce-apex-code:input\" },\n);\n\nexport const OutputSchema = defineSchema(\n { payload: SchemaType.Any() },\n { $id: \"salesforce-apex-code:output\" },\n);\n","import type { Connection } from \"jsforce\";\nimport { SalesforceClient } from \"../services/salesforce\";\n\ninterface DeployRequest {\n className: string;\n body: string;\n resolve: (result: { id: string }) => void;\n reject: (error: Error) => void;\n}\n\ninterface ConnectionProvider {\n getConnection(): Promise<Connection>;\n}\n\nexport class ApexClassManager {\n private static instances = new Map<string, ApexClassManager>();\n private static readonly FLUSH_DELAY_MS = 500;\n\n private pendingDeploys = new Map<string, DeployRequest>();\n private pendingDeletes = new Set<string>();\n private flushTimer: ReturnType<typeof setTimeout> | null = null;\n private connectionProvider: ConnectionProvider;\n\n private constructor(connectionProvider: ConnectionProvider) {\n this.connectionProvider = connectionProvider;\n }\n\n static getInstance(\n connectionId: string,\n connectionProvider: ConnectionProvider,\n ): ApexClassManager {\n if (!ApexClassManager.instances.has(connectionId)) {\n ApexClassManager.instances.set(\n connectionId,\n new ApexClassManager(connectionProvider),\n );\n }\n return ApexClassManager.instances.get(connectionId)!;\n }\n\n static removeInstance(connectionId: string): void {\n ApexClassManager.instances.delete(connectionId);\n }\n\n register(className: string, body: string): Promise<{ id: string }> {\n this.pendingDeletes.delete(className);\n\n return new Promise((resolve, reject) => {\n this.pendingDeploys.set(className, { className, body, resolve, reject });\n this.scheduleFlush();\n });\n }\n\n unregister(className: string): void {\n const pending = this.pendingDeploys.get(className);\n if (pending) {\n pending.reject(new Error(\"Deploy cancelled — node was removed\"));\n this.pendingDeploys.delete(className);\n }\n\n this.pendingDeletes.add(className);\n this.scheduleFlush();\n }\n\n private scheduleFlush(): void {\n if (this.flushTimer) return;\n this.flushTimer = setTimeout(() => {\n this.flushTimer = null;\n this.flush().catch((err) => {\n console.error(\"[ApexClassManager] flush error:\", err);\n });\n }, ApexClassManager.FLUSH_DELAY_MS);\n }\n\n private async flush(): Promise<void> {\n const deletes = new Set(this.pendingDeletes);\n const deploys = new Map(this.pendingDeploys);\n this.pendingDeletes.clear();\n this.pendingDeploys.clear();\n\n if (deletes.size === 0 && deploys.size === 0) return;\n\n const conn = await this.connectionProvider.getConnection();\n const sf = new SalesforceClient(conn);\n\n const allNames = [...deletes, ...deploys.keys()];\n const existingByName = await sf.queryApexClassesByName(allNames);\n\n // Phase 1: Deletions first\n for (const className of deletes) {\n const record = existingByName.get(className);\n if (!record) continue;\n try {\n await sf.deleteApexClass(record.Id);\n } catch (err) {\n console.error(`[ApexClassManager] Failed to delete ${className}:`, err);\n }\n }\n\n // Phase 2: Creates (delete + recreate if body changed)\n for (const [className, request] of deploys) {\n try {\n const record = existingByName.get(className);\n\n if (record) {\n if (record.Body === request.body) {\n request.resolve({ id: record.Id });\n continue;\n }\n await sf.deleteApexClass(record.Id);\n }\n\n const { id } = await sf.createApexClass(className, request.body);\n request.resolve({ id });\n } catch (err) {\n request.reject(err instanceof Error ? err : new Error(String(err)));\n }\n }\n }\n}\n","import { IONode, type Schema, type Infer } from \"@bonsae/nrg/server\";\nimport {\n ConfigsSchema,\n InputSchema,\n OutputSchema,\n SettingsSchema,\n} from \"../schemas/salesforce-apex-code\";\nimport { ApexClassManager } from \"../lib/apex-class-manager\";\nimport { SalesforceClient } from \"../services/salesforce\";\nimport {\n buildInvocableClass,\n buildRestClass,\n type RestMethod,\n} from \"../../shared/apex-templates\";\n\ntype Config = Infer<typeof ConfigsSchema>;\ntype Input = Infer<typeof InputSchema>;\ntype Output = Infer<typeof OutputSchema>;\ntype Settings = Infer<typeof SettingsSchema>;\n\nexport default class SalesforceApexCode extends IONode<\n Config,\n any,\n Input,\n Output,\n Settings\n> {\n static override readonly type = \"salesforce-apex-code\";\n static override readonly category = \"salesforce\";\n static override readonly color: `#${string}` = \"#FFFFFF\";\n static override readonly configSchema: Schema = ConfigsSchema;\n static override readonly inputSchema: Schema = InputSchema;\n static override readonly outputsSchema: Schema = OutputSchema;\n static override readonly settingsSchema: Schema = SettingsSchema;\n\n private deployed = false;\n\n private getFullClassName(): string {\n return `${this.settings.classPrefix}${this.config.className}`;\n }\n\n private buildApexBody(): string {\n const fullClassName = this.getFullClassName();\n if (this.config.apexType === \"rest\") {\n return buildRestClass(\n fullClassName,\n this.config.urlMapping,\n this.config.httpMethod as RestMethod,\n this.config.code,\n );\n }\n return buildInvocableClass(fullClassName, this.config.code);\n }\n\n override async created() {\n const connection = this.config.connection;\n if (!connection) {\n this.status({ fill: \"red\", shape: \"dot\", text: \"no connection\" });\n return;\n }\n if (!this.config.className) {\n this.status({ fill: \"red\", shape: \"dot\", text: \"class name required\" });\n return;\n }\n\n const manager = ApexClassManager.getInstance(\n (connection as any).id,\n connection,\n );\n\n this.status({ fill: \"green\", shape: \"dot\", text: \"deploying...\" });\n\n manager\n .register(this.getFullClassName(), this.buildApexBody())\n .then(() => {\n this.deployed = true;\n this.status({ fill: \"green\", shape: \"dot\", text: \"deployed\" });\n })\n .catch((err) => {\n const message = err instanceof Error ? err.message : String(err);\n this.status({ fill: \"red\", shape: \"dot\", text: message });\n this.error(`Apex deploy failed: ${message}`);\n });\n }\n\n override async input(msg: Input) {\n if (!this.deployed) {\n this.error(\n \"Apex class not yet deployed — wait for deployment to complete\",\n msg,\n );\n return;\n }\n\n const connection = this.config.connection;\n if (!connection) {\n this.error(\"No Salesforce connection configured\", msg);\n return;\n }\n\n try {\n const conn = await connection.getConnection();\n const client = new SalesforceClient(conn);\n this.status({ fill: \"green\", shape: \"dot\", text: \"executing...\" });\n\n if (this.config.apexType === \"invocable\") {\n const action = await client.invoke(\n this.getFullClassName(),\n msg.payload,\n );\n this.status({ fill: \"green\", shape: \"dot\", text: \"done\" });\n this.send({ ...msg, payload: action.outputValues });\n } else {\n const path = this.config.urlMapping;\n const method = this.config.httpMethod;\n let result: string;\n\n if (method === \"HttpGet\" || method === \"HttpDelete\") {\n result =\n method === \"HttpGet\"\n ? await client.get(path)\n : await client.delete(path);\n } else {\n const fn =\n method === \"HttpPut\"\n ? \"put\"\n : method === \"HttpPatch\"\n ? \"patch\"\n : \"post\";\n result = await client[fn](path, msg.payload);\n }\n\n this.status({ fill: \"green\", shape: \"dot\", text: \"done\" });\n this.send({ ...msg, payload: result });\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n this.status({ fill: \"red\", shape: \"dot\", text: message });\n this.error(`Apex execution failed: ${message}`, msg);\n }\n }\n\n override async closed(removed?: boolean) {\n if (removed) {\n const connection = this.config.connection;\n if (connection) {\n const manager = ApexClassManager.getInstance(\n (connection as any).id,\n connection,\n );\n manager.unregister(this.getFullClassName());\n }\n }\n this.deployed = false;\n }\n}\n","import { defineModule } from \"@bonsae/nrg/server\";\nimport SalesforceConnection from \"./nodes/salesforce-connection\";\nimport SalesforceSoql from \"./nodes/salesforce-soql\";\nimport SalesforceDml from \"./nodes/salesforce-dml\";\nimport SalesforceBulk from \"./nodes/salesforce-bulk\";\nimport SalesforceDescribe from \"./nodes/salesforce-describe\";\nimport SalesforceStreaming from \"./nodes/salesforce-streaming\";\nimport SalesforceApexInvocation from \"./nodes/salesforce-apex-invocation\";\nimport SalesforceApexCode from \"./nodes/salesforce-apex-code\";\n\nexport default defineModule({\n nodes: [\n SalesforceConnection,\n SalesforceSoql,\n SalesforceDml,\n SalesforceBulk,\n SalesforceDescribe,\n SalesforceStreaming,\n SalesforceApexInvocation,\n SalesforceApexCode,\n ],\n});\n"],"names":["ConfigsSchema","__nrgRegisterTypes","defineSchema","SchemaType","ConfigNode","IONode","defineModule","jsforce","crypto","ConfigsSchema$7","CredentialsSchema","AUTH_STATE_TTL","generateCodeVerifier","__name","generateCodeChallenge","verifier","createAuthState","params","state","codeVerifier","codeChallenge","pendingAuthStates","key","value","consumeAuthState","entry","escapeHtml","str","errorPage","message","autoClose","script","initAuthRoutes","RED","adminRoot","req","res","nodeId","loginUrl","clientId","overrideCallbackUrl","callbackUrl","error","code","oauthError","error_description","tokenResponse","errorBody","tokens","messageData","credentials","authenticated","getConnection","_SalesforceClient","__publicField","fullClassName","payload","version","action","errors","e","path","names","namesList","n","result","map","record","name","body","_a","id","rest","invocable","r","match","_b","channels","sobject","label","attempt","fn","err","delay","SalesforceClient","sfType","buildFauxClass","desc","lines","field","apexType","sfTypeToApex","initApexRoutes","conn","sf","cacheKey","cached","sobjectCache","SOBJECT_CACHE_TTL","s","fauxClasses","i","batchSize","batch","sobjectNames","results","initStreamingRoutes","client","_SalesforceConnection","initRoutes","newAccessToken","SalesforceConnection","ConfigsSchema$6","InputSchema","InputSchema$5","OutputSchema$6","_SalesforceSoql","msg","connection","query","SalesforceSoql","ConfigsSchema$5","InputSchema$4","OutputSchema$5","_SalesforceDml","operation","sObjectType","data","SalesforceDml","ConfigsSchema$4","InputSchema$3","OutputSchema","OutputSchema$4","_SalesforceBulk","soql","stream","count","resolve","reject","job","successCount","failureCount","totalRecords","_c","SalesforceBulk","ConfigsSchema$3","InputSchema$2","OutputSchema$3","_SalesforceDescribe","SalesforceDescribe","ConfigsSchema$2","OutputSchema$2","_SalesforceStreaming","accessToken","instanceUrl","PubSubApiClient","numRequested","channelName","callback","_subscription","callbackType","errorMsg","replayId","SalesforceStreaming","ConfigsSchema$1","InputSchema$1","OutputSchema$1","_SalesforceApex","method","SalesforceApex","DEFAULT_USER_CODE","buildInvocableClass","userCode","buildRestClass","urlMapping","methodName","REST_METHOD_NAMES","payloadLine","HAS_REQUEST_BODY","SettingsSchema","_ApexClassManager","connectionProvider","connectionId","className","pending","deletes","deploys","allNames","existingByName","request","ApexClassManager","_SalesforceApexCode","manager","removed","SalesforceApexCode","index","SalesforceApexInvocation"],"mappings":"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"}
@@ -265,7 +265,7 @@
265
265
  <tr><td>Klassenname</td><td>className</td><td>string</td><td>Ja</td><td><code>""</code></td><td></td></tr>
266
266
  <tr><td>URL-Zuordnung</td><td>urlMapping</td><td>string</td><td>Ja</td><td><code>""</code></td><td></td></tr>
267
267
  <tr><td>HTTP-Methode</td><td>httpMethod</td><td></td><td>Ja</td><td><code>"HttpPost"</code></td><td></td></tr>
268
- <tr><td>Apex-Code</td><td>code</td><td>string</td><td>Ja</td><td><code>""</code></td><td></td></tr>
268
+ <tr><td>Apex-Code</td><td>code</td><td>string</td><td>Ja</td><td><code>"private static Object run(String payload) {\n // Your code here\n return payload;\n }"</code></td><td></td></tr>
269
269
  <tr><td></td><td>errorPort</td><td>boolean</td><td>Ja</td><td><code>false</code></td><td></td></tr>
270
270
  <tr><td></td><td>completePort</td><td>boolean</td><td>Ja</td><td><code>false</code></td><td></td></tr>
271
271
  <tr><td></td><td>statusPort</td><td>boolean</td><td>Ja</td><td><code>false</code></td><td></td></tr>
@@ -265,7 +265,7 @@
265
265
  <tr><td>Class Name</td><td>className</td><td>string</td><td>Yes</td><td><code>""</code></td><td></td></tr>
266
266
  <tr><td>URL Mapping</td><td>urlMapping</td><td>string</td><td>Yes</td><td><code>""</code></td><td></td></tr>
267
267
  <tr><td>HTTP Method</td><td>httpMethod</td><td></td><td>Yes</td><td><code>"HttpPost"</code></td><td></td></tr>
268
- <tr><td>Apex Code</td><td>code</td><td>string</td><td>Yes</td><td><code>""</code></td><td></td></tr>
268
+ <tr><td>Apex Code</td><td>code</td><td>string</td><td>Yes</td><td><code>"private static Object run(String payload) {\n // Your code here\n return payload;\n }"</code></td><td></td></tr>
269
269
  <tr><td></td><td>errorPort</td><td>boolean</td><td>Yes</td><td><code>false</code></td><td></td></tr>
270
270
  <tr><td></td><td>completePort</td><td>boolean</td><td>Yes</td><td><code>false</code></td><td></td></tr>
271
271
  <tr><td></td><td>statusPort</td><td>boolean</td><td>Yes</td><td><code>false</code></td><td></td></tr>
@@ -265,7 +265,7 @@
265
265
  <tr><td>Nombre de Clase</td><td>className</td><td>string</td><td>Sí</td><td><code>""</code></td><td></td></tr>
266
266
  <tr><td>Mapeo de URL</td><td>urlMapping</td><td>string</td><td>Sí</td><td><code>""</code></td><td></td></tr>
267
267
  <tr><td>Método HTTP</td><td>httpMethod</td><td></td><td>Sí</td><td><code>"HttpPost"</code></td><td></td></tr>
268
- <tr><td>Codigo Apex</td><td>code</td><td>string</td><td>Sí</td><td><code>""</code></td><td></td></tr>
268
+ <tr><td>Codigo Apex</td><td>code</td><td>string</td><td>Sí</td><td><code>"private static Object run(String payload) {\n // Your code here\n return payload;\n }"</code></td><td></td></tr>
269
269
  <tr><td></td><td>errorPort</td><td>boolean</td><td>Sí</td><td><code>false</code></td><td></td></tr>
270
270
  <tr><td></td><td>completePort</td><td>boolean</td><td>Sí</td><td><code>false</code></td><td></td></tr>
271
271
  <tr><td></td><td>statusPort</td><td>boolean</td><td>Sí</td><td><code>false</code></td><td></td></tr>
@@ -265,7 +265,7 @@
265
265
  <tr><td>Nom de Classe</td><td>className</td><td>string</td><td>Oui</td><td><code>""</code></td><td></td></tr>
266
266
  <tr><td>Mappage d'URL</td><td>urlMapping</td><td>string</td><td>Oui</td><td><code>""</code></td><td></td></tr>
267
267
  <tr><td>Méthode HTTP</td><td>httpMethod</td><td></td><td>Oui</td><td><code>"HttpPost"</code></td><td></td></tr>
268
- <tr><td>Code Apex</td><td>code</td><td>string</td><td>Oui</td><td><code>""</code></td><td></td></tr>
268
+ <tr><td>Code Apex</td><td>code</td><td>string</td><td>Oui</td><td><code>"private static Object run(String payload) {\n // Your code here\n return payload;\n }"</code></td><td></td></tr>
269
269
  <tr><td></td><td>errorPort</td><td>boolean</td><td>Oui</td><td><code>false</code></td><td></td></tr>
270
270
  <tr><td></td><td>completePort</td><td>boolean</td><td>Oui</td><td><code>false</code></td><td></td></tr>
271
271
  <tr><td></td><td>statusPort</td><td>boolean</td><td>Oui</td><td><code>false</code></td><td></td></tr>