@party-stack/salesforce-ontology 0.4.0 → 0.4.2
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 +22 -31
- package/lib/actionMetadata.d.ts +11 -9
- package/lib/actionMetadata.d.ts.map +1 -1
- package/lib/actionMetadata.js +19 -30
- package/lib/actionMetadata.js.map +1 -1
- package/lib/adapter/convertLoadSubsetOptions.d.ts +10 -8
- package/lib/adapter/convertLoadSubsetOptions.d.ts.map +1 -1
- package/lib/adapter/convertLoadSubsetOptions.js +110 -173
- package/lib/adapter/convertLoadSubsetOptions.js.map +1 -1
- package/lib/adapter/createSalesforceOntologyBackendAdapter.d.ts +14 -12
- package/lib/adapter/createSalesforceOntologyBackendAdapter.d.ts.map +1 -1
- package/lib/adapter/createSalesforceOntologyBackendAdapter.js +124 -191
- package/lib/adapter/createSalesforceOntologyBackendAdapter.js.map +1 -1
- package/lib/adapter/index.d.ts +5 -5
- package/lib/adapter/index.js +5 -5
- package/lib/adapter/objectCollectionOptions.d.ts +22 -22
- package/lib/adapter/objectCollectionOptions.d.ts.map +1 -1
- package/lib/adapter/objectCollectionOptions.js +198 -280
- package/lib/adapter/objectCollectionOptions.js.map +1 -1
- package/lib/adapter/salesforceCodec.d.ts +6 -4
- package/lib/adapter/salesforceCodec.d.ts.map +1 -1
- package/lib/adapter/salesforceCodec.js +126 -190
- package/lib/adapter/salesforceCodec.js.map +1 -1
- package/lib/config/index.d.ts +20 -18
- package/lib/config/index.d.ts.map +1 -1
- package/lib/config/index.js +148 -192
- package/lib/config/index.js.map +1 -1
- package/lib/connection.d.ts +35 -33
- package/lib/connection.d.ts.map +1 -1
- package/lib/connection.js +243 -299
- package/lib/connection.js.map +1 -1
- package/lib/crud.d.ts +5 -3
- package/lib/crud.d.ts.map +1 -1
- package/lib/crud.js +0 -1
- package/lib/index.d.ts +10 -5
- package/lib/index.js +10 -5
- package/lib/installation/createSalesforceBackendInstallation.d.ts +28 -26
- package/lib/installation/createSalesforceBackendInstallation.d.ts.map +1 -1
- package/lib/installation/createSalesforceBackendInstallation.js +75 -85
- package/lib/installation/createSalesforceBackendInstallation.js.map +1 -1
- package/lib/installation/index.d.ts +2 -2
- package/lib/installation/index.js +1 -2
- package/lib/meta/actionTypeCollectionOptions.d.ts +10 -8
- package/lib/meta/actionTypeCollectionOptions.d.ts.map +1 -1
- package/lib/meta/actionTypeCollectionOptions.js +105 -212
- package/lib/meta/actionTypeCollectionOptions.js.map +1 -1
- package/lib/meta/convertMetaActionType.d.ts +4 -2
- package/lib/meta/convertMetaActionType.d.ts.map +1 -1
- package/lib/meta/convertMetaActionType.js +32 -32
- package/lib/meta/convertMetaActionType.js.map +1 -1
- package/lib/meta/convertMetaLinkType.d.ts +4 -2
- package/lib/meta/convertMetaLinkType.d.ts.map +1 -1
- package/lib/meta/convertMetaLinkType.js +39 -45
- package/lib/meta/convertMetaLinkType.js.map +1 -1
- package/lib/meta/convertMetaLoadSubsetOptions.d.ts +12 -10
- package/lib/meta/convertMetaLoadSubsetOptions.d.ts.map +1 -1
- package/lib/meta/convertMetaLoadSubsetOptions.js +42 -58
- package/lib/meta/convertMetaLoadSubsetOptions.js.map +1 -1
- package/lib/meta/convertMetaObjectType.d.ts +4 -2
- package/lib/meta/convertMetaObjectType.d.ts.map +1 -1
- package/lib/meta/convertMetaObjectType.js +36 -40
- package/lib/meta/convertMetaObjectType.js.map +1 -1
- package/lib/meta/convertMetaQueryFunctionType.d.ts +4 -2
- package/lib/meta/convertMetaQueryFunctionType.d.ts.map +1 -1
- package/lib/meta/convertMetaQueryFunctionType.js +27 -25
- package/lib/meta/convertMetaQueryFunctionType.js.map +1 -1
- package/lib/meta/convertMetaTypeDef.d.ts +10 -8
- package/lib/meta/convertMetaTypeDef.d.ts.map +1 -1
- package/lib/meta/convertMetaTypeDef.js +196 -188
- package/lib/meta/convertMetaTypeDef.js.map +1 -1
- package/lib/meta/createSalesforceMetaOntologyBackendAdapter.d.ts +19 -17
- package/lib/meta/createSalesforceMetaOntologyBackendAdapter.d.ts.map +1 -1
- package/lib/meta/createSalesforceMetaOntologyBackendAdapter.js +38 -40
- package/lib/meta/createSalesforceMetaOntologyBackendAdapter.js.map +1 -1
- package/lib/meta/entityCollectionOptions.d.ts +10 -8
- package/lib/meta/entityCollectionOptions.d.ts.map +1 -1
- package/lib/meta/entityCollectionOptions.js +73 -82
- package/lib/meta/entityCollectionOptions.js.map +1 -1
- package/lib/meta/index.d.ts +7 -7
- package/lib/meta/index.js +7 -7
- package/lib/meta/queryFunctionTypeCollectionOptions.d.ts +7 -5
- package/lib/meta/queryFunctionTypeCollectionOptions.d.ts.map +1 -1
- package/lib/meta/queryFunctionTypeCollectionOptions.js +53 -91
- package/lib/meta/queryFunctionTypeCollectionOptions.js.map +1 -1
- package/lib/meta/synthesizeCrudActionTypes.d.ts +4 -2
- package/lib/meta/synthesizeCrudActionTypes.d.ts.map +1 -1
- package/lib/meta/synthesizeCrudActionTypes.js +77 -116
- package/lib/meta/synthesizeCrudActionTypes.js.map +1 -1
- package/lib/standardActions.d.ts +2 -0
- package/lib/standardActions.d.ts.map +1 -1
- package/lib/standardActions.js +22 -20
- package/lib/standardActions.js.map +1 -1
- package/lib/utils/AsyncIterable.d.ts +2 -0
- package/lib/utils/AsyncIterable.d.ts.map +1 -1
- package/lib/utils/AsyncIterable.js +20 -23
- package/lib/utils/AsyncIterable.js.map +1 -1
- package/lib/utils/ids.d.ts +2 -0
- package/lib/utils/ids.d.ts.map +1 -1
- package/lib/utils/ids.js +23 -19
- package/lib/utils/ids.js.map +1 -1
- package/package.json +18 -24
- package/lib/adapter/convertLoadSubsetOptions.test.d.ts +0 -2
- package/lib/adapter/convertLoadSubsetOptions.test.d.ts.map +0 -1
- package/lib/adapter/convertLoadSubsetOptions.test.js +0 -80
- package/lib/adapter/convertLoadSubsetOptions.test.js.map +0 -1
- package/lib/adapter/createSalesforceOntologyBackendAdapter.test.d.ts +0 -2
- package/lib/adapter/createSalesforceOntologyBackendAdapter.test.d.ts.map +0 -1
- package/lib/adapter/createSalesforceOntologyBackendAdapter.test.js +0 -394
- package/lib/adapter/createSalesforceOntologyBackendAdapter.test.js.map +0 -1
- package/lib/adapter/index.d.ts.map +0 -1
- package/lib/adapter/index.js.map +0 -1
- package/lib/adapter/objectCollectionOptions.test.d.ts +0 -2
- package/lib/adapter/objectCollectionOptions.test.d.ts.map +0 -1
- package/lib/adapter/objectCollectionOptions.test.js +0 -160
- package/lib/adapter/objectCollectionOptions.test.js.map +0 -1
- package/lib/adapter/salesforceCodec.test.d.ts +0 -2
- package/lib/adapter/salesforceCodec.test.d.ts.map +0 -1
- package/lib/adapter/salesforceCodec.test.js +0 -57
- package/lib/adapter/salesforceCodec.test.js.map +0 -1
- package/lib/config/index.test.d.ts +0 -2
- package/lib/config/index.test.d.ts.map +0 -1
- package/lib/config/index.test.js +0 -177
- package/lib/config/index.test.js.map +0 -1
- package/lib/connection.test.d.ts +0 -2
- package/lib/connection.test.d.ts.map +0 -1
- package/lib/connection.test.js +0 -189
- package/lib/connection.test.js.map +0 -1
- package/lib/crud.js.map +0 -1
- package/lib/index.d.ts.map +0 -1
- package/lib/index.js.map +0 -1
- package/lib/installation/createSalesforceBackendInstallation.test.d.ts +0 -2
- package/lib/installation/createSalesforceBackendInstallation.test.d.ts.map +0 -1
- package/lib/installation/createSalesforceBackendInstallation.test.js +0 -55
- package/lib/installation/createSalesforceBackendInstallation.test.js.map +0 -1
- package/lib/installation/index.d.ts.map +0 -1
- package/lib/installation/index.js.map +0 -1
- package/lib/meta/actionTypeCollectionOptions.test.d.ts +0 -2
- package/lib/meta/actionTypeCollectionOptions.test.d.ts.map +0 -1
- package/lib/meta/actionTypeCollectionOptions.test.js +0 -192
- package/lib/meta/actionTypeCollectionOptions.test.js.map +0 -1
- package/lib/meta/convertMetaActionType.test.d.ts +0 -2
- package/lib/meta/convertMetaActionType.test.d.ts.map +0 -1
- package/lib/meta/convertMetaActionType.test.js +0 -185
- package/lib/meta/convertMetaActionType.test.js.map +0 -1
- package/lib/meta/convertMetaObjectType.test.d.ts +0 -2
- package/lib/meta/convertMetaObjectType.test.d.ts.map +0 -1
- package/lib/meta/convertMetaObjectType.test.js +0 -187
- package/lib/meta/convertMetaObjectType.test.js.map +0 -1
- package/lib/meta/convertMetaQueryFunctionType.test.d.ts +0 -2
- package/lib/meta/convertMetaQueryFunctionType.test.d.ts.map +0 -1
- package/lib/meta/convertMetaQueryFunctionType.test.js +0 -58
- package/lib/meta/convertMetaQueryFunctionType.test.js.map +0 -1
- package/lib/meta/entityCollectionOptions.test.d.ts +0 -2
- package/lib/meta/entityCollectionOptions.test.d.ts.map +0 -1
- package/lib/meta/entityCollectionOptions.test.js +0 -120
- package/lib/meta/entityCollectionOptions.test.js.map +0 -1
- package/lib/meta/index.d.ts.map +0 -1
- package/lib/meta/index.js.map +0 -1
- package/lib/meta/queryFunctionTypeCollectionOptions.test.d.ts +0 -2
- package/lib/meta/queryFunctionTypeCollectionOptions.test.d.ts.map +0 -1
- package/lib/meta/queryFunctionTypeCollectionOptions.test.js +0 -71
- package/lib/meta/queryFunctionTypeCollectionOptions.test.js.map +0 -1
- package/lib/meta/synthesizeCrudActionTypes.test.d.ts +0 -2
- package/lib/meta/synthesizeCrudActionTypes.test.d.ts.map +0 -1
- package/lib/meta/synthesizeCrudActionTypes.test.js +0 -153
- package/lib/meta/synthesizeCrudActionTypes.test.js.map +0 -1
package/lib/connection.js
CHANGED
|
@@ -1,314 +1,258 @@
|
|
|
1
|
-
import { withHttpAuthenticationErrorHandling, withHttpRetryHandling
|
|
1
|
+
import { withHttpAuthenticationErrorHandling, withHttpRetryHandling } from "@party-stack/connections";
|
|
2
2
|
import { unauthenticated } from "@party-stack/errors";
|
|
3
|
-
import { createClientCredentialsOAuthClient, createPublicOAuthClient
|
|
4
|
-
import { createSalesforceClient
|
|
5
|
-
|
|
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
|
+
];
|
|
6
11
|
function normalizeUrl(value) {
|
|
7
|
-
|
|
12
|
+
return value.replace(/\/+$/, "");
|
|
8
13
|
}
|
|
9
14
|
function activeState(expiresAt, refreshable) {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
},
|
|
18
|
-
};
|
|
15
|
+
return expiresAt === void 0 ? { status: "active" } : {
|
|
16
|
+
status: "active",
|
|
17
|
+
expiration: {
|
|
18
|
+
expiresAt,
|
|
19
|
+
refreshable
|
|
20
|
+
}
|
|
21
|
+
};
|
|
19
22
|
}
|
|
20
23
|
async function resolveSalesforceUserId(options) {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
throw new Error(`Salesforce userinfo failed with status ${response.status}: ${await response.text()}`);
|
|
32
|
-
}
|
|
33
|
-
const user = (await response.json());
|
|
34
|
-
const userId = user.user_id ?? user.sub;
|
|
35
|
-
if (!userId) {
|
|
36
|
-
throw new Error("Salesforce userinfo did not return user_id or sub.");
|
|
37
|
-
}
|
|
38
|
-
return userId;
|
|
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;
|
|
39
34
|
}
|
|
40
35
|
function assertSalesforceOrigin(request, instanceUrl) {
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
if (actual !== expected) {
|
|
44
|
-
throw new Error(`Salesforce egress not allowed for origin "${actual}".`);
|
|
45
|
-
}
|
|
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}".`);
|
|
46
38
|
}
|
|
47
39
|
function createSalesforceEgressWrapper(options) {
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
}
|
|
67
|
-
return response;
|
|
68
|
-
},
|
|
69
|
-
}));
|
|
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
|
+
}));
|
|
70
58
|
}
|
|
71
59
|
async function createSalesforceConnectionAdapterInstance(options, context) {
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
if (!clientCredentialsOauth) {
|
|
264
|
-
throw new Error("Salesforce client credentials are not configured.");
|
|
265
|
-
}
|
|
266
|
-
if (typeof window !==
|
|
267
|
-
"undefined") {
|
|
268
|
-
throw new Error("Salesforce client credentials cannot run in a browser.");
|
|
269
|
-
}
|
|
270
|
-
const connectionSession = await createClientCredentialsSession();
|
|
271
|
-
await controller.connect(connectionSession);
|
|
272
|
-
return connectionSession.connection;
|
|
273
|
-
},
|
|
274
|
-
async accessToken(authenticationOptions = {}) {
|
|
275
|
-
const connectionSession = await createTokenSession(authenticationOptions);
|
|
276
|
-
if (authenticationOptions.token === undefined && options.token) {
|
|
277
|
-
tokenActive = true;
|
|
278
|
-
}
|
|
279
|
-
await controller.connect(connectionSession);
|
|
280
|
-
return connectionSession.connection;
|
|
281
|
-
},
|
|
282
|
-
},
|
|
283
|
-
};
|
|
284
|
-
},
|
|
285
|
-
async restoreConnections() {
|
|
286
|
-
const restored = new Map();
|
|
287
|
-
if (tokenActive && options.token) {
|
|
288
|
-
const session = await createTokenSession();
|
|
289
|
-
restored.set(session.connection.userId, session);
|
|
290
|
-
}
|
|
291
|
-
if (publicOauth) {
|
|
292
|
-
for (const oauthSession of await publicOauth.restoreSessions()) {
|
|
293
|
-
const session = createPublicSession(oauthSession);
|
|
294
|
-
restored.set(session.connection.userId, session);
|
|
295
|
-
}
|
|
296
|
-
}
|
|
297
|
-
if (clientCredentialsOauth &&
|
|
298
|
-
typeof window === "undefined") {
|
|
299
|
-
const session = await createClientCredentialsSession();
|
|
300
|
-
restored.set(session.connection.userId, session);
|
|
301
|
-
}
|
|
302
|
-
return [...restored.values()];
|
|
303
|
-
},
|
|
304
|
-
async cleanup() {
|
|
305
|
-
tokenProviders.clear();
|
|
306
|
-
await publicOauth?.cleanup();
|
|
307
|
-
clientCredentialsOauth?.cleanup();
|
|
308
|
-
},
|
|
309
|
-
};
|
|
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
|
+
};
|
|
310
251
|
}
|
|
311
|
-
|
|
312
|
-
|
|
252
|
+
function createSalesforceConnectionAdapter(options) {
|
|
253
|
+
return (context) => createSalesforceConnectionAdapterInstance(options, context);
|
|
313
254
|
}
|
|
255
|
+
//#endregion
|
|
256
|
+
export { createSalesforceConnectionAdapter };
|
|
257
|
+
|
|
314
258
|
//# sourceMappingURL=connection.js.map
|
package/lib/connection.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connection.js","sourceRoot":"","sources":["../src/connection.ts"],"names":[],"mappings":"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"}
|
|
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":";;;;;AA4EA,MAAM,iBAAiB;CAAC;CAAO;CAAiB;AAAQ;AAExD,SAAS,aAAa,OAAuB;CACzC,OAAO,MAAM,QAAQ,QAAQ,EAAE;AACnC;AAEA,SAAS,YAAY,WAA+B,aAAqD;CACrG,OAAO,cAAc,KAAA,IACf,EAAE,QAAQ,SAAS,IACnB;EACI,QAAQ;EACR,YAAY;GACR;GACA;EACJ;CACJ;AACV;AAEA,eAAe,wBAAwB,SAInB;CAChB,MAAM,WAAW,MAAM,QAAQ,MAAM,GAAG,QAAQ,SAAS,4BAA4B,EACjF,SAAS;EACL,eAAe,UAAU,QAAQ;EACjC,QAAQ;CACZ,EACJ,CAAC;CACD,IAAI,SAAS,WAAW,KACpB,MAAM,gBAAgB,gDAAgD;CAE1E,IAAI,CAAC,SAAS,IACV,MAAM,IAAI,MACN,0CAA0C,SAAS,OAAO,IAAI,MAAM,SAAS,KAAK,GACtF;CAEJ,MAAM,OAAQ,MAAM,SAAS,KAAK;CAClC,MAAM,SAAS,KAAK,WAAW,KAAK;CACpC,IAAI,CAAC,QACD,MAAM,IAAI,MAAM,oDAAoD;CAExE,OAAO;AACX;AAEA,SAAS,uBAAuB,SAAkB,aAA2B;CACzE,MAAM,SAAS,IAAI,IAAI,QAAQ,GAAG,CAAC,CAAC;CAEpC,IAAI,WADa,IAAI,IAAI,WAAW,CAAC,CAAC,QAElC,MAAM,IAAI,MAAM,6CAA6C,OAAO,GAAG;AAE/E;AAEA,SAAS,8BAA8B,SAI8B;CACjE,QAAQ,aACJ,oCACI,sBAAsB;EAClB,GAAG;EACH,MAAM,MAAM,SAAS;GACjB,uBAAuB,SAAS,QAAQ,WAAW;GACnD,MAAM,eAAe,QAAQ,MAAM;GACnC,MAAM,OAAO,OAAO,YAAqB;IACrC,MAAM,UAAU,IAAI,QAAQ,QAAQ,OAAO;IAC3C,QAAQ,IAAI,iBAAiB,UAAU,MAAM,QAAQ,cAAc,GAAG;IACtE,OAAO,SAAS,MACZ,IAAI,QAAQ,SAAS,EACjB,QACJ,CAAC,CACL;GACJ;GACA,IAAI,WAAW,MAAM,KAAK,OAAO;GACjC,IAAI,SAAS,WAAW,OAAO,QAAQ,SAAS;IAC5C,MAAM,QAAQ,QAAQ;IACtB,WAAW,MAAM,KAAK,YAAY;GACtC;GACA,OAAO;EACX;CACJ,CAAC,CACL;AACR;AAEA,eAAe,0CACX,SACA,SACiE;CACjE,MAAM,cAAc,aAAa,QAAQ,WAAW;CACpD,MAAM,aAAa,QAAQ,cAAc;CACzC,MAAM,WAAW,aACb,QAAQ,OAAO,YAAY,QAAQ,mBAAmB,YAAY,WACtE;CACA,MAAM,YACF,QAAQ,OAAO,SAAS,QAAQ,mBAAmB,SAAS,WAAW,MAAM,KAAK,UAAU;CAChG,IAAI,cAAc,QAAQ,QAAQ,KAAK;CACvC,MAAM,iCAAiB,IAAI,IAAmC;CAC9D,MAAM,cAA6C,QAAQ,QACrD,MAAM,wBAAwB;EAC1B,UAAU,QAAQ,MAAM;EACxB,aAAa,QAAQ,MAAM;EAC3B,QAAQ,CAAC,GAAG,IAAI,IAAI,QAAQ,MAAM,UAAU,cAAc,CAAC;EAC3D,qBAAqB;GACjB,QAAQ;GACR,uBAAuB,GAAG,SAAS;GACnC,eAAe,GAAG,SAAS;GAC3B,oBAAoB,GAAG,SAAS;EACpC;EACA,SAAS,QAAQ;EACjB,OAAO,QAAQ,MAAM;EACrB,2BAA2B,QAAQ,MAAM;EACzC,gBAAgB,UACZ,wBAAwB;GACpB;GACA;GACA,OAAO;EACX,CAAC;CACT,CAAC,IACD,KAAA;CACN,MAAM,yBAAmE,QAAQ,oBAC3E,mCAAmC;EAC/B,UAAU,QAAQ,kBAAkB;EACpC,cAAc,QAAQ,kBAAkB;EACxC,eAAe,GAAG,SAAS;EAC3B,QAAQ,QAAQ,kBAAkB;EAClC,OAAO,QAAQ,kBAAkB;EACjC,gBAAgB,UACZ,wBAAwB;GACpB;GACA;GACA,OAAO;EACX,CAAC;CACT,CAAC,IACD,KAAA;CAEN,MAAM,qBAAqB,OACvB,wBAGI,CAAC,MAC4B;EACjC,MAAM,QAAQ,sBAAsB,SAAS,QAAQ;EACrD,IAAI,CAAC,OACD,MAAM,IAAI,MAAM,yDAAyD;EAE7E,MAAM,SACF,sBAAsB,UACtB,QAAQ,UACP,MAAM,wBAAwB;GAC3B;GACA;GACA,OAAO;EACX,CAAC;EACL,MAAM,aAAmC;GACrC;GACA,OAAO,EAAE,QAAQ,SAAS;EAC9B;EACA,eAAe,IAAI,cAAc,QAAQ,QAAQ,KAAK,CAAC;EAcvD,OAAO;GAAE;GAAY,SAAA;IAZjB,aAAa;KACT,eAAe,OAAO,MAAM;KAC5B,IAAI,UAAU,QAAQ,OAClB,cAAc;KAElB,OAAO,QAAQ,QAAQ;IAC3B;IACA,QAAQ,8BAA8B;KAClC;KACA,qBAAqB,QAAQ,QAAQ,KAAK;IAC9C,CAAC;GAEsB;EAAE;CACjC;CAEA,MAAM,uBAAuB,iBAAsD;EAC/E,MAAM,SAAS,aAAa;EAC5B,MAAM,aAAmC;GACrC;GACA,OAAO,YACH,aAAa,YAAY,WACzB,aAAa,YAAY,eAAe,KAC5C;EACJ;EACA,MAAM,sBAAsB;GACxB,IAAI,CAAC,aACD,MAAM,gBAAgB,4CAA4C;GAEtE,OAAO,YAAY,eAAe,MAAM;EAC5C;EACA,eAAe,IAAI,QAAQ,aAAa;EAuBxC,OAAO;GAAE;GAAY,SAAA;IArBjB,MAAM,UAAU;KACZ,IAAI,CAAC,aACD,MAAM,gBAAgB,4CAA4C;KAEtE,OAAO,oBAAoB,MAAM,YAAY,QAAQ,MAAM,CAAC;IAChE;IACA,MAAM,aAAa;KACf,eAAe,OAAO,MAAM;KAC5B,MAAM,aAAa,OAAO,MAAM;IACpC;IACA,QAAQ,8BAA8B;KAClC;KACA;KACA,SAAS,YAAY;MACjB,IAAI,CAAC,aACD,MAAM,gBAAgB,4CAA4C;MAEtE,MAAM,YAAY,QAAQ,MAAM;KACpC;IACJ,CAAC;GAEsB;EAAE;CACjC;CAEA,MAAM,iCAAiC,OAAO,eAAe,UAA0C;EACnG,IAAI,CAAC,wBACD,MAAM,IAAI,MAAM,mDAAmD;EAEvE,MAAM,eAAe,eACf,MAAM,uBAAuB,QAAQ,IACrC,MAAM,uBAAuB,WAAW;EAC9C,MAAM,SAAS,aAAa;EAC5B,MAAM,sBAAsB,uBAAuB,eAAe;EAClE,eAAe,IAAI,QAAQ,aAAa;EACxC,OAAO;GACH,YAAY;IACR;IACA,OAAO,YAAY,aAAa,YAAY,WAAW,IAAI;GAC/D;GACA,SAAS;IACL,eAAe,+BAA+B,IAAI;IAClD,aAAa;KACT,eAAe,OAAO,MAAM;KAC5B,OAAO,QAAQ,QAAQ;IAC3B;IACA,QAAQ,8BAA8B;KAClC;KACA;KACA,eAAe,uBAAuB,QAAQ,CAAC,CAAC,WAAW,KAAA,CAAS;IACxE,CAAC;GACL;EACJ;CACJ;CAEA,OAAO;EACH,MAAM;EACN,2BAA2B,YAAY;GACnC,OAAO;IACH,MAAM,wBAAwB,QAAQ,aAAa,UAAU,qBAAqB;KAC9E,MAAM,gBAAgB,eAAe,IAAI,MAAM;KAC/C,IAAI,CAAC,eACD,MAAM,gBAAgB,mCAAmC,OAAO,kBAAkB;KAQtF,OANe,uBAAuB;MAClC;MACA;MACA,WAAW,QAAQ;MACnB;KACJ,CACY,CAAC,CAAC,wBAAwB,aAAa,UAAU,mBAAmB;IACpF;IACA,MAAM,sBAAsB,KAAK;KAC7B,IAAI,CAAC,aAAa;KAClB,MAAM,UAAU,MAAM,YAAY,iBAAiB,GAAG;KACtD,IAAI,CAAC,SAAS;KACd,MAAM,oBAAoB,oBAAoB,OAAO;KACrD,MAAM,WAAW,QAAQ,iBAAiB;KAC1C,OAAO,kBAAkB;IAC7B;IACA,QAAQ;KACJ,MAAM,MAAM,wBAAwB,CAAC,GAAG;MACpC,IAAI,CAAC,aACD,MAAM,IAAI,MAAM,4CAA4C;MAEhE,MAAM,UAAU,MAAM,YAAY,OAAO,EACrC,qBAAqB,sBAAsB,oBAC/C,CAAC;MACD,MAAM,oBAAoB,oBAAoB,OAAO;MACrD,MAAM,WAAW,QAAQ,iBAAiB;MAC1C,OAAO,kBAAkB;KAC7B;KACA,MAAM,oBAAoB;MACtB,IAAI,CAAC,wBACD,MAAM,IAAI,MAAM,mDAAmD;MAEvE,IAAI,OAAO,WAAW,aAClB,MAAM,IAAI,MAAM,wDAAwD;MAE5E,MAAM,oBAAoB,MAAM,+BAA+B;MAC/D,MAAM,WAAW,QAAQ,iBAAiB;MAC1C,OAAO,kBAAkB;KAC7B;KACA,MAAM,YAAY,wBAAwB,CAAC,GAAG;MAC1C,MAAM,oBAAoB,MAAM,mBAAmB,qBAAqB;MACxE,IAAI,sBAAsB,UAAU,KAAA,KAAa,QAAQ,OACrD,cAAc;MAElB,MAAM,WAAW,QAAQ,iBAAiB;MAC1C,OAAO,kBAAkB;KAC7B;IACJ;GACJ;EACJ;EACA,MAAM,qBAAqB;GACvB,MAAM,2BAAW,IAAI,IAAmC;GACxD,IAAI,eAAe,QAAQ,OAAO;IAC9B,MAAM,UAAU,MAAM,mBAAmB;IACzC,SAAS,IAAI,QAAQ,WAAW,QAAQ,OAAO;GACnD;GACA,IAAI,aACA,KAAK,MAAM,gBAAgB,MAAM,YAAY,gBAAgB,GAAG;IAC5D,MAAM,UAAU,oBAAoB,YAAY;IAChD,SAAS,IAAI,QAAQ,WAAW,QAAQ,OAAO;GACnD;GAEJ,IAAI,0BAA0B,OAAO,WAAW,aAAa;IACzD,MAAM,UAAU,MAAM,+BAA+B;IACrD,SAAS,IAAI,QAAQ,WAAW,QAAQ,OAAO;GACnD;GACA,OAAO,CAAC,GAAG,SAAS,OAAO,CAAC;EAChC;EACA,MAAM,UAAU;GACZ,eAAe,MAAM;GACrB,MAAM,aAAa,QAAQ;GAC3B,wBAAwB,QAAQ;EACpC;CACJ;AACJ;AAEA,SAAgB,kCACZ,SACgE;CAChE,QAAQ,YAAY,0CAA0C,SAAS,OAAO;AAClF"}
|