@party-stack/salesforce-ontology 0.4.1 → 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 +2 -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 +16 -20
- 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 -35
- 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 -2
- 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
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { CompiledSoqlFilter } from "./soql.js";
|
|
2
|
+
import { SalesforceClient } from "@party-stack/salesforce-client";
|
|
3
|
+
//#region src/adapter/salesforceObjectSearch.d.ts
|
|
4
|
+
type SalesforceObject = Record<string, unknown>;
|
|
5
|
+
/** Shared SOQL transport; query compilation and collection materialization live outside it. */
|
|
6
|
+
export declare function searchSalesforceObjects(client: SalesforceClient, objectType: string, selectedProperties: string[], opts: {
|
|
7
|
+
where?: CompiledSoqlFilter;
|
|
8
|
+
orderBy?: string;
|
|
9
|
+
offset?: number;
|
|
10
|
+
limit?: number;
|
|
11
|
+
signal?: AbortSignal;
|
|
12
|
+
}, decodeObject?: (object: SalesforceObject) => SalesforceObject): Promise<SalesforceObject[]>;
|
|
13
|
+
//#endregion
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=salesforceObjectSearch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"salesforceObjectSearch.d.ts","names":[],"sources":["../../src/adapter/salesforceObjectSearch.ts"],"mappings":";;;KAOK,mBAAmB;;wBASF,wBAClB,QAAQ,kBACR,oBACA,8BACA;EACI,QAAQ;EACR;EACA;EACA;EACA,SAAS;GAEb,gBAAe,QAAQ,qBAAqB,mBAC7C,QAAQ"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { fromPagination, toArray } from "../utils/AsyncIterable.js";
|
|
2
|
+
import { buildSoqlQuery } from "./soql.js";
|
|
3
|
+
import { Redacted, Schema } from "effect";
|
|
4
|
+
import { BackendError } from "@party-stack/ontology-backend";
|
|
5
|
+
//#region src/adapter/salesforceObjectSearch.ts
|
|
6
|
+
const Page = Schema.Struct({
|
|
7
|
+
done: Schema.Boolean,
|
|
8
|
+
records: Schema.Array(Schema.Record(Schema.String, Schema.Unknown)),
|
|
9
|
+
nextRecordsUrl: Schema.optional(Schema.String)
|
|
10
|
+
});
|
|
11
|
+
/** Shared SOQL transport; query compilation and collection materialization live outside it. */
|
|
12
|
+
async function searchSalesforceObjects(client, objectType, selectedProperties, opts, decodeObject = (object) => object) {
|
|
13
|
+
const offset = Math.max(0, Math.trunc(opts.offset ?? 0));
|
|
14
|
+
const limit = opts.limit === void 0 ? void 0 : Math.max(0, Math.trunc(opts.limit));
|
|
15
|
+
if (limit === 0 || opts.where?.alwaysFalse) return [];
|
|
16
|
+
if (opts.signal) client = client.withSignal?.(opts.signal) ?? client;
|
|
17
|
+
const canPushOffset = offset > 0 && offset <= 2e3 && (limit === void 0 || offset + limit <= 2e3);
|
|
18
|
+
const soql = buildSoqlQuery({
|
|
19
|
+
objectType,
|
|
20
|
+
selectedProperties,
|
|
21
|
+
where: opts.where,
|
|
22
|
+
orderBy: opts.orderBy,
|
|
23
|
+
limit: canPushOffset ? limit === void 0 ? void 0 : offset + limit : limit === void 0 ? void 0 : offset + limit,
|
|
24
|
+
offset: canPushOffset ? offset : void 0
|
|
25
|
+
});
|
|
26
|
+
const results = await toArray(fromPagination(async (_pageSize, pageToken) => {
|
|
27
|
+
opts.signal?.throwIfAborted();
|
|
28
|
+
const result = await (pageToken ? client.queryMore(pageToken) : client.query(soql));
|
|
29
|
+
let page;
|
|
30
|
+
try {
|
|
31
|
+
page = Schema.decodeUnknownSync(Page)(result);
|
|
32
|
+
} catch (cause) {
|
|
33
|
+
throw new BackendError({
|
|
34
|
+
operation: "salesforce.loadSubset",
|
|
35
|
+
kind: "InvalidResponse",
|
|
36
|
+
retryable: false,
|
|
37
|
+
message: "Salesforce returned an invalid object page.",
|
|
38
|
+
cause: Redacted.make(cause)
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
if (!page.done && !page.nextRecordsUrl) throw new BackendError({
|
|
42
|
+
operation: "salesforce.loadSubset",
|
|
43
|
+
kind: "InvalidResponse",
|
|
44
|
+
retryable: false,
|
|
45
|
+
message: "Salesforce returned an incomplete page without a query locator."
|
|
46
|
+
});
|
|
47
|
+
return page;
|
|
48
|
+
}, (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));
|
|
49
|
+
const sliced = canPushOffset ? results : results.slice(offset, limit === void 0 ? void 0 : offset + limit);
|
|
50
|
+
try {
|
|
51
|
+
return sliced.map(decodeObject);
|
|
52
|
+
} catch (cause) {
|
|
53
|
+
throw new BackendError({
|
|
54
|
+
operation: "salesforce.loadSubset",
|
|
55
|
+
kind: "InvalidResponse",
|
|
56
|
+
message: "Salesforce returned an invalid row.",
|
|
57
|
+
retryable: false,
|
|
58
|
+
cause: Redacted.make(cause)
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
//#endregion
|
|
63
|
+
export { searchSalesforceObjects };
|
|
64
|
+
|
|
65
|
+
//# sourceMappingURL=salesforceObjectSearch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"salesforceObjectSearch.js","names":["AsyncIterable.toArray","AsyncIterable.fromPagination"],"sources":["../../src/adapter/salesforceObjectSearch.ts"],"sourcesContent":["import { BackendError } from \"@party-stack/ontology-backend\";\nimport { Schema, Redacted } from \"effect\";\nimport * as AsyncIterable from \"../utils/AsyncIterable.js\";\nimport { buildSoqlQuery } from \"./soql.js\";\nimport type { CompiledSoqlFilter } from \"./soql.js\";\nimport type { SalesforceClient } from \"@party-stack/salesforce-client\";\n\ntype SalesforceObject = Record<string, unknown>;\n\nconst Page = Schema.Struct({\n done: Schema.Boolean,\n records: Schema.Array(Schema.Record(Schema.String, Schema.Unknown)),\n nextRecordsUrl: Schema.optional(Schema.String),\n});\n\n/** Shared SOQL transport; query compilation and collection materialization live outside it. */\nexport async function searchSalesforceObjects(\n client: SalesforceClient,\n objectType: string,\n selectedProperties: string[],\n opts: {\n where?: CompiledSoqlFilter;\n orderBy?: string;\n offset?: number;\n limit?: number;\n signal?: AbortSignal;\n },\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 || opts.where?.alwaysFalse) return [];\n if (opts.signal) client = client.withSignal?.(opts.signal) ?? client;\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 soql = buildSoqlQuery({\n objectType,\n selectedProperties,\n where: opts.where,\n orderBy: opts.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 opts.signal?.throwIfAborted();\n const result = await (pageToken\n ? client.queryMore<SalesforceObject>(pageToken)\n : client.query<SalesforceObject>(soql));\n let page: typeof Page.Type;\n try {\n page = Schema.decodeUnknownSync(Page)(result);\n } catch (cause) {\n throw new BackendError({\n operation: \"salesforce.loadSubset\",\n kind: \"InvalidResponse\",\n retryable: false,\n message: \"Salesforce returned an invalid object page.\",\n cause: Redacted.make(cause),\n });\n }\n if (!page.done && !page.nextRecordsUrl)\n throw new BackendError({\n operation: \"salesforce.loadSubset\",\n kind: \"InvalidResponse\",\n retryable: false,\n message: \"Salesforce returned an incomplete page without a query locator.\",\n });\n return page;\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 try {\n return sliced.map(decodeObject);\n } catch (cause) {\n throw new BackendError({\n operation: \"salesforce.loadSubset\",\n kind: \"InvalidResponse\",\n message: \"Salesforce returned an invalid row.\",\n retryable: false,\n cause: Redacted.make(cause),\n });\n }\n}\n"],"mappings":";;;;;AASA,MAAM,OAAO,OAAO,OAAO;CACvB,MAAM,OAAO;CACb,SAAS,OAAO,MAAM,OAAO,OAAO,OAAO,QAAQ,OAAO,OAAO,CAAC;CAClE,gBAAgB,OAAO,SAAS,OAAO,MAAM;AACjD,CAAC;;AAGD,eAAsB,wBAClB,QACA,YACA,oBACA,MAOA,gBAAgE,WAAW,QAChD;CAC3B,MAAM,SAAS,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,UAAU,CAAC,CAAC;CACvD,MAAM,QAAQ,KAAK,UAAU,KAAA,IAAY,KAAA,IAAY,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,KAAK,CAAC;CACvF,IAAI,UAAU,KAAK,KAAK,OAAO,aAAa,OAAO,CAAC;CACpD,IAAI,KAAK,QAAQ,SAAS,OAAO,aAAa,KAAK,MAAM,KAAK;CAG9D,MAAM,gBAAgB,SAAS,KAAK,UAAU,QAAS,UAAU,KAAA,KAAa,SAAS,SAAS;CAChG,MAAM,OAAO,eAAe;EACxB;EACA;EACA,OAAO,KAAK;EACZ,SAAS,KAAK;EACd,OAAO,gBACD,UAAU,KAAA,IACN,KAAA,IACA,SAAS,QACb,UAAU,KAAA,IACR,KAAA,IACA,SAAS;EACjB,QAAQ,gBAAgB,SAAS,KAAA;CACrC,CAAC;CAED,MAAM,UAAU,MAAMA,QAClBC,eACI,OAAO,WAAW,cAAkC;EAChD,KAAK,QAAQ,eAAe;EAC5B,MAAM,SAAS,OAAO,YAChB,OAAO,UAA4B,SAAS,IAC5C,OAAO,MAAwB,IAAI;EACzC,IAAI;EACJ,IAAI;GACA,OAAO,OAAO,kBAAkB,IAAI,CAAC,CAAC,MAAM;EAChD,SAAS,OAAO;GACZ,MAAM,IAAI,aAAa;IACnB,WAAW;IACX,MAAM;IACN,WAAW;IACX,SAAS;IACT,OAAO,SAAS,KAAK,KAAK;GAC9B,CAAC;EACL;EACA,IAAI,CAAC,KAAK,QAAQ,CAAC,KAAK,gBACpB,MAAM,IAAI,aAAa;GACnB,WAAW;GACX,MAAM;GACN,WAAW;GACX,SAAS;EACb,CAAC;EACL,OAAO;CACX,IACC,SAAU,KAAK,OAAO,KAAA,IAAY,KAAK,iBACvC,SAAS,KAAK,SACf,KACA,gBACM,UAAU,KAAA,IACN,KAAA,IACA,QACJ,UAAU,KAAA,IACR,KAAA,IACA,SAAS,KACrB,CACJ;CAEA,MAAM,SAAS,gBACT,UACA,QAAQ,MAAM,QAAQ,UAAU,KAAA,IAAY,KAAA,IAAY,SAAS,KAAK;CAE5E,IAAI;EACA,OAAO,OAAO,IAAI,YAAY;CAClC,SAAS,OAAO;EACZ,MAAM,IAAI,aAAa;GACnB,WAAW;GACX,MAAM;GACN,SAAS;GACT,WAAW;GACX,OAAO,SAAS,KAAK,KAAK;EAC9B,CAAC;CACL;AACJ"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
//#region src/adapter/soql.d.ts
|
|
2
|
+
export type CompiledSoqlFilter = {
|
|
3
|
+
clause?: string;
|
|
4
|
+
alwaysFalse: boolean;
|
|
5
|
+
};
|
|
6
|
+
export declare function quoteSoqlIdentifier(identifier: string): string;
|
|
7
|
+
export declare function serializeSoqlLiteral(value: unknown): string;
|
|
8
|
+
export declare function buildSoqlQuery(opts: {
|
|
9
|
+
objectType: string;
|
|
10
|
+
selectedProperties: string[];
|
|
11
|
+
where?: CompiledSoqlFilter;
|
|
12
|
+
orderBy?: string;
|
|
13
|
+
limit?: number;
|
|
14
|
+
offset?: number;
|
|
15
|
+
}): string;
|
|
16
|
+
//#endregion
|
|
17
|
+
//# sourceMappingURL=soql.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"soql.d.ts","names":[],"sources":["../../src/adapter/soql.ts"],"mappings":";YAEY;EACR;EACA;;wBAGY,oBAAoB;wBA8CpB,qBAAqB;wBA+BrB,eAAe;EAC3B;EACA;EACA,QAAQ;EACR;EACA;EACA"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { Temporal } from "temporal-polyfill";
|
|
2
|
+
//#region src/adapter/soql.ts
|
|
3
|
+
function quoteSoqlIdentifier(identifier) {
|
|
4
|
+
if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(identifier)) throw new Error(`Invalid Salesforce identifier "${identifier}".`);
|
|
5
|
+
return identifier;
|
|
6
|
+
}
|
|
7
|
+
function escapeSoqlString(value) {
|
|
8
|
+
let escaped = "";
|
|
9
|
+
for (const character of value) switch (character) {
|
|
10
|
+
case "\\":
|
|
11
|
+
escaped += "\\\\";
|
|
12
|
+
break;
|
|
13
|
+
case "'":
|
|
14
|
+
escaped += "\\'";
|
|
15
|
+
break;
|
|
16
|
+
case "\b":
|
|
17
|
+
escaped += "\\b";
|
|
18
|
+
break;
|
|
19
|
+
case "\f":
|
|
20
|
+
escaped += "\\f";
|
|
21
|
+
break;
|
|
22
|
+
case "\n":
|
|
23
|
+
escaped += "\\n";
|
|
24
|
+
break;
|
|
25
|
+
case "\r":
|
|
26
|
+
escaped += "\\r";
|
|
27
|
+
break;
|
|
28
|
+
case " ":
|
|
29
|
+
escaped += "\\t";
|
|
30
|
+
break;
|
|
31
|
+
default: {
|
|
32
|
+
const codePoint = character.codePointAt(0);
|
|
33
|
+
if (codePoint < 32 || codePoint === 127) throw new Error(`Cannot serialize control character U+${codePoint.toString(16).padStart(4, "0")} to SOQL.`);
|
|
34
|
+
escaped += character;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return escaped;
|
|
38
|
+
}
|
|
39
|
+
function serializeSoqlLiteral(value) {
|
|
40
|
+
if (value === null || value === void 0) return "null";
|
|
41
|
+
if (typeof value === "boolean") return value ? "true" : "false";
|
|
42
|
+
if (typeof value === "number") {
|
|
43
|
+
if (!Number.isFinite(value)) throw new Error(`Cannot serialize non-finite number ${value} to SOQL.`);
|
|
44
|
+
return String(value);
|
|
45
|
+
}
|
|
46
|
+
if (typeof value === "bigint") return String(value);
|
|
47
|
+
if (value instanceof Date) return value.toISOString();
|
|
48
|
+
if (value instanceof Temporal.Instant) return value.toString();
|
|
49
|
+
if (value instanceof Temporal.PlainDate || value instanceof Temporal.PlainDateTime) return value.toString();
|
|
50
|
+
if (typeof value === "string") return `'${escapeSoqlString(value)}'`;
|
|
51
|
+
throw new Error(`Unsupported SOQL literal type: ${typeof value}`);
|
|
52
|
+
}
|
|
53
|
+
function buildSoqlQuery(opts) {
|
|
54
|
+
const objectType = quoteSoqlIdentifier(opts.objectType);
|
|
55
|
+
const clauses = [`SELECT ${opts.selectedProperties.map(quoteSoqlIdentifier).join(", ")} FROM ${objectType}`];
|
|
56
|
+
if (opts.where?.clause) clauses.push(`WHERE ${opts.where.clause}`);
|
|
57
|
+
if (opts.orderBy) clauses.push(`ORDER BY ${opts.orderBy}`);
|
|
58
|
+
if (opts.limit !== void 0) clauses.push(`LIMIT ${Math.max(0, Math.trunc(opts.limit))}`);
|
|
59
|
+
if (opts.offset !== void 0 && opts.offset > 0) clauses.push(`OFFSET ${Math.max(0, Math.trunc(opts.offset))}`);
|
|
60
|
+
return clauses.join(" ");
|
|
61
|
+
}
|
|
62
|
+
//#endregion
|
|
63
|
+
export { buildSoqlQuery, quoteSoqlIdentifier, serializeSoqlLiteral };
|
|
64
|
+
|
|
65
|
+
//# sourceMappingURL=soql.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"soql.js","names":[],"sources":["../../src/adapter/soql.ts"],"sourcesContent":["import { Temporal } from \"temporal-polyfill\";\n\nexport type CompiledSoqlFilter = {\n clause?: string;\n alwaysFalse: boolean;\n};\n\nexport function quoteSoqlIdentifier(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 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 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 = quoteSoqlIdentifier(opts.objectType);\n const select = opts.selectedProperties.map(quoteSoqlIdentifier).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":";;AAOA,SAAgB,oBAAoB,YAA4B;CAC5D,IAAI,CAAC,2BAA2B,KAAK,UAAU,GAC3C,MAAM,IAAI,MAAM,kCAAkC,WAAW,GAAG;CAEpE,OAAO;AACX;AAEA,SAAS,iBAAiB,OAAuB;CAC7C,IAAI,UAAU;CACd,KAAK,MAAM,aAAa,OACpB,QAAQ,WAAR;EACI,KAAK;GACD,WAAW;GACX;EACJ,KAAK;GACD,WAAW;GACX;EACJ,KAAK;GACD,WAAW;GACX;EACJ,KAAK;GACD,WAAW;GACX;EACJ,KAAK;GACD,WAAW;GACX;EACJ,KAAK;GACD,WAAW;GACX;EACJ,KAAK;GACD,WAAW;GACX;EACJ,SAAS;GACL,MAAM,YAAY,UAAU,YAAY,CAAC;GACzC,IAAI,YAAY,MAAQ,cAAc,KAClC,MAAM,IAAI,MACN,wCAAwC,UAAU,SAAS,EAAE,CAAC,CAAC,SAAS,GAAG,GAAG,EAAE,UACpF;GAEJ,WAAW;EACf;CACJ;CAEJ,OAAO;AACX;AAEA,SAAgB,qBAAqB,OAAwB;CACzD,IAAI,UAAU,QAAQ,UAAU,KAAA,GAC5B,OAAO;CAEX,IAAI,OAAO,UAAU,WACjB,OAAO,QAAQ,SAAS;CAE5B,IAAI,OAAO,UAAU,UAAU;EAC3B,IAAI,CAAC,OAAO,SAAS,KAAK,GACtB,MAAM,IAAI,MAAM,sCAAsC,MAAM,UAAU;EAE1E,OAAO,OAAO,KAAK;CACvB;CACA,IAAI,OAAO,UAAU,UACjB,OAAO,OAAO,KAAK;CAEvB,IAAI,iBAAiB,MACjB,OAAO,MAAM,YAAY;CAE7B,IAAI,iBAAiB,SAAS,SAC1B,OAAO,MAAM,SAAS;CAE1B,IAAI,iBAAiB,SAAS,aAAa,iBAAiB,SAAS,eACjE,OAAO,MAAM,SAAS;CAE1B,IAAI,OAAO,UAAU,UACjB,OAAO,IAAI,iBAAiB,KAAK,EAAE;CAEvC,MAAM,IAAI,MAAM,kCAAkC,OAAO,OAAO;AACpE;AAEA,SAAgB,eAAe,MAOpB;CACP,MAAM,aAAa,oBAAoB,KAAK,UAAU;CAEtD,MAAM,UAAU,CAAC,UADF,KAAK,mBAAmB,IAAI,mBAAmB,CAAC,CAAC,KAAK,IACrC,EAAE,QAAQ,YAAY;CAEtD,IAAI,KAAK,OAAO,QACZ,QAAQ,KAAK,SAAS,KAAK,MAAM,QAAQ;CAE7C,IAAI,KAAK,SACL,QAAQ,KAAK,YAAY,KAAK,SAAS;CAE3C,IAAI,KAAK,UAAU,KAAA,GACf,QAAQ,KAAK,SAAS,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,KAAK,CAAC,GAAG;CAE/D,IAAI,KAAK,WAAW,KAAA,KAAa,KAAK,SAAS,GAC3C,QAAQ,KAAK,UAAU,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,MAAM,CAAC,GAAG;CAEjE,OAAO,QAAQ,KAAK,GAAG;AAC3B"}
|
package/lib/config/index.d.ts
CHANGED
|
@@ -1,13 +1,16 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { SalesforceOAuthConnectionOptions } from "../connectionOptions.js";
|
|
2
2
|
import { SalesforceCrudActionTypeSelection } from "../crud.js";
|
|
3
|
-
import {
|
|
3
|
+
import { Effect } from "effect";
|
|
4
|
+
import { Runtimes } from "@party-stack/runtime";
|
|
5
|
+
import { OntologyIR } from "@party-stack/ontology-spec";
|
|
6
|
+
import { OntologyPullConfig } from "@party-stack/ontology-backend/meta";
|
|
4
7
|
//#region src/config/index.d.ts
|
|
5
8
|
export interface SalesforceOntologyPullConnectionOptions {
|
|
6
9
|
oauth?: SalesforceOAuthConnectionOptions;
|
|
7
10
|
token?: string;
|
|
8
11
|
userId?: string;
|
|
9
12
|
}
|
|
10
|
-
export interface
|
|
13
|
+
export interface SalesforcePullBackendOptions {
|
|
11
14
|
instanceUrl: string;
|
|
12
15
|
apiVersion: string;
|
|
13
16
|
ontologyId: string;
|
|
@@ -17,13 +20,13 @@ export interface CreateSalesforceOntologyPullSourceOptions {
|
|
|
17
20
|
standardQueryFunctionTypeNames?: string[];
|
|
18
21
|
crudActionTypes?: readonly SalesforceCrudActionTypeSelection[];
|
|
19
22
|
connection: SalesforceOntologyPullConnectionOptions;
|
|
20
|
-
transformPulledOntology?: (ontology: OntologyIR) => OntologyIR | Promise<OntologyIR>;
|
|
21
23
|
}
|
|
22
|
-
export declare
|
|
23
|
-
export type SalesforceOntologyPullConfig = OntologyPullConfig<
|
|
24
|
-
export interface CreateSalesforceOntologyPullConfigOptions extends
|
|
24
|
+
export declare const makeSalesforcePullBackend: (options: SalesforcePullBackendOptions) => Effect.Effect<import("@party-stack/ontology-backend").OntologyBackendService, import("@party-stack/ontology-backend").BackendError<"Conflict" | "Forbidden" | "HistoryExpired" | "Internal" | "InvalidConfiguration" | "InvalidRequest" | "InvalidResponse" | "NotFound" | "NotImplemented" | "RateLimited" | "ResultExpired" | "SchemaMismatch" | "SessionExpired" | "SessionReplaced" | "SourceMismatch" | "Unauthenticated" | "Unavailable" | "ValidationFailed" | "ViewReplaced">, Runtimes | import("effect/Scope").Scope>;
|
|
25
|
+
export type SalesforceOntologyPullConfig = OntologyPullConfig<Runtimes>;
|
|
26
|
+
export interface CreateSalesforceOntologyPullConfigOptions extends SalesforcePullBackendOptions {
|
|
25
27
|
flowActionTypeNames: string[];
|
|
26
28
|
queryFunctionTypeNames?: string[];
|
|
29
|
+
transformPulledOntology?: (ontology: OntologyIR) => OntologyIR | Promise<OntologyIR>;
|
|
27
30
|
}
|
|
28
31
|
export declare function createSalesforceOntologyPullConfig(options: CreateSalesforceOntologyPullConfigOptions): SalesforceOntologyPullConfig;
|
|
29
32
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/config/index.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/config/index.ts"],"mappings":";;;;;;;iBAYiB;EACb,QAAQ;EACR;EACA;;iBAGa;EACb;EACA;EACA;EACA;EACA;EACA;EACA;EACA,2BAA2B;EAC3B,YAAY;;qBA0GH,4BAAyB,SAAA,iCAAA,OAAA,+CAAA,gEAAA,iWAAA,kCAAA;YAiD1B,+BAA+B,mBAAmB;iBAE7C,kDAAkD;EAC/D;EACA;EACA,2BAA2B,UAAU,eAAe,aAAa,QAAQ;;wBAG7D,mCACZ,SAAS,4CACV"}
|
package/lib/config/index.js
CHANGED
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
import { salesforceCrudActionTypeName } from "../utils/ids.js";
|
|
2
|
-
import {
|
|
2
|
+
import { makeSalesforceMetadataBackend } from "../connect.js";
|
|
3
|
+
import { makeSalesforceServiceConnector } from "../serviceConnector.js";
|
|
4
|
+
import { acquireConfiguredConnection, makeConnectManager } from "@party-stack/connect";
|
|
5
|
+
import { Effect } from "effect";
|
|
6
|
+
import { classifyBackendFailure } from "@party-stack/ontology-backend";
|
|
7
|
+
import { Runtime, Runtimes } from "@party-stack/runtime";
|
|
3
8
|
//#region src/config/index.ts
|
|
4
9
|
function scopeObjectReferences(type, objectTypeNames) {
|
|
5
10
|
switch (type.kind) {
|
|
@@ -78,6 +83,7 @@ function scopePulledOntology(ontology) {
|
|
|
78
83
|
})),
|
|
79
84
|
actionTypes: ontology.actionTypes.map((actionType) => ({
|
|
80
85
|
...actionType,
|
|
86
|
+
...actionType.returnType ? { returnType: scope(actionType.returnType) } : {},
|
|
81
87
|
parameters: actionType.parameters.map((parameter) => ({
|
|
82
88
|
...parameter,
|
|
83
89
|
type: scope(parameter.type)
|
|
@@ -91,56 +97,69 @@ function scopePulledOntology(ontology) {
|
|
|
91
97
|
})),
|
|
92
98
|
returnType: scope(queryFunctionType.returnType)
|
|
93
99
|
})),
|
|
94
|
-
|
|
100
|
+
context: ontology.context ? {
|
|
101
|
+
...ontology.context,
|
|
102
|
+
type: ontology.context.type ? scope(ontology.context.type) : void 0
|
|
103
|
+
} : void 0
|
|
95
104
|
};
|
|
96
105
|
}
|
|
97
|
-
function
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
flowActionTypeNames: options.flowActionTypeNames,
|
|
114
|
-
standardActionTypeNames: options.standardActionTypeNames,
|
|
115
|
-
standardQueryFunctionTypeNames: options.standardQueryFunctionTypeNames,
|
|
116
|
-
crudActionTypes: options.crudActionTypes
|
|
117
|
-
})]
|
|
106
|
+
const makeSalesforcePullBackend = Effect.fn("Salesforce.makePullBackend")(function* (options) {
|
|
107
|
+
const oauth = options.connection.oauth;
|
|
108
|
+
const identity = `salesforce:${options.instanceUrl}:${oauth?.clientId ?? "api-key"}:${[...oauth?.scopes ?? [
|
|
109
|
+
"api",
|
|
110
|
+
"refresh_token",
|
|
111
|
+
"openid"
|
|
112
|
+
]].sort().join(",")}`;
|
|
113
|
+
const runtimes = yield* Runtimes;
|
|
114
|
+
const runtime = yield* runtimes.acquire({
|
|
115
|
+
owner: "connect",
|
|
116
|
+
namespace: identity
|
|
117
|
+
}).pipe(Effect.mapError((cause) => classifyBackendFailure("pull.runtime", cause)));
|
|
118
|
+
const manager = yield* makeConnectManager({ services: [{
|
|
119
|
+
connector: makeSalesforceServiceConnector({
|
|
120
|
+
loginUrl: oauth?.loginUrl,
|
|
121
|
+
fetch: oauth?.fetch
|
|
118
122
|
}),
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
123
|
+
instances: [{
|
|
124
|
+
id: options.instanceUrl,
|
|
125
|
+
title: "Salesforce",
|
|
126
|
+
instanceUrl: options.instanceUrl,
|
|
127
|
+
OAuthApplications: oauth ? [{
|
|
128
|
+
id: oauth.clientId,
|
|
129
|
+
title: "Salesforce",
|
|
130
|
+
clientId: oauth.clientId,
|
|
131
|
+
scopes: oauth.scopes,
|
|
132
|
+
redirectUrl: oauth.redirectUrl,
|
|
133
|
+
flow: "authorization-code"
|
|
134
|
+
}] : []
|
|
135
|
+
}]
|
|
136
|
+
}] }).pipe(Effect.provideService(Runtime, runtime));
|
|
137
|
+
const access = yield* acquireConfiguredConnection({
|
|
138
|
+
manager,
|
|
139
|
+
serviceInstanceId: options.instanceUrl,
|
|
140
|
+
userId: options.connection.userId,
|
|
141
|
+
apiKey: options.connection.token,
|
|
142
|
+
oauth: oauth ? {
|
|
143
|
+
applicationId: oauth.clientId,
|
|
144
|
+
redirectUrl: oauth.redirectUrl
|
|
145
|
+
} : void 0,
|
|
146
|
+
browserAuthentication: runtimes.browserAuthentication ?? runtime.browserAuthentication
|
|
147
|
+
});
|
|
148
|
+
return yield* makeSalesforceMetadataBackend({
|
|
149
|
+
...options,
|
|
150
|
+
egress: access.egress
|
|
151
|
+
});
|
|
152
|
+
});
|
|
138
153
|
function createSalesforceOntologyPullConfig(options) {
|
|
139
154
|
const objectTypeNames = new Set(options.objectTypeNames);
|
|
140
155
|
for (const selection of options.crudActionTypes ?? []) if (!objectTypeNames.has(selection.objectType)) throw new Error(`Salesforce CRUD object type "${selection.objectType}" must also appear in objectTypeNames.`);
|
|
141
156
|
const crudActionTypeNames = (options.crudActionTypes ?? []).flatMap((selection) => selection.operations.map((operation) => salesforceCrudActionTypeName(operation, selection.objectType)));
|
|
142
157
|
return {
|
|
143
|
-
|
|
158
|
+
backend: makeSalesforcePullBackend(options),
|
|
159
|
+
async transformPulledOntology(ontology) {
|
|
160
|
+
const scoped = scopePulledOntology(ontology);
|
|
161
|
+
return options.transformPulledOntology ? options.transformPulledOntology(scoped) : scoped;
|
|
162
|
+
},
|
|
144
163
|
objectTypeNames: options.objectTypeNames,
|
|
145
164
|
actionTypeNames: [
|
|
146
165
|
...options.flowActionTypeNames,
|
|
@@ -151,6 +170,6 @@ function createSalesforceOntologyPullConfig(options) {
|
|
|
151
170
|
};
|
|
152
171
|
}
|
|
153
172
|
//#endregion
|
|
154
|
-
export { createSalesforceOntologyPullConfig,
|
|
173
|
+
export { createSalesforceOntologyPullConfig, makeSalesforcePullBackend };
|
|
155
174
|
|
|
156
175
|
//# sourceMappingURL=index.js.map
|
package/lib/config/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../src/config/index.ts"],"sourcesContent":["import { type SalesforceAuthenticationClient, type SalesforceOAuthConnectionOptions } from \"../connection.js\";\nimport {\n createSalesforceBackendInstallation,\n createSalesforceOntologyRoute,\n} from \"../installation/createSalesforceBackendInstallation.js\";\nimport { salesforceCrudActionTypeName } from \"../utils/ids.js\";\nimport type { SalesforceCrudActionTypeSelection } from \"../crud.js\";\nimport type { Connection } from \"@party-stack/connections\";\nimport type { OntologyPullConfig, OntologyPullSource, OntologyIR, TypeDef } from \"@party-stack/ontology\";\n\nexport interface SalesforceOntologyPullConnectionOptions {\n oauth?: SalesforceOAuthConnectionOptions;\n token?: string;\n userId?: string;\n}\n\nexport interface CreateSalesforceOntologyPullSourceOptions {\n instanceUrl: string;\n apiVersion: string;\n ontologyId: string;\n objectTypeNames: string[];\n flowActionTypeNames?: string[];\n standardActionTypeNames?: string[];\n standardQueryFunctionTypeNames?: string[];\n crudActionTypes?: readonly SalesforceCrudActionTypeSelection[];\n connection: SalesforceOntologyPullConnectionOptions;\n transformPulledOntology?: (ontology: OntologyIR) => OntologyIR | Promise<OntologyIR>;\n}\n\nfunction scopeObjectReferences(type: TypeDef, objectTypeNames: ReadonlySet<string>): TypeDef {\n switch (type.kind) {\n case \"objectReference\":\n return objectTypeNames.has(type.value.objectType) ? type : { kind: \"string\", value: {} };\n case \"list\":\n return {\n ...type,\n value: {\n ...type.value,\n elementType: scopeObjectReferences(type.value.elementType, objectTypeNames),\n },\n };\n case \"map\":\n return {\n ...type,\n value: {\n ...type.value,\n keyType: scopeObjectReferences(type.value.keyType, objectTypeNames),\n valueType: scopeObjectReferences(type.value.valueType, objectTypeNames),\n },\n };\n case \"struct\":\n return {\n ...type,\n value: {\n ...type.value,\n fields: type.value.fields.map((field) => ({\n ...field,\n type: scopeObjectReferences(field.type, objectTypeNames),\n })),\n },\n };\n case \"union\":\n return {\n ...type,\n value: {\n ...type.value,\n variants: type.value.variants.map((variant) => ({\n ...variant,\n type: scopeObjectReferences(variant.type, objectTypeNames),\n })),\n },\n };\n case \"optional\":\n return {\n ...type,\n value: {\n ...type.value,\n type: scopeObjectReferences(type.value.type, objectTypeNames),\n },\n };\n case \"result\":\n return {\n ...type,\n value: {\n ...type.value,\n okType: scopeObjectReferences(type.value.okType, objectTypeNames),\n errType: scopeObjectReferences(type.value.errType, objectTypeNames),\n },\n };\n default:\n return type;\n }\n}\n\nfunction scopePulledOntology(ontology: OntologyIR): OntologyIR {\n const objectTypeNames = new Set(ontology.objectTypes.map((objectType) => objectType.name));\n const scope = (type: TypeDef) => scopeObjectReferences(type, objectTypeNames);\n return {\n ...ontology,\n types: ontology.types.map((type) => ({\n ...type,\n type: scope(type.type),\n })),\n objectTypes: ontology.objectTypes.map((objectType) => ({\n ...objectType,\n properties: objectType.properties.map((property) => ({\n ...property,\n type: scope(property.type),\n })),\n })),\n actionTypes: ontology.actionTypes.map((actionType) => ({\n ...actionType,\n parameters: actionType.parameters.map((parameter) => ({\n ...parameter,\n type: scope(parameter.type),\n })),\n })),\n queryFunctionTypes: ontology.queryFunctionTypes.map((queryFunctionType) => ({\n ...queryFunctionType,\n parameters: queryFunctionType.parameters.map((parameter) => ({\n ...parameter,\n type: scope(parameter.type),\n })),\n returnType: scope(queryFunctionType.returnType),\n })),\n contextType: ontology.contextType ? scope(ontology.contextType) : undefined,\n };\n}\n\nexport function createSalesforceOntologyPullSource(\n options: CreateSalesforceOntologyPullSourceOptions\n): OntologyPullSource<SalesforceAuthenticationClient> {\n return {\n ontologyId: options.ontologyId,\n createInstallation: ({ runtime }) =>\n createSalesforceBackendInstallation({\n installationId: `salesforce-pull:${options.instanceUrl}:${options.ontologyId}`,\n instanceUrl: options.instanceUrl,\n apiVersion: options.apiVersion,\n runtime,\n connections: {\n token: options.connection.token,\n userId: options.connection.userId,\n oauth: options.connection.oauth,\n },\n routes: [\n createSalesforceOntologyRoute({\n ontologyId: options.ontologyId,\n objectTypeNames: options.objectTypeNames,\n flowActionTypeNames: options.flowActionTypeNames,\n standardActionTypeNames: options.standardActionTypeNames,\n standardQueryFunctionTypeNames: options.standardQueryFunctionTypeNames,\n crudActionTypes: options.crudActionTypes,\n }),\n ],\n }),\n async resolveConnection(installation) {\n const configuredUserId = options.connection.userId;\n const activeConnections = [...installation.connections.values()]\n .filter((connection) => connection.state.status === \"active\")\n .map((connection): Connection<\"active\"> => ({\n userId: connection.userId,\n state: connection.state as Connection<\"active\">[\"state\"],\n }));\n\n if (!options.connection.token && !configuredUserId && activeConnections.length > 1) {\n throw new Error(\n \"Multiple Salesforce users are signed in for this project. Set connection.userId in the ontology pull source.\"\n );\n }\n let connection = options.connection.token\n ? await installation.authentication.signIn.accessToken({\n userId: configuredUserId,\n })\n : configuredUserId\n ? activeConnections.find((candidate) => candidate.userId === configuredUserId)\n : activeConnections[0];\n if (!connection && options.connection.oauth) {\n connection = await installation.authentication.signIn.oauth();\n }\n if (!connection) {\n throw new Error(\"Salesforce ontology pull requires connection.oauth or connection.token.\");\n }\n if (configuredUserId && connection.userId !== configuredUserId) {\n throw new Error(\n `Salesforce signed in as \"${connection.userId}\", but connection.userId is \"${configuredUserId}\".`\n );\n }\n return connection;\n },\n async transformPulledOntology(ontology) {\n const scoped = scopePulledOntology(ontology);\n return options.transformPulledOntology ? options.transformPulledOntology(scoped) : scoped;\n },\n };\n}\n\nexport type SalesforceOntologyPullConfig = OntologyPullConfig<SalesforceAuthenticationClient>;\n\nexport interface CreateSalesforceOntologyPullConfigOptions extends CreateSalesforceOntologyPullSourceOptions {\n flowActionTypeNames: string[];\n queryFunctionTypeNames?: string[];\n}\n\nexport function createSalesforceOntologyPullConfig(\n options: CreateSalesforceOntologyPullConfigOptions\n): SalesforceOntologyPullConfig {\n const objectTypeNames = new Set(options.objectTypeNames);\n for (const selection of options.crudActionTypes ?? []) {\n if (!objectTypeNames.has(selection.objectType)) {\n throw new Error(\n `Salesforce CRUD object type \"${selection.objectType}\" must also appear in objectTypeNames.`\n );\n }\n }\n const crudActionTypeNames = (options.crudActionTypes ?? []).flatMap((selection) =>\n selection.operations.map((operation) => salesforceCrudActionTypeName(operation, selection.objectType))\n );\n return {\n source: createSalesforceOntologyPullSource(options),\n objectTypeNames: options.objectTypeNames,\n actionTypeNames: [\n ...options.flowActionTypeNames,\n ...(options.standardActionTypeNames ?? []),\n ...crudActionTypeNames,\n ],\n queryFunctionTypeNames: [\n ...(options.queryFunctionTypeNames ?? []),\n ...(options.standardQueryFunctionTypeNames ?? []),\n ],\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../src/config/index.ts"],"sourcesContent":["import { makeConnectManager, acquireConfiguredConnection } from \"@party-stack/connect\";\nimport { classifyBackendFailure } from \"@party-stack/ontology-backend\";\nimport { Runtimes, Runtime } from \"@party-stack/runtime\";\nimport { Effect } from \"effect\";\nimport { makeSalesforceMetadataBackend } from \"../connect.js\";\nimport { makeSalesforceServiceConnector } from \"../serviceConnector.js\";\nimport { salesforceCrudActionTypeName } from \"../utils/ids.js\";\nimport type { SalesforceOAuthConnectionOptions } from \"../connectionOptions.js\";\nimport type { SalesforceCrudActionTypeSelection } from \"../crud.js\";\nimport type { OntologyPullConfig } from \"@party-stack/ontology-backend/meta\";\nimport type { OntologyIR, TypeDef } from \"@party-stack/ontology-spec\";\n\nexport interface SalesforceOntologyPullConnectionOptions {\n oauth?: SalesforceOAuthConnectionOptions;\n token?: string;\n userId?: string;\n}\n\nexport interface SalesforcePullBackendOptions {\n instanceUrl: string;\n apiVersion: string;\n ontologyId: string;\n objectTypeNames: string[];\n flowActionTypeNames?: string[];\n standardActionTypeNames?: string[];\n standardQueryFunctionTypeNames?: string[];\n crudActionTypes?: readonly SalesforceCrudActionTypeSelection[];\n connection: SalesforceOntologyPullConnectionOptions;\n}\n\nfunction scopeObjectReferences(type: TypeDef, objectTypeNames: ReadonlySet<string>): TypeDef {\n switch (type.kind) {\n case \"objectReference\":\n return objectTypeNames.has(type.value.objectType) ? type : { kind: \"string\", value: {} };\n case \"list\":\n return {\n ...type,\n value: {\n ...type.value,\n elementType: scopeObjectReferences(type.value.elementType, objectTypeNames),\n },\n };\n case \"map\":\n return {\n ...type,\n value: {\n ...type.value,\n keyType: scopeObjectReferences(type.value.keyType, objectTypeNames),\n valueType: scopeObjectReferences(type.value.valueType, objectTypeNames),\n },\n };\n case \"struct\":\n return {\n ...type,\n value: {\n ...type.value,\n fields: type.value.fields.map((field) => ({\n ...field,\n type: scopeObjectReferences(field.type, objectTypeNames),\n })),\n },\n };\n case \"union\":\n return {\n ...type,\n value: {\n ...type.value,\n variants: type.value.variants.map((variant) => ({\n ...variant,\n type: scopeObjectReferences(variant.type, objectTypeNames),\n })),\n },\n };\n case \"optional\":\n return {\n ...type,\n value: {\n ...type.value,\n type: scopeObjectReferences(type.value.type, objectTypeNames),\n },\n };\n case \"result\":\n return {\n ...type,\n value: {\n ...type.value,\n okType: scopeObjectReferences(type.value.okType, objectTypeNames),\n errType: scopeObjectReferences(type.value.errType, objectTypeNames),\n },\n };\n default:\n return type;\n }\n}\n\nfunction scopePulledOntology(ontology: OntologyIR): OntologyIR {\n const objectTypeNames = new Set(ontology.objectTypes.map((objectType) => objectType.name));\n const scope = (type: TypeDef) => scopeObjectReferences(type, objectTypeNames);\n return {\n ...ontology,\n types: ontology.types.map((type) => ({\n ...type,\n type: scope(type.type),\n })),\n objectTypes: ontology.objectTypes.map((objectType) => ({\n ...objectType,\n properties: objectType.properties.map((property) => ({\n ...property,\n type: scope(property.type),\n })),\n })),\n actionTypes: ontology.actionTypes.map((actionType) => ({\n ...actionType,\n ...(actionType.returnType ? { returnType: scope(actionType.returnType) } : {}),\n parameters: actionType.parameters.map((parameter) => ({\n ...parameter,\n type: scope(parameter.type),\n })),\n })),\n queryFunctionTypes: ontology.queryFunctionTypes.map((queryFunctionType) => ({\n ...queryFunctionType,\n parameters: queryFunctionType.parameters.map((parameter) => ({\n ...parameter,\n type: scope(parameter.type),\n })),\n returnType: scope(queryFunctionType.returnType),\n })),\n context: ontology.context\n ? { ...ontology.context, type: ontology.context.type ? scope(ontology.context.type) : undefined }\n : undefined,\n };\n}\n\nexport const makeSalesforcePullBackend = Effect.fn(\"Salesforce.makePullBackend\")(function* (\n options: SalesforcePullBackendOptions\n) {\n const oauth = options.connection.oauth;\n const identity = `salesforce:${options.instanceUrl}:${oauth?.clientId ?? \"api-key\"}:${[...(oauth?.scopes ?? [\"api\", \"refresh_token\", \"openid\"])].sort().join(\",\")}`;\n const runtimes = yield* Runtimes;\n const runtime = yield* runtimes\n .acquire({ owner: \"connect\", namespace: identity })\n .pipe(Effect.mapError((cause) => classifyBackendFailure(\"pull.runtime\", cause)));\n const manager = yield* makeConnectManager({\n services: [\n {\n connector: makeSalesforceServiceConnector({\n loginUrl: oauth?.loginUrl,\n fetch: oauth?.fetch,\n }),\n instances: [\n {\n id: options.instanceUrl,\n title: \"Salesforce\",\n instanceUrl: options.instanceUrl,\n OAuthApplications: oauth\n ? [\n {\n id: oauth.clientId,\n title: \"Salesforce\",\n clientId: oauth.clientId,\n scopes: oauth.scopes,\n redirectUrl: oauth.redirectUrl,\n flow: \"authorization-code\",\n },\n ]\n : [],\n },\n ],\n },\n ],\n }).pipe(Effect.provideService(Runtime, runtime));\n const access = yield* acquireConfiguredConnection({\n manager,\n serviceInstanceId: options.instanceUrl,\n userId: options.connection.userId,\n apiKey: options.connection.token,\n oauth: oauth ? { applicationId: oauth.clientId, redirectUrl: oauth.redirectUrl } : undefined,\n browserAuthentication: runtimes.browserAuthentication ?? runtime.browserAuthentication,\n });\n return yield* makeSalesforceMetadataBackend({ ...options, egress: access.egress });\n});\n\nexport type SalesforceOntologyPullConfig = OntologyPullConfig<Runtimes>;\n\nexport interface CreateSalesforceOntologyPullConfigOptions extends SalesforcePullBackendOptions {\n flowActionTypeNames: string[];\n queryFunctionTypeNames?: string[];\n transformPulledOntology?: (ontology: OntologyIR) => OntologyIR | Promise<OntologyIR>;\n}\n\nexport function createSalesforceOntologyPullConfig(\n options: CreateSalesforceOntologyPullConfigOptions\n): SalesforceOntologyPullConfig {\n const objectTypeNames = new Set(options.objectTypeNames);\n for (const selection of options.crudActionTypes ?? []) {\n if (!objectTypeNames.has(selection.objectType)) {\n throw new Error(\n `Salesforce CRUD object type \"${selection.objectType}\" must also appear in objectTypeNames.`\n );\n }\n }\n const crudActionTypeNames = (options.crudActionTypes ?? []).flatMap((selection) =>\n selection.operations.map((operation) => salesforceCrudActionTypeName(operation, selection.objectType))\n );\n return {\n backend: makeSalesforcePullBackend(options),\n async transformPulledOntology(ontology) {\n const scoped = scopePulledOntology(ontology);\n return options.transformPulledOntology ? options.transformPulledOntology(scoped) : scoped;\n },\n objectTypeNames: options.objectTypeNames,\n actionTypeNames: [\n ...options.flowActionTypeNames,\n ...(options.standardActionTypeNames ?? []),\n ...crudActionTypeNames,\n ],\n queryFunctionTypeNames: [\n ...(options.queryFunctionTypeNames ?? []),\n ...(options.standardQueryFunctionTypeNames ?? []),\n ],\n };\n}\n"],"mappings":"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"}
|
package/lib/connect.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { SalesforceMetadataBackendOptions } from "./meta/backend.js";
|
|
2
|
+
import { ConnectionEgress } from "@party-stack/connect";
|
|
3
|
+
import { Effect } from "effect";
|
|
4
|
+
import { OntologyIR } from "@party-stack/ontology-spec";
|
|
5
|
+
//#region src/connect.d.ts
|
|
6
|
+
export interface SalesforceConnectionClientOptions {
|
|
7
|
+
instanceUrl: string;
|
|
8
|
+
apiVersion: string;
|
|
9
|
+
egress: ConnectionEgress;
|
|
10
|
+
}
|
|
11
|
+
export declare const makeSalesforceConnectionClient: (options: SalesforceConnectionClientOptions) => Effect.Effect<import("@party-stack/salesforce-client").SalesforceClient, never, import("effect/Scope").Scope>;
|
|
12
|
+
export declare const makeSalesforceBackend: (options: SalesforceConnectionClientOptions & {
|
|
13
|
+
ir: OntologyIR;
|
|
14
|
+
context: Record<string, unknown>;
|
|
15
|
+
}) => Effect.Effect<import("@party-stack/ontology-backend").OntologyBackendService, import("@party-stack/ontology-backend").BackendError<"InvalidConfiguration">, import("effect/Scope").Scope>;
|
|
16
|
+
export declare const makeSalesforceMetadataBackend: (options: SalesforceConnectionClientOptions & Omit<SalesforceMetadataBackendOptions, "client">) => Effect.Effect<import("@party-stack/ontology-backend").OntologyBackendService, never, import("effect/Scope").Scope>;
|
|
17
|
+
//#endregion
|
|
18
|
+
//# sourceMappingURL=connect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connect.d.ts","names":[],"sources":["../src/connect.ts"],"mappings":";;;;;iBASiB;EACb;EACA;EACA,QAAQ;;qBAEC,iCAA8B,SAAA,sCAAA,OAAA,gDAAA,gDAAA;qBAW9B,wBAAqB,SAAA;EACqB,IAAA;EAAqB,SAAA;MAO1E,OAAA,+CAAA,gEAAA,6DAAA;qBACW,gCAA6B,SAAA,oCAAA,KAAA,gDAAA,OAAA,+CAAA,sDAAA"}
|
package/lib/connect.js
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { makeSalesforceOntologyBackend } from "./adapter/makeSalesforceOntologyBackend.js";
|
|
2
|
+
import { makeSalesforceMetadataBackend as makeSalesforceMetadataBackend$1 } from "./meta/backend.js";
|
|
3
|
+
import { toWebEgress } from "@party-stack/connect";
|
|
4
|
+
import { createSalesforceClient } from "@party-stack/salesforce-client";
|
|
5
|
+
import { Effect } from "effect";
|
|
6
|
+
//#region src/connect.ts
|
|
7
|
+
const makeSalesforceConnectionClient = Effect.fnUntraced(function* (options) {
|
|
8
|
+
const web = yield* toWebEgress(options.egress);
|
|
9
|
+
return createSalesforceClient({
|
|
10
|
+
instanceUrl: options.instanceUrl,
|
|
11
|
+
apiVersion: options.apiVersion,
|
|
12
|
+
authenticatedFetch: true,
|
|
13
|
+
fetch: web.fetch
|
|
14
|
+
});
|
|
15
|
+
});
|
|
16
|
+
const makeSalesforceBackend = Effect.fnUntraced(function* (options) {
|
|
17
|
+
return yield* makeSalesforceOntologyBackend({
|
|
18
|
+
ir: options.ir,
|
|
19
|
+
client: yield* makeSalesforceConnectionClient(options),
|
|
20
|
+
context: options.context
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
const makeSalesforceMetadataBackend = Effect.fnUntraced(function* (options) {
|
|
24
|
+
return makeSalesforceMetadataBackend$1({
|
|
25
|
+
...options,
|
|
26
|
+
client: yield* makeSalesforceConnectionClient(options)
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
//#endregion
|
|
30
|
+
export { makeSalesforceBackend, makeSalesforceConnectionClient, makeSalesforceMetadataBackend };
|
|
31
|
+
|
|
32
|
+
//# sourceMappingURL=connect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connect.js","names":["makeMetadataBackend"],"sources":["../src/connect.ts"],"sourcesContent":["import { toWebEgress } from \"@party-stack/connect\";\nimport { createSalesforceClient } from \"@party-stack/salesforce-client\";\nimport { Effect } from \"effect\";\nimport { makeSalesforceOntologyBackend } from \"./adapter/makeSalesforceOntologyBackend.js\";\nimport { makeSalesforceMetadataBackend as makeMetadataBackend } from \"./meta/backend.js\";\nimport type { SalesforceMetadataBackendOptions } from \"./meta/backend.js\";\nimport type { ConnectionEgress } from \"@party-stack/connect\";\nimport type { OntologyIR } from \"@party-stack/ontology-spec\";\n\nexport interface SalesforceConnectionClientOptions {\n instanceUrl: string;\n apiVersion: string;\n egress: ConnectionEgress;\n}\nexport const makeSalesforceConnectionClient = Effect.fnUntraced(function* (\n options: SalesforceConnectionClientOptions\n) {\n const web = yield* toWebEgress(options.egress);\n return createSalesforceClient({\n instanceUrl: options.instanceUrl,\n apiVersion: options.apiVersion,\n authenticatedFetch: true,\n fetch: web.fetch,\n });\n});\nexport const makeSalesforceBackend = Effect.fnUntraced(function* (\n options: SalesforceConnectionClientOptions & { ir: OntologyIR; context: Record<string, unknown> }\n) {\n return yield* makeSalesforceOntologyBackend({\n ir: options.ir,\n client: yield* makeSalesforceConnectionClient(options),\n context: options.context,\n });\n});\nexport const makeSalesforceMetadataBackend = Effect.fnUntraced(function* (\n options: SalesforceConnectionClientOptions & Omit<SalesforceMetadataBackendOptions, \"client\">\n) {\n return makeMetadataBackend({\n ...options,\n client: yield* makeSalesforceConnectionClient(options),\n });\n});\n"],"mappings":";;;;;;AAcA,MAAa,iCAAiC,OAAO,WAAW,WAC5D,SACF;CACE,MAAM,MAAM,OAAO,YAAY,QAAQ,MAAM;CAC7C,OAAO,uBAAuB;EAC1B,aAAa,QAAQ;EACrB,YAAY,QAAQ;EACpB,oBAAoB;EACpB,OAAO,IAAI;CACf,CAAC;AACL,CAAC;AACD,MAAa,wBAAwB,OAAO,WAAW,WACnD,SACF;CACE,OAAO,OAAO,8BAA8B;EACxC,IAAI,QAAQ;EACZ,QAAQ,OAAO,+BAA+B,OAAO;EACrD,SAAS,QAAQ;CACrB,CAAC;AACL,CAAC;AACD,MAAa,gCAAgC,OAAO,WAAW,WAC3D,SACF;CACE,OAAOA,gCAAoB;EACvB,GAAG;EACH,QAAQ,OAAO,+BAA+B,OAAO;CACzD,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
//#region src/connectionOptions.d.ts
|
|
2
|
+
export interface SalesforceOAuthConnectionOptions {
|
|
3
|
+
clientId: string;
|
|
4
|
+
redirectUrl: string;
|
|
5
|
+
loginUrl?: string;
|
|
6
|
+
scopes?: string[];
|
|
7
|
+
fetch?: typeof globalThis.fetch;
|
|
8
|
+
}
|
|
9
|
+
//#endregion
|
|
10
|
+
//# sourceMappingURL=connectionOptions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connectionOptions.d.ts","names":[],"sources":["../src/connectionOptions.ts"],"mappings":";iBAAiB;EACb;EACA;EACA;EACA;EACA,eAAe,WAAW"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/lib/index.d.ts
CHANGED
|
@@ -1,11 +1,8 @@
|
|
|
1
1
|
import { SalesforceActionMetadata, getSalesforceActionMetadata, salesforceActionMeta } from "./actionMetadata.js";
|
|
2
|
-
import {
|
|
3
|
-
import { ObjectCollectionConfig, ObjectCollectionOpts, ObjectCollectionUtils, SubscribeToSalesforceChangeEvents, objectCollectionOptions } from "./adapter/objectCollectionOptions.js";
|
|
4
|
-
import { CreateSalesforceOntologyBackendOptions, createSalesforceOntologyBackend, createSalesforceOntologyBackendAdapter } from "./adapter/createSalesforceOntologyBackendAdapter.js";
|
|
2
|
+
import { makeSalesforceOntologyBackend } from "./adapter/makeSalesforceOntologyBackend.js";
|
|
5
3
|
import { SalesforceCodec, createSalesforceCodec } from "./adapter/salesforceCodec.js";
|
|
6
4
|
import "./adapter/index.js";
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import "./installation/index.js";
|
|
5
|
+
import { SalesforceOAuthConnectionOptions } from "./connectionOptions.js";
|
|
6
|
+
import { makeSalesforceServiceConnector } from "./serviceConnector.js";
|
|
10
7
|
export * from "@party-stack/salesforce-client";
|
|
11
|
-
export {
|
|
8
|
+
export { SalesforceActionMetadata, SalesforceCodec, type SalesforceOAuthConnectionOptions, createSalesforceCodec, getSalesforceActionMetadata, makeSalesforceOntologyBackend, makeSalesforceServiceConnector, salesforceActionMeta };
|
package/lib/index.js
CHANGED
|
@@ -1,11 +1,7 @@
|
|
|
1
1
|
import { getSalesforceActionMetadata, salesforceActionMeta } from "./actionMetadata.js";
|
|
2
|
-
import { createSalesforceConnectionAdapter } from "./connection.js";
|
|
3
|
-
import { buildSoqlQuery, convertLoadSubsetFilter, convertLoadSubsetOrderBy, isAlwaysFalseFilter, serializeSoqlLiteral } from "./adapter/convertLoadSubsetOptions.js";
|
|
4
|
-
import { objectCollectionOptions } from "./adapter/objectCollectionOptions.js";
|
|
5
2
|
import { createSalesforceCodec } from "./adapter/salesforceCodec.js";
|
|
6
|
-
import {
|
|
3
|
+
import { makeSalesforceOntologyBackend } from "./adapter/makeSalesforceOntologyBackend.js";
|
|
7
4
|
import "./adapter/index.js";
|
|
8
|
-
import {
|
|
9
|
-
import "./installation/index.js";
|
|
5
|
+
import { makeSalesforceServiceConnector } from "./serviceConnector.js";
|
|
10
6
|
export * from "@party-stack/salesforce-client";
|
|
11
|
-
export {
|
|
7
|
+
export { createSalesforceCodec, getSalesforceActionMetadata, makeSalesforceOntologyBackend, makeSalesforceServiceConnector, salesforceActionMeta };
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { SalesforceCrudActionTypeSelection } from "../crud.js";
|
|
2
2
|
import { SalesforceClient } from "@party-stack/salesforce-client";
|
|
3
|
-
import {
|
|
4
|
-
//#region src/meta/
|
|
5
|
-
export interface
|
|
3
|
+
import { OntologyBackendService } from "@party-stack/ontology-backend";
|
|
4
|
+
//#region src/meta/backend.d.ts
|
|
5
|
+
export interface SalesforceMetadataBackendOptions {
|
|
6
6
|
client: SalesforceClient;
|
|
7
7
|
/**
|
|
8
8
|
* Optional allowlist of sObject API names for metadata loading.
|
|
@@ -18,6 +18,6 @@ export interface CreateSalesforceMetaOntologyBackendAdapterOpts {
|
|
|
18
18
|
/** Explicit CRUD actions to synthesize from sObject describe metadata. */
|
|
19
19
|
crudActionTypes?: readonly SalesforceCrudActionTypeSelection[];
|
|
20
20
|
}
|
|
21
|
-
export declare function
|
|
21
|
+
export declare function makeSalesforceMetadataBackend(options: SalesforceMetadataBackendOptions): OntologyBackendService;
|
|
22
22
|
//#endregion
|
|
23
|
-
//# sourceMappingURL=
|
|
23
|
+
//# sourceMappingURL=backend.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backend.d.ts","names":[],"sources":["../../src/meta/backend.ts"],"mappings":";;;;iBAiBiB;EACb,QAAQ;;;;;EAKR;;EAEA;;EAEA;;EAEA;;EAEA,2BAA2B;;wBAMf,8BACZ,SAAS,mCACV"}
|