@party-stack/salesforce-ontology 0.4.2 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +61 -68
- package/lib/adapter/backend.d.ts +15 -0
- package/lib/adapter/backend.d.ts.map +1 -0
- package/lib/adapter/backend.js +94 -0
- package/lib/adapter/backend.js.map +1 -0
- package/lib/adapter/index.d.ts +2 -4
- package/lib/adapter/index.js +2 -4
- package/lib/adapter/makeSalesforceOntologyBackend.d.ts +12 -0
- package/lib/adapter/makeSalesforceOntologyBackend.d.ts.map +1 -0
- package/lib/adapter/makeSalesforceOntologyBackend.js +186 -0
- package/lib/adapter/makeSalesforceOntologyBackend.js.map +1 -0
- package/lib/adapter/salesforceCodec.d.ts +1 -1
- package/lib/adapter/salesforceCodec.js.map +1 -1
- package/lib/adapter/salesforceObjectSearch.d.ts +15 -0
- package/lib/adapter/salesforceObjectSearch.d.ts.map +1 -0
- package/lib/adapter/salesforceObjectSearch.js +65 -0
- package/lib/adapter/salesforceObjectSearch.js.map +1 -0
- package/lib/adapter/soql.d.ts +17 -0
- package/lib/adapter/soql.d.ts.map +1 -0
- package/lib/adapter/soql.js +65 -0
- package/lib/adapter/soql.js.map +1 -0
- package/lib/config/index.d.ts +10 -7
- package/lib/config/index.d.ts.map +1 -1
- package/lib/config/index.js +63 -44
- package/lib/config/index.js.map +1 -1
- package/lib/connect.d.ts +18 -0
- package/lib/connect.d.ts.map +1 -0
- package/lib/connect.js +32 -0
- package/lib/connect.js.map +1 -0
- package/lib/connectionOptions.d.ts +10 -0
- package/lib/connectionOptions.d.ts.map +1 -0
- package/lib/connectionOptions.js +1 -0
- package/lib/index.d.ts +4 -7
- package/lib/index.js +3 -7
- package/lib/meta/{createSalesforceMetaOntologyBackendAdapter.d.ts → backend.d.ts} +5 -5
- package/lib/meta/backend.d.ts.map +1 -0
- package/lib/meta/backend.js +86 -0
- package/lib/meta/backend.js.map +1 -0
- package/lib/meta/convertMetaActionType.d.ts +3 -3
- package/lib/meta/convertMetaActionType.d.ts.map +1 -1
- package/lib/meta/convertMetaActionType.js.map +1 -1
- package/lib/meta/convertMetaLinkType.d.ts +2 -2
- package/lib/meta/convertMetaLinkType.d.ts.map +1 -1
- package/lib/meta/convertMetaLinkType.js.map +1 -1
- package/lib/meta/convertMetaLoadSubsetOptions.d.ts +2 -2
- package/lib/meta/convertMetaLoadSubsetOptions.d.ts.map +1 -1
- package/lib/meta/convertMetaLoadSubsetOptions.js +33 -33
- package/lib/meta/convertMetaLoadSubsetOptions.js.map +1 -1
- package/lib/meta/convertMetaObjectType.d.ts +2 -2
- package/lib/meta/convertMetaObjectType.d.ts.map +1 -1
- package/lib/meta/convertMetaObjectType.js.map +1 -1
- package/lib/meta/convertMetaQueryFunctionType.d.ts +1 -1
- package/lib/meta/convertMetaQueryFunctionType.js.map +1 -1
- package/lib/meta/convertMetaTypeDef.d.ts +1 -1
- package/lib/meta/convertMetaTypeDef.js.map +1 -1
- package/lib/meta/index.d.ts +2 -4
- package/lib/meta/index.js +3 -5
- package/lib/meta/loadActions.d.ts +15 -0
- package/lib/meta/loadActions.d.ts.map +1 -0
- package/lib/meta/loadActions.js +103 -0
- package/lib/meta/loadActions.js.map +1 -0
- package/lib/meta/loadEntities.d.ts +5 -0
- package/lib/meta/loadEntities.d.ts.map +1 -0
- package/lib/meta/loadEntities.js +14 -0
- package/lib/meta/loadEntities.js.map +1 -0
- package/lib/meta/loadQueryFunctions.d.ts +11 -0
- package/lib/meta/loadQueryFunctions.d.ts.map +1 -0
- package/lib/meta/loadQueryFunctions.js +43 -0
- package/lib/meta/loadQueryFunctions.js.map +1 -0
- package/lib/meta/synthesizeCrudActionTypes.d.ts +2 -2
- package/lib/meta/synthesizeCrudActionTypes.d.ts.map +1 -1
- package/lib/meta/synthesizeCrudActionTypes.js.map +1 -1
- package/lib/serviceConnector.d.ts +8 -0
- package/lib/serviceConnector.d.ts.map +1 -0
- package/lib/serviceConnector.js +125 -0
- package/lib/serviceConnector.js.map +1 -0
- package/lib/utils/AsyncIterable.d.ts +1 -1
- package/lib/utils/AsyncIterable.d.ts.map +1 -1
- package/lib/utils/AsyncIterable.js +11 -0
- package/lib/utils/AsyncIterable.js.map +1 -1
- package/package.json +15 -19
- package/lib/adapter/convertLoadSubsetOptions.d.ts +0 -20
- package/lib/adapter/convertLoadSubsetOptions.d.ts.map +0 -1
- package/lib/adapter/convertLoadSubsetOptions.js +0 -127
- package/lib/adapter/convertLoadSubsetOptions.js.map +0 -1
- package/lib/adapter/createSalesforceOntologyBackendAdapter.d.ts +0 -22
- package/lib/adapter/createSalesforceOntologyBackendAdapter.d.ts.map +0 -1
- package/lib/adapter/createSalesforceOntologyBackendAdapter.js +0 -139
- package/lib/adapter/createSalesforceOntologyBackendAdapter.js.map +0 -1
- package/lib/adapter/objectCollectionOptions.d.ts +0 -36
- package/lib/adapter/objectCollectionOptions.d.ts.map +0 -1
- package/lib/adapter/objectCollectionOptions.js +0 -204
- package/lib/adapter/objectCollectionOptions.js.map +0 -1
- package/lib/connection.d.ts +0 -45
- package/lib/connection.d.ts.map +0 -1
- package/lib/connection.js +0 -258
- package/lib/connection.js.map +0 -1
- package/lib/installation/createSalesforceBackendInstallation.d.ts +0 -37
- package/lib/installation/createSalesforceBackendInstallation.d.ts.map +0 -1
- package/lib/installation/createSalesforceBackendInstallation.js +0 -84
- package/lib/installation/createSalesforceBackendInstallation.js.map +0 -1
- package/lib/installation/index.d.ts +0 -2
- package/lib/installation/index.js +0 -1
- package/lib/meta/actionTypeCollectionOptions.d.ts +0 -15
- package/lib/meta/actionTypeCollectionOptions.d.ts.map +0 -1
- package/lib/meta/actionTypeCollectionOptions.js +0 -121
- package/lib/meta/actionTypeCollectionOptions.js.map +0 -1
- package/lib/meta/createSalesforceMetaOntologyBackendAdapter.d.ts.map +0 -1
- package/lib/meta/createSalesforceMetaOntologyBackendAdapter.js +0 -42
- package/lib/meta/createSalesforceMetaOntologyBackendAdapter.js.map +0 -1
- package/lib/meta/entityCollectionOptions.d.ts +0 -16
- package/lib/meta/entityCollectionOptions.d.ts.map +0 -1
- package/lib/meta/entityCollectionOptions.js +0 -81
- package/lib/meta/entityCollectionOptions.js.map +0 -1
- package/lib/meta/queryFunctionTypeCollectionOptions.d.ts +0 -11
- package/lib/meta/queryFunctionTypeCollectionOptions.d.ts.map +0 -1
- package/lib/meta/queryFunctionTypeCollectionOptions.js +0 -59
- package/lib/meta/queryFunctionTypeCollectionOptions.js.map +0 -1
package/lib/connection.js
DELETED
|
@@ -1,258 +0,0 @@
|
|
|
1
|
-
import { withHttpAuthenticationErrorHandling, withHttpRetryHandling } from "@party-stack/connections";
|
|
2
|
-
import { unauthenticated } from "@party-stack/errors";
|
|
3
|
-
import { createClientCredentialsOAuthClient, createPublicOAuthClient } from "@party-stack/oauth";
|
|
4
|
-
import { createSalesforceClient } from "@party-stack/salesforce-client";
|
|
5
|
-
//#region src/connection.ts
|
|
6
|
-
const DEFAULT_SCOPES = [
|
|
7
|
-
"api",
|
|
8
|
-
"refresh_token",
|
|
9
|
-
"openid"
|
|
10
|
-
];
|
|
11
|
-
function normalizeUrl(value) {
|
|
12
|
-
return value.replace(/\/+$/, "");
|
|
13
|
-
}
|
|
14
|
-
function activeState(expiresAt, refreshable) {
|
|
15
|
-
return expiresAt === void 0 ? { status: "active" } : {
|
|
16
|
-
status: "active",
|
|
17
|
-
expiration: {
|
|
18
|
-
expiresAt,
|
|
19
|
-
refreshable
|
|
20
|
-
}
|
|
21
|
-
};
|
|
22
|
-
}
|
|
23
|
-
async function resolveSalesforceUserId(options) {
|
|
24
|
-
const response = await options.fetch(`${options.loginUrl}/services/oauth2/userinfo`, { headers: {
|
|
25
|
-
Authorization: `Bearer ${options.token}`,
|
|
26
|
-
Accept: "application/json"
|
|
27
|
-
} });
|
|
28
|
-
if (response.status === 401) throw unauthenticated("Salesforce access token is invalid or expired.");
|
|
29
|
-
if (!response.ok) throw new Error(`Salesforce userinfo failed with status ${response.status}: ${await response.text()}`);
|
|
30
|
-
const user = await response.json();
|
|
31
|
-
const userId = user.user_id ?? user.sub;
|
|
32
|
-
if (!userId) throw new Error("Salesforce userinfo did not return user_id or sub.");
|
|
33
|
-
return userId;
|
|
34
|
-
}
|
|
35
|
-
function assertSalesforceOrigin(request, instanceUrl) {
|
|
36
|
-
const actual = new URL(request.url).origin;
|
|
37
|
-
if (actual !== new URL(instanceUrl).origin) throw new Error(`Salesforce egress not allowed for origin "${actual}".`);
|
|
38
|
-
}
|
|
39
|
-
function createSalesforceEgressWrapper(options) {
|
|
40
|
-
return (handlers) => withHttpAuthenticationErrorHandling(withHttpRetryHandling({
|
|
41
|
-
...handlers,
|
|
42
|
-
async fetch(request) {
|
|
43
|
-
assertSalesforceOrigin(request, options.instanceUrl);
|
|
44
|
-
const retryRequest = request.clone();
|
|
45
|
-
const send = async (current) => {
|
|
46
|
-
const headers = new Headers(current.headers);
|
|
47
|
-
headers.set("Authorization", `Bearer ${await options.tokenProvider()}`);
|
|
48
|
-
return handlers.fetch(new Request(current, { headers }));
|
|
49
|
-
};
|
|
50
|
-
let response = await send(request);
|
|
51
|
-
if (response.status === 401 && options.refresh) {
|
|
52
|
-
await options.refresh();
|
|
53
|
-
response = await send(retryRequest);
|
|
54
|
-
}
|
|
55
|
-
return response;
|
|
56
|
-
}
|
|
57
|
-
}));
|
|
58
|
-
}
|
|
59
|
-
async function createSalesforceConnectionAdapterInstance(options, context) {
|
|
60
|
-
const instanceUrl = normalizeUrl(options.instanceUrl);
|
|
61
|
-
const apiVersion = options.apiVersion ?? "65.0";
|
|
62
|
-
const loginUrl = normalizeUrl(options.oauth?.loginUrl ?? options.clientCredentials?.loginUrl ?? instanceUrl);
|
|
63
|
-
const fetchImpl = options.oauth?.fetch ?? options.clientCredentials?.fetch ?? globalThis.fetch.bind(globalThis);
|
|
64
|
-
let tokenActive = Boolean(options.token);
|
|
65
|
-
const tokenProviders = /* @__PURE__ */ new Map();
|
|
66
|
-
const publicOauth = options.oauth ? await createPublicOAuthClient({
|
|
67
|
-
clientId: options.oauth.clientId,
|
|
68
|
-
redirectUrl: options.oauth.redirectUrl,
|
|
69
|
-
scopes: [...new Set(options.oauth.scopes ?? DEFAULT_SCOPES)],
|
|
70
|
-
authorizationServer: {
|
|
71
|
-
issuer: loginUrl,
|
|
72
|
-
authorizationEndpoint: `${loginUrl}/services/oauth2/authorize`,
|
|
73
|
-
tokenEndpoint: `${loginUrl}/services/oauth2/token`,
|
|
74
|
-
revocationEndpoint: `${loginUrl}/services/oauth2/revoke`
|
|
75
|
-
},
|
|
76
|
-
runtime: context.runtime,
|
|
77
|
-
fetch: options.oauth.fetch,
|
|
78
|
-
dangerouslyPersistSecrets: options.oauth.dangerouslyPersistSecrets,
|
|
79
|
-
resolveUserId: (token) => resolveSalesforceUserId({
|
|
80
|
-
loginUrl,
|
|
81
|
-
token,
|
|
82
|
-
fetch: fetchImpl
|
|
83
|
-
})
|
|
84
|
-
}) : void 0;
|
|
85
|
-
const clientCredentialsOauth = options.clientCredentials ? createClientCredentialsOAuthClient({
|
|
86
|
-
clientId: options.clientCredentials.clientId,
|
|
87
|
-
clientSecret: options.clientCredentials.clientSecret,
|
|
88
|
-
tokenEndpoint: `${loginUrl}/services/oauth2/token`,
|
|
89
|
-
scopes: options.clientCredentials.scopes,
|
|
90
|
-
fetch: options.clientCredentials.fetch,
|
|
91
|
-
resolveUserId: (token) => resolveSalesforceUserId({
|
|
92
|
-
loginUrl,
|
|
93
|
-
token,
|
|
94
|
-
fetch: fetchImpl
|
|
95
|
-
})
|
|
96
|
-
}) : void 0;
|
|
97
|
-
const createTokenSession = async (authenticationOptions = {}) => {
|
|
98
|
-
const token = authenticationOptions.token ?? options.token;
|
|
99
|
-
if (!token) throw new Error("Salesforce access-token connections are not configured.");
|
|
100
|
-
const userId = authenticationOptions.userId ?? options.userId ?? await resolveSalesforceUserId({
|
|
101
|
-
loginUrl,
|
|
102
|
-
token,
|
|
103
|
-
fetch: fetchImpl
|
|
104
|
-
});
|
|
105
|
-
const connection = {
|
|
106
|
-
userId,
|
|
107
|
-
state: { status: "active" }
|
|
108
|
-
};
|
|
109
|
-
tokenProviders.set(userId, () => Promise.resolve(token));
|
|
110
|
-
return {
|
|
111
|
-
connection,
|
|
112
|
-
session: {
|
|
113
|
-
disconnect() {
|
|
114
|
-
tokenProviders.delete(userId);
|
|
115
|
-
if (token === options.token) tokenActive = false;
|
|
116
|
-
return Promise.resolve();
|
|
117
|
-
},
|
|
118
|
-
egress: createSalesforceEgressWrapper({
|
|
119
|
-
instanceUrl,
|
|
120
|
-
tokenProvider: () => Promise.resolve(token)
|
|
121
|
-
})
|
|
122
|
-
}
|
|
123
|
-
};
|
|
124
|
-
};
|
|
125
|
-
const createPublicSession = (oauthSession) => {
|
|
126
|
-
const userId = oauthSession.userId;
|
|
127
|
-
const connection = {
|
|
128
|
-
userId,
|
|
129
|
-
state: activeState(oauthSession.expiration?.expiresAt, oauthSession.expiration?.refreshable ?? false)
|
|
130
|
-
};
|
|
131
|
-
const tokenProvider = () => {
|
|
132
|
-
if (!publicOauth) throw unauthenticated("Salesforce public OAuth is not configured.");
|
|
133
|
-
return publicOauth.getAccessToken(userId);
|
|
134
|
-
};
|
|
135
|
-
tokenProviders.set(userId, tokenProvider);
|
|
136
|
-
return {
|
|
137
|
-
connection,
|
|
138
|
-
session: {
|
|
139
|
-
async refresh() {
|
|
140
|
-
if (!publicOauth) throw unauthenticated("Salesforce public OAuth is not configured.");
|
|
141
|
-
return createPublicSession(await publicOauth.refresh(userId));
|
|
142
|
-
},
|
|
143
|
-
async disconnect() {
|
|
144
|
-
tokenProviders.delete(userId);
|
|
145
|
-
await publicOauth?.revoke(userId);
|
|
146
|
-
},
|
|
147
|
-
egress: createSalesforceEgressWrapper({
|
|
148
|
-
instanceUrl,
|
|
149
|
-
tokenProvider,
|
|
150
|
-
refresh: async () => {
|
|
151
|
-
if (!publicOauth) throw unauthenticated("Salesforce public OAuth is not configured.");
|
|
152
|
-
await publicOauth.refresh(userId);
|
|
153
|
-
}
|
|
154
|
-
})
|
|
155
|
-
}
|
|
156
|
-
};
|
|
157
|
-
};
|
|
158
|
-
const createClientCredentialsSession = async (forceRefresh = false) => {
|
|
159
|
-
if (!clientCredentialsOauth) throw new Error("Salesforce client credentials are not configured.");
|
|
160
|
-
const oauthSession = forceRefresh ? await clientCredentialsOauth.refresh() : await clientCredentialsOauth.getSession();
|
|
161
|
-
const userId = oauthSession.userId;
|
|
162
|
-
const tokenProvider = () => clientCredentialsOauth.getAccessToken();
|
|
163
|
-
tokenProviders.set(userId, tokenProvider);
|
|
164
|
-
return {
|
|
165
|
-
connection: {
|
|
166
|
-
userId,
|
|
167
|
-
state: activeState(oauthSession.expiration?.expiresAt, true)
|
|
168
|
-
},
|
|
169
|
-
session: {
|
|
170
|
-
refresh: () => createClientCredentialsSession(true),
|
|
171
|
-
disconnect() {
|
|
172
|
-
tokenProviders.delete(userId);
|
|
173
|
-
return Promise.resolve();
|
|
174
|
-
},
|
|
175
|
-
egress: createSalesforceEgressWrapper({
|
|
176
|
-
instanceUrl,
|
|
177
|
-
tokenProvider,
|
|
178
|
-
refresh: () => clientCredentialsOauth.refresh().then(() => void 0)
|
|
179
|
-
})
|
|
180
|
-
}
|
|
181
|
-
};
|
|
182
|
-
};
|
|
183
|
-
return {
|
|
184
|
-
name: "salesforce",
|
|
185
|
-
createAuthenticationClient(controller) {
|
|
186
|
-
return {
|
|
187
|
-
async subscribeToChangeEvents(userId, sObjectName, listener, subscriptionOptions) {
|
|
188
|
-
const tokenProvider = tokenProviders.get(userId);
|
|
189
|
-
if (!tokenProvider) throw unauthenticated(`Salesforce connection for user "${userId}" is unavailable.`);
|
|
190
|
-
return createSalesforceClient({
|
|
191
|
-
instanceUrl,
|
|
192
|
-
apiVersion,
|
|
193
|
-
cometdUrl: options.cometdUrl,
|
|
194
|
-
tokenProvider
|
|
195
|
-
}).subscribeToChangeEvents(sObjectName, listener, subscriptionOptions);
|
|
196
|
-
},
|
|
197
|
-
async completeOAuthRedirect(url) {
|
|
198
|
-
if (!publicOauth) return;
|
|
199
|
-
const session = await publicOauth.completeRedirect(url);
|
|
200
|
-
if (!session) return;
|
|
201
|
-
const connectionSession = createPublicSession(session);
|
|
202
|
-
await controller.connect(connectionSession);
|
|
203
|
-
return connectionSession.connection;
|
|
204
|
-
},
|
|
205
|
-
signIn: {
|
|
206
|
-
async oauth(authenticationOptions = {}) {
|
|
207
|
-
if (!publicOauth) throw new Error("Salesforce public OAuth is not configured.");
|
|
208
|
-
const session = await publicOauth.signIn({ browserPresentation: authenticationOptions.browserPresentation });
|
|
209
|
-
const connectionSession = createPublicSession(session);
|
|
210
|
-
await controller.connect(connectionSession);
|
|
211
|
-
return connectionSession.connection;
|
|
212
|
-
},
|
|
213
|
-
async clientCredentials() {
|
|
214
|
-
if (!clientCredentialsOauth) throw new Error("Salesforce client credentials are not configured.");
|
|
215
|
-
if (typeof window !== "undefined") throw new Error("Salesforce client credentials cannot run in a browser.");
|
|
216
|
-
const connectionSession = await createClientCredentialsSession();
|
|
217
|
-
await controller.connect(connectionSession);
|
|
218
|
-
return connectionSession.connection;
|
|
219
|
-
},
|
|
220
|
-
async accessToken(authenticationOptions = {}) {
|
|
221
|
-
const connectionSession = await createTokenSession(authenticationOptions);
|
|
222
|
-
if (authenticationOptions.token === void 0 && options.token) tokenActive = true;
|
|
223
|
-
await controller.connect(connectionSession);
|
|
224
|
-
return connectionSession.connection;
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
};
|
|
228
|
-
},
|
|
229
|
-
async restoreConnections() {
|
|
230
|
-
const restored = /* @__PURE__ */ new Map();
|
|
231
|
-
if (tokenActive && options.token) {
|
|
232
|
-
const session = await createTokenSession();
|
|
233
|
-
restored.set(session.connection.userId, session);
|
|
234
|
-
}
|
|
235
|
-
if (publicOauth) for (const oauthSession of await publicOauth.restoreSessions()) {
|
|
236
|
-
const session = createPublicSession(oauthSession);
|
|
237
|
-
restored.set(session.connection.userId, session);
|
|
238
|
-
}
|
|
239
|
-
if (clientCredentialsOauth && typeof window === "undefined") {
|
|
240
|
-
const session = await createClientCredentialsSession();
|
|
241
|
-
restored.set(session.connection.userId, session);
|
|
242
|
-
}
|
|
243
|
-
return [...restored.values()];
|
|
244
|
-
},
|
|
245
|
-
async cleanup() {
|
|
246
|
-
tokenProviders.clear();
|
|
247
|
-
await publicOauth?.cleanup();
|
|
248
|
-
clientCredentialsOauth?.cleanup();
|
|
249
|
-
}
|
|
250
|
-
};
|
|
251
|
-
}
|
|
252
|
-
function createSalesforceConnectionAdapter(options) {
|
|
253
|
-
return (context) => createSalesforceConnectionAdapterInstance(options, context);
|
|
254
|
-
}
|
|
255
|
-
//#endregion
|
|
256
|
-
export { createSalesforceConnectionAdapter };
|
|
257
|
-
|
|
258
|
-
//# sourceMappingURL=connection.js.map
|
package/lib/connection.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"connection.js","names":[],"sources":["../src/connection.ts"],"sourcesContent":["import {\n type BackendConnectionAdapter,\n type BackendConnectionAdapterContext,\n type BackendConnectionAdapterProvider,\n type Connection,\n type ConnectionEgressHandlers,\n type ConnectionSession,\n type EstablishedConnection,\n withHttpAuthenticationErrorHandling,\n withHttpRetryHandling,\n} from \"@party-stack/connections\";\nimport { unauthenticated } from \"@party-stack/errors\";\nimport {\n createClientCredentialsOAuthClient,\n createPublicOAuthClient,\n type ClientCredentialsOAuthClient,\n type OAuthSession,\n type PublicOAuthClient,\n} from \"@party-stack/oauth\";\nimport {\n createSalesforceClient,\n type SalesforceChangeEvent,\n type SalesforceChangeEventSubscription,\n type SalesforceChangeEventSubscriptionOptions,\n} from \"@party-stack/salesforce-client\";\nimport type { BrowserAuthenticationPresentation } from \"@party-stack/runtime\";\n\nexport interface SalesforceOAuthConnectionOptions {\n clientId: string;\n redirectUrl: string;\n loginUrl?: string;\n scopes?: string[];\n fetch?: typeof globalThis.fetch;\n dangerouslyPersistSecrets?: boolean;\n}\n\nexport interface SalesforceClientCredentialsConnectionOptions {\n clientId: string;\n clientSecret: string;\n loginUrl?: string;\n scopes?: string[];\n fetch?: typeof globalThis.fetch;\n}\n\nexport interface CreateSalesforceConnectionAdapterOptions {\n instanceUrl: string;\n apiVersion?: string;\n cometdUrl?: string;\n oauth?: SalesforceOAuthConnectionOptions;\n clientCredentials?: SalesforceClientCredentialsConnectionOptions;\n token?: string;\n userId?: string;\n}\n\nexport interface SalesforceAuthenticationClient {\n completeOAuthRedirect(url: string): Promise<Connection<\"active\"> | undefined>;\n subscribeToChangeEvents(\n userId: string,\n sObjectName: string,\n listener: (event: SalesforceChangeEvent) => void,\n options?: SalesforceChangeEventSubscriptionOptions\n ): Promise<SalesforceChangeEventSubscription>;\n signIn: {\n oauth(options?: {\n browserPresentation?: BrowserAuthenticationPresentation;\n }): Promise<Connection<\"active\">>;\n clientCredentials(): Promise<Connection<\"active\">>;\n accessToken(options?: { token?: string; userId?: string }): Promise<Connection<\"active\">>;\n };\n}\n\ninterface SalesforceUserInfo {\n user_id?: string;\n sub?: string;\n}\n\nconst DEFAULT_SCOPES = [\"api\", \"refresh_token\", \"openid\"];\n\nfunction normalizeUrl(value: string): string {\n return value.replace(/\\/+$/, \"\");\n}\n\nfunction activeState(expiresAt: number | undefined, refreshable: boolean): Connection<\"active\">[\"state\"] {\n return expiresAt === undefined\n ? { status: \"active\" }\n : {\n status: \"active\",\n expiration: {\n expiresAt,\n refreshable,\n },\n };\n}\n\nasync function resolveSalesforceUserId(options: {\n loginUrl: string;\n token: string;\n fetch: typeof globalThis.fetch;\n}): Promise<string> {\n const response = await options.fetch(`${options.loginUrl}/services/oauth2/userinfo`, {\n headers: {\n Authorization: `Bearer ${options.token}`,\n Accept: \"application/json\",\n },\n });\n if (response.status === 401) {\n throw unauthenticated(\"Salesforce access token is invalid or expired.\");\n }\n if (!response.ok) {\n throw new Error(\n `Salesforce userinfo failed with status ${response.status}: ${await response.text()}`\n );\n }\n const user = (await response.json()) as SalesforceUserInfo;\n const userId = user.user_id ?? user.sub;\n if (!userId) {\n throw new Error(\"Salesforce userinfo did not return user_id or sub.\");\n }\n return userId;\n}\n\nfunction assertSalesforceOrigin(request: Request, instanceUrl: string): void {\n const actual = new URL(request.url).origin;\n const expected = new URL(instanceUrl).origin;\n if (actual !== expected) {\n throw new Error(`Salesforce egress not allowed for origin \"${actual}\".`);\n }\n}\n\nfunction createSalesforceEgressWrapper(options: {\n instanceUrl: string;\n tokenProvider: () => Promise<string>;\n refresh?: () => Promise<void>;\n}): (handlers: ConnectionEgressHandlers) => ConnectionEgressHandlers {\n return (handlers) =>\n withHttpAuthenticationErrorHandling(\n withHttpRetryHandling({\n ...handlers,\n async fetch(request) {\n assertSalesforceOrigin(request, options.instanceUrl);\n const retryRequest = request.clone();\n const send = async (current: Request) => {\n const headers = new Headers(current.headers);\n headers.set(\"Authorization\", `Bearer ${await options.tokenProvider()}`);\n return handlers.fetch(\n new Request(current, {\n headers,\n })\n );\n };\n let response = await send(request);\n if (response.status === 401 && options.refresh) {\n await options.refresh();\n response = await send(retryRequest);\n }\n return response;\n },\n })\n );\n}\n\nasync function createSalesforceConnectionAdapterInstance(\n options: CreateSalesforceConnectionAdapterOptions,\n context: BackendConnectionAdapterContext\n): Promise<BackendConnectionAdapter<SalesforceAuthenticationClient>> {\n const instanceUrl = normalizeUrl(options.instanceUrl);\n const apiVersion = options.apiVersion ?? \"65.0\";\n const loginUrl = normalizeUrl(\n options.oauth?.loginUrl ?? options.clientCredentials?.loginUrl ?? instanceUrl\n );\n const fetchImpl =\n options.oauth?.fetch ?? options.clientCredentials?.fetch ?? globalThis.fetch.bind(globalThis);\n let tokenActive = Boolean(options.token);\n const tokenProviders = new Map<string, () => Promise<string>>();\n const publicOauth: PublicOAuthClient | undefined = options.oauth\n ? await createPublicOAuthClient({\n clientId: options.oauth.clientId,\n redirectUrl: options.oauth.redirectUrl,\n scopes: [...new Set(options.oauth.scopes ?? DEFAULT_SCOPES)],\n authorizationServer: {\n issuer: loginUrl,\n authorizationEndpoint: `${loginUrl}/services/oauth2/authorize`,\n tokenEndpoint: `${loginUrl}/services/oauth2/token`,\n revocationEndpoint: `${loginUrl}/services/oauth2/revoke`,\n },\n runtime: context.runtime,\n fetch: options.oauth.fetch,\n dangerouslyPersistSecrets: options.oauth.dangerouslyPersistSecrets,\n resolveUserId: (token) =>\n resolveSalesforceUserId({\n loginUrl,\n token,\n fetch: fetchImpl,\n }),\n })\n : undefined;\n const clientCredentialsOauth: ClientCredentialsOAuthClient | undefined = options.clientCredentials\n ? createClientCredentialsOAuthClient({\n clientId: options.clientCredentials.clientId,\n clientSecret: options.clientCredentials.clientSecret,\n tokenEndpoint: `${loginUrl}/services/oauth2/token`,\n scopes: options.clientCredentials.scopes,\n fetch: options.clientCredentials.fetch,\n resolveUserId: (token) =>\n resolveSalesforceUserId({\n loginUrl,\n token,\n fetch: fetchImpl,\n }),\n })\n : undefined;\n\n const createTokenSession = async (\n authenticationOptions: {\n token?: string;\n userId?: string;\n } = {}\n ): Promise<EstablishedConnection> => {\n const token = authenticationOptions.token ?? options.token;\n if (!token) {\n throw new Error(\"Salesforce access-token connections are not configured.\");\n }\n const userId =\n authenticationOptions.userId ??\n options.userId ??\n (await resolveSalesforceUserId({\n loginUrl,\n token,\n fetch: fetchImpl,\n }));\n const connection: Connection<\"active\"> = {\n userId,\n state: { status: \"active\" },\n };\n tokenProviders.set(userId, () => Promise.resolve(token));\n const session: ConnectionSession = {\n disconnect() {\n tokenProviders.delete(userId);\n if (token === options.token) {\n tokenActive = false;\n }\n return Promise.resolve();\n },\n egress: createSalesforceEgressWrapper({\n instanceUrl,\n tokenProvider: () => Promise.resolve(token),\n }),\n };\n return { connection, session };\n };\n\n const createPublicSession = (oauthSession: OAuthSession): EstablishedConnection => {\n const userId = oauthSession.userId;\n const connection: Connection<\"active\"> = {\n userId,\n state: activeState(\n oauthSession.expiration?.expiresAt,\n oauthSession.expiration?.refreshable ?? false\n ),\n };\n const tokenProvider = () => {\n if (!publicOauth) {\n throw unauthenticated(\"Salesforce public OAuth is not configured.\");\n }\n return publicOauth.getAccessToken(userId);\n };\n tokenProviders.set(userId, tokenProvider);\n const session: ConnectionSession = {\n async refresh() {\n if (!publicOauth) {\n throw unauthenticated(\"Salesforce public OAuth is not configured.\");\n }\n return createPublicSession(await publicOauth.refresh(userId));\n },\n async disconnect() {\n tokenProviders.delete(userId);\n await publicOauth?.revoke(userId);\n },\n egress: createSalesforceEgressWrapper({\n instanceUrl,\n tokenProvider,\n refresh: async () => {\n if (!publicOauth) {\n throw unauthenticated(\"Salesforce public OAuth is not configured.\");\n }\n await publicOauth.refresh(userId);\n },\n }),\n };\n return { connection, session };\n };\n\n const createClientCredentialsSession = async (forceRefresh = false): Promise<EstablishedConnection> => {\n if (!clientCredentialsOauth) {\n throw new Error(\"Salesforce client credentials are not configured.\");\n }\n const oauthSession = forceRefresh\n ? await clientCredentialsOauth.refresh()\n : await clientCredentialsOauth.getSession();\n const userId = oauthSession.userId;\n const tokenProvider = () => clientCredentialsOauth.getAccessToken();\n tokenProviders.set(userId, tokenProvider);\n return {\n connection: {\n userId,\n state: activeState(oauthSession.expiration?.expiresAt, true),\n },\n session: {\n refresh: () => createClientCredentialsSession(true),\n disconnect() {\n tokenProviders.delete(userId);\n return Promise.resolve();\n },\n egress: createSalesforceEgressWrapper({\n instanceUrl,\n tokenProvider,\n refresh: () => clientCredentialsOauth.refresh().then(() => undefined),\n }),\n },\n };\n };\n\n return {\n name: \"salesforce\",\n createAuthenticationClient(controller) {\n return {\n async subscribeToChangeEvents(userId, sObjectName, listener, subscriptionOptions) {\n const tokenProvider = tokenProviders.get(userId);\n if (!tokenProvider) {\n throw unauthenticated(`Salesforce connection for user \"${userId}\" is unavailable.`);\n }\n const client = createSalesforceClient({\n instanceUrl,\n apiVersion,\n cometdUrl: options.cometdUrl,\n tokenProvider,\n });\n return client.subscribeToChangeEvents(sObjectName, listener, subscriptionOptions);\n },\n async completeOAuthRedirect(url) {\n if (!publicOauth) return;\n const session = await publicOauth.completeRedirect(url);\n if (!session) return;\n const connectionSession = createPublicSession(session);\n await controller.connect(connectionSession);\n return connectionSession.connection;\n },\n signIn: {\n async oauth(authenticationOptions = {}) {\n if (!publicOauth) {\n throw new Error(\"Salesforce public OAuth is not configured.\");\n }\n const session = await publicOauth.signIn({\n browserPresentation: authenticationOptions.browserPresentation,\n });\n const connectionSession = createPublicSession(session);\n await controller.connect(connectionSession);\n return connectionSession.connection;\n },\n async clientCredentials() {\n if (!clientCredentialsOauth) {\n throw new Error(\"Salesforce client credentials are not configured.\");\n }\n if (typeof window !== \"undefined\") {\n throw new Error(\"Salesforce client credentials cannot run in a browser.\");\n }\n const connectionSession = await createClientCredentialsSession();\n await controller.connect(connectionSession);\n return connectionSession.connection;\n },\n async accessToken(authenticationOptions = {}) {\n const connectionSession = await createTokenSession(authenticationOptions);\n if (authenticationOptions.token === undefined && options.token) {\n tokenActive = true;\n }\n await controller.connect(connectionSession);\n return connectionSession.connection;\n },\n },\n };\n },\n async restoreConnections() {\n const restored = new Map<string, EstablishedConnection>();\n if (tokenActive && options.token) {\n const session = await createTokenSession();\n restored.set(session.connection.userId, session);\n }\n if (publicOauth) {\n for (const oauthSession of await publicOauth.restoreSessions()) {\n const session = createPublicSession(oauthSession);\n restored.set(session.connection.userId, session);\n }\n }\n if (clientCredentialsOauth && typeof window === \"undefined\") {\n const session = await createClientCredentialsSession();\n restored.set(session.connection.userId, session);\n }\n return [...restored.values()];\n },\n async cleanup() {\n tokenProviders.clear();\n await publicOauth?.cleanup();\n clientCredentialsOauth?.cleanup();\n },\n };\n}\n\nexport function createSalesforceConnectionAdapter(\n options: CreateSalesforceConnectionAdapterOptions\n): BackendConnectionAdapterProvider<SalesforceAuthenticationClient> {\n return (context) => createSalesforceConnectionAdapterInstance(options, context);\n}\n"],"mappings":"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"}
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import { CreateSalesforceConnectionAdapterOptions, SalesforceAuthenticationClient } from "../connection.js";
|
|
2
|
-
import { SalesforceCrudActionTypeSelection } from "../crud.js";
|
|
3
|
-
import { BackendConnectionAdapterProvider } from "@party-stack/connections";
|
|
4
|
-
import { SalesforceChangeEvent, SalesforceChangeEventSubscription, SalesforceChangeEventSubscriptionOptions } from "@party-stack/salesforce-client";
|
|
5
|
-
import { LiveOntologyWrites, OntologyBackendInstallation, OntologyIR, OntologyRoute } from "@party-stack/ontology";
|
|
6
|
-
import { RuntimeAdapterProvider } from "@party-stack/runtime";
|
|
7
|
-
//#region src/installation/createSalesforceBackendInstallation.d.ts
|
|
8
|
-
export type SalesforceConnectionOptions = Omit<CreateSalesforceConnectionAdapterOptions, "instanceUrl" | "apiVersion">;
|
|
9
|
-
export type SalesforceOntologyRoute = (options: {
|
|
10
|
-
instanceUrl: string;
|
|
11
|
-
apiVersion: string;
|
|
12
|
-
subscribeToChangeEvents?: (userId: string, objectType: string, listener: (event: SalesforceChangeEvent) => void, subscriptionOptions?: SalesforceChangeEventSubscriptionOptions) => Promise<SalesforceChangeEventSubscription>;
|
|
13
|
-
}) => OntologyRoute;
|
|
14
|
-
export interface CreateSalesforceBackendInstallationOptions<AuthenticationClient extends object = SalesforceAuthenticationClient> {
|
|
15
|
-
installationId?: string;
|
|
16
|
-
instanceUrl: string;
|
|
17
|
-
apiVersion: string;
|
|
18
|
-
runtime: RuntimeAdapterProvider;
|
|
19
|
-
connections: SalesforceConnectionOptions | BackendConnectionAdapterProvider<AuthenticationClient>;
|
|
20
|
-
routes: readonly SalesforceOntologyRoute[];
|
|
21
|
-
createContext?: (userId: string, ontologyId: string) => Record<string, unknown>;
|
|
22
|
-
}
|
|
23
|
-
export declare function createSalesforceOntologyRoute(options: {
|
|
24
|
-
ontologyId: string;
|
|
25
|
-
ir?: OntologyIR;
|
|
26
|
-
objectTypeNames?: string[];
|
|
27
|
-
flowActionTypeNames?: string[];
|
|
28
|
-
standardActionTypeNames?: string[];
|
|
29
|
-
standardQueryFunctionTypeNames?: string[];
|
|
30
|
-
crudActionTypes?: readonly SalesforceCrudActionTypeSelection[];
|
|
31
|
-
live?: boolean;
|
|
32
|
-
persistObjects?: boolean;
|
|
33
|
-
writes?: LiveOntologyWrites;
|
|
34
|
-
}): SalesforceOntologyRoute;
|
|
35
|
-
export declare function createSalesforceBackendInstallation<AuthenticationClient extends object = SalesforceAuthenticationClient>(options: CreateSalesforceBackendInstallationOptions<AuthenticationClient>): Promise<OntologyBackendInstallation<AuthenticationClient>>;
|
|
36
|
-
//#endregion
|
|
37
|
-
//# sourceMappingURL=createSalesforceBackendInstallation.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"createSalesforceBackendInstallation.d.ts","names":[],"sources":["../../src/installation/createSalesforceBackendInstallation.ts"],"mappings":";;;;;;;YA2BY,8BAA8B,KACtC;YAIQ,2BAA2B;EACnC;EACA;EACA,2BACI,gBACA,oBACA,WAAW,OAAO,gCAClB,sBAAsB,6CACrB,QAAQ;MACX;iBAEW,2CACb,sCAAsC;EAEtC;EACA;EACA;EACA,SAAS;EACT,aAAa,8BAA8B,iCAAiC;EAC5E,iBAAiB;EACjB,iBAAiB,gBAAgB,uBAAuB;;wBA4C5C,8BAA8B;EAC1C;EACA,KAAK;EACL;EACA;EACA;EACA;EACA,2BAA2B;EAC3B;EACA;EACA,SAAS;IACT;wBAgDY,oCACZ,sCAAsC,gCAEtC,SAAS,2CAA2C,wBACrD,QAAQ,4BAA4B"}
|
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
import { createSalesforceConnectionAdapter } from "../connection.js";
|
|
2
|
-
import { createSalesforceOntologyBackend } from "../adapter/createSalesforceOntologyBackendAdapter.js";
|
|
3
|
-
import { createSalesforceMetaOntologyBackendAdapter } from "../meta/createSalesforceMetaOntologyBackendAdapter.js";
|
|
4
|
-
import { createSalesforceClient } from "@party-stack/salesforce-client";
|
|
5
|
-
import { createMetaOntologyConfiguration, createOntologyBackendInstallation } from "@party-stack/ontology";
|
|
6
|
-
//#region src/installation/createSalesforceBackendInstallation.ts
|
|
7
|
-
function createConnectionSalesforceClient(options) {
|
|
8
|
-
return createSalesforceClient({
|
|
9
|
-
instanceUrl: options.instanceUrl,
|
|
10
|
-
apiVersion: options.apiVersion,
|
|
11
|
-
authenticatedFetch: true,
|
|
12
|
-
fetch: (input, init) => options.egress.fetch(new Request(input, init))
|
|
13
|
-
});
|
|
14
|
-
}
|
|
15
|
-
function configureSalesforceMeta(instanceUrl, apiVersion, objectTypeNames, flowActionTypeNames, standardActionTypeNames, standardQueryFunctionTypeNames, crudActionTypes, options) {
|
|
16
|
-
const client = createConnectionSalesforceClient({
|
|
17
|
-
instanceUrl,
|
|
18
|
-
apiVersion,
|
|
19
|
-
egress: options.egress
|
|
20
|
-
});
|
|
21
|
-
return createMetaOntologyConfiguration({ backend: () => createSalesforceMetaOntologyBackendAdapter({
|
|
22
|
-
client,
|
|
23
|
-
objectTypeNames,
|
|
24
|
-
flowActionTypeNames,
|
|
25
|
-
standardActionTypeNames,
|
|
26
|
-
standardQueryFunctionTypeNames,
|
|
27
|
-
crudActionTypes
|
|
28
|
-
}) });
|
|
29
|
-
}
|
|
30
|
-
function createSalesforceOntologyRoute(options) {
|
|
31
|
-
return ({ instanceUrl, apiVersion, subscribeToChangeEvents }) => {
|
|
32
|
-
const route = { matches: (ontologyId) => ontologyId === options.ontologyId };
|
|
33
|
-
const ir = options.ir;
|
|
34
|
-
if (ir) route.configure = ({ egress, connection }) => {
|
|
35
|
-
const client = createConnectionSalesforceClient({
|
|
36
|
-
instanceUrl,
|
|
37
|
-
apiVersion,
|
|
38
|
-
egress
|
|
39
|
-
});
|
|
40
|
-
return {
|
|
41
|
-
ir,
|
|
42
|
-
backend: createSalesforceOntologyBackend({
|
|
43
|
-
client,
|
|
44
|
-
live: options.live,
|
|
45
|
-
subscribeToChangeEvents: subscribeToChangeEvents ? (objectType, listener, subscriptionOptions) => subscribeToChangeEvents(connection.userId, objectType, listener, subscriptionOptions) : void 0
|
|
46
|
-
}),
|
|
47
|
-
persistObjects: options.persistObjects,
|
|
48
|
-
writes: options.writes
|
|
49
|
-
};
|
|
50
|
-
};
|
|
51
|
-
route.configureMeta = (configureOptions) => configureSalesforceMeta(instanceUrl, apiVersion, options.objectTypeNames, options.flowActionTypeNames, options.standardActionTypeNames, options.standardQueryFunctionTypeNames, options.crudActionTypes, configureOptions);
|
|
52
|
-
return route;
|
|
53
|
-
};
|
|
54
|
-
}
|
|
55
|
-
function createSalesforceBackendInstallation(options) {
|
|
56
|
-
let installation;
|
|
57
|
-
const subscribeToChangeEvents = typeof options.connections === "function" ? void 0 : (userId, objectType, listener, subscriptionOptions) => {
|
|
58
|
-
if (!installation) throw new Error("Salesforce installation is not ready.");
|
|
59
|
-
return installation.authentication.subscribeToChangeEvents(userId, objectType, listener, subscriptionOptions);
|
|
60
|
-
};
|
|
61
|
-
const connectionAdapter = typeof options.connections === "function" ? options.connections : createSalesforceConnectionAdapter({
|
|
62
|
-
...options.connections,
|
|
63
|
-
instanceUrl: options.instanceUrl,
|
|
64
|
-
apiVersion: options.apiVersion
|
|
65
|
-
});
|
|
66
|
-
return createOntologyBackendInstallation({
|
|
67
|
-
installationId: options.installationId ?? `salesforce:${new URL(options.instanceUrl).origin}`,
|
|
68
|
-
connections: connectionAdapter,
|
|
69
|
-
runtime: options.runtime,
|
|
70
|
-
routes: options.routes.map((route) => route({
|
|
71
|
-
instanceUrl: options.instanceUrl,
|
|
72
|
-
apiVersion: options.apiVersion,
|
|
73
|
-
subscribeToChangeEvents
|
|
74
|
-
})),
|
|
75
|
-
createContext: options.createContext
|
|
76
|
-
}).then((created) => {
|
|
77
|
-
installation = created;
|
|
78
|
-
return created;
|
|
79
|
-
});
|
|
80
|
-
}
|
|
81
|
-
//#endregion
|
|
82
|
-
export { createSalesforceBackendInstallation, createSalesforceOntologyRoute };
|
|
83
|
-
|
|
84
|
-
//# sourceMappingURL=createSalesforceBackendInstallation.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"createSalesforceBackendInstallation.js","names":[],"sources":["../../src/installation/createSalesforceBackendInstallation.ts"],"sourcesContent":["import {\n createMetaOntologyConfiguration,\n createOntologyBackendInstallation,\n type ConfigureOntologyOptions,\n type LiveOntologyWrites,\n type OntologyBackendInstallation,\n type OntologyConfiguration,\n type OntologyIR,\n type OntologyRoute,\n} from \"@party-stack/ontology\";\nimport {\n createSalesforceClient,\n type SalesforceChangeEvent,\n type SalesforceChangeEventSubscription,\n type SalesforceChangeEventSubscriptionOptions,\n} from \"@party-stack/salesforce-client\";\nimport { createSalesforceOntologyBackend } from \"../adapter/createSalesforceOntologyBackendAdapter.js\";\nimport {\n createSalesforceConnectionAdapter,\n type CreateSalesforceConnectionAdapterOptions,\n type SalesforceAuthenticationClient,\n} from \"../connection.js\";\nimport { createSalesforceMetaOntologyBackendAdapter } from \"../meta/createSalesforceMetaOntologyBackendAdapter.js\";\nimport type { SalesforceCrudActionTypeSelection } from \"../crud.js\";\nimport type { BackendConnectionAdapterProvider, ConnectionEgress } from \"@party-stack/connections\";\nimport type { RuntimeAdapterProvider } from \"@party-stack/runtime\";\n\nexport type SalesforceConnectionOptions = Omit<\n CreateSalesforceConnectionAdapterOptions,\n \"instanceUrl\" | \"apiVersion\"\n>;\n\nexport type SalesforceOntologyRoute = (options: {\n instanceUrl: string;\n apiVersion: string;\n subscribeToChangeEvents?: (\n userId: string,\n objectType: string,\n listener: (event: SalesforceChangeEvent) => void,\n subscriptionOptions?: SalesforceChangeEventSubscriptionOptions\n ) => Promise<SalesforceChangeEventSubscription>;\n}) => OntologyRoute;\n\nexport interface CreateSalesforceBackendInstallationOptions<\n AuthenticationClient extends object = SalesforceAuthenticationClient,\n> {\n installationId?: string;\n instanceUrl: string;\n apiVersion: string;\n runtime: RuntimeAdapterProvider;\n connections: SalesforceConnectionOptions | BackendConnectionAdapterProvider<AuthenticationClient>;\n routes: readonly SalesforceOntologyRoute[];\n createContext?: (userId: string, ontologyId: string) => Record<string, unknown>;\n}\n\nfunction createConnectionSalesforceClient(options: {\n instanceUrl: string;\n apiVersion: string;\n egress: ConnectionEgress;\n}) {\n return createSalesforceClient({\n instanceUrl: options.instanceUrl,\n apiVersion: options.apiVersion,\n authenticatedFetch: true,\n fetch: (input, init) => options.egress.fetch(new Request(input, init)),\n });\n}\n\nfunction configureSalesforceMeta(\n instanceUrl: string,\n apiVersion: string,\n objectTypeNames: string[] | undefined,\n flowActionTypeNames: string[] | undefined,\n standardActionTypeNames: string[] | undefined,\n standardQueryFunctionTypeNames: string[] | undefined,\n crudActionTypes: readonly SalesforceCrudActionTypeSelection[] | undefined,\n options: ConfigureOntologyOptions\n): OntologyConfiguration {\n const client = createConnectionSalesforceClient({\n instanceUrl,\n apiVersion,\n egress: options.egress,\n });\n return createMetaOntologyConfiguration({\n backend: () =>\n createSalesforceMetaOntologyBackendAdapter({\n client,\n objectTypeNames,\n flowActionTypeNames,\n standardActionTypeNames,\n standardQueryFunctionTypeNames,\n crudActionTypes,\n }),\n });\n}\n\nexport function createSalesforceOntologyRoute(options: {\n ontologyId: string;\n ir?: OntologyIR;\n objectTypeNames?: string[];\n flowActionTypeNames?: string[];\n standardActionTypeNames?: string[];\n standardQueryFunctionTypeNames?: string[];\n crudActionTypes?: readonly SalesforceCrudActionTypeSelection[];\n live?: boolean;\n persistObjects?: boolean;\n writes?: LiveOntologyWrites;\n}): SalesforceOntologyRoute {\n return ({ instanceUrl, apiVersion, subscribeToChangeEvents }) => {\n const route: OntologyRoute = {\n matches: (ontologyId) => ontologyId === options.ontologyId,\n };\n const ir = options.ir;\n if (ir) {\n route.configure = ({ egress, connection }) => {\n const client = createConnectionSalesforceClient({\n instanceUrl,\n apiVersion,\n egress,\n });\n return {\n ir,\n backend: createSalesforceOntologyBackend({\n client,\n live: options.live,\n subscribeToChangeEvents: subscribeToChangeEvents\n ? (objectType, listener, subscriptionOptions) =>\n subscribeToChangeEvents(\n connection.userId,\n objectType,\n listener,\n subscriptionOptions\n )\n : undefined,\n }),\n persistObjects: options.persistObjects,\n writes: options.writes,\n };\n };\n }\n route.configureMeta = (configureOptions) =>\n configureSalesforceMeta(\n instanceUrl,\n apiVersion,\n options.objectTypeNames,\n options.flowActionTypeNames,\n options.standardActionTypeNames,\n options.standardQueryFunctionTypeNames,\n options.crudActionTypes,\n configureOptions\n );\n return route;\n };\n}\n\nexport function createSalesforceBackendInstallation<\n AuthenticationClient extends object = SalesforceAuthenticationClient,\n>(\n options: CreateSalesforceBackendInstallationOptions<AuthenticationClient>\n): Promise<OntologyBackendInstallation<AuthenticationClient>> {\n let installation: OntologyBackendInstallation<AuthenticationClient> | undefined;\n const subscribeToChangeEvents =\n typeof options.connections === \"function\"\n ? undefined\n : (\n userId: string,\n objectType: string,\n listener: (event: SalesforceChangeEvent) => void,\n subscriptionOptions?: SalesforceChangeEventSubscriptionOptions\n ) => {\n if (!installation) {\n throw new Error(\"Salesforce installation is not ready.\");\n }\n return (\n installation.authentication as unknown as SalesforceAuthenticationClient\n ).subscribeToChangeEvents(userId, objectType, listener, subscriptionOptions);\n };\n const connectionAdapter =\n typeof options.connections === \"function\"\n ? options.connections\n : (createSalesforceConnectionAdapter({\n ...options.connections,\n instanceUrl: options.instanceUrl,\n apiVersion: options.apiVersion,\n }) as BackendConnectionAdapterProvider<AuthenticationClient>);\n return createOntologyBackendInstallation<AuthenticationClient>({\n installationId: options.installationId ?? `salesforce:${new URL(options.instanceUrl).origin}`,\n connections: connectionAdapter,\n runtime: options.runtime,\n routes: options.routes.map((route) =>\n route({\n instanceUrl: options.instanceUrl,\n apiVersion: options.apiVersion,\n subscribeToChangeEvents,\n })\n ),\n createContext: options.createContext,\n }).then((created) => {\n installation = created;\n return created;\n });\n}\n"],"mappings":";;;;;;AAuDA,SAAS,iCAAiC,SAIvC;CACC,OAAO,uBAAuB;EAC1B,aAAa,QAAQ;EACrB,YAAY,QAAQ;EACpB,oBAAoB;EACpB,QAAQ,OAAO,SAAS,QAAQ,OAAO,MAAM,IAAI,QAAQ,OAAO,IAAI,CAAC;CACzE,CAAC;AACL;AAEA,SAAS,wBACL,aACA,YACA,iBACA,qBACA,yBACA,gCACA,iBACA,SACqB;CACrB,MAAM,SAAS,iCAAiC;EAC5C;EACA;EACA,QAAQ,QAAQ;CACpB,CAAC;CACD,OAAO,gCAAgC,EACnC,eACI,2CAA2C;EACvC;EACA;EACA;EACA;EACA;EACA;CACJ,CAAC,EACT,CAAC;AACL;AAEA,SAAgB,8BAA8B,SAWlB;CACxB,QAAQ,EAAE,aAAa,YAAY,8BAA8B;EAC7D,MAAM,QAAuB,EACzB,UAAU,eAAe,eAAe,QAAQ,WACpD;EACA,MAAM,KAAK,QAAQ;EACnB,IAAI,IACA,MAAM,aAAa,EAAE,QAAQ,iBAAiB;GAC1C,MAAM,SAAS,iCAAiC;IAC5C;IACA;IACA;GACJ,CAAC;GACD,OAAO;IACH;IACA,SAAS,gCAAgC;KACrC;KACA,MAAM,QAAQ;KACd,yBAAyB,2BAClB,YAAY,UAAU,wBACnB,wBACI,WAAW,QACX,YACA,UACA,mBACJ,IACJ,KAAA;IACV,CAAC;IACD,gBAAgB,QAAQ;IACxB,QAAQ,QAAQ;GACpB;EACJ;EAEJ,MAAM,iBAAiB,qBACnB,wBACI,aACA,YACA,QAAQ,iBACR,QAAQ,qBACR,QAAQ,yBACR,QAAQ,gCACR,QAAQ,iBACR,gBACJ;EACJ,OAAO;CACX;AACJ;AAEA,SAAgB,oCAGZ,SAC0D;CAC1D,IAAI;CACJ,MAAM,0BACF,OAAO,QAAQ,gBAAgB,aACzB,KAAA,KAEI,QACA,YACA,UACA,wBACC;EACD,IAAI,CAAC,cACD,MAAM,IAAI,MAAM,uCAAuC;EAE3D,OACI,aAAa,eACf,wBAAwB,QAAQ,YAAY,UAAU,mBAAmB;CAC/E;CACV,MAAM,oBACF,OAAO,QAAQ,gBAAgB,aACzB,QAAQ,cACP,kCAAkC;EAC/B,GAAG,QAAQ;EACX,aAAa,QAAQ;EACrB,YAAY,QAAQ;CACxB,CAAC;CACX,OAAO,kCAAwD;EAC3D,gBAAgB,QAAQ,kBAAkB,cAAc,IAAI,IAAI,QAAQ,WAAW,CAAC,CAAC;EACrF,aAAa;EACb,SAAS,QAAQ;EACjB,QAAQ,QAAQ,OAAO,KAAK,UACxB,MAAM;GACF,aAAa,QAAQ;GACrB,YAAY,QAAQ;GACpB;EACJ,CAAC,CACL;EACA,eAAe,QAAQ;CAC3B,CAAC,CAAC,CAAC,MAAM,YAAY;EACjB,eAAe;EACf,OAAO;CACX,CAAC;AACL"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import { CreateSalesforceBackendInstallationOptions, SalesforceConnectionOptions, SalesforceOntologyRoute, createSalesforceBackendInstallation, createSalesforceOntologyRoute } from "./createSalesforceBackendInstallation.js";
|
|
2
|
-
export { type CreateSalesforceBackendInstallationOptions, type SalesforceConnectionOptions, type SalesforceOntologyRoute, createSalesforceBackendInstallation, createSalesforceOntologyRoute };
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export { createSalesforceBackendInstallation, createSalesforceOntologyRoute } from "./createSalesforceBackendInstallation.js";
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { SalesforceCrudActionTypeSelection } from "../crud.js";
|
|
2
|
-
import { SalesforceClient } from "@party-stack/salesforce-client";
|
|
3
|
-
import { OntologyCollectionOptions } from "@party-stack/ontology";
|
|
4
|
-
import { QueryClient } from "@tanstack/query-core";
|
|
5
|
-
//#region src/meta/actionTypeCollectionOptions.d.ts
|
|
6
|
-
export interface ActionTypeCollectionOpts {
|
|
7
|
-
client: SalesforceClient;
|
|
8
|
-
flowActionTypeNames?: string[];
|
|
9
|
-
standardActionTypeNames?: string[];
|
|
10
|
-
crudActionTypes?: readonly SalesforceCrudActionTypeSelection[];
|
|
11
|
-
queryClient?: QueryClient;
|
|
12
|
-
}
|
|
13
|
-
export declare function actionTypeCollectionOptions(opts: ActionTypeCollectionOpts): OntologyCollectionOptions;
|
|
14
|
-
//#endregion
|
|
15
|
-
//# sourceMappingURL=actionTypeCollectionOptions.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"actionTypeCollectionOptions.d.ts","names":[],"sources":["../../src/meta/actionTypeCollectionOptions.ts"],"mappings":";;;;;iBAoBiB;EACb,QAAQ;EACR;EACA;EACA,2BAA2B;EAC3B,cAAc;;wBAqGF,4BAA4B,MAAM,2BAA2B"}
|
|
@@ -1,121 +0,0 @@
|
|
|
1
|
-
import { classifySalesforceStandardAction } from "../standardActions.js";
|
|
2
|
-
import { salesforceCrudActionTypeId, salesforceCrudActionTypeName } from "../utils/ids.js";
|
|
3
|
-
import { convertSalesforceMetaActionType, convertSalesforceMetaStandardActionType } from "./convertMetaActionType.js";
|
|
4
|
-
import { convertMetaNameQuery, matchesMetaNameQuery } from "./convertMetaLoadSubsetOptions.js";
|
|
5
|
-
import { synthesizeSalesforceCrudActionTypes } from "./synthesizeCrudActionTypes.js";
|
|
6
|
-
import { QueryClient } from "@tanstack/query-core";
|
|
7
|
-
import { queryCollectionOptions } from "@tanstack/query-db-collection";
|
|
8
|
-
//#region src/meta/actionTypeCollectionOptions.ts
|
|
9
|
-
function normalizeFlowActionList(response) {
|
|
10
|
-
if (Array.isArray(response)) return response;
|
|
11
|
-
if (typeof response === "object" && response !== null && "actions" in response) return Array.isArray(response.actions) ? response.actions : [];
|
|
12
|
-
return Object.keys(response).map((name) => ({ name }));
|
|
13
|
-
}
|
|
14
|
-
async function loadFlowActionDescribe(client, apiName) {
|
|
15
|
-
try {
|
|
16
|
-
return await client.describeFlowAction(apiName);
|
|
17
|
-
} catch {
|
|
18
|
-
return;
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
async function loadStandardActionDescribe(client, apiName) {
|
|
22
|
-
try {
|
|
23
|
-
return await client.describeStandardAction(apiName);
|
|
24
|
-
} catch {
|
|
25
|
-
return;
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
async function loadFlowActionDescribes(client, names) {
|
|
29
|
-
if (typeof client.describeFlowActions === "function") try {
|
|
30
|
-
return await client.describeFlowActions(names);
|
|
31
|
-
} catch {}
|
|
32
|
-
return Promise.all(names.map((name) => loadFlowActionDescribe(client, name)));
|
|
33
|
-
}
|
|
34
|
-
async function loadStandardActionDescribes(client, names) {
|
|
35
|
-
if (typeof client.describeStandardActions === "function") try {
|
|
36
|
-
return await client.describeStandardActions(names);
|
|
37
|
-
} catch {}
|
|
38
|
-
return Promise.all(names.map((name) => loadStandardActionDescribe(client, name)));
|
|
39
|
-
}
|
|
40
|
-
async function loadSelectedActionDescribes(client, flowNames, standardNames) {
|
|
41
|
-
if (typeof client.describeInvocableActions === "function") try {
|
|
42
|
-
const combined = await client.describeInvocableActions([...flowNames.map((apiName) => ({
|
|
43
|
-
kind: "flow",
|
|
44
|
-
apiName
|
|
45
|
-
})), ...standardNames.map((apiName) => ({
|
|
46
|
-
kind: "standard",
|
|
47
|
-
apiName
|
|
48
|
-
}))]);
|
|
49
|
-
return [combined.slice(0, flowNames.length), combined.slice(flowNames.length)];
|
|
50
|
-
} catch {}
|
|
51
|
-
return Promise.all([flowNames.length > 0 ? loadFlowActionDescribes(client, flowNames) : [], standardNames.length > 0 ? loadStandardActionDescribes(client, standardNames) : []]);
|
|
52
|
-
}
|
|
53
|
-
function actionTypeCollectionOptions(opts) {
|
|
54
|
-
const describeCache = /* @__PURE__ */ new Map();
|
|
55
|
-
return queryCollectionOptions({
|
|
56
|
-
queryClient: opts.queryClient ?? new QueryClient(),
|
|
57
|
-
getKey: (row) => row.name,
|
|
58
|
-
queryKey: [
|
|
59
|
-
"salesforce",
|
|
60
|
-
"ontology",
|
|
61
|
-
"actionTypes",
|
|
62
|
-
opts.flowActionTypeNames ?? "all",
|
|
63
|
-
opts.standardActionTypeNames ?? [],
|
|
64
|
-
opts.crudActionTypes ?? []
|
|
65
|
-
],
|
|
66
|
-
syncMode: "on-demand",
|
|
67
|
-
queryFn: async (ctx) => {
|
|
68
|
-
const query = convertMetaNameQuery(ctx.meta?.loadSubsetOptions);
|
|
69
|
-
const requestedNames = query.type === "getBatch" ? new Set(query.names) : void 0;
|
|
70
|
-
const configuredCrudNames = new Set((opts.crudActionTypes ?? []).flatMap((selection) => selection.operations.map((operation) => salesforceCrudActionTypeName(operation, selection.objectType))));
|
|
71
|
-
const [flowSummaries, standardSummaries] = await Promise.all([opts.flowActionTypeNames || requestedNames ? Promise.resolve(void 0) : opts.client.listFlowActions().then(normalizeFlowActionList), opts.standardActionTypeNames || requestedNames ? Promise.resolve(void 0) : opts.client.listStandardActions().then(normalizeFlowActionList)]);
|
|
72
|
-
const candidates = [...(opts.flowActionTypeNames ?? (requestedNames ? [...requestedNames].filter((name) => !configuredCrudNames.has(name)) : flowSummaries?.map((summary) => summary.name) ?? [])).map((name) => ({
|
|
73
|
-
kind: "flow",
|
|
74
|
-
name,
|
|
75
|
-
displayName: flowSummaries?.find((summary) => summary.name === name)?.label ?? name
|
|
76
|
-
})), ...(opts.standardActionTypeNames ?? (requestedNames ? [...requestedNames].filter((name) => !configuredCrudNames.has(name)) : standardSummaries?.filter((summary) => classifySalesforceStandardAction(summary.name) === "action").map((summary) => summary.name) ?? [])).map((name) => ({
|
|
77
|
-
kind: "standard",
|
|
78
|
-
name,
|
|
79
|
-
displayName: standardSummaries?.find((summary) => summary.name === name)?.label ?? name
|
|
80
|
-
}))];
|
|
81
|
-
const matchingCandidates = query.type === "search" ? candidates.filter((candidate) => matchesMetaNameQuery(query, candidate)) : candidates;
|
|
82
|
-
matchingCandidates.sort((left, right) => left.name.localeCompare(right.name));
|
|
83
|
-
const offset = Math.max(0, Math.trunc(ctx.meta?.loadSubsetOptions?.offset ?? 0));
|
|
84
|
-
const limit = ctx.meta?.loadSubsetOptions?.limit;
|
|
85
|
-
const selectedCandidates = requestedNames ? matchingCandidates : matchingCandidates.slice(offset, limit === void 0 ? void 0 : offset + Math.max(0, Math.trunc(limit)));
|
|
86
|
-
const names = selectedCandidates.filter((candidate) => candidate.kind === "flow").map((candidate) => candidate.name);
|
|
87
|
-
const standardNames = selectedCandidates.filter((candidate) => candidate.kind === "standard").map((candidate) => candidate.name);
|
|
88
|
-
const describeCacheKey = JSON.stringify([names, standardNames]);
|
|
89
|
-
let cached = describeCache.get(describeCacheKey);
|
|
90
|
-
if (!cached) {
|
|
91
|
-
cached = loadSelectedActionDescribes(opts.client, names, standardNames);
|
|
92
|
-
describeCache.set(describeCacheKey, cached);
|
|
93
|
-
}
|
|
94
|
-
const [describes, rawStandardDescribes] = await cached;
|
|
95
|
-
const standardDescribes = rawStandardDescribes.filter((describe) => Boolean(describe) && (opts.standardActionTypeNames !== void 0 || classifySalesforceStandardAction(describe.name) === "action"));
|
|
96
|
-
const flowDescribes = describes.filter((describe) => Boolean(describe));
|
|
97
|
-
const sObjectNames = new Set((opts.crudActionTypes ?? []).map((selection) => selection.objectType));
|
|
98
|
-
for (const describe of [...flowDescribes, ...standardDescribes]) for (const input of describe.inputs ?? []) {
|
|
99
|
-
const sObjectType = input.sobjectType ?? input.sObjectType;
|
|
100
|
-
if (input.type?.toLowerCase() === "sobject" && sObjectType) sObjectNames.add(sObjectType);
|
|
101
|
-
}
|
|
102
|
-
const sObjectDescribes = new Map(await Promise.all([...sObjectNames].map(async (name) => [name, await opts.client.describeSObject(name)])));
|
|
103
|
-
const flowActions = flowDescribes.map((describe) => convertSalesforceMetaActionType(describe, sObjectDescribes));
|
|
104
|
-
const standardActions = standardDescribes.map((describe) => convertSalesforceMetaStandardActionType(describe, sObjectDescribes));
|
|
105
|
-
const crudActions = (opts.crudActionTypes ?? []).flatMap((selection) => {
|
|
106
|
-
const describe = sObjectDescribes.get(selection.objectType);
|
|
107
|
-
return describe ? synthesizeSalesforceCrudActionTypes(describe).filter((action) => (!requestedNames || requestedNames.has(action.name)) && matchesMetaNameQuery(query, action) && selection.operations.some((operation) => action.id === salesforceCrudActionTypeId(operation, selection.objectType))) : [];
|
|
108
|
-
});
|
|
109
|
-
const actions = new Map([...flowActions, ...standardActions].map((action) => [action.name, action]));
|
|
110
|
-
for (const action of crudActions) {
|
|
111
|
-
if (actions.has(action.name)) throw new Error(`Multiple Salesforce actions use ontology name "${action.name}".`);
|
|
112
|
-
actions.set(action.name, action);
|
|
113
|
-
}
|
|
114
|
-
return [...actions.values()];
|
|
115
|
-
}
|
|
116
|
-
});
|
|
117
|
-
}
|
|
118
|
-
//#endregion
|
|
119
|
-
export { actionTypeCollectionOptions };
|
|
120
|
-
|
|
121
|
-
//# sourceMappingURL=actionTypeCollectionOptions.js.map
|