@party-stack/salesforce-ontology 0.4.2 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +61 -68
- package/lib/adapter/backend.d.ts +15 -0
- package/lib/adapter/backend.d.ts.map +1 -0
- package/lib/adapter/backend.js +94 -0
- package/lib/adapter/backend.js.map +1 -0
- package/lib/adapter/index.d.ts +2 -4
- package/lib/adapter/index.js +2 -4
- package/lib/adapter/makeSalesforceOntologyBackend.d.ts +12 -0
- package/lib/adapter/makeSalesforceOntologyBackend.d.ts.map +1 -0
- package/lib/adapter/makeSalesforceOntologyBackend.js +186 -0
- package/lib/adapter/makeSalesforceOntologyBackend.js.map +1 -0
- package/lib/adapter/salesforceCodec.d.ts +1 -1
- package/lib/adapter/salesforceCodec.js.map +1 -1
- package/lib/adapter/salesforceObjectSearch.d.ts +15 -0
- package/lib/adapter/salesforceObjectSearch.d.ts.map +1 -0
- package/lib/adapter/salesforceObjectSearch.js +65 -0
- package/lib/adapter/salesforceObjectSearch.js.map +1 -0
- package/lib/adapter/soql.d.ts +17 -0
- package/lib/adapter/soql.d.ts.map +1 -0
- package/lib/adapter/soql.js +65 -0
- package/lib/adapter/soql.js.map +1 -0
- package/lib/config/index.d.ts +10 -7
- package/lib/config/index.d.ts.map +1 -1
- package/lib/config/index.js +63 -44
- package/lib/config/index.js.map +1 -1
- package/lib/connect.d.ts +18 -0
- package/lib/connect.d.ts.map +1 -0
- package/lib/connect.js +32 -0
- package/lib/connect.js.map +1 -0
- package/lib/connectionOptions.d.ts +10 -0
- package/lib/connectionOptions.d.ts.map +1 -0
- package/lib/connectionOptions.js +1 -0
- package/lib/index.d.ts +4 -7
- package/lib/index.js +3 -7
- package/lib/meta/{createSalesforceMetaOntologyBackendAdapter.d.ts → backend.d.ts} +5 -5
- package/lib/meta/backend.d.ts.map +1 -0
- package/lib/meta/backend.js +86 -0
- package/lib/meta/backend.js.map +1 -0
- package/lib/meta/convertMetaActionType.d.ts +3 -3
- package/lib/meta/convertMetaActionType.d.ts.map +1 -1
- package/lib/meta/convertMetaActionType.js.map +1 -1
- package/lib/meta/convertMetaLinkType.d.ts +2 -2
- package/lib/meta/convertMetaLinkType.d.ts.map +1 -1
- package/lib/meta/convertMetaLinkType.js.map +1 -1
- package/lib/meta/convertMetaLoadSubsetOptions.d.ts +2 -2
- package/lib/meta/convertMetaLoadSubsetOptions.d.ts.map +1 -1
- package/lib/meta/convertMetaLoadSubsetOptions.js +33 -33
- package/lib/meta/convertMetaLoadSubsetOptions.js.map +1 -1
- package/lib/meta/convertMetaObjectType.d.ts +2 -2
- package/lib/meta/convertMetaObjectType.d.ts.map +1 -1
- package/lib/meta/convertMetaObjectType.js.map +1 -1
- package/lib/meta/convertMetaQueryFunctionType.d.ts +1 -1
- package/lib/meta/convertMetaQueryFunctionType.js.map +1 -1
- package/lib/meta/convertMetaTypeDef.d.ts +1 -1
- package/lib/meta/convertMetaTypeDef.js.map +1 -1
- package/lib/meta/index.d.ts +2 -4
- package/lib/meta/index.js +3 -5
- package/lib/meta/loadActions.d.ts +15 -0
- package/lib/meta/loadActions.d.ts.map +1 -0
- package/lib/meta/loadActions.js +103 -0
- package/lib/meta/loadActions.js.map +1 -0
- package/lib/meta/loadEntities.d.ts +5 -0
- package/lib/meta/loadEntities.d.ts.map +1 -0
- package/lib/meta/loadEntities.js +14 -0
- package/lib/meta/loadEntities.js.map +1 -0
- package/lib/meta/loadQueryFunctions.d.ts +11 -0
- package/lib/meta/loadQueryFunctions.d.ts.map +1 -0
- package/lib/meta/loadQueryFunctions.js +43 -0
- package/lib/meta/loadQueryFunctions.js.map +1 -0
- package/lib/meta/synthesizeCrudActionTypes.d.ts +2 -2
- package/lib/meta/synthesizeCrudActionTypes.d.ts.map +1 -1
- package/lib/meta/synthesizeCrudActionTypes.js.map +1 -1
- package/lib/serviceConnector.d.ts +8 -0
- package/lib/serviceConnector.d.ts.map +1 -0
- package/lib/serviceConnector.js +125 -0
- package/lib/serviceConnector.js.map +1 -0
- package/lib/utils/AsyncIterable.d.ts +1 -1
- package/lib/utils/AsyncIterable.d.ts.map +1 -1
- package/lib/utils/AsyncIterable.js +11 -0
- package/lib/utils/AsyncIterable.js.map +1 -1
- package/package.json +15 -19
- package/lib/adapter/convertLoadSubsetOptions.d.ts +0 -20
- package/lib/adapter/convertLoadSubsetOptions.d.ts.map +0 -1
- package/lib/adapter/convertLoadSubsetOptions.js +0 -127
- package/lib/adapter/convertLoadSubsetOptions.js.map +0 -1
- package/lib/adapter/createSalesforceOntologyBackendAdapter.d.ts +0 -22
- package/lib/adapter/createSalesforceOntologyBackendAdapter.d.ts.map +0 -1
- package/lib/adapter/createSalesforceOntologyBackendAdapter.js +0 -139
- package/lib/adapter/createSalesforceOntologyBackendAdapter.js.map +0 -1
- package/lib/adapter/objectCollectionOptions.d.ts +0 -36
- package/lib/adapter/objectCollectionOptions.d.ts.map +0 -1
- package/lib/adapter/objectCollectionOptions.js +0 -204
- package/lib/adapter/objectCollectionOptions.js.map +0 -1
- package/lib/connection.d.ts +0 -45
- package/lib/connection.d.ts.map +0 -1
- package/lib/connection.js +0 -258
- package/lib/connection.js.map +0 -1
- package/lib/installation/createSalesforceBackendInstallation.d.ts +0 -37
- package/lib/installation/createSalesforceBackendInstallation.d.ts.map +0 -1
- package/lib/installation/createSalesforceBackendInstallation.js +0 -84
- package/lib/installation/createSalesforceBackendInstallation.js.map +0 -1
- package/lib/installation/index.d.ts +0 -2
- package/lib/installation/index.js +0 -1
- package/lib/meta/actionTypeCollectionOptions.d.ts +0 -15
- package/lib/meta/actionTypeCollectionOptions.d.ts.map +0 -1
- package/lib/meta/actionTypeCollectionOptions.js +0 -121
- package/lib/meta/actionTypeCollectionOptions.js.map +0 -1
- package/lib/meta/createSalesforceMetaOntologyBackendAdapter.d.ts.map +0 -1
- package/lib/meta/createSalesforceMetaOntologyBackendAdapter.js +0 -42
- package/lib/meta/createSalesforceMetaOntologyBackendAdapter.js.map +0 -1
- package/lib/meta/entityCollectionOptions.d.ts +0 -16
- package/lib/meta/entityCollectionOptions.d.ts.map +0 -1
- package/lib/meta/entityCollectionOptions.js +0 -81
- package/lib/meta/entityCollectionOptions.js.map +0 -1
- package/lib/meta/queryFunctionTypeCollectionOptions.d.ts +0 -11
- package/lib/meta/queryFunctionTypeCollectionOptions.d.ts.map +0 -1
- package/lib/meta/queryFunctionTypeCollectionOptions.js +0 -59
- package/lib/meta/queryFunctionTypeCollectionOptions.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"convertLoadSubsetOptions.js","names":[],"sources":["../../src/adapter/convertLoadSubsetOptions.ts"],"sourcesContent":["import { FieldPath, LoadSubsetOptions, parseOrderByExpression, parseWhereExpression } from \"@tanstack/db\";\nimport { Temporal } from \"temporal-polyfill\";\n\nconst ALWAYS_FALSE = \"__ALWAYS_FALSE__\";\n\nexport type CompiledSoqlFilter = {\n clause?: string;\n alwaysFalse: boolean;\n};\n\nfunction quoteIdentifier(identifier: string): string {\n if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(identifier)) {\n throw new Error(`Invalid Salesforce identifier \"${identifier}\".`);\n }\n return identifier;\n}\n\nfunction fieldPathToSoql(fieldPath: FieldPath): string {\n if (fieldPath.length === 0) {\n throw new Error(\"Empty field path.\");\n }\n return fieldPath.map((segment) => quoteIdentifier(String(segment))).join(\".\");\n}\n\nfunction escapeSoqlString(value: string): string {\n let escaped = \"\";\n for (const character of value) {\n switch (character) {\n case \"\\\\\":\n escaped += \"\\\\\\\\\";\n break;\n case \"'\":\n escaped += \"\\\\'\";\n break;\n case \"\\b\":\n escaped += \"\\\\b\";\n break;\n case \"\\f\":\n escaped += \"\\\\f\";\n break;\n case \"\\n\":\n escaped += \"\\\\n\";\n break;\n case \"\\r\":\n escaped += \"\\\\r\";\n break;\n case \"\\t\":\n escaped += \"\\\\t\";\n break;\n default: {\n const codePoint = character.codePointAt(0)!;\n if (codePoint < 0x20 || codePoint === 0x7f) {\n throw new Error(\n `Cannot serialize control character U+${codePoint.toString(16).padStart(4, \"0\")} to SOQL.`\n );\n }\n escaped += character;\n }\n }\n }\n return escaped;\n}\n\nexport function serializeSoqlLiteral(value: unknown): string {\n if (value === null || value === undefined) {\n return \"null\";\n }\n if (typeof value === \"boolean\") {\n return value ? \"true\" : \"false\";\n }\n if (typeof value === \"number\") {\n if (!Number.isFinite(value)) {\n throw new Error(`Cannot serialize non-finite number ${value} to SOQL.`);\n }\n return String(value);\n }\n if (typeof value === \"bigint\") {\n return String(value);\n }\n if (value instanceof Date) {\n return value.toISOString();\n }\n if (value instanceof Temporal.Instant) {\n return value.toString();\n }\n if (value instanceof Temporal.PlainDate || value instanceof Temporal.PlainDateTime) {\n return value.toString();\n }\n if (typeof value === \"string\") {\n return `'${escapeSoqlString(value)}'`;\n }\n throw new Error(`Unsupported SOQL literal type: ${typeof value}`);\n}\n\nexport function isAlwaysFalseFilter(filter: CompiledSoqlFilter | undefined): boolean {\n return Boolean(filter?.alwaysFalse);\n}\n\nfunction convertInFilter(fieldOrValue: unknown, valuesOrField: unknown): string {\n if (!Array.isArray(valuesOrField)) {\n throw new Error(\"Expected the second inArray argument to be an array or field path\");\n }\n\n if (!Array.isArray(fieldOrValue)) {\n return fieldOrValue == null\n ? ALWAYS_FALSE\n : `${fieldPathToSoql(valuesOrField as FieldPath)} INCLUDES (${serializeSoqlLiteral(fieldOrValue)})`;\n }\n\n const literals = (valuesOrField as unknown[])\n .filter((entry) => entry !== null && entry !== undefined)\n .map(serializeSoqlLiteral);\n if (literals.length === 0) return ALWAYS_FALSE;\n return `${fieldPathToSoql(fieldOrValue as FieldPath)} IN (${literals.join(\", \")})`;\n}\n\nexport function convertLoadSubsetFilter(filter: LoadSubsetOptions[\"where\"]): CompiledSoqlFilter | undefined {\n if (!filter) return undefined;\n\n const compiled =\n parseWhereExpression<string>(filter, {\n handlers: {\n and: (...filters: string[]) => {\n if (filters.includes(ALWAYS_FALSE)) return ALWAYS_FALSE;\n const clauses = filters.filter((clause) => clause.length > 0);\n if (clauses.length === 0) return \"\";\n if (clauses.length === 1) return clauses[0]!;\n return `(${clauses.join(\" AND \")})`;\n },\n or: (...filters: string[]) => {\n if (filters.every((clause) => clause === ALWAYS_FALSE)) return ALWAYS_FALSE;\n const clauses = filters.filter((clause) => clause !== ALWAYS_FALSE && clause.length > 0);\n if (clauses.length === 0) return \"\";\n if (clauses.length === 1) return clauses[0]!;\n return `(${clauses.join(\" OR \")})`;\n },\n not: (inner: string) => {\n if (inner === ALWAYS_FALSE) return \"\";\n if (!inner) return ALWAYS_FALSE;\n return `(NOT ${inner})`;\n },\n eq: (field: FieldPath, value) =>\n value == null\n ? `${fieldPathToSoql(field)} = null`\n : `${fieldPathToSoql(field)} = ${serializeSoqlLiteral(value)}`,\n gt: (field: FieldPath, value) =>\n value == null\n ? ALWAYS_FALSE\n : `${fieldPathToSoql(field)} > ${serializeSoqlLiteral(value)}`,\n gte: (field: FieldPath, value) =>\n value == null\n ? ALWAYS_FALSE\n : `${fieldPathToSoql(field)} >= ${serializeSoqlLiteral(value)}`,\n lt: (field: FieldPath, value) =>\n value == null\n ? ALWAYS_FALSE\n : `${fieldPathToSoql(field)} < ${serializeSoqlLiteral(value)}`,\n lte: (field: FieldPath, value) =>\n value == null\n ? ALWAYS_FALSE\n : `${fieldPathToSoql(field)} <= ${serializeSoqlLiteral(value)}`,\n isUndefined: (field: FieldPath) => `${fieldPathToSoql(field)} = null`,\n in: convertInFilter,\n like: (field: FieldPath, value: string) =>\n value === \"%\" ? \"\" : `${fieldPathToSoql(field)} LIKE ${serializeSoqlLiteral(value)}`,\n ilike: (field: FieldPath, value: string) =>\n // Salesforce LIKE is case-insensitive for most text fields.\n value === \"%\" ? \"\" : `${fieldPathToSoql(field)} LIKE ${serializeSoqlLiteral(value)}`,\n },\n }) ?? undefined;\n\n if (compiled === undefined) return undefined;\n if (compiled === ALWAYS_FALSE) {\n return { alwaysFalse: true };\n }\n return { clause: compiled || undefined, alwaysFalse: false };\n}\n\nexport function convertLoadSubsetOrderBy(orderBy: LoadSubsetOptions[\"orderBy\"]): string | undefined {\n if (!orderBy) return undefined;\n const fields = parseOrderByExpression(orderBy).map((ordering) => {\n const field = fieldPathToSoql(ordering.field);\n return `${field} ${ordering.direction.toUpperCase()}`;\n });\n return fields.length > 0 ? fields.join(\", \") : undefined;\n}\n\nexport function buildSoqlQuery(opts: {\n objectType: string;\n selectedProperties: string[];\n where?: CompiledSoqlFilter;\n orderBy?: string;\n limit?: number;\n offset?: number;\n}): string {\n const objectType = quoteIdentifier(opts.objectType);\n const select = opts.selectedProperties.map(quoteIdentifier).join(\", \");\n const clauses = [`SELECT ${select} FROM ${objectType}`];\n\n if (opts.where?.clause) {\n clauses.push(`WHERE ${opts.where.clause}`);\n }\n if (opts.orderBy) {\n clauses.push(`ORDER BY ${opts.orderBy}`);\n }\n if (opts.limit !== undefined) {\n clauses.push(`LIMIT ${Math.max(0, Math.trunc(opts.limit))}`);\n }\n if (opts.offset !== undefined && opts.offset > 0) {\n clauses.push(`OFFSET ${Math.max(0, Math.trunc(opts.offset))}`);\n }\n return clauses.join(\" \");\n}\n"],"mappings":"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"}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { SubscribeToSalesforceChangeEvents } from "./objectCollectionOptions.js";
|
|
2
|
-
import { SalesforceClient } from "@party-stack/salesforce-client";
|
|
3
|
-
import { OntologyBackendAdapter, OntologyBackendAdapterProvider, OntologyIR } from "@party-stack/ontology";
|
|
4
|
-
//#region src/adapter/createSalesforceOntologyBackendAdapter.d.ts
|
|
5
|
-
export declare function createSalesforceOntologyBackendAdapter(opts: {
|
|
6
|
-
client: SalesforceClient;
|
|
7
|
-
ir: OntologyIR;
|
|
8
|
-
subscribeToChangeEvents?: SubscribeToSalesforceChangeEvents;
|
|
9
|
-
live?: boolean;
|
|
10
|
-
}): OntologyBackendAdapter;
|
|
11
|
-
export type CreateSalesforceOntologyBackendOptions<Context extends Record<string, unknown> = Record<string, unknown>> = ({
|
|
12
|
-
client: SalesforceClient;
|
|
13
|
-
subscribeToChangeEvents?: SubscribeToSalesforceChangeEvents;
|
|
14
|
-
} | {
|
|
15
|
-
createClient: (ir: OntologyIR, context: Context) => SalesforceClient | Promise<SalesforceClient>;
|
|
16
|
-
subscribeToChangeEvents?: SubscribeToSalesforceChangeEvents;
|
|
17
|
-
}) & {
|
|
18
|
-
live?: boolean;
|
|
19
|
-
};
|
|
20
|
-
export declare function createSalesforceOntologyBackend<Context extends Record<string, unknown> = Record<string, unknown>>(opts: CreateSalesforceOntologyBackendOptions<Context>): OntologyBackendAdapterProvider<Context>;
|
|
21
|
-
//#endregion
|
|
22
|
-
//# sourceMappingURL=createSalesforceOntologyBackendAdapter.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"createSalesforceOntologyBackendAdapter.d.ts","names":[],"sources":["../../src/adapter/createSalesforceOntologyBackendAdapter.ts"],"mappings":";;;;wBAuFgB,uCAAuC;EACnD,QAAQ;EACR,IAAI;EACJ,0BAA0B;EAC1B;IACA;YA+JQ,uCACR,gBAAgB,0BAA0B;EAGpC,QAAQ;EACR,0BAA0B;;EAG1B,eAAe,IAAI,YAAY,SAAS,YAAY,mBAAmB,QAAQ;EAC/E,0BAA0B;;EAGhC;;wBAGY,gCACZ,gBAAgB,0BAA0B,yBAC5C,MAAM,uCAAuC,WAAW,+BAA+B"}
|
|
@@ -1,139 +0,0 @@
|
|
|
1
|
-
import { getSalesforceActionMetadata } from "../actionMetadata.js";
|
|
2
|
-
import { objectCollectionOptions } from "./objectCollectionOptions.js";
|
|
3
|
-
import { createSalesforceCodec } from "./salesforceCodec.js";
|
|
4
|
-
import { SalesforceApiError } from "@party-stack/salesforce-client";
|
|
5
|
-
import { NonRetryableError } from "@party-stack/ontology";
|
|
6
|
-
//#region src/adapter/createSalesforceOntologyBackendAdapter.ts
|
|
7
|
-
function isNonRetryableSalesforceError(error) {
|
|
8
|
-
if (!(error instanceof SalesforceApiError)) return false;
|
|
9
|
-
if (error.statusCode === 400 || error.statusCode === 403 || error.statusCode === 404) return true;
|
|
10
|
-
const code = error.errorCode?.toUpperCase();
|
|
11
|
-
return code === "INVALID_INPUT" || code === "REQUIRED_FIELD_MISSING" || code === "FIELD_CUSTOM_VALIDATION_EXCEPTION" || code === "INSUFFICIENT_ACCESS" || code === "INSUFFICIENT_ACCESS_OR_READONLY" || code === "NOT_FOUND";
|
|
12
|
-
}
|
|
13
|
-
async function awaitInvalidation(utils) {
|
|
14
|
-
try {
|
|
15
|
-
await utils.invalidate();
|
|
16
|
-
} catch (error) {
|
|
17
|
-
throw new NonRetryableError("Salesforce accepted the action, but its collection changes could not be observed.", { cause: error });
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
async function invalidateEditedCollections(objects) {
|
|
21
|
-
await Promise.all(Object.values(objects).map((collection) => awaitInvalidation(collection.utils)));
|
|
22
|
-
}
|
|
23
|
-
function assertSaveSucceeded(result) {
|
|
24
|
-
if (result.success) return;
|
|
25
|
-
throw new NonRetryableError(result.errors.map((error) => error.message).filter(Boolean).join("; ") || "Salesforce rejected the record write.");
|
|
26
|
-
}
|
|
27
|
-
async function refreshConfirmedRecord(collection, recordId) {
|
|
28
|
-
if (!collection) return;
|
|
29
|
-
const utils = collection.utils;
|
|
30
|
-
if (recordId === void 0) {
|
|
31
|
-
await awaitInvalidation(utils);
|
|
32
|
-
return;
|
|
33
|
-
}
|
|
34
|
-
try {
|
|
35
|
-
await utils.refreshByKey(recordId);
|
|
36
|
-
} catch (error) {
|
|
37
|
-
throw new NonRetryableError(`Salesforce accepted the write, but record "${recordId}" could not be observed in its collection.`, { cause: error });
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
function createSalesforceOntologyBackendAdapter(opts) {
|
|
41
|
-
const codec = createSalesforceCodec(opts.ir);
|
|
42
|
-
const encodeInvocableParameter = (type, value) => {
|
|
43
|
-
if (type.kind === "optional") return encodeInvocableParameter(type.value.type, value);
|
|
44
|
-
if (type.kind === "list" && Array.isArray(value)) return value.map((entry) => codec.encodeValue(type.value.elementType, entry));
|
|
45
|
-
return codec.encodeValue(type, value);
|
|
46
|
-
};
|
|
47
|
-
return {
|
|
48
|
-
name: "salesforce",
|
|
49
|
-
live: opts.live !== false,
|
|
50
|
-
getCollectionOptions: (objectType) => {
|
|
51
|
-
const objectTypeDef = opts.ir.objectTypes.find((candidate) => candidate.name === objectType);
|
|
52
|
-
if (!objectTypeDef) throw new Error(`Unknown Salesforce object type "${objectType}".`);
|
|
53
|
-
return objectCollectionOptions({
|
|
54
|
-
client: opts.client,
|
|
55
|
-
objectType,
|
|
56
|
-
primaryKeyProperty: objectTypeDef.primaryKey,
|
|
57
|
-
selectedProperties: objectTypeDef.properties.map((property) => property.name),
|
|
58
|
-
subscribeToChangeEvents: opts.live === false ? void 0 : opts.subscribeToChangeEvents,
|
|
59
|
-
decodeObject: (object) => codec.decodeObject(objectType, object)
|
|
60
|
-
});
|
|
61
|
-
},
|
|
62
|
-
applyAction: async (name, parameters, live) => {
|
|
63
|
-
const actionType = opts.ir.actionTypes.find((candidate) => candidate.name === name);
|
|
64
|
-
if (!actionType) throw new NonRetryableError(`Unknown Salesforce action type "${name}".`);
|
|
65
|
-
const parameterTypes = new Map(actionType.parameters.map((parameter) => [parameter.name, parameter.type]));
|
|
66
|
-
const requestParameters = {};
|
|
67
|
-
for (const [parameterName, value] of Object.entries(parameters)) {
|
|
68
|
-
if (value === void 0) continue;
|
|
69
|
-
const parameterType = parameterTypes.get(parameterName);
|
|
70
|
-
requestParameters[parameterName] = parameterType ? encodeInvocableParameter(parameterType, value) : value;
|
|
71
|
-
}
|
|
72
|
-
const metadata = getSalesforceActionMetadata(actionType);
|
|
73
|
-
if (!metadata) throw new NonRetryableError(`Salesforce action type "${name}" is missing Salesforce metadata.`);
|
|
74
|
-
if (metadata.kind === "crud") {
|
|
75
|
-
const collection = live.objects[metadata.objectType];
|
|
76
|
-
if (metadata.operation === "create") {
|
|
77
|
-
const result = await opts.client.createRecord(metadata.objectType, requestParameters);
|
|
78
|
-
assertSaveSucceeded(result);
|
|
79
|
-
if (opts.live !== false) await refreshConfirmedRecord(collection, result.id);
|
|
80
|
-
return;
|
|
81
|
-
}
|
|
82
|
-
const recordId = requestParameters.recordId;
|
|
83
|
-
if (typeof recordId !== "string" || recordId.length === 0) throw new NonRetryableError(`Salesforce ${metadata.operation} action requires recordId.`);
|
|
84
|
-
if (metadata.operation === "update") {
|
|
85
|
-
const fields = Object.fromEntries(Object.entries(requestParameters).filter(([parameterName]) => parameterName !== "recordId"));
|
|
86
|
-
const result = await opts.client.updateRecord(metadata.objectType, recordId, fields);
|
|
87
|
-
assertSaveSucceeded(result);
|
|
88
|
-
if (opts.live !== false) await refreshConfirmedRecord(collection, result.id ?? recordId);
|
|
89
|
-
return;
|
|
90
|
-
}
|
|
91
|
-
assertSaveSucceeded(await opts.client.deleteRecord(metadata.objectType, recordId));
|
|
92
|
-
if (opts.live !== false && collection) await collection.utils.deleteByKey(recordId);
|
|
93
|
-
return;
|
|
94
|
-
}
|
|
95
|
-
const actionApiName = metadata.apiName;
|
|
96
|
-
let results;
|
|
97
|
-
try {
|
|
98
|
-
results = metadata.kind === "standard" ? await opts.client.invokeStandardAction(actionApiName, [requestParameters]) : await opts.client.invokeFlowAction(actionApiName, [requestParameters]);
|
|
99
|
-
} catch (error) {
|
|
100
|
-
if (isNonRetryableSalesforceError(error)) throw new NonRetryableError(error instanceof Error ? error.message : "Salesforce action invocation failed.", { cause: error });
|
|
101
|
-
throw error;
|
|
102
|
-
}
|
|
103
|
-
const result = results[0];
|
|
104
|
-
if (!result) throw new Error(`Salesforce action "${actionApiName}" returned no results.`);
|
|
105
|
-
if (!result.isSuccess) {
|
|
106
|
-
const message = result.errors?.map((entry) => entry.message).filter(Boolean).join("; ") || `Salesforce action "${actionApiName}" failed.`;
|
|
107
|
-
throw new NonRetryableError(message);
|
|
108
|
-
}
|
|
109
|
-
if (opts.live !== false) await invalidateEditedCollections(live.objects);
|
|
110
|
-
},
|
|
111
|
-
runQueryFunction: async (name, parameters) => {
|
|
112
|
-
const queryFunction = opts.ir.queryFunctionTypes.find((candidate) => candidate.name === name);
|
|
113
|
-
if (!queryFunction) throw new NonRetryableError(`Unknown Salesforce query function type "${name}".`);
|
|
114
|
-
const parameterTypes = new Map(queryFunction.parameters.map((parameter) => [parameter.name, parameter.type]));
|
|
115
|
-
const requestParameters = {};
|
|
116
|
-
for (const [parameterName, value] of Object.entries(parameters)) {
|
|
117
|
-
if (value === void 0) continue;
|
|
118
|
-
const parameterType = parameterTypes.get(parameterName);
|
|
119
|
-
requestParameters[parameterName] = parameterType ? encodeInvocableParameter(parameterType, value) : value;
|
|
120
|
-
}
|
|
121
|
-
const result = (await opts.client.invokeStandardAction(name, [requestParameters]))[0];
|
|
122
|
-
if (!result) throw new Error(`Salesforce standard query "${name}" returned no results.`);
|
|
123
|
-
if (!result.isSuccess) throw new NonRetryableError(result.errors?.map((entry) => entry.message).filter(Boolean).join("; ") || `Salesforce standard query "${name}" failed.`);
|
|
124
|
-
return codec.decodeValue(queryFunction.returnType, result.outputValues ?? {});
|
|
125
|
-
}
|
|
126
|
-
};
|
|
127
|
-
}
|
|
128
|
-
function createSalesforceOntologyBackend(opts) {
|
|
129
|
-
return async (ir, context) => createSalesforceOntologyBackendAdapter({
|
|
130
|
-
ir,
|
|
131
|
-
client: "client" in opts ? opts.client : await opts.createClient(ir, context),
|
|
132
|
-
subscribeToChangeEvents: opts.subscribeToChangeEvents,
|
|
133
|
-
live: opts.live
|
|
134
|
-
});
|
|
135
|
-
}
|
|
136
|
-
//#endregion
|
|
137
|
-
export { createSalesforceOntologyBackend, createSalesforceOntologyBackendAdapter };
|
|
138
|
-
|
|
139
|
-
//# sourceMappingURL=createSalesforceOntologyBackendAdapter.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"createSalesforceOntologyBackendAdapter.js","names":[],"sources":["../../src/adapter/createSalesforceOntologyBackendAdapter.ts"],"sourcesContent":["import {\n NonRetryableError,\n type OntologyBackendAdapter,\n type OntologyBackendAdapterProvider,\n type OntologyIR,\n} from \"@party-stack/ontology\";\nimport { SalesforceApiError, type SalesforceClient } from \"@party-stack/salesforce-client\";\nimport { Collection } from \"@tanstack/db\";\nimport { getSalesforceActionMetadata } from \"../actionMetadata.js\";\nimport {\n objectCollectionOptions,\n type ObjectCollectionUtils,\n type SubscribeToSalesforceChangeEvents,\n} from \"./objectCollectionOptions.js\";\nimport { createSalesforceCodec } from \"./salesforceCodec.js\";\n\ntype CollectionWithUtils = Collection<Record<string, unknown>, string | number, ObjectCollectionUtils>;\n\nfunction isNonRetryableSalesforceError(error: unknown): boolean {\n if (!(error instanceof SalesforceApiError)) {\n return false;\n }\n if (error.statusCode === 400 || error.statusCode === 403 || error.statusCode === 404) {\n return true;\n }\n const code = error.errorCode?.toUpperCase();\n return (\n code === \"INVALID_INPUT\" ||\n code === \"REQUIRED_FIELD_MISSING\" ||\n code === \"FIELD_CUSTOM_VALIDATION_EXCEPTION\" ||\n code === \"INSUFFICIENT_ACCESS\" ||\n code === \"INSUFFICIENT_ACCESS_OR_READONLY\" ||\n code === \"NOT_FOUND\"\n );\n}\n\nasync function awaitInvalidation(utils: ObjectCollectionUtils): Promise<void> {\n try {\n await utils.invalidate();\n } catch (error) {\n throw new NonRetryableError(\n \"Salesforce accepted the action, but its collection changes could not be observed.\",\n { cause: error }\n );\n }\n}\n\nasync function invalidateEditedCollections(\n objects: Record<string, Collection<Record<string, unknown>>>\n): Promise<void> {\n await Promise.all(\n Object.values(objects).map((collection) =>\n awaitInvalidation((collection as CollectionWithUtils).utils)\n )\n );\n}\n\nfunction assertSaveSucceeded(result: { success: boolean; errors: Array<{ message: string }> }): void {\n if (result.success) return;\n throw new NonRetryableError(\n result.errors\n .map((error) => error.message)\n .filter(Boolean)\n .join(\"; \") || \"Salesforce rejected the record write.\"\n );\n}\n\nasync function refreshConfirmedRecord(\n collection: CollectionWithUtils | undefined,\n recordId: string | number | undefined\n): Promise<void> {\n if (!collection) return;\n const utils: ObjectCollectionUtils = collection.utils;\n if (recordId === undefined) {\n await awaitInvalidation(utils);\n return;\n }\n try {\n await utils.refreshByKey(recordId);\n } catch (error) {\n throw new NonRetryableError(\n `Salesforce accepted the write, but record \"${recordId}\" could not be observed in its collection.`,\n { cause: error }\n );\n }\n}\n\nexport function createSalesforceOntologyBackendAdapter(opts: {\n client: SalesforceClient;\n ir: OntologyIR;\n subscribeToChangeEvents?: SubscribeToSalesforceChangeEvents;\n live?: boolean;\n}): OntologyBackendAdapter {\n const codec = createSalesforceCodec(opts.ir);\n const encodeInvocableParameter = (\n type: Parameters<typeof codec.encodeValue>[0],\n value: unknown\n ): unknown => {\n if (type.kind === \"optional\") {\n return encodeInvocableParameter(type.value.type, value);\n }\n if (type.kind === \"list\" && Array.isArray(value)) {\n return value.map((entry) => codec.encodeValue(type.value.elementType, entry));\n }\n return codec.encodeValue(type, value);\n };\n\n return {\n name: \"salesforce\",\n live: opts.live !== false,\n getCollectionOptions: (objectType: string) => {\n const objectTypeDef = opts.ir.objectTypes.find((candidate) => candidate.name === objectType);\n if (!objectTypeDef) {\n throw new Error(`Unknown Salesforce object type \"${objectType}\".`);\n }\n return objectCollectionOptions({\n client: opts.client,\n objectType,\n primaryKeyProperty: objectTypeDef.primaryKey,\n selectedProperties: objectTypeDef.properties.map((property) => property.name),\n subscribeToChangeEvents: opts.live === false ? undefined : opts.subscribeToChangeEvents,\n decodeObject: (object) => codec.decodeObject(objectType, object),\n });\n },\n applyAction: async (name, parameters, live) => {\n const actionType = opts.ir.actionTypes.find((candidate) => candidate.name === name);\n if (!actionType) {\n throw new NonRetryableError(`Unknown Salesforce action type \"${name}\".`);\n }\n\n const parameterTypes = new Map(\n actionType.parameters.map((parameter) => [parameter.name, parameter.type])\n );\n const requestParameters: Record<string, unknown> = {};\n for (const [parameterName, value] of Object.entries(parameters)) {\n if (value === undefined) continue;\n const parameterType = parameterTypes.get(parameterName);\n requestParameters[parameterName] = parameterType\n ? encodeInvocableParameter(parameterType, value)\n : value;\n }\n\n const metadata = getSalesforceActionMetadata(actionType);\n if (!metadata) {\n throw new NonRetryableError(\n `Salesforce action type \"${name}\" is missing Salesforce metadata.`\n );\n }\n if (metadata.kind === \"crud\") {\n const collection = live.objects[metadata.objectType] as CollectionWithUtils | undefined;\n if (metadata.operation === \"create\") {\n const result = await opts.client.createRecord(metadata.objectType, requestParameters);\n assertSaveSucceeded(result);\n if (opts.live !== false) {\n await refreshConfirmedRecord(collection, result.id);\n }\n return;\n }\n const recordId = requestParameters.recordId;\n if (typeof recordId !== \"string\" || recordId.length === 0) {\n throw new NonRetryableError(`Salesforce ${metadata.operation} action requires recordId.`);\n }\n if (metadata.operation === \"update\") {\n const fields = Object.fromEntries(\n Object.entries(requestParameters).filter(\n ([parameterName]) => parameterName !== \"recordId\"\n )\n );\n const result = await opts.client.updateRecord(metadata.objectType, recordId, fields);\n assertSaveSucceeded(result);\n if (opts.live !== false) {\n await refreshConfirmedRecord(collection, result.id ?? recordId);\n }\n return;\n }\n assertSaveSucceeded(await opts.client.deleteRecord(metadata.objectType, recordId));\n if (opts.live !== false && collection) {\n await collection.utils.deleteByKey(recordId);\n }\n return;\n }\n\n const actionApiName = metadata.apiName;\n\n let results;\n try {\n results =\n metadata.kind === \"standard\"\n ? await opts.client.invokeStandardAction(actionApiName, [requestParameters])\n : await opts.client.invokeFlowAction(actionApiName, [requestParameters]);\n } catch (error) {\n if (isNonRetryableSalesforceError(error)) {\n throw new NonRetryableError(\n error instanceof Error ? error.message : \"Salesforce action invocation failed.\",\n { cause: error }\n );\n }\n throw error;\n }\n\n const result = results[0];\n if (!result) {\n throw new Error(`Salesforce action \"${actionApiName}\" returned no results.`);\n }\n if (!result.isSuccess) {\n const message =\n result.errors\n ?.map((entry) => entry.message)\n .filter(Boolean)\n .join(\"; \") || `Salesforce action \"${actionApiName}\" failed.`;\n throw new NonRetryableError(message);\n }\n\n if (opts.live !== false) {\n await invalidateEditedCollections(live.objects);\n }\n },\n runQueryFunction: async (name, parameters) => {\n const queryFunction = opts.ir.queryFunctionTypes.find((candidate) => candidate.name === name);\n if (!queryFunction) {\n throw new NonRetryableError(`Unknown Salesforce query function type \"${name}\".`);\n }\n const parameterTypes = new Map(\n queryFunction.parameters.map((parameter) => [parameter.name, parameter.type])\n );\n const requestParameters: Record<string, unknown> = {};\n for (const [parameterName, value] of Object.entries(parameters)) {\n if (value === undefined) continue;\n const parameterType = parameterTypes.get(parameterName);\n requestParameters[parameterName] = parameterType\n ? encodeInvocableParameter(parameterType, value)\n : value;\n }\n const results = await opts.client.invokeStandardAction(name, [requestParameters]);\n const result = results[0];\n if (!result) {\n throw new Error(`Salesforce standard query \"${name}\" returned no results.`);\n }\n if (!result.isSuccess) {\n throw new NonRetryableError(\n result.errors\n ?.map((entry) => entry.message)\n .filter(Boolean)\n .join(\"; \") || `Salesforce standard query \"${name}\" failed.`\n );\n }\n return codec.decodeValue(queryFunction.returnType, result.outputValues ?? {});\n },\n };\n}\n\nexport type CreateSalesforceOntologyBackendOptions<\n Context extends Record<string, unknown> = Record<string, unknown>,\n> = (\n | {\n client: SalesforceClient;\n subscribeToChangeEvents?: SubscribeToSalesforceChangeEvents;\n }\n | {\n createClient: (ir: OntologyIR, context: Context) => SalesforceClient | Promise<SalesforceClient>;\n subscribeToChangeEvents?: SubscribeToSalesforceChangeEvents;\n }\n) & {\n live?: boolean;\n};\n\nexport function createSalesforceOntologyBackend<\n Context extends Record<string, unknown> = Record<string, unknown>,\n>(opts: CreateSalesforceOntologyBackendOptions<Context>): OntologyBackendAdapterProvider<Context> {\n return async (ir, context) =>\n createSalesforceOntologyBackendAdapter({\n ir,\n client: \"client\" in opts ? opts.client : await opts.createClient(ir, context),\n subscribeToChangeEvents: opts.subscribeToChangeEvents,\n live: opts.live,\n });\n}\n"],"mappings":"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"}
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import { SalesforceChangeEvent, SalesforceChangeEventSubscription, SalesforceChangeEventSubscriptionOptions, SalesforceClient } from "@party-stack/salesforce-client";
|
|
2
|
-
import { CollectionConfig, InferSchemaOutput, StandardSchema, SyncConfig, UtilsRecord } from "@tanstack/db";
|
|
3
|
-
//#region src/adapter/objectCollectionOptions.d.ts
|
|
4
|
-
type WithRequired<T, K extends keyof T> = T & { [P in K]-?: T[P]; };
|
|
5
|
-
type SalesforceObject = Record<string, unknown>;
|
|
6
|
-
export type SubscribeToSalesforceChangeEvents = (objectType: string, listener: (event: SalesforceChangeEvent) => void, options?: SalesforceChangeEventSubscriptionOptions) => Promise<SalesforceChangeEventSubscription>;
|
|
7
|
-
export interface ObjectCollectionUtils extends UtilsRecord {
|
|
8
|
-
/**
|
|
9
|
-
* Reset load-subset deduplication and await refetching active subsets.
|
|
10
|
-
*/
|
|
11
|
-
invalidate: () => Promise<void>;
|
|
12
|
-
/** Refetch one confirmed backend record and commit it locally. */
|
|
13
|
-
refreshByKey: (key: string | number) => Promise<void>;
|
|
14
|
-
/** Apply a confirmed backend deletion to the local collection. */
|
|
15
|
-
deleteByKey: (key: string | number) => Promise<void>;
|
|
16
|
-
}
|
|
17
|
-
export interface ObjectCollectionOpts {
|
|
18
|
-
client: SalesforceClient;
|
|
19
|
-
objectType: string;
|
|
20
|
-
primaryKeyProperty: string;
|
|
21
|
-
selectedProperties: string[];
|
|
22
|
-
subscribeToChangeEvents?: SubscribeToSalesforceChangeEvents;
|
|
23
|
-
decodeObject?: (object: Record<string, unknown>) => Record<string, unknown>;
|
|
24
|
-
}
|
|
25
|
-
export interface ObjectCollectionConfig<TSchema extends StandardSchema<SalesforceObject>> extends ObjectCollectionOpts, Omit<CollectionConfig<InferSchemaOutput<TSchema>, string | number, TSchema>, "sync" | "syncMode" | "getKey" | "onInsert" | "onUpdate" | "onDelete"> {
|
|
26
|
-
schema: TSchema;
|
|
27
|
-
}
|
|
28
|
-
export declare function objectCollectionOptions<TSchema extends StandardSchema<SalesforceObject>>(config: ObjectCollectionConfig<TSchema>): WithRequired<CollectionConfig<InferSchemaOutput<TSchema>, string | number, TSchema, ObjectCollectionUtils>, "schema">;
|
|
29
|
-
export declare function objectCollectionOptions(config: ObjectCollectionOpts): {
|
|
30
|
-
syncMode: "on-demand";
|
|
31
|
-
sync: SyncConfig<Record<string, unknown>, string | number>;
|
|
32
|
-
utils: ObjectCollectionUtils;
|
|
33
|
-
};
|
|
34
|
-
//#endregion
|
|
35
|
-
export {};
|
|
36
|
-
//# sourceMappingURL=objectCollectionOptions.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"objectCollectionOptions.d.ts","names":[],"sources":["../../src/adapter/objectCollectionOptions.ts"],"mappings":";;;KAyBK,aAAa,GAAG,gBAAgB,KAAK,OAAO,KAAK,MAAM,EAAE;KAEzD,mBAAmB;YAEZ,qCACR,oBACA,WAAW,OAAO,gCAClB,UAAU,6CACT,QAAQ;iBAEI,8BAA8B;;;;EAI3C,kBAAkB;;EAElB,eAAe,yBAAyB;;EAExC,cAAc,yBAAyB;;iBAgT1B;EACb,QAAQ;EACR;EACA;EACA;EACA,0BAA0B;EAC1B,gBAAgB,QAAQ,4BAA4B;;iBAGvC,uBAAuB,gBAAgB,eAAe,2BAE/D,sBACA,KACI,iBAAiB,kBAAkB,2BAA2B;EAGtE,QAAQ;;wBAGI,wBAAwB,gBAAgB,eAAe,mBACnE,QAAQ,uBAAuB,WAChC,aACC,iBAAiB,kBAAkB,2BAA2B,SAAS;wBAG3D,wBAAwB,QAAQ;EAC5C;EACA,MAAM,WAAW;EACjB,OAAO"}
|
|
@@ -1,204 +0,0 @@
|
|
|
1
|
-
import { fromPagination, toArray } from "../utils/AsyncIterable.js";
|
|
2
|
-
import { buildSoqlQuery, convertLoadSubsetFilter, convertLoadSubsetOrderBy, isAlwaysFalseFilter, serializeSoqlLiteral } from "./convertLoadSubsetOptions.js";
|
|
3
|
-
import { BasicIndex, DeduplicatedLoadSubset } from "@tanstack/db";
|
|
4
|
-
//#region src/adapter/objectCollectionOptions.ts
|
|
5
|
-
async function fetchSalesforceObjects(client, objectType, selectedProperties, opts, decodeObject = (object) => object) {
|
|
6
|
-
const offset = Math.max(0, Math.trunc(opts.offset ?? 0));
|
|
7
|
-
const limit = opts.limit === void 0 ? void 0 : Math.max(0, Math.trunc(opts.limit));
|
|
8
|
-
if (limit === 0) return [];
|
|
9
|
-
let where = convertLoadSubsetFilter(opts.where);
|
|
10
|
-
if (isAlwaysFalseFilter(where)) return [];
|
|
11
|
-
if (opts.cursor?.whereFrom) {
|
|
12
|
-
const cursorWhere = convertLoadSubsetFilter(opts.cursor.whereFrom);
|
|
13
|
-
if (isAlwaysFalseFilter(cursorWhere)) return [];
|
|
14
|
-
if (cursorWhere?.clause) where = where?.clause ? {
|
|
15
|
-
clause: `(${where.clause} AND ${cursorWhere.clause})`,
|
|
16
|
-
alwaysFalse: false
|
|
17
|
-
} : cursorWhere;
|
|
18
|
-
}
|
|
19
|
-
const canPushOffset = offset > 0 && offset <= 2e3 && (limit === void 0 || offset + limit <= 2e3);
|
|
20
|
-
const orderBy = convertLoadSubsetOrderBy(opts.orderBy);
|
|
21
|
-
const soql = buildSoqlQuery({
|
|
22
|
-
objectType,
|
|
23
|
-
selectedProperties,
|
|
24
|
-
where,
|
|
25
|
-
orderBy,
|
|
26
|
-
limit: canPushOffset ? limit === void 0 ? void 0 : offset + limit : limit === void 0 ? void 0 : offset + limit,
|
|
27
|
-
offset: canPushOffset ? offset : void 0
|
|
28
|
-
});
|
|
29
|
-
const results = await toArray(fromPagination(async (_pageSize, pageToken) => {
|
|
30
|
-
if (pageToken) return client.queryMore(pageToken);
|
|
31
|
-
return client.query(soql);
|
|
32
|
-
}, (page) => page.done ? void 0 : page.nextRecordsUrl, (page) => page.records, 2e3, canPushOffset ? limit === void 0 ? void 0 : limit : limit === void 0 ? void 0 : offset + limit));
|
|
33
|
-
return (canPushOffset ? results : results.slice(offset, limit === void 0 ? void 0 : offset + limit)).map(decodeObject);
|
|
34
|
-
}
|
|
35
|
-
function createSyncConfig(client, objectType, primaryKeyProperty, selectedProperties, subscribeToChangeEvents, decodeObject = (object) => object) {
|
|
36
|
-
let loadSubsetDedupe;
|
|
37
|
-
let deleteByKey;
|
|
38
|
-
let refreshByKey;
|
|
39
|
-
let invalidate;
|
|
40
|
-
return {
|
|
41
|
-
sync: { sync: (params) => {
|
|
42
|
-
const { begin, write, commit, markError, markReady } = params;
|
|
43
|
-
const activeSubsets = /* @__PURE__ */ new Set();
|
|
44
|
-
const collectionMetadata = params.metadata?.collection;
|
|
45
|
-
const replayMetadataKey = `salesforce.cdc.${objectType}.replayId`;
|
|
46
|
-
const restoredReplayId = collectionMetadata?.get(replayMetadataKey);
|
|
47
|
-
let disposed = false;
|
|
48
|
-
let changeSubscription;
|
|
49
|
-
let changeQueue = Promise.resolve();
|
|
50
|
-
const upsertObject = (object) => {
|
|
51
|
-
const key = object.Id;
|
|
52
|
-
if (typeof key !== "string" && typeof key !== "number") throw new Error(`Salesforce object for ${objectType} is missing a string/number Id primary key.`);
|
|
53
|
-
const exists = params.collection.has(key);
|
|
54
|
-
const existing = exists ? params.collection.get(key) : void 0;
|
|
55
|
-
write({
|
|
56
|
-
type: exists ? "update" : "insert",
|
|
57
|
-
value: existing ? {
|
|
58
|
-
...existing,
|
|
59
|
-
...object
|
|
60
|
-
} : object
|
|
61
|
-
});
|
|
62
|
-
};
|
|
63
|
-
const loadSubset = async (opts, awaitApplication = true) => {
|
|
64
|
-
if (!activeSubsets.has(opts)) {
|
|
65
|
-
activeSubsets.add(opts);
|
|
66
|
-
opts.signal?.addEventListener("abort", () => activeSubsets.delete(opts), { once: true });
|
|
67
|
-
}
|
|
68
|
-
const objects = await fetchSalesforceObjects(client, objectType, selectedProperties, opts, decodeObject);
|
|
69
|
-
if (objects.length > 0) {
|
|
70
|
-
begin();
|
|
71
|
-
for (const object of objects) upsertObject(object);
|
|
72
|
-
const applied = commit();
|
|
73
|
-
if (applied instanceof Promise) {
|
|
74
|
-
if (awaitApplication) await applied;
|
|
75
|
-
else applied.catch((error) => {
|
|
76
|
-
if (!disposed) markError(error);
|
|
77
|
-
});
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
};
|
|
81
|
-
loadSubsetDedupe = new DeduplicatedLoadSubset({ loadSubset: (options) => loadSubset(options) });
|
|
82
|
-
invalidate = async () => {
|
|
83
|
-
loadSubsetDedupe?.reset();
|
|
84
|
-
for (const subset of activeSubsets) if (!subset.signal?.aborted) await loadSubset(subset, false);
|
|
85
|
-
};
|
|
86
|
-
refreshByKey = async (key) => {
|
|
87
|
-
const object = (await client.query(buildSoqlQuery({
|
|
88
|
-
objectType,
|
|
89
|
-
selectedProperties,
|
|
90
|
-
where: {
|
|
91
|
-
clause: `${primaryKeyProperty} = ${serializeSoqlLiteral(key)}`,
|
|
92
|
-
alwaysFalse: false
|
|
93
|
-
},
|
|
94
|
-
limit: 1
|
|
95
|
-
}))).records[0];
|
|
96
|
-
if (!object) throw new Error(`Salesforce ${objectType} record "${key}" was not returned after a confirmed write.`);
|
|
97
|
-
begin();
|
|
98
|
-
upsertObject(decodeObject(object));
|
|
99
|
-
const applied = commit();
|
|
100
|
-
if (applied instanceof Promise) applied.catch((error) => {
|
|
101
|
-
if (!disposed) markError(error);
|
|
102
|
-
});
|
|
103
|
-
loadSubsetDedupe?.reset();
|
|
104
|
-
};
|
|
105
|
-
deleteByKey = (key) => {
|
|
106
|
-
begin();
|
|
107
|
-
write({
|
|
108
|
-
type: "delete",
|
|
109
|
-
key
|
|
110
|
-
});
|
|
111
|
-
const applied = commit();
|
|
112
|
-
if (applied instanceof Promise) applied.catch((error) => {
|
|
113
|
-
if (!disposed) markError(error);
|
|
114
|
-
});
|
|
115
|
-
loadSubsetDedupe?.reset();
|
|
116
|
-
return Promise.resolve();
|
|
117
|
-
};
|
|
118
|
-
markReady();
|
|
119
|
-
if (subscribeToChangeEvents) subscribeToChangeEvents(objectType, (event) => {
|
|
120
|
-
changeQueue = changeQueue.then(async () => {
|
|
121
|
-
if (disposed) return;
|
|
122
|
-
const header = event.payload.ChangeEventHeader;
|
|
123
|
-
if (header.changeType === "DELETE") {
|
|
124
|
-
begin();
|
|
125
|
-
for (const id of header.recordIds) write({
|
|
126
|
-
type: "delete",
|
|
127
|
-
key: id
|
|
128
|
-
});
|
|
129
|
-
const replayId = event.event?.replayId;
|
|
130
|
-
if (replayId !== void 0) collectionMetadata?.set(replayMetadataKey, replayId);
|
|
131
|
-
await commit();
|
|
132
|
-
loadSubsetDedupe?.reset();
|
|
133
|
-
return;
|
|
134
|
-
}
|
|
135
|
-
await invalidate?.();
|
|
136
|
-
const replayId = event.event?.replayId;
|
|
137
|
-
if (replayId !== void 0 && collectionMetadata) {
|
|
138
|
-
begin();
|
|
139
|
-
collectionMetadata.set(replayMetadataKey, replayId);
|
|
140
|
-
await commit();
|
|
141
|
-
}
|
|
142
|
-
}).catch((error) => {
|
|
143
|
-
markError(error instanceof Error ? error : new Error(String(error)));
|
|
144
|
-
});
|
|
145
|
-
}, typeof restoredReplayId === "number" ? { replayId: restoredReplayId } : void 0).then((subscription) => {
|
|
146
|
-
if (disposed) subscription.unsubscribe();
|
|
147
|
-
else changeSubscription = subscription;
|
|
148
|
-
}, (error) => {
|
|
149
|
-
markError(error instanceof Error ? error : new Error(String(error)));
|
|
150
|
-
});
|
|
151
|
-
return {
|
|
152
|
-
loadSubset: loadSubsetDedupe.loadSubset,
|
|
153
|
-
cleanup: () => {
|
|
154
|
-
disposed = true;
|
|
155
|
-
changeSubscription?.unsubscribe();
|
|
156
|
-
changeQueue.finally(() => {
|
|
157
|
-
loadSubsetDedupe?.reset();
|
|
158
|
-
loadSubsetDedupe = void 0;
|
|
159
|
-
invalidate = void 0;
|
|
160
|
-
refreshByKey = void 0;
|
|
161
|
-
deleteByKey = void 0;
|
|
162
|
-
});
|
|
163
|
-
}
|
|
164
|
-
};
|
|
165
|
-
} },
|
|
166
|
-
utils: {
|
|
167
|
-
invalidate: () => {
|
|
168
|
-
if (!invalidate) throw new Error(`Salesforce ${objectType} collection is not ready.`);
|
|
169
|
-
return invalidate();
|
|
170
|
-
},
|
|
171
|
-
refreshByKey: (key) => {
|
|
172
|
-
if (!refreshByKey) throw new Error(`Salesforce ${objectType} collection is not ready.`);
|
|
173
|
-
return refreshByKey(key);
|
|
174
|
-
},
|
|
175
|
-
deleteByKey: (key) => {
|
|
176
|
-
if (!deleteByKey) throw new Error(`Salesforce ${objectType} collection is not ready.`);
|
|
177
|
-
return deleteByKey(key);
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
};
|
|
181
|
-
}
|
|
182
|
-
function objectCollectionOptions(config) {
|
|
183
|
-
const { client, objectType, primaryKeyProperty, selectedProperties, subscribeToChangeEvents, decodeObject, schema, ...rest } = config;
|
|
184
|
-
const { sync, utils } = createSyncConfig(client, objectType, primaryKeyProperty, selectedProperties, subscribeToChangeEvents, decodeObject);
|
|
185
|
-
if (schema === void 0) return {
|
|
186
|
-
syncMode: "on-demand",
|
|
187
|
-
sync,
|
|
188
|
-
utils
|
|
189
|
-
};
|
|
190
|
-
return {
|
|
191
|
-
...rest,
|
|
192
|
-
schema,
|
|
193
|
-
defaultIndexType: BasicIndex,
|
|
194
|
-
autoIndex: "eager",
|
|
195
|
-
syncMode: "on-demand",
|
|
196
|
-
getKey: (object) => object[primaryKeyProperty],
|
|
197
|
-
sync,
|
|
198
|
-
utils
|
|
199
|
-
};
|
|
200
|
-
}
|
|
201
|
-
//#endregion
|
|
202
|
-
export { objectCollectionOptions };
|
|
203
|
-
|
|
204
|
-
//# sourceMappingURL=objectCollectionOptions.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"objectCollectionOptions.js","names":["AsyncIterable.toArray","AsyncIterable.fromPagination"],"sources":["../../src/adapter/objectCollectionOptions.ts"],"sourcesContent":["import {\n BasicIndex,\n CollectionConfig,\n DeduplicatedLoadSubset,\n InferSchemaOutput,\n LoadSubsetOptions,\n StandardSchema,\n SyncConfig,\n UtilsRecord,\n} from \"@tanstack/db\";\nimport * as AsyncIterable from \"../utils/AsyncIterable.js\";\nimport {\n buildSoqlQuery,\n convertLoadSubsetFilter,\n convertLoadSubsetOrderBy,\n isAlwaysFalseFilter,\n serializeSoqlLiteral,\n} from \"./convertLoadSubsetOptions.js\";\nimport type {\n SalesforceChangeEvent,\n SalesforceChangeEventSubscription,\n SalesforceChangeEventSubscriptionOptions,\n SalesforceClient,\n} from \"@party-stack/salesforce-client\";\n\ntype WithRequired<T, K extends keyof T> = T & { [P in K]-?: T[P] };\n\ntype SalesforceObject = Record<string, unknown>;\n\nexport type SubscribeToSalesforceChangeEvents = (\n objectType: string,\n listener: (event: SalesforceChangeEvent) => void,\n options?: SalesforceChangeEventSubscriptionOptions\n) => Promise<SalesforceChangeEventSubscription>;\n\nexport interface ObjectCollectionUtils extends UtilsRecord {\n /**\n * Reset load-subset deduplication and await refetching active subsets.\n */\n invalidate: () => Promise<void>;\n /** Refetch one confirmed backend record and commit it locally. */\n refreshByKey: (key: string | number) => Promise<void>;\n /** Apply a confirmed backend deletion to the local collection. */\n deleteByKey: (key: string | number) => Promise<void>;\n}\n\nasync function fetchSalesforceObjects(\n client: SalesforceClient,\n objectType: string,\n selectedProperties: string[],\n opts: LoadSubsetOptions,\n decodeObject: (object: SalesforceObject) => SalesforceObject = (object) => object\n): Promise<SalesforceObject[]> {\n const offset = Math.max(0, Math.trunc(opts.offset ?? 0));\n const limit = opts.limit === undefined ? undefined : Math.max(0, Math.trunc(opts.limit));\n if (limit === 0) return [];\n\n let where = convertLoadSubsetFilter(opts.where);\n if (isAlwaysFalseFilter(where)) {\n return [];\n }\n\n if (opts.cursor?.whereFrom) {\n const cursorWhere = convertLoadSubsetFilter(opts.cursor.whereFrom);\n if (isAlwaysFalseFilter(cursorWhere)) {\n return [];\n }\n if (cursorWhere?.clause) {\n where = where?.clause\n ? { clause: `(${where.clause} AND ${cursorWhere.clause})`, alwaysFalse: false }\n : cursorWhere;\n }\n }\n\n // Salesforce OFFSET max is 2000. Prefer locator pagination for deep reads and\n // only push OFFSET when the caller requested a small local window.\n const canPushOffset = offset > 0 && offset <= 2000 && (limit === undefined || offset + limit <= 2000);\n const orderBy = convertLoadSubsetOrderBy(opts.orderBy);\n const soql = buildSoqlQuery({\n objectType,\n selectedProperties,\n where,\n orderBy,\n limit: canPushOffset\n ? limit === undefined\n ? undefined\n : offset + limit\n : limit === undefined\n ? undefined\n : offset + limit,\n offset: canPushOffset ? offset : undefined,\n });\n\n const results = await AsyncIterable.toArray(\n AsyncIterable.fromPagination(\n async (_pageSize, pageToken: string | undefined) => {\n if (pageToken) {\n return client.queryMore<SalesforceObject>(pageToken);\n }\n return client.query<SalesforceObject>(soql);\n },\n (page) => (page.done ? undefined : page.nextRecordsUrl),\n (page) => page.records,\n 2_000,\n canPushOffset\n ? limit === undefined\n ? undefined\n : limit\n : limit === undefined\n ? undefined\n : offset + limit\n )\n );\n\n const sliced = canPushOffset\n ? results\n : results.slice(offset, limit === undefined ? undefined : offset + limit);\n\n return sliced.map(decodeObject);\n}\n\nfunction createSyncConfig(\n client: SalesforceClient,\n objectType: string,\n primaryKeyProperty: string,\n selectedProperties: string[],\n subscribeToChangeEvents: SubscribeToSalesforceChangeEvents | undefined,\n decodeObject: (object: SalesforceObject) => SalesforceObject = (object) => object\n): { sync: SyncConfig<Record<string, unknown>, string | number>; utils: ObjectCollectionUtils } {\n let loadSubsetDedupe: DeduplicatedLoadSubset | undefined;\n let deleteByKey: ((key: string | number) => Promise<void>) | undefined;\n let refreshByKey: ((key: string | number) => Promise<void>) | undefined;\n let invalidate: (() => Promise<void>) | undefined;\n\n const utils: ObjectCollectionUtils = {\n invalidate: () => {\n if (!invalidate) {\n throw new Error(`Salesforce ${objectType} collection is not ready.`);\n }\n return invalidate();\n },\n refreshByKey: (key) => {\n if (!refreshByKey) {\n throw new Error(`Salesforce ${objectType} collection is not ready.`);\n }\n return refreshByKey(key);\n },\n deleteByKey: (key) => {\n if (!deleteByKey) {\n throw new Error(`Salesforce ${objectType} collection is not ready.`);\n }\n return deleteByKey(key);\n },\n };\n\n const sync: SyncConfig<Record<string, unknown>, string | number> = {\n sync: (params) => {\n const { begin, write, commit, markError, markReady } = params;\n const activeSubsets = new Set<LoadSubsetOptions>();\n const collectionMetadata = params.metadata?.collection;\n const replayMetadataKey = `salesforce.cdc.${objectType}.replayId`;\n const restoredReplayId = collectionMetadata?.get(replayMetadataKey);\n let disposed = false;\n let changeSubscription: SalesforceChangeEventSubscription | undefined;\n let changeQueue = Promise.resolve();\n\n const upsertObject = (object: SalesforceObject) => {\n const key = object.Id;\n if (typeof key !== \"string\" && typeof key !== \"number\") {\n throw new Error(\n `Salesforce object for ${objectType} is missing a string/number Id primary key.`\n );\n }\n const exists = params.collection.has(key);\n const existing = exists ? params.collection.get(key) : undefined;\n write({\n type: exists ? \"update\" : \"insert\",\n value: existing ? { ...existing, ...object } : object,\n });\n };\n\n const loadSubset = async (opts: LoadSubsetOptions, awaitApplication = true): Promise<void> => {\n if (!activeSubsets.has(opts)) {\n activeSubsets.add(opts);\n opts.signal?.addEventListener(\"abort\", () => activeSubsets.delete(opts), { once: true });\n }\n const objects = await fetchSalesforceObjects(\n client,\n objectType,\n selectedProperties,\n opts,\n decodeObject\n );\n if (objects.length > 0) {\n begin();\n for (const object of objects) {\n upsertObject(object);\n }\n const applied = commit();\n if (applied instanceof Promise) {\n if (awaitApplication) {\n await applied;\n } else {\n void applied.catch((error) => {\n if (!disposed) {\n markError(error);\n }\n });\n }\n }\n }\n };\n\n loadSubsetDedupe = new DeduplicatedLoadSubset({\n loadSubset: (options) => loadSubset(options),\n });\n invalidate = async () => {\n loadSubsetDedupe?.reset();\n for (const subset of activeSubsets) {\n if (!subset.signal?.aborted) {\n await loadSubset(subset, false);\n }\n }\n };\n refreshByKey = async (key) => {\n const result = await client.query<SalesforceObject>(\n buildSoqlQuery({\n objectType,\n selectedProperties,\n where: {\n clause: `${primaryKeyProperty} = ${serializeSoqlLiteral(key)}`,\n alwaysFalse: false,\n },\n limit: 1,\n })\n );\n const object = result.records[0];\n if (!object) {\n throw new Error(\n `Salesforce ${objectType} record \"${key}\" was not returned after a confirmed write.`\n );\n }\n begin();\n upsertObject(decodeObject(object));\n const applied = commit();\n if (applied instanceof Promise) {\n void applied.catch((error) => {\n if (!disposed) {\n markError(error);\n }\n });\n }\n loadSubsetDedupe?.reset();\n };\n deleteByKey = (key) => {\n begin();\n write({\n type: \"delete\",\n key,\n });\n const applied = commit();\n if (applied instanceof Promise) {\n void applied.catch((error) => {\n if (!disposed) {\n markError(error);\n }\n });\n }\n loadSubsetDedupe?.reset();\n return Promise.resolve();\n };\n markReady();\n if (subscribeToChangeEvents) {\n void subscribeToChangeEvents(\n objectType,\n (event) => {\n changeQueue = changeQueue\n .then(async () => {\n if (disposed) return;\n const header = event.payload.ChangeEventHeader;\n if (header.changeType === \"DELETE\") {\n begin();\n for (const id of header.recordIds) {\n write({\n type: \"delete\",\n key: id,\n });\n }\n const replayId = event.event?.replayId;\n if (replayId !== undefined) {\n collectionMetadata?.set(replayMetadataKey, replayId);\n }\n await commit();\n loadSubsetDedupe?.reset();\n return;\n }\n await invalidate?.();\n const replayId = event.event?.replayId;\n if (replayId !== undefined && collectionMetadata) {\n begin();\n collectionMetadata.set(replayMetadataKey, replayId);\n await commit();\n }\n })\n .catch((error: unknown) => {\n markError(error instanceof Error ? error : new Error(String(error)));\n });\n },\n typeof restoredReplayId === \"number\"\n ? {\n replayId: restoredReplayId,\n }\n : undefined\n ).then(\n (subscription) => {\n if (disposed) {\n subscription.unsubscribe();\n } else {\n changeSubscription = subscription;\n }\n },\n (error: unknown) => {\n markError(error instanceof Error ? error : new Error(String(error)));\n }\n );\n }\n\n return {\n loadSubset: loadSubsetDedupe.loadSubset,\n cleanup: () => {\n disposed = true;\n changeSubscription?.unsubscribe();\n void changeQueue.finally(() => {\n loadSubsetDedupe?.reset();\n loadSubsetDedupe = undefined;\n invalidate = undefined;\n refreshByKey = undefined;\n deleteByKey = undefined;\n });\n },\n };\n },\n };\n\n return { sync, utils };\n}\n\nexport interface ObjectCollectionOpts {\n client: SalesforceClient;\n objectType: string;\n primaryKeyProperty: string;\n selectedProperties: string[];\n subscribeToChangeEvents?: SubscribeToSalesforceChangeEvents;\n decodeObject?: (object: Record<string, unknown>) => Record<string, unknown>;\n}\n\nexport interface ObjectCollectionConfig<TSchema extends StandardSchema<SalesforceObject>>\n extends\n ObjectCollectionOpts,\n Omit<\n CollectionConfig<InferSchemaOutput<TSchema>, string | number, TSchema>,\n \"sync\" | \"syncMode\" | \"getKey\" | \"onInsert\" | \"onUpdate\" | \"onDelete\"\n > {\n schema: TSchema;\n}\n\nexport function objectCollectionOptions<TSchema extends StandardSchema<SalesforceObject>>(\n config: ObjectCollectionConfig<TSchema>\n): WithRequired<\n CollectionConfig<InferSchemaOutput<TSchema>, string | number, TSchema, ObjectCollectionUtils>,\n \"schema\"\n>;\nexport function objectCollectionOptions(config: ObjectCollectionOpts): {\n syncMode: \"on-demand\";\n sync: SyncConfig<Record<string, unknown>, string | number>;\n utils: ObjectCollectionUtils;\n};\n// oxlint-disable-next-line typescript/no-explicit-any\nexport function objectCollectionOptions(config: any): any {\n const {\n client,\n objectType,\n primaryKeyProperty,\n selectedProperties,\n subscribeToChangeEvents,\n decodeObject,\n schema,\n ...rest\n } = config as ObjectCollectionOpts & { schema?: StandardSchema<SalesforceObject> } & Record<\n string,\n unknown\n >;\n const { sync, utils } = createSyncConfig(\n client,\n objectType,\n primaryKeyProperty,\n selectedProperties,\n subscribeToChangeEvents,\n decodeObject\n );\n\n if (schema === undefined) {\n return { syncMode: \"on-demand\" as const, sync, utils };\n }\n\n return {\n ...rest,\n schema,\n defaultIndexType: BasicIndex,\n autoIndex: \"eager\",\n syncMode: \"on-demand\" as const,\n getKey: (object: Record<string, unknown>) =>\n (object as Record<string, string | number>)[primaryKeyProperty] as string | number,\n sync,\n utils,\n };\n}\n"],"mappings":"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"}
|
package/lib/connection.d.ts
DELETED
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
import { BackendConnectionAdapterProvider, Connection } from "@party-stack/connections";
|
|
2
|
-
import { SalesforceChangeEvent, SalesforceChangeEventSubscription, SalesforceChangeEventSubscriptionOptions } from "@party-stack/salesforce-client";
|
|
3
|
-
import { BrowserAuthenticationPresentation } from "@party-stack/runtime";
|
|
4
|
-
//#region src/connection.d.ts
|
|
5
|
-
export interface SalesforceOAuthConnectionOptions {
|
|
6
|
-
clientId: string;
|
|
7
|
-
redirectUrl: string;
|
|
8
|
-
loginUrl?: string;
|
|
9
|
-
scopes?: string[];
|
|
10
|
-
fetch?: typeof globalThis.fetch;
|
|
11
|
-
dangerouslyPersistSecrets?: boolean;
|
|
12
|
-
}
|
|
13
|
-
export interface SalesforceClientCredentialsConnectionOptions {
|
|
14
|
-
clientId: string;
|
|
15
|
-
clientSecret: string;
|
|
16
|
-
loginUrl?: string;
|
|
17
|
-
scopes?: string[];
|
|
18
|
-
fetch?: typeof globalThis.fetch;
|
|
19
|
-
}
|
|
20
|
-
export interface CreateSalesforceConnectionAdapterOptions {
|
|
21
|
-
instanceUrl: string;
|
|
22
|
-
apiVersion?: string;
|
|
23
|
-
cometdUrl?: string;
|
|
24
|
-
oauth?: SalesforceOAuthConnectionOptions;
|
|
25
|
-
clientCredentials?: SalesforceClientCredentialsConnectionOptions;
|
|
26
|
-
token?: string;
|
|
27
|
-
userId?: string;
|
|
28
|
-
}
|
|
29
|
-
export interface SalesforceAuthenticationClient {
|
|
30
|
-
completeOAuthRedirect(url: string): Promise<Connection<"active"> | undefined>;
|
|
31
|
-
subscribeToChangeEvents(userId: string, sObjectName: string, listener: (event: SalesforceChangeEvent) => void, options?: SalesforceChangeEventSubscriptionOptions): Promise<SalesforceChangeEventSubscription>;
|
|
32
|
-
signIn: {
|
|
33
|
-
oauth(options?: {
|
|
34
|
-
browserPresentation?: BrowserAuthenticationPresentation;
|
|
35
|
-
}): Promise<Connection<"active">>;
|
|
36
|
-
clientCredentials(): Promise<Connection<"active">>;
|
|
37
|
-
accessToken(options?: {
|
|
38
|
-
token?: string;
|
|
39
|
-
userId?: string;
|
|
40
|
-
}): Promise<Connection<"active">>;
|
|
41
|
-
};
|
|
42
|
-
}
|
|
43
|
-
export declare function createSalesforceConnectionAdapter(options: CreateSalesforceConnectionAdapterOptions): BackendConnectionAdapterProvider<SalesforceAuthenticationClient>;
|
|
44
|
-
//#endregion
|
|
45
|
-
//# sourceMappingURL=connection.d.ts.map
|
package/lib/connection.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"connection.d.ts","names":[],"sources":["../src/connection.ts"],"mappings":";;;;iBA2BiB;EACb;EACA;EACA;EACA;EACA,eAAe,WAAW;EAC1B;;iBAGa;EACb;EACA;EACA;EACA;EACA,eAAe,WAAW;;iBAGb;EACb;EACA;EACA;EACA,QAAQ;EACR,oBAAoB;EACpB;EACA;;iBAGa;EACb,sBAAsB,cAAc,QAAQ;EAC5C,wBACI,gBACA,qBACA,WAAW,OAAO,gCAClB,UAAU,2CACX,QAAQ;EACX;IACI,MAAM;MACF,sBAAsB;QACtB,QAAQ;IACZ,qBAAqB,QAAQ;IAC7B,YAAY;MAAY;MAAgB;QAAoB,QAAQ;;;wBAoV5D,kCACZ,SAAS,2CACV,iCAAiC"}
|