@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.
Files changed (118) hide show
  1. package/README.md +61 -68
  2. package/lib/adapter/backend.d.ts +15 -0
  3. package/lib/adapter/backend.d.ts.map +1 -0
  4. package/lib/adapter/backend.js +94 -0
  5. package/lib/adapter/backend.js.map +1 -0
  6. package/lib/adapter/index.d.ts +2 -4
  7. package/lib/adapter/index.js +2 -4
  8. package/lib/adapter/makeSalesforceOntologyBackend.d.ts +12 -0
  9. package/lib/adapter/makeSalesforceOntologyBackend.d.ts.map +1 -0
  10. package/lib/adapter/makeSalesforceOntologyBackend.js +186 -0
  11. package/lib/adapter/makeSalesforceOntologyBackend.js.map +1 -0
  12. package/lib/adapter/salesforceCodec.d.ts +1 -1
  13. package/lib/adapter/salesforceCodec.js.map +1 -1
  14. package/lib/adapter/salesforceObjectSearch.d.ts +15 -0
  15. package/lib/adapter/salesforceObjectSearch.d.ts.map +1 -0
  16. package/lib/adapter/salesforceObjectSearch.js +65 -0
  17. package/lib/adapter/salesforceObjectSearch.js.map +1 -0
  18. package/lib/adapter/soql.d.ts +17 -0
  19. package/lib/adapter/soql.d.ts.map +1 -0
  20. package/lib/adapter/soql.js +65 -0
  21. package/lib/adapter/soql.js.map +1 -0
  22. package/lib/config/index.d.ts +10 -7
  23. package/lib/config/index.d.ts.map +1 -1
  24. package/lib/config/index.js +63 -44
  25. package/lib/config/index.js.map +1 -1
  26. package/lib/connect.d.ts +18 -0
  27. package/lib/connect.d.ts.map +1 -0
  28. package/lib/connect.js +32 -0
  29. package/lib/connect.js.map +1 -0
  30. package/lib/connectionOptions.d.ts +10 -0
  31. package/lib/connectionOptions.d.ts.map +1 -0
  32. package/lib/connectionOptions.js +1 -0
  33. package/lib/index.d.ts +4 -7
  34. package/lib/index.js +3 -7
  35. package/lib/meta/{createSalesforceMetaOntologyBackendAdapter.d.ts → backend.d.ts} +5 -5
  36. package/lib/meta/backend.d.ts.map +1 -0
  37. package/lib/meta/backend.js +86 -0
  38. package/lib/meta/backend.js.map +1 -0
  39. package/lib/meta/convertMetaActionType.d.ts +3 -3
  40. package/lib/meta/convertMetaActionType.d.ts.map +1 -1
  41. package/lib/meta/convertMetaActionType.js.map +1 -1
  42. package/lib/meta/convertMetaLinkType.d.ts +2 -2
  43. package/lib/meta/convertMetaLinkType.d.ts.map +1 -1
  44. package/lib/meta/convertMetaLinkType.js.map +1 -1
  45. package/lib/meta/convertMetaLoadSubsetOptions.d.ts +2 -2
  46. package/lib/meta/convertMetaLoadSubsetOptions.d.ts.map +1 -1
  47. package/lib/meta/convertMetaLoadSubsetOptions.js +33 -33
  48. package/lib/meta/convertMetaLoadSubsetOptions.js.map +1 -1
  49. package/lib/meta/convertMetaObjectType.d.ts +2 -2
  50. package/lib/meta/convertMetaObjectType.d.ts.map +1 -1
  51. package/lib/meta/convertMetaObjectType.js.map +1 -1
  52. package/lib/meta/convertMetaQueryFunctionType.d.ts +1 -1
  53. package/lib/meta/convertMetaQueryFunctionType.js.map +1 -1
  54. package/lib/meta/convertMetaTypeDef.d.ts +1 -1
  55. package/lib/meta/convertMetaTypeDef.js.map +1 -1
  56. package/lib/meta/index.d.ts +2 -4
  57. package/lib/meta/index.js +3 -5
  58. package/lib/meta/loadActions.d.ts +15 -0
  59. package/lib/meta/loadActions.d.ts.map +1 -0
  60. package/lib/meta/loadActions.js +103 -0
  61. package/lib/meta/loadActions.js.map +1 -0
  62. package/lib/meta/loadEntities.d.ts +5 -0
  63. package/lib/meta/loadEntities.d.ts.map +1 -0
  64. package/lib/meta/loadEntities.js +14 -0
  65. package/lib/meta/loadEntities.js.map +1 -0
  66. package/lib/meta/loadQueryFunctions.d.ts +11 -0
  67. package/lib/meta/loadQueryFunctions.d.ts.map +1 -0
  68. package/lib/meta/loadQueryFunctions.js +43 -0
  69. package/lib/meta/loadQueryFunctions.js.map +1 -0
  70. package/lib/meta/synthesizeCrudActionTypes.d.ts +2 -2
  71. package/lib/meta/synthesizeCrudActionTypes.d.ts.map +1 -1
  72. package/lib/meta/synthesizeCrudActionTypes.js.map +1 -1
  73. package/lib/serviceConnector.d.ts +8 -0
  74. package/lib/serviceConnector.d.ts.map +1 -0
  75. package/lib/serviceConnector.js +125 -0
  76. package/lib/serviceConnector.js.map +1 -0
  77. package/lib/utils/AsyncIterable.d.ts +1 -1
  78. package/lib/utils/AsyncIterable.d.ts.map +1 -1
  79. package/lib/utils/AsyncIterable.js +11 -0
  80. package/lib/utils/AsyncIterable.js.map +1 -1
  81. package/package.json +15 -19
  82. package/lib/adapter/convertLoadSubsetOptions.d.ts +0 -20
  83. package/lib/adapter/convertLoadSubsetOptions.d.ts.map +0 -1
  84. package/lib/adapter/convertLoadSubsetOptions.js +0 -127
  85. package/lib/adapter/convertLoadSubsetOptions.js.map +0 -1
  86. package/lib/adapter/createSalesforceOntologyBackendAdapter.d.ts +0 -22
  87. package/lib/adapter/createSalesforceOntologyBackendAdapter.d.ts.map +0 -1
  88. package/lib/adapter/createSalesforceOntologyBackendAdapter.js +0 -139
  89. package/lib/adapter/createSalesforceOntologyBackendAdapter.js.map +0 -1
  90. package/lib/adapter/objectCollectionOptions.d.ts +0 -36
  91. package/lib/adapter/objectCollectionOptions.d.ts.map +0 -1
  92. package/lib/adapter/objectCollectionOptions.js +0 -204
  93. package/lib/adapter/objectCollectionOptions.js.map +0 -1
  94. package/lib/connection.d.ts +0 -45
  95. package/lib/connection.d.ts.map +0 -1
  96. package/lib/connection.js +0 -258
  97. package/lib/connection.js.map +0 -1
  98. package/lib/installation/createSalesforceBackendInstallation.d.ts +0 -37
  99. package/lib/installation/createSalesforceBackendInstallation.d.ts.map +0 -1
  100. package/lib/installation/createSalesforceBackendInstallation.js +0 -84
  101. package/lib/installation/createSalesforceBackendInstallation.js.map +0 -1
  102. package/lib/installation/index.d.ts +0 -2
  103. package/lib/installation/index.js +0 -1
  104. package/lib/meta/actionTypeCollectionOptions.d.ts +0 -15
  105. package/lib/meta/actionTypeCollectionOptions.d.ts.map +0 -1
  106. package/lib/meta/actionTypeCollectionOptions.js +0 -121
  107. package/lib/meta/actionTypeCollectionOptions.js.map +0 -1
  108. package/lib/meta/createSalesforceMetaOntologyBackendAdapter.d.ts.map +0 -1
  109. package/lib/meta/createSalesforceMetaOntologyBackendAdapter.js +0 -42
  110. package/lib/meta/createSalesforceMetaOntologyBackendAdapter.js.map +0 -1
  111. package/lib/meta/entityCollectionOptions.d.ts +0 -16
  112. package/lib/meta/entityCollectionOptions.d.ts.map +0 -1
  113. package/lib/meta/entityCollectionOptions.js +0 -81
  114. package/lib/meta/entityCollectionOptions.js.map +0 -1
  115. package/lib/meta/queryFunctionTypeCollectionOptions.d.ts +0 -11
  116. package/lib/meta/queryFunctionTypeCollectionOptions.d.ts.map +0 -1
  117. package/lib/meta/queryFunctionTypeCollectionOptions.js +0 -59
  118. 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"}
@@ -1,13 +1,16 @@
1
- import { SalesforceAuthenticationClient, SalesforceOAuthConnectionOptions } from "../connection.js";
1
+ import { SalesforceOAuthConnectionOptions } from "../connectionOptions.js";
2
2
  import { SalesforceCrudActionTypeSelection } from "../crud.js";
3
- import { OntologyIR, OntologyPullConfig, OntologyPullSource } from "@party-stack/ontology";
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 CreateSalesforceOntologyPullSourceOptions {
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 function createSalesforceOntologyPullSource(options: CreateSalesforceOntologyPullSourceOptions): OntologyPullSource<SalesforceAuthenticationClient>;
23
- export type SalesforceOntologyPullConfig = OntologyPullConfig<SalesforceAuthenticationClient>;
24
- export interface CreateSalesforceOntologyPullConfigOptions extends CreateSalesforceOntologyPullSourceOptions {
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":";;;;iBAUiB;EACb,QAAQ;EACR;EACA;;iBAGa;EACb;EACA;EACA;EACA;EACA;EACA;EACA;EACA,2BAA2B;EAC3B,YAAY;EACZ,2BAA2B,UAAU,eAAe,aAAa,QAAQ;;wBAuG7D,mCACZ,SAAS,4CACV,mBAAmB;YAkEV,+BAA+B,mBAAmB;iBAE7C,kDAAkD;EAC/D;EACA;;wBAGY,mCACZ,SAAS,4CACV"}
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"}
@@ -1,5 +1,10 @@
1
1
  import { salesforceCrudActionTypeName } from "../utils/ids.js";
2
- import { createSalesforceBackendInstallation, createSalesforceOntologyRoute } from "../installation/createSalesforceBackendInstallation.js";
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
- contextType: ontology.contextType ? scope(ontology.contextType) : void 0
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 createSalesforceOntologyPullSource(options) {
98
- return {
99
- ontologyId: options.ontologyId,
100
- createInstallation: ({ runtime }) => createSalesforceBackendInstallation({
101
- installationId: `salesforce-pull:${options.instanceUrl}:${options.ontologyId}`,
102
- instanceUrl: options.instanceUrl,
103
- apiVersion: options.apiVersion,
104
- runtime,
105
- connections: {
106
- token: options.connection.token,
107
- userId: options.connection.userId,
108
- oauth: options.connection.oauth
109
- },
110
- routes: [createSalesforceOntologyRoute({
111
- ontologyId: options.ontologyId,
112
- objectTypeNames: options.objectTypeNames,
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
- async resolveConnection(installation) {
120
- const configuredUserId = options.connection.userId;
121
- const activeConnections = [...installation.connections.values()].filter((connection) => connection.state.status === "active").map((connection) => ({
122
- userId: connection.userId,
123
- state: connection.state
124
- }));
125
- if (!options.connection.token && !configuredUserId && activeConnections.length > 1) throw new Error("Multiple Salesforce users are signed in for this project. Set connection.userId in the ontology pull source.");
126
- let connection = options.connection.token ? await installation.authentication.signIn.accessToken({ userId: configuredUserId }) : configuredUserId ? activeConnections.find((candidate) => candidate.userId === configuredUserId) : activeConnections[0];
127
- if (!connection && options.connection.oauth) connection = await installation.authentication.signIn.oauth();
128
- if (!connection) throw new Error("Salesforce ontology pull requires connection.oauth or connection.token.");
129
- if (configuredUserId && connection.userId !== configuredUserId) throw new Error(`Salesforce signed in as "${connection.userId}", but connection.userId is "${configuredUserId}".`);
130
- return connection;
131
- },
132
- async transformPulledOntology(ontology) {
133
- const scoped = scopePulledOntology(ontology);
134
- return options.transformPulledOntology ? options.transformPulledOntology(scoped) : scoped;
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
- source: createSalesforceOntologyPullSource(options),
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, createSalesforceOntologyPullSource };
173
+ export { createSalesforceOntologyPullConfig, makeSalesforcePullBackend };
155
174
 
156
175
  //# sourceMappingURL=index.js.map
@@ -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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"}
@@ -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 { CompiledSoqlFilter, buildSoqlQuery, convertLoadSubsetFilter, convertLoadSubsetOrderBy, isAlwaysFalseFilter, serializeSoqlLiteral } from "./adapter/convertLoadSubsetOptions.js";
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 { CreateSalesforceConnectionAdapterOptions, SalesforceAuthenticationClient, SalesforceClientCredentialsConnectionOptions, SalesforceOAuthConnectionOptions, createSalesforceConnectionAdapter } from "./connection.js";
8
- import { CreateSalesforceBackendInstallationOptions, SalesforceConnectionOptions, SalesforceOntologyRoute, createSalesforceBackendInstallation, createSalesforceOntologyRoute } from "./installation/createSalesforceBackendInstallation.js";
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 { CompiledSoqlFilter, type CreateSalesforceBackendInstallationOptions, CreateSalesforceConnectionAdapterOptions, CreateSalesforceOntologyBackendOptions, ObjectCollectionConfig, ObjectCollectionOpts, ObjectCollectionUtils, SalesforceActionMetadata, SalesforceAuthenticationClient, SalesforceClientCredentialsConnectionOptions, SalesforceCodec, type SalesforceConnectionOptions, SalesforceOAuthConnectionOptions, type SalesforceOntologyRoute, SubscribeToSalesforceChangeEvents, buildSoqlQuery, convertLoadSubsetFilter, convertLoadSubsetOrderBy, createSalesforceBackendInstallation, createSalesforceCodec, createSalesforceConnectionAdapter, createSalesforceOntologyBackend, createSalesforceOntologyBackendAdapter, createSalesforceOntologyRoute, getSalesforceActionMetadata, isAlwaysFalseFilter, objectCollectionOptions, salesforceActionMeta, serializeSoqlLiteral };
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 { createSalesforceOntologyBackend, createSalesforceOntologyBackendAdapter } from "./adapter/createSalesforceOntologyBackendAdapter.js";
3
+ import { makeSalesforceOntologyBackend } from "./adapter/makeSalesforceOntologyBackend.js";
7
4
  import "./adapter/index.js";
8
- import { createSalesforceBackendInstallation, createSalesforceOntologyRoute } from "./installation/createSalesforceBackendInstallation.js";
9
- import "./installation/index.js";
5
+ import { makeSalesforceServiceConnector } from "./serviceConnector.js";
10
6
  export * from "@party-stack/salesforce-client";
11
- export { buildSoqlQuery, convertLoadSubsetFilter, convertLoadSubsetOrderBy, createSalesforceBackendInstallation, createSalesforceCodec, createSalesforceConnectionAdapter, createSalesforceOntologyBackend, createSalesforceOntologyBackendAdapter, createSalesforceOntologyRoute, getSalesforceActionMetadata, isAlwaysFalseFilter, objectCollectionOptions, salesforceActionMeta, serializeSoqlLiteral };
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 { OntologyBackendAdapter } from "@party-stack/ontology";
4
- //#region src/meta/createSalesforceMetaOntologyBackendAdapter.d.ts
5
- export interface CreateSalesforceMetaOntologyBackendAdapterOpts {
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 createSalesforceMetaOntologyBackendAdapter(opts: CreateSalesforceMetaOntologyBackendAdapterOpts): OntologyBackendAdapter;
21
+ export declare function makeSalesforceMetadataBackend(options: SalesforceMetadataBackendOptions): OntologyBackendService;
22
22
  //#endregion
23
- //# sourceMappingURL=createSalesforceMetaOntologyBackendAdapter.d.ts.map
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"}