@adminide-stack/form-builder-core 5.1.8-alpha.16 → 5.1.8-alpha.160
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/LICENSE +63 -22
- package/lib/config/cdnConfig.d.ts +7 -3
- package/lib/config/cdnConfig.d.ts.map +1 -1
- package/lib/config/cdnConfig.js +17 -7
- package/lib/config/cdnConfig.js.map +1 -1
- package/lib/index.d.ts +1 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +1 -1
- package/lib/utils/authMetaDataSchema.d.ts +91 -2
- package/lib/utils/authMetaDataSchema.d.ts.map +1 -1
- package/lib/utils/authMetaDataSchema.js +190 -47
- package/lib/utils/authMetaDataSchema.js.map +1 -1
- package/lib/utils/integrationCommands.d.ts +94 -0
- package/lib/utils/integrationCommands.d.ts.map +1 -0
- package/lib/utils/integrationCommands.js +253 -0
- package/lib/utils/integrationCommands.js.map +1 -0
- package/package.json +3 -4
package/LICENSE
CHANGED
|
@@ -1,30 +1,71 @@
|
|
|
1
|
-
PROPRIETARY SOFTWARE LICENSE
|
|
1
|
+
PROPRIETARY SOFTWARE LICENSE AGREEMENT
|
|
2
2
|
|
|
3
|
-
Copyright (c)
|
|
3
|
+
Copyright (c) 2026 CDEBase Inc. All Rights Reserved.
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
NOTICE TO USER: THIS IS A CONTRACT. BY INSTALLING, COPYING, OR OTHERWISE
|
|
6
|
+
USING THE SOFTWARE, YOU AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE.
|
|
7
|
+
IF YOU DO NOT AGREE TO THE TERMS OF THIS LICENSE, DO NOT INSTALL, COPY,
|
|
8
|
+
OR USE THE SOFTWARE.
|
|
7
9
|
|
|
8
|
-
|
|
10
|
+
NO LICENSE GRANTED
|
|
11
|
+
No license, express or implied, is granted to any person or entity.
|
|
12
|
+
All rights are reserved by CDEBase Inc. Any use of this software
|
|
13
|
+
without prior written authorization from CDEBase Inc. is strictly
|
|
14
|
+
prohibited.
|
|
9
15
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
16
|
+
RESTRICTIONS
|
|
17
|
+
You may NOT:
|
|
18
|
+
a) Copy, modify, adapt, translate, reverse engineer, decompile, or
|
|
19
|
+
disassemble the software or create derivative works based on it
|
|
20
|
+
b) Distribute, sublicense, lease, rent, loan, or otherwise transfer
|
|
21
|
+
the software to any third party
|
|
22
|
+
c) Remove or alter any proprietary notices, labels, or marks on the
|
|
23
|
+
software
|
|
24
|
+
d) Use the software to develop competing products or services
|
|
25
|
+
e) Publicly disclose any benchmarking or performance results
|
|
26
|
+
f) Use the software in any manner that violates applicable laws or
|
|
27
|
+
regulations
|
|
28
|
+
g) Access, view, or use any portion of the source code without
|
|
29
|
+
explicit prior written consent from CDEBase Inc.
|
|
14
30
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
31
|
+
OWNERSHIP
|
|
32
|
+
This software is the exclusive proprietary property of CDEBase Inc.
|
|
33
|
+
and is protected by copyright laws and international treaty provisions.
|
|
34
|
+
CDEBase Inc. retains all rights, title, and interest in and to the
|
|
35
|
+
software, including all copyrights, patents, trade secrets, trademarks,
|
|
36
|
+
and other intellectual property rights. No rights are transferred or
|
|
37
|
+
conveyed by possession or access to this software.
|
|
18
38
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
39
|
+
CONFIDENTIALITY
|
|
40
|
+
The software contains trade secrets and proprietary information of
|
|
41
|
+
CDEBase Inc. You agree to maintain strict confidentiality of the
|
|
42
|
+
software and not disclose it, in whole or in part, to any third party
|
|
43
|
+
without prior written consent of CDEBase Inc. This obligation survives
|
|
44
|
+
termination of any agreement with CDEBase Inc.
|
|
22
45
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
46
|
+
TERMINATION
|
|
47
|
+
Any unauthorized use automatically and immediately terminates all
|
|
48
|
+
permissions. CDEBase Inc. may seek all available legal and equitable
|
|
49
|
+
remedies, including injunctive relief, for any unauthorized use or
|
|
50
|
+
disclosure.
|
|
29
51
|
|
|
30
|
-
|
|
52
|
+
WARRANTY DISCLAIMER
|
|
53
|
+
THE SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
|
54
|
+
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
55
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND
|
|
56
|
+
NONINFRINGEMENT.
|
|
57
|
+
|
|
58
|
+
LIMITATION OF LIABILITY
|
|
59
|
+
IN NO EVENT SHALL CDEBASE INC. BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
|
|
60
|
+
INDIRECT, OR CONSEQUENTIAL DAMAGES WHATSOEVER ARISING OUT OF THE USE
|
|
61
|
+
OF OR INABILITY TO USE THE SOFTWARE.
|
|
62
|
+
|
|
63
|
+
GOVERNING LAW
|
|
64
|
+
This agreement shall be governed by and construed in accordance with
|
|
65
|
+
the laws of the jurisdiction in which CDEBase Inc. is registered,
|
|
66
|
+
without regard to its conflict of law provisions.
|
|
67
|
+
|
|
68
|
+
For licensing inquiries, contact: legal@cdebase.com
|
|
69
|
+
|
|
70
|
+
CDEBase Inc.
|
|
71
|
+
All Rights Reserved.
|
|
@@ -1,13 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* CDN / asset-URL configuration.
|
|
2
|
+
* CDN / asset-URL configuration for connector artwork.
|
|
3
3
|
*
|
|
4
4
|
* Connector configs store only the *path* portion
|
|
5
5
|
* (e.g. `_side/thirdparty/logos/gmail.svg`); call `iurl(path)` to get the
|
|
6
6
|
* full URL at runtime.
|
|
7
7
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
8
|
+
* Logos are served from the `cde-extensions` bucket (the same CDN that fronts
|
|
9
|
+
* the connector registry and pods), *not* from the tenant upload bucket that
|
|
10
|
+
* `AWS_CDN_URL` points at. Override with the `EXTENSION_CDN_URL` env var via
|
|
11
|
+
* `setCdnBase()`; browser packages do that at init time.
|
|
10
12
|
*/
|
|
13
|
+
/** `cde-extensions` bucket CDN — the default home for connector artwork. */
|
|
14
|
+
export declare const DEFAULT_EXTENSION_CDN_BASE = "https://cdn.yantra.app";
|
|
11
15
|
/** Set the CDN base URL (typically called once from env-config). */
|
|
12
16
|
export declare function setCdnBase(base: string): void;
|
|
13
17
|
/** Get the current CDN base URL. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cdnConfig.d.ts","sourceRoot":"","sources":["../../src/config/cdnConfig.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"cdnConfig.d.ts","sourceRoot":"","sources":["../../src/config/cdnConfig.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,4EAA4E;AAC5E,eAAO,MAAM,0BAA0B,2BAA2B,CAAC;AAInE,oEAAoE;AACpE,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAS7C;AAED,oCAAoC;AACpC,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED,0DAA0D;AAC1D,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAOzC"}
|
package/lib/config/cdnConfig.js
CHANGED
|
@@ -1,18 +1,28 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* CDN / asset-URL configuration.
|
|
2
|
+
* CDN / asset-URL configuration for connector artwork.
|
|
3
3
|
*
|
|
4
4
|
* Connector configs store only the *path* portion
|
|
5
5
|
* (e.g. `_side/thirdparty/logos/gmail.svg`); call `iurl(path)` to get the
|
|
6
6
|
* full URL at runtime.
|
|
7
7
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
8
|
+
* Logos are served from the `cde-extensions` bucket (the same CDN that fronts
|
|
9
|
+
* the connector registry and pods), *not* from the tenant upload bucket that
|
|
10
|
+
* `AWS_CDN_URL` points at. Override with the `EXTENSION_CDN_URL` env var via
|
|
11
|
+
* `setCdnBase()`; browser packages do that at init time.
|
|
10
12
|
*/
|
|
11
|
-
|
|
13
|
+
/** `cde-extensions` bucket CDN — the default home for connector artwork. */
|
|
14
|
+
const DEFAULT_EXTENSION_CDN_BASE = 'https://cdn.yantra.app';
|
|
15
|
+
let _cdnBase = DEFAULT_EXTENSION_CDN_BASE;
|
|
12
16
|
/** Set the CDN base URL (typically called once from env-config). */
|
|
13
17
|
function setCdnBase(base) {
|
|
14
|
-
// Strip trailing slash for consistency.
|
|
15
|
-
|
|
18
|
+
// Strip trailing slash for consistency. Empty/blank resets to the default
|
|
19
|
+
// so an unset env var can never degrade logos to host-relative 404s.
|
|
20
|
+
const trimmed = (base || '').trim();
|
|
21
|
+
if (!trimmed) {
|
|
22
|
+
_cdnBase = DEFAULT_EXTENSION_CDN_BASE;
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
_cdnBase = trimmed.endsWith('/') ? trimmed.slice(0, -1) : trimmed;
|
|
16
26
|
}
|
|
17
27
|
/** Get the current CDN base URL. */
|
|
18
28
|
function getCdnBase() {
|
|
@@ -26,4 +36,4 @@ function iurl(path) {
|
|
|
26
36
|
// Strip leading slash so we don't end up with a double-slash.
|
|
27
37
|
const clean = path.startsWith('/') ? path.slice(1) : path;
|
|
28
38
|
return _cdnBase ? `${_cdnBase}/${clean}` : clean;
|
|
29
|
-
}export{getCdnBase,iurl,setCdnBase};//# sourceMappingURL=cdnConfig.js.map
|
|
39
|
+
}export{DEFAULT_EXTENSION_CDN_BASE,getCdnBase,iurl,setCdnBase};//# sourceMappingURL=cdnConfig.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cdnConfig.js","sources":["../../src/config/cdnConfig.ts"],"sourcesContent":[null],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"cdnConfig.js","sources":["../../src/config/cdnConfig.ts"],"sourcesContent":[null],"names":[],"mappings":"AAAA;;;;;;;;;;;AAWG;AAEH;AACA,MAAA,0BAAa,GAAA;AAIb,IAAA,QAAA,GAAA,0BAAA;AACA;AAWA,SAAA,UAAA,CAAA,IAAA,EAAA;AACA;AAIA;AACA,EAAA,MAAA,OAAA,GAAA,CAAA,IAAA,MAAqB,EAAA,IAAM,EAAA;;;;;;;;;;;;;;;;;;;"}
|
package/lib/index.d.ts
CHANGED
package/lib/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,2CAA2C,CAAC;AAC1D,cAAc,sBAAsB,CAAC;AACrC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,yCAAyC,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,8BAA8B,EAAE,MAAM,yBAAyB,CAAC;AAC9F,cAAc,4BAA4B,CAAC;AAC3C,cAAc,qCAAqC,CAAC;AACpD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,cAAc,CAAC;AAC7B,cAAc,uBAAuB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,2CAA2C,CAAC;AAC1D,cAAc,sBAAsB,CAAC;AACrC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,yCAAyC,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,8BAA8B,EAAE,MAAM,yBAAyB,CAAC;AAC9F,cAAc,4BAA4B,CAAC;AAC3C,cAAc,qCAAqC,CAAC;AACpD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,cAAc,CAAC;AAC7B,cAAc,uBAAuB,CAAC;AACtC,cAAc,6BAA6B,CAAC"}
|
package/lib/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export{getCdnBase,iurl,setCdnBase}from'./config/cdnConfig.js';export{CONNECTOR_CATALOG_SAMPLE_CHUNK_SIZE,CONNECTOR_CATALOG_SAMPLE_ENTRIES,CONNECTOR_CATALOG_SAMPLE_ENTRY_BY_SCHEMA_ID}from'./config/connectorSampleOptions.generated.js';export{CONNECTOR_CATEGORIES}from'./config/configTypes.js';export{generateFunctionCode,generateHandlerBody,generateHandlerBodyWithReturn,generateStepFromFunction,generateStepFunctionsFromDB,wrapStepsInInngestFunction}from'./inngest/generateFunctionCode.js';export{getAvailableDefinitions,installLibraryForAutocomplete,setupMonacoAutocomplete,setupStepAutocomplete,updateAutocompleteConfig}from'./inngest/monacoAutocompleteIntegration.js';export{cleanStepCode,extractFunctionBody,extractStepVarName,generateFromExtractedFunctions}from'./inngest/stepGenerator.js';export{buildMetadataSchema,buildProviderConfig,buildProviderSeedFromConfig,buildProviderWithRefs,createOAuthSeedGenerator}from'./utils/authMetaDataSchema.js';export{resolveConnectorFieldTokensInString,resolveConnectorFieldTokensInValue}from'./utils/connectorFieldTokenResolver.js';export{deepMergeElements,deepMergeFormSteps}from'./utils/deepMergeFormSteps.js';export{flatten,unflatten}from'./utils/json.js';export{DatabaseType,FORM_METADATA_NODE_TYPE,FormType,SCHEMA_ID_OPTIONS,flattenSchemaWithUiContext,flattenSchemas,flattenUiSchema,isContributionSchemaId,parseSampleNodes}from'./utils/schemaHelpers.js';//# sourceMappingURL=index.js.map
|
|
1
|
+
export{DEFAULT_EXTENSION_CDN_BASE,getCdnBase,iurl,setCdnBase}from'./config/cdnConfig.js';export{CONNECTOR_CATALOG_SAMPLE_CHUNK_SIZE,CONNECTOR_CATALOG_SAMPLE_ENTRIES,CONNECTOR_CATALOG_SAMPLE_ENTRY_BY_SCHEMA_ID}from'./config/connectorSampleOptions.generated.js';export{CONNECTOR_CATEGORIES}from'./config/configTypes.js';export{generateFunctionCode,generateHandlerBody,generateHandlerBodyWithReturn,generateStepFromFunction,generateStepFunctionsFromDB,wrapStepsInInngestFunction}from'./inngest/generateFunctionCode.js';export{getAvailableDefinitions,installLibraryForAutocomplete,setupMonacoAutocomplete,setupStepAutocomplete,updateAutocompleteConfig}from'./inngest/monacoAutocompleteIntegration.js';export{cleanStepCode,extractFunctionBody,extractStepVarName,generateFromExtractedFunctions}from'./inngest/stepGenerator.js';export{buildCredentialOAuthConfigKey,buildCredentialOAuthTokenVaultKeys,buildCredentialScopedSecretKey,buildMetadataSchema,buildNamespaceCredentialOAuthTokenVaultKeys,buildOAuthInstanceTokenVaultKeys,buildProviderConfig,buildProviderCredentialOAuthTokenVaultKeys,buildProviderSeedFromConfig,buildProviderWithRefs,createOAuthSeedGenerator,credentialIdFromOAuthConfigKey,credentialIdFromScopedSecretKey,isCredentialAccountConfigKey,isCredentialScopedSecretKey,namespaceFromOAuthConfigKey,stripCredentialAccountConfigKey,stripCredentialScopedSecretKey,toVaultPrefix}from'./utils/authMetaDataSchema.js';export{resolveConnectorFieldTokensInString,resolveConnectorFieldTokensInValue}from'./utils/connectorFieldTokenResolver.js';export{deepMergeElements,deepMergeFormSteps}from'./utils/deepMergeFormSteps.js';export{flatten,unflatten}from'./utils/json.js';export{DatabaseType,FORM_METADATA_NODE_TYPE,FormType,SCHEMA_ID_OPTIONS,flattenSchemaWithUiContext,flattenSchemas,flattenUiSchema,isContributionSchemaId,parseSampleNodes}from'./utils/schemaHelpers.js';export{buildCommandsFromActions,buildIntegrationConfigurationContribution,buildMenusFromCommands,buildParamBindings,extractTemplateUserFields,extractUserFieldsFromStepperFormMetadata,parseInputTemplate,resolveInputTemplate}from'./utils/integrationCommands.js';//# sourceMappingURL=index.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { ConnectorType } from 'common';
|
|
2
2
|
import { ConnectorCategoryTuple, ConnectorConfig, CustomButtonConfig, FormFieldConfig, FormResourceConfig, MCPProviderConfig } from '../config/configTypes';
|
|
3
3
|
type SampleFormGenerator = (title?: string, formIcon?: string, formExtensionId?: string) => any[];
|
|
4
|
-
interface ProviderTemplateSeed {
|
|
4
|
+
export interface ProviderTemplateSeed {
|
|
5
5
|
key: string;
|
|
6
6
|
providerId: string;
|
|
7
7
|
title: string;
|
|
@@ -179,7 +179,96 @@ export declare const buildProviderConfig: (providerConfig: CustomProviderConfigI
|
|
|
179
179
|
}[];
|
|
180
180
|
};
|
|
181
181
|
export declare function buildProviderSeedFromConfig(provider: ConnectorConfig | MCPProviderConfig, connectorType: ConnectorType): ProviderTemplateSeed;
|
|
182
|
-
|
|
182
|
+
/**
|
|
183
|
+
* Normalize a provider id or form namespace into a vault secret key prefix.
|
|
184
|
+
* e.g. `gmail-app-hk7zf7w9` → `GMAIL_APP_HK7ZF7W9`
|
|
185
|
+
*/
|
|
186
|
+
export declare const toVaultPrefix: (value: string) => string;
|
|
187
|
+
/**
|
|
188
|
+
* Per-form-instance vault keys for non-account-specific secrets (e.g. API key fields).
|
|
189
|
+
*
|
|
190
|
+
* Do NOT use these for OAuth access/refresh tokens when multiple accounts can share
|
|
191
|
+
* one published form — connecting account B would overwrite account A's vault entry.
|
|
192
|
+
* Access/refresh live under per-credential `configKey.accounts.{id}.*` and durable
|
|
193
|
+
* `CRED_<id>_*` vault keys via syncOAuthTokensToCredentialVault.
|
|
194
|
+
*
|
|
195
|
+
* Client id/secret stay provider-scoped (shared OAuth app credentials).
|
|
196
|
+
*/
|
|
197
|
+
export declare const buildOAuthInstanceTokenVaultKeys: (namespace: string) => {
|
|
198
|
+
/** @deprecated Do not wire access tokens to this shared key — use CRED_* instead. */
|
|
199
|
+
readonly accessToken: `${string}_ACCESS_TOKEN`;
|
|
200
|
+
/** @deprecated Do not wire refresh tokens to this shared key — use CRED_* instead. */
|
|
201
|
+
readonly refreshToken: `${string}_REFRESH_TOKEN`;
|
|
202
|
+
readonly apiKey: `${string}_API_KEY`;
|
|
203
|
+
};
|
|
204
|
+
/**
|
|
205
|
+
* Credential-scoped vault key: `{BASE_KEY}_{credentialId}`.
|
|
206
|
+
*
|
|
207
|
+
* This is the platform's own convention — `preferences-service` resolves a
|
|
208
|
+
* `format: 'secret'` config key to `${defaultValueSource.secretKey}_${credentialId}`
|
|
209
|
+
* on both read and write whenever the node context carries a `credentialId`.
|
|
210
|
+
* API-key connectors reuse the exact same shape so several credentials for one
|
|
211
|
+
* provider can coexist in a project/env instead of overwriting each other's
|
|
212
|
+
* shared `PROVIDER_API_KEY` entry (the same isolation OAuth gets from its
|
|
213
|
+
* per-account configKey).
|
|
214
|
+
*
|
|
215
|
+
* Idempotent when `baseSecretKey` is already scoped to the same credential.
|
|
216
|
+
*/
|
|
217
|
+
export declare const buildCredentialScopedSecretKey: (baseSecretKey: string, credentialId: string) => string;
|
|
218
|
+
/** True when a vault key already carries a `_{credentialId}` suffix. */
|
|
219
|
+
export declare const isCredentialScopedSecretKey: (secretKey: string) => boolean;
|
|
220
|
+
/** Strip `_{credentialId}` to recover the catalog/base vault key. */
|
|
221
|
+
export declare const stripCredentialScopedSecretKey: (secretKey: string) => string;
|
|
222
|
+
/** credentialId embedded in a scoped vault key, if any. */
|
|
223
|
+
export declare const credentialIdFromScopedSecretKey: (secretKey: string) => string | null;
|
|
224
|
+
/**
|
|
225
|
+
* Durable per-credential token vault keys. Used after OAuth connect so each
|
|
226
|
+
* FormBuilderCredential keeps its own token pair even when several credentials
|
|
227
|
+
* share the same published template/configKey staging path.
|
|
228
|
+
*/
|
|
229
|
+
export declare const buildCredentialOAuthTokenVaultKeys: (credentialId: string) => {
|
|
230
|
+
readonly accessToken: `${string}_ACCESS_TOKEN`;
|
|
231
|
+
readonly refreshToken: `${string}_REFRESH_TOKEN`;
|
|
232
|
+
};
|
|
233
|
+
/**
|
|
234
|
+
* Provider-scoped per-credential OAuth vault keys (e.g. OAuth callback writes
|
|
235
|
+
* `GOOGLE_GMAIL_ACCESS_TOKEN_{credentialId}` to Personal Vault).
|
|
236
|
+
*/
|
|
237
|
+
export declare const buildProviderCredentialOAuthTokenVaultKeys: (providerId: string, credentialId: string) => {
|
|
238
|
+
readonly accessToken: `${string}_ACCESS_TOKEN_${string}`;
|
|
239
|
+
readonly refreshToken: `${string}_REFRESH_TOKEN_${string}`;
|
|
240
|
+
};
|
|
241
|
+
/**
|
|
242
|
+
* Namespace-scoped per-credential OAuth vault keys (`google_gmail-app` → `GOOGLE_GMAIL_APP_*_{id}`).
|
|
243
|
+
*/
|
|
244
|
+
export declare const buildNamespaceCredentialOAuthTokenVaultKeys: (namespace: string, credentialId: string) => {
|
|
245
|
+
readonly accessToken: `${string}_ACCESS_TOKEN_${string}`;
|
|
246
|
+
readonly refreshToken: `${string}_REFRESH_TOKEN_${string}`;
|
|
247
|
+
};
|
|
248
|
+
/** True when configKey is already scoped to a FormBuilder credential account. */
|
|
249
|
+
export declare const isCredentialAccountConfigKey: (configKey: string) => boolean;
|
|
250
|
+
/** Strip `.accounts.{credentialId}` to recover the published template configKey. */
|
|
251
|
+
export declare const stripCredentialAccountConfigKey: (configKey: string) => string;
|
|
252
|
+
/** credentialId embedded in an account-scoped configKey, if any. */
|
|
253
|
+
export declare const credentialIdFromOAuthConfigKey: (configKey: string) => string | null;
|
|
254
|
+
/**
|
|
255
|
+
* Build the per-credential OAuth configKey used for connect / refresh / disconnect.
|
|
256
|
+
* Idempotent when `baseConfigKey` is already account-scoped for the same id.
|
|
257
|
+
*/
|
|
258
|
+
export declare const buildCredentialOAuthConfigKey: (baseConfigKey: string, credentialId: string) => string;
|
|
259
|
+
/** Extract the form namespace from an oauthConnector configKey path. */
|
|
260
|
+
export declare const namespaceFromOAuthConfigKey: (configKey: string) => string | null;
|
|
261
|
+
export interface SeedGeneratorOptions {
|
|
262
|
+
/**
|
|
263
|
+
* Exact namespace (== formId) per seed, aligned by index. Pass a published template's
|
|
264
|
+
* key to regenerate a form that is identity-compatible with it - same formId and the
|
|
265
|
+
* same `integrationSettings.settings.<type>.<ns>.oauthConnector` configuration keys -
|
|
266
|
+
* so stored credentials and OAuth writes keep resolving. Omitted entries fall back to
|
|
267
|
+
* the random-suffix default (new-form behavior).
|
|
268
|
+
*/
|
|
269
|
+
namespaces?: Array<string | undefined>;
|
|
270
|
+
}
|
|
271
|
+
export declare function createOAuthSeedGenerator(seeds: ProviderTemplateSeed[], options?: SeedGeneratorOptions): SampleFormGenerator;
|
|
183
272
|
export declare const buildProviderWithRefs: (provider: any, sampleNodes: any[]) => any;
|
|
184
273
|
export declare const buildMetadataSchema: (sampleNodes: any[]) => ({
|
|
185
274
|
schemaId: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authMetaDataSchema.d.ts","sourceRoot":"","sources":["../../src/utils/authMetaDataSchema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,aAAa,EAAyD,MAAM,QAAQ,CAAC;AAClH,OAAO,EAEH,sBAAsB,EACtB,eAAe,EACf,kBAAkB,EAClB,eAAe,EACf,kBAAkB,EAClB,iBAAiB,EACpB,MAAM,uBAAuB,CAAC;AAI/B,KAAK,mBAAmB,GAAG,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,eAAe,CAAC,EAAE,MAAM,KAAK,GAAG,EAAE,CAAC;AAElG,
|
|
1
|
+
{"version":3,"file":"authMetaDataSchema.d.ts","sourceRoot":"","sources":["../../src/utils/authMetaDataSchema.ts"],"names":[],"mappings":"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"}
|
|
@@ -226,7 +226,134 @@ function buildInngestNode() {
|
|
|
226
226
|
};
|
|
227
227
|
}
|
|
228
228
|
const seedCategory = seed => seed.categories[0];
|
|
229
|
+
/**
|
|
230
|
+
* uiLayout credential namespace bucket — collapses every connector category into
|
|
231
|
+
* one of three: app | llm | mcp. MCP by connectorType; LLM seeds carry connectorType
|
|
232
|
+
* 'app' but a `${id}:llm` key; everything else is an app connector.
|
|
233
|
+
*/
|
|
234
|
+
const seedCredentialNamespace = seed => seed.connectorType === 'mcp' ? 'mcp' : seed.key.endsWith(':llm') ? 'llm' : 'app';
|
|
235
|
+
/**
|
|
236
|
+
* Normalize a provider id or form namespace into a vault secret key prefix.
|
|
237
|
+
* e.g. `gmail-app-hk7zf7w9` → `GMAIL_APP_HK7ZF7W9`
|
|
238
|
+
*/
|
|
229
239
|
const toVaultPrefix = value => value.replace(/[^a-zA-Z0-9]/g, '_').toUpperCase();
|
|
240
|
+
/**
|
|
241
|
+
* Per-form-instance vault keys for non-account-specific secrets (e.g. API key fields).
|
|
242
|
+
*
|
|
243
|
+
* Do NOT use these for OAuth access/refresh tokens when multiple accounts can share
|
|
244
|
+
* one published form — connecting account B would overwrite account A's vault entry.
|
|
245
|
+
* Access/refresh live under per-credential `configKey.accounts.{id}.*` and durable
|
|
246
|
+
* `CRED_<id>_*` vault keys via syncOAuthTokensToCredentialVault.
|
|
247
|
+
*
|
|
248
|
+
* Client id/secret stay provider-scoped (shared OAuth app credentials).
|
|
249
|
+
*/
|
|
250
|
+
const buildOAuthInstanceTokenVaultKeys = namespace => {
|
|
251
|
+
const prefix = toVaultPrefix(namespace);
|
|
252
|
+
return {
|
|
253
|
+
/** @deprecated Do not wire access tokens to this shared key — use CRED_* instead. */
|
|
254
|
+
accessToken: `${prefix}_ACCESS_TOKEN`,
|
|
255
|
+
/** @deprecated Do not wire refresh tokens to this shared key — use CRED_* instead. */
|
|
256
|
+
refreshToken: `${prefix}_REFRESH_TOKEN`,
|
|
257
|
+
apiKey: `${prefix}_API_KEY`
|
|
258
|
+
};
|
|
259
|
+
};
|
|
260
|
+
/** `_{24-hex}` suffix appended to a base vault key to scope it to one credential. */
|
|
261
|
+
const CREDENTIAL_SCOPED_SECRET_KEY_RE = /_([a-fA-F0-9]{24})$/;
|
|
262
|
+
/**
|
|
263
|
+
* Credential-scoped vault key: `{BASE_KEY}_{credentialId}`.
|
|
264
|
+
*
|
|
265
|
+
* This is the platform's own convention — `preferences-service` resolves a
|
|
266
|
+
* `format: 'secret'` config key to `${defaultValueSource.secretKey}_${credentialId}`
|
|
267
|
+
* on both read and write whenever the node context carries a `credentialId`.
|
|
268
|
+
* API-key connectors reuse the exact same shape so several credentials for one
|
|
269
|
+
* provider can coexist in a project/env instead of overwriting each other's
|
|
270
|
+
* shared `PROVIDER_API_KEY` entry (the same isolation OAuth gets from its
|
|
271
|
+
* per-account configKey).
|
|
272
|
+
*
|
|
273
|
+
* Idempotent when `baseSecretKey` is already scoped to the same credential.
|
|
274
|
+
*/
|
|
275
|
+
const buildCredentialScopedSecretKey = (baseSecretKey, credentialId) => {
|
|
276
|
+
const base = stripCredentialScopedSecretKey(baseSecretKey || '');
|
|
277
|
+
if (!base || !credentialId) {
|
|
278
|
+
return base || '';
|
|
279
|
+
}
|
|
280
|
+
return `${base}_${credentialId}`;
|
|
281
|
+
};
|
|
282
|
+
/** True when a vault key already carries a `_{credentialId}` suffix. */
|
|
283
|
+
const isCredentialScopedSecretKey = secretKey => CREDENTIAL_SCOPED_SECRET_KEY_RE.test(secretKey || '');
|
|
284
|
+
/** Strip `_{credentialId}` to recover the catalog/base vault key. */
|
|
285
|
+
const stripCredentialScopedSecretKey = secretKey => (secretKey || '').replace(CREDENTIAL_SCOPED_SECRET_KEY_RE, '');
|
|
286
|
+
/** credentialId embedded in a scoped vault key, if any. */
|
|
287
|
+
const credentialIdFromScopedSecretKey = secretKey => CREDENTIAL_SCOPED_SECRET_KEY_RE.exec(secretKey || '')?.[1] || null;
|
|
288
|
+
/**
|
|
289
|
+
* Durable per-credential token vault keys. Used after OAuth connect so each
|
|
290
|
+
* FormBuilderCredential keeps its own token pair even when several credentials
|
|
291
|
+
* share the same published template/configKey staging path.
|
|
292
|
+
*/
|
|
293
|
+
const buildCredentialOAuthTokenVaultKeys = credentialId => {
|
|
294
|
+
const prefix = toVaultPrefix(`cred_${credentialId}`);
|
|
295
|
+
return {
|
|
296
|
+
accessToken: `${prefix}_ACCESS_TOKEN`,
|
|
297
|
+
refreshToken: `${prefix}_REFRESH_TOKEN`
|
|
298
|
+
};
|
|
299
|
+
};
|
|
300
|
+
/**
|
|
301
|
+
* Provider-scoped per-credential OAuth vault keys (e.g. OAuth callback writes
|
|
302
|
+
* `GOOGLE_GMAIL_ACCESS_TOKEN_{credentialId}` to Personal Vault).
|
|
303
|
+
*/
|
|
304
|
+
const buildProviderCredentialOAuthTokenVaultKeys = (providerId, credentialId) => {
|
|
305
|
+
const prefix = toVaultPrefix(providerId);
|
|
306
|
+
return {
|
|
307
|
+
accessToken: `${prefix}_ACCESS_TOKEN_${credentialId}`,
|
|
308
|
+
refreshToken: `${prefix}_REFRESH_TOKEN_${credentialId}`
|
|
309
|
+
};
|
|
310
|
+
};
|
|
311
|
+
/**
|
|
312
|
+
* Namespace-scoped per-credential OAuth vault keys (`google_gmail-app` → `GOOGLE_GMAIL_APP_*_{id}`).
|
|
313
|
+
*/
|
|
314
|
+
const buildNamespaceCredentialOAuthTokenVaultKeys = (namespace, credentialId) => {
|
|
315
|
+
const prefix = toVaultPrefix(namespace);
|
|
316
|
+
return {
|
|
317
|
+
accessToken: `${prefix}_ACCESS_TOKEN_${credentialId}`,
|
|
318
|
+
refreshToken: `${prefix}_REFRESH_TOKEN_${credentialId}`
|
|
319
|
+
};
|
|
320
|
+
};
|
|
321
|
+
/**
|
|
322
|
+
* Per-connected-account OAuth preferences path.
|
|
323
|
+
* Template: `….{namespace}.oauthConnector`
|
|
324
|
+
* Account: `….{namespace}.oauthConnector.accounts.{credentialId}`
|
|
325
|
+
*
|
|
326
|
+
* OAuth app settings (client id/secret, scopes, endpoints) are seeded from the
|
|
327
|
+
* template path onto each account path so ApplicationConnectorOAuthService can
|
|
328
|
+
* use a single configKey without a shared token staging slot.
|
|
329
|
+
*/
|
|
330
|
+
const CREDENTIAL_ACCOUNT_CONFIG_KEY_RE = /\.accounts\.([a-fA-F0-9]{24})$/;
|
|
331
|
+
/** True when configKey is already scoped to a FormBuilder credential account. */
|
|
332
|
+
const isCredentialAccountConfigKey = configKey => CREDENTIAL_ACCOUNT_CONFIG_KEY_RE.test(configKey || '');
|
|
333
|
+
/** Strip `.accounts.{credentialId}` to recover the published template configKey. */
|
|
334
|
+
const stripCredentialAccountConfigKey = configKey => (configKey || '').replace(CREDENTIAL_ACCOUNT_CONFIG_KEY_RE, '');
|
|
335
|
+
/** credentialId embedded in an account-scoped configKey, if any. */
|
|
336
|
+
const credentialIdFromOAuthConfigKey = configKey => {
|
|
337
|
+
const match = CREDENTIAL_ACCOUNT_CONFIG_KEY_RE.exec(configKey || '');
|
|
338
|
+
return match?.[1] || null;
|
|
339
|
+
};
|
|
340
|
+
/**
|
|
341
|
+
* Build the per-credential OAuth configKey used for connect / refresh / disconnect.
|
|
342
|
+
* Idempotent when `baseConfigKey` is already account-scoped for the same id.
|
|
343
|
+
*/
|
|
344
|
+
const buildCredentialOAuthConfigKey = (baseConfigKey, credentialId) => {
|
|
345
|
+
const base = stripCredentialAccountConfigKey(baseConfigKey || '').replace(/\.+$/, '');
|
|
346
|
+
if (!base || !credentialId) {
|
|
347
|
+
return base || '';
|
|
348
|
+
}
|
|
349
|
+
return `${base}.accounts.${credentialId}`;
|
|
350
|
+
};
|
|
351
|
+
/** Extract the form namespace from an oauthConnector configKey path. */
|
|
352
|
+
const namespaceFromOAuthConfigKey = configKey => {
|
|
353
|
+
const normalized = stripCredentialAccountConfigKey(configKey || '');
|
|
354
|
+
const match = /integrationSettings\.settings\.[^.]+\.([^.]+)\.oauthConnector(?:\.|$)/.exec(normalized);
|
|
355
|
+
return match?.[1] || null;
|
|
356
|
+
};
|
|
230
357
|
const seedAuthMethodDefault = seed => seed.authMethods.includes('oauth2') ? 'oauth' : seed.connectorType === 'mcp' ? 'mcp' : 'api_key';
|
|
231
358
|
/**
|
|
232
359
|
* Build a `genericType -> count` map for the given fields. Used by
|
|
@@ -264,7 +391,10 @@ const resolveFieldKey = (field, genericTypeCounts) => {
|
|
|
264
391
|
return field.name;
|
|
265
392
|
};
|
|
266
393
|
function buildPreGeneratedFormSteps(seed, namespace) {
|
|
267
|
-
|
|
394
|
+
// Shared OAuth app credentials (one client id/secret per provider).
|
|
395
|
+
const providerVaultPrefix = toVaultPrefix(seed.providerId);
|
|
396
|
+
// Per-form-instance tokens — unique namespace prevents multi-account overwrite.
|
|
397
|
+
const instanceTokenKeys = buildOAuthInstanceTokenVaultKeys(namespace);
|
|
268
398
|
const isApp = seed.connectorType === 'app';
|
|
269
399
|
const isApiKeyOnly = seedIsApiKeyOnly(seed);
|
|
270
400
|
const templateType = seedTemplateType(seed);
|
|
@@ -361,12 +491,13 @@ function buildPreGeneratedFormSteps(seed, namespace) {
|
|
|
361
491
|
useBasicAuth: seed.useBasicAuth ?? false,
|
|
362
492
|
connectorRedirectUri: '{{CLIENT_URL}}/{{CONNECTOR_ENDPOINT}}',
|
|
363
493
|
// connectorAuthMethod — present only for non-oauth connectors (matches reference forms)
|
|
364
|
-
...(
|
|
494
|
+
...(seedAuthMethodDefault(seed) !== 'oauth' ? {
|
|
365
495
|
connectorAuthMethod: seedAuthMethodDefault(seed)
|
|
366
496
|
} : {}),
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
497
|
+
// Always emitted, even empty: a template entry is self-describing only when a reader can
|
|
498
|
+
// tell "no extra provider fields" from "unknown", and the credential picker synthesizes
|
|
499
|
+
// the form from this entry instead of fetching the published form document.
|
|
500
|
+
connectorProviderFields: seed.fields,
|
|
370
501
|
...(seed.resources.length > 0 ? {
|
|
371
502
|
connectorProviderResources: seed.resources
|
|
372
503
|
} : {}),
|
|
@@ -401,7 +532,7 @@ function buildPreGeneratedFormSteps(seed, namespace) {
|
|
|
401
532
|
defaultValueSource: {
|
|
402
533
|
type: ContributeDefaultValueSourceType.Vault,
|
|
403
534
|
secretType: 'OAUTH_CLIENT',
|
|
404
|
-
secretKey: `${
|
|
535
|
+
secretKey: `${providerVaultPrefix}_CLIENT_ID`,
|
|
405
536
|
...(isApp ? {
|
|
406
537
|
requiredReference: true
|
|
407
538
|
} : {})
|
|
@@ -420,7 +551,7 @@ function buildPreGeneratedFormSteps(seed, namespace) {
|
|
|
420
551
|
defaultValueSource: {
|
|
421
552
|
type: ContributeDefaultValueSourceType.Vault,
|
|
422
553
|
secretType: 'OAUTH_CLIENT',
|
|
423
|
-
secretKey: `${
|
|
554
|
+
secretKey: `${providerVaultPrefix}_CLIENT_SECRET`,
|
|
424
555
|
...(isApp ? {
|
|
425
556
|
requiredReference: true
|
|
426
557
|
} : {})
|
|
@@ -439,7 +570,7 @@ function buildPreGeneratedFormSteps(seed, namespace) {
|
|
|
439
570
|
defaultValueSource: {
|
|
440
571
|
type: ContributeDefaultValueSourceType.Vault,
|
|
441
572
|
secretType: 'API_KEY',
|
|
442
|
-
secretKey:
|
|
573
|
+
secretKey: instanceTokenKeys.apiKey
|
|
443
574
|
}
|
|
444
575
|
}
|
|
445
576
|
}, {
|
|
@@ -451,11 +582,16 @@ function buildPreGeneratedFormSteps(seed, namespace) {
|
|
|
451
582
|
default: '',
|
|
452
583
|
readOnly: true,
|
|
453
584
|
scope: 1 /* ConfigurationScope.APPLICATION */,
|
|
585
|
+
|
|
586
|
+
// No shared vault secretKey by default — multi-account connects would overwrite.
|
|
587
|
+
// Staging still needs a vault route: writeSettings discards format:secret when
|
|
588
|
+
// defaultValueSource is missing. Instance keys are the temporary staging slot;
|
|
589
|
+
// completeOAuth / sync(force) copies them into CRED_<credentialId>_*.
|
|
454
590
|
schemaExtensions: {
|
|
455
591
|
defaultValueSource: {
|
|
456
592
|
type: ContributeDefaultValueSourceType.Vault,
|
|
457
593
|
secretType: 'OAUTH_CLIENT',
|
|
458
|
-
secretKey:
|
|
594
|
+
secretKey: instanceTokenKeys.accessToken
|
|
459
595
|
}
|
|
460
596
|
}
|
|
461
597
|
}, {
|
|
@@ -471,7 +607,7 @@ function buildPreGeneratedFormSteps(seed, namespace) {
|
|
|
471
607
|
defaultValueSource: {
|
|
472
608
|
type: ContributeDefaultValueSourceType.Vault,
|
|
473
609
|
secretType: 'OAUTH_CLIENT',
|
|
474
|
-
secretKey:
|
|
610
|
+
secretKey: instanceTokenKeys.refreshToken
|
|
475
611
|
}
|
|
476
612
|
}
|
|
477
613
|
}, {
|
|
@@ -754,12 +890,13 @@ function buildPreGeneratedFormSteps(seed, namespace) {
|
|
|
754
890
|
useBasicAuth: seed.useBasicAuth ?? false,
|
|
755
891
|
connectorRedirectUri: '{{CLIENT_URL}}/{{CONNECTOR_ENDPOINT}}',
|
|
756
892
|
// connectorAuthMethod — present only for non-oauth connectors (matches reference forms)
|
|
757
|
-
...(
|
|
893
|
+
...(seedAuthMethodDefault(seed) !== 'oauth' ? {
|
|
758
894
|
connectorAuthMethod: seedAuthMethodDefault(seed)
|
|
759
895
|
} : {}),
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
896
|
+
// Always emitted, even empty: a template entry is self-describing only when a reader can
|
|
897
|
+
// tell "no extra provider fields" from "unknown", and the credential picker synthesizes
|
|
898
|
+
// the form from this entry instead of fetching the published form document.
|
|
899
|
+
connectorProviderFields: seed.fields,
|
|
763
900
|
...(seed.resources.length > 0 ? {
|
|
764
901
|
connectorProviderResources: seed.resources
|
|
765
902
|
} : {}),
|
|
@@ -776,25 +913,6 @@ function buildPreGeneratedFormSteps(seed, namespace) {
|
|
|
776
913
|
}]
|
|
777
914
|
}];
|
|
778
915
|
}
|
|
779
|
-
const buildCategoryKeyLookup = () => {
|
|
780
|
-
const lookup = new Map();
|
|
781
|
-
const prefix = 'uiLayout.credential.templates.';
|
|
782
|
-
const suffix = '.value';
|
|
783
|
-
for (const [key, value] of Object.entries(CONTRIBUTION_POINTS)) {
|
|
784
|
-
if (key.startsWith(prefix) && key.endsWith(suffix)) {
|
|
785
|
-
lookup.set(value, key.slice(prefix.length, -suffix.length));
|
|
786
|
-
}
|
|
787
|
-
}
|
|
788
|
-
return lookup;
|
|
789
|
-
};
|
|
790
|
-
const CATEGORY_KEY_LOOKUP = buildCategoryKeyLookup();
|
|
791
|
-
const categoryToTemplateTypeKey = category => {
|
|
792
|
-
const key = CATEGORY_KEY_LOOKUP.get(category);
|
|
793
|
-
if (!key) {
|
|
794
|
-
throw new Error(`No contribution-point template type found for category "${category}"`);
|
|
795
|
-
}
|
|
796
|
-
return key;
|
|
797
|
-
};
|
|
798
916
|
function buildOAuthConfigurationContribution(seedsWithNamespaces) {
|
|
799
917
|
const formProperties = {
|
|
800
918
|
required: []
|
|
@@ -805,7 +923,8 @@ function buildOAuthConfigurationContribution(seedsWithNamespaces) {
|
|
|
805
923
|
seed,
|
|
806
924
|
namespace
|
|
807
925
|
} of seedsWithNamespaces) {
|
|
808
|
-
const
|
|
926
|
+
const providerVaultPrefix = toVaultPrefix(seed.providerId);
|
|
927
|
+
const instanceTokenKeys = buildOAuthInstanceTokenVaultKeys(namespace);
|
|
809
928
|
const isApp = seed.connectorType === 'app';
|
|
810
929
|
const isApiKeyOnly = seedIsApiKeyOnly(seed);
|
|
811
930
|
const templateType = seedTemplateType(seed);
|
|
@@ -867,7 +986,7 @@ function buildOAuthConfigurationContribution(seedsWithNamespaces) {
|
|
|
867
986
|
defaultValueSource: {
|
|
868
987
|
type: ContributeDefaultValueSourceType.Vault,
|
|
869
988
|
secretType: 'OAUTH_CLIENT',
|
|
870
|
-
secretKey: `${
|
|
989
|
+
secretKey: `${providerVaultPrefix}_CLIENT_ID`,
|
|
871
990
|
...(isApp ? {
|
|
872
991
|
requiredReference: true
|
|
873
992
|
} : {})
|
|
@@ -888,7 +1007,7 @@ function buildOAuthConfigurationContribution(seedsWithNamespaces) {
|
|
|
888
1007
|
defaultValueSource: {
|
|
889
1008
|
type: ContributeDefaultValueSourceType.Vault,
|
|
890
1009
|
secretType: 'OAUTH_CLIENT',
|
|
891
|
-
secretKey: `${
|
|
1010
|
+
secretKey: `${providerVaultPrefix}_CLIENT_SECRET`,
|
|
892
1011
|
...(isApp ? {
|
|
893
1012
|
requiredReference: true
|
|
894
1013
|
} : {})
|
|
@@ -909,7 +1028,7 @@ function buildOAuthConfigurationContribution(seedsWithNamespaces) {
|
|
|
909
1028
|
defaultValueSource: {
|
|
910
1029
|
type: ContributeDefaultValueSourceType.Vault,
|
|
911
1030
|
secretType: 'API_KEY',
|
|
912
|
-
secretKey:
|
|
1031
|
+
secretKey: instanceTokenKeys.apiKey
|
|
913
1032
|
}
|
|
914
1033
|
}, {
|
|
915
1034
|
'ui:widget': !seed.authMethods.includes('oauth2') ? 'password' : 'hidden',
|
|
@@ -925,10 +1044,13 @@ function buildOAuthConfigurationContribution(seedsWithNamespaces) {
|
|
|
925
1044
|
readOnly: true,
|
|
926
1045
|
writeOnly: true,
|
|
927
1046
|
scope: 1 /* ConfigurationScope.APPLICATION */,
|
|
1047
|
+
|
|
1048
|
+
// Staging vault route required — writeSettings drops format:secret
|
|
1049
|
+
// without defaultValueSource. Durable isolation is CRED_* via sync.
|
|
928
1050
|
defaultValueSource: {
|
|
929
1051
|
type: ContributeDefaultValueSourceType.Vault,
|
|
930
1052
|
secretType: 'OAUTH_CLIENT',
|
|
931
|
-
secretKey:
|
|
1053
|
+
secretKey: instanceTokenKeys.accessToken
|
|
932
1054
|
}
|
|
933
1055
|
}, {
|
|
934
1056
|
'ui:widget': 'hidden'
|
|
@@ -945,7 +1067,7 @@ function buildOAuthConfigurationContribution(seedsWithNamespaces) {
|
|
|
945
1067
|
defaultValueSource: {
|
|
946
1068
|
type: ContributeDefaultValueSourceType.Vault,
|
|
947
1069
|
secretType: 'OAUTH_CLIENT',
|
|
948
|
-
secretKey:
|
|
1070
|
+
secretKey: instanceTokenKeys.refreshToken
|
|
949
1071
|
}
|
|
950
1072
|
}, {
|
|
951
1073
|
'ui:widget': 'hidden'
|
|
@@ -1052,6 +1174,18 @@ function buildOAuthConfigurationContribution(seedsWithNamespaces) {
|
|
|
1052
1174
|
}, {
|
|
1053
1175
|
'ui:widget': 'hidden'
|
|
1054
1176
|
});
|
|
1177
|
+
// Without this key in the registry the connect flow cannot see the catalog's
|
|
1178
|
+
// usePKCE, and both the widget and readOAuthConfigFromRegistry fall back to
|
|
1179
|
+
// PKCE-on — silently ignoring every `usePKCE: false` in the catalog.
|
|
1180
|
+
addField('usePKCE', {
|
|
1181
|
+
type: 'boolean',
|
|
1182
|
+
title: 'Use PKCE',
|
|
1183
|
+
default: seed.usePKCE !== false,
|
|
1184
|
+
readOnly: true,
|
|
1185
|
+
scope: 2 /* ConfigurationScope.MACHINE */
|
|
1186
|
+
}, {
|
|
1187
|
+
'ui:widget': 'hidden'
|
|
1188
|
+
});
|
|
1055
1189
|
if (seed.clientAuthMethod) {
|
|
1056
1190
|
addField('clientAuthMethod', {
|
|
1057
1191
|
type: 'string',
|
|
@@ -1299,15 +1433,24 @@ function buildOAuthConfigurationContribution(seedsWithNamespaces) {
|
|
|
1299
1433
|
properties: formUIProperties
|
|
1300
1434
|
}];
|
|
1301
1435
|
}
|
|
1302
|
-
function generateFromSeeds(seeds, title, formIcon, formExtensionId) {
|
|
1436
|
+
function generateFromSeeds(seeds, title, formIcon, formExtensionId, options = {}) {
|
|
1303
1437
|
const allNodes = [];
|
|
1304
1438
|
const mergedUiLayoutTemplates = {};
|
|
1305
1439
|
const mergedUiLayoutUi = {};
|
|
1306
1440
|
let uiLayoutFormMetadataNode = null;
|
|
1307
1441
|
const seedsWithNamespaces = [];
|
|
1308
1442
|
seeds.forEach((seed, idx) => {
|
|
1309
|
-
|
|
1310
|
-
|
|
1443
|
+
// The namespace doubles as the formId AND flows into every configuration key
|
|
1444
|
+
// (`integrationSettings.settings.<type>.<ns>.oauthConnector…`). An explicit
|
|
1445
|
+
// namespace lets a caller regenerate the form for an ALREADY-PUBLISHED template
|
|
1446
|
+
// so the output is identity-compatible with it (same formId, same config keys);
|
|
1447
|
+
// the random default is only safe for brand-new forms.
|
|
1448
|
+
const generatedFormId = options.namespaces?.[idx] || `${sanitizeFieldKey(seed.providerId)}-${seed.connectorType}-${Math.random().toString(36).substring(2, 10)}`;
|
|
1449
|
+
// The connector's own title, with no `(APP)` marker appended. `connectorType` is
|
|
1450
|
+
// `app` for every one of the 1166 catalog connectors, so the suffix carried no
|
|
1451
|
+
// information - it just made every row in the credential picker read "… (APP)".
|
|
1452
|
+
// The type is still contributed as `connectorType` for anything that needs it.
|
|
1453
|
+
const providerTitle = seed.title;
|
|
1311
1454
|
const namespace = generatedFormId;
|
|
1312
1455
|
seedsWithNamespaces.push({
|
|
1313
1456
|
seed,
|
|
@@ -1543,13 +1686,13 @@ function generateFromSeeds(seeds, title, formIcon, formExtensionId) {
|
|
|
1543
1686
|
const credentialBasePath = CONTRIBUTION_POINTS['uiLayout.credential.path'];
|
|
1544
1687
|
const prefixedTemplates = {};
|
|
1545
1688
|
const prefixedUi = {};
|
|
1546
|
-
//
|
|
1689
|
+
// Bucket each seed into one of three credential namespaces: app | llm | mcp
|
|
1547
1690
|
const nsToCategoryMap = new Map();
|
|
1548
1691
|
seedsWithNamespaces.forEach(({
|
|
1549
1692
|
seed,
|
|
1550
1693
|
namespace
|
|
1551
1694
|
}) => {
|
|
1552
|
-
nsToCategoryMap.set(namespace,
|
|
1695
|
+
nsToCategoryMap.set(namespace, seedCredentialNamespace(seed));
|
|
1553
1696
|
});
|
|
1554
1697
|
Object.keys(mergedUiLayoutTemplates).forEach(key => {
|
|
1555
1698
|
const categoryKey = nsToCategoryMap.get(key);
|
|
@@ -1587,8 +1730,8 @@ function generateFromSeeds(seeds, title, formIcon, formExtensionId) {
|
|
|
1587
1730
|
if (!uiLayoutFormMetadataNode) return allNodes;
|
|
1588
1731
|
return [...allNodes, uiLayoutFormMetadataNode, uiLayoutFormNode, uiLayoutFormUINode];
|
|
1589
1732
|
}
|
|
1590
|
-
function createOAuthSeedGenerator(seeds) {
|
|
1591
|
-
return (title = '', formIcon = '', formExtensionId = '') => generateFromSeeds(seeds, title, formIcon, formExtensionId);
|
|
1733
|
+
function createOAuthSeedGenerator(seeds, options = {}) {
|
|
1734
|
+
return (title = '', formIcon = '', formExtensionId = '') => generateFromSeeds(seeds, title, formIcon, formExtensionId, options);
|
|
1592
1735
|
}
|
|
1593
1736
|
// create provider refs
|
|
1594
1737
|
const findRefPath = node => {
|
|
@@ -1646,4 +1789,4 @@ const buildMetadataSchema = sampleNodes => {
|
|
|
1646
1789
|
configurationNodes: entry.configurationNodes,
|
|
1647
1790
|
contributes: {}
|
|
1648
1791
|
}))];
|
|
1649
|
-
};export{buildMetadataSchema,buildProviderConfig,buildProviderSeedFromConfig,buildProviderWithRefs,createOAuthSeedGenerator};//# sourceMappingURL=authMetaDataSchema.js.map
|
|
1792
|
+
};export{buildCredentialOAuthConfigKey,buildCredentialOAuthTokenVaultKeys,buildCredentialScopedSecretKey,buildMetadataSchema,buildNamespaceCredentialOAuthTokenVaultKeys,buildOAuthInstanceTokenVaultKeys,buildProviderConfig,buildProviderCredentialOAuthTokenVaultKeys,buildProviderSeedFromConfig,buildProviderWithRefs,createOAuthSeedGenerator,credentialIdFromOAuthConfigKey,credentialIdFromScopedSecretKey,isCredentialAccountConfigKey,isCredentialScopedSecretKey,namespaceFromOAuthConfigKey,stripCredentialAccountConfigKey,stripCredentialScopedSecretKey,toVaultPrefix};//# sourceMappingURL=authMetaDataSchema.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authMetaDataSchema.js","sources":["../../src/utils/authMetaDataSchema.ts"],"sourcesContent":[null],"names":[],"mappings":"6NAeA,
|
|
1
|
+
{"version":3,"file":"authMetaDataSchema.js","sources":["../../src/utils/authMetaDataSchema.ts"],"sourcesContent":[null],"names":[],"mappings":"6NAeA,MAAM,WAAW,GAAA,GAAA,IAAA,GAAA,CAAA,KAAA,CAAoB,GAAA,CAAA,CAAA,GAAA,CAAA,CAAA,IAAA,CAAA,CAAA,IAAA,EAAA,CAAA,CAAA,MAAA,CAAA,OAAA,CAAA;MACjC,eAAY,GAAA,GAAA,IAAA;MACZ,KAAA,CAAA,WAAmB,CAAA,EAAA,OAAA,GAAA;MACnB,GAAK,SAAS,IAAA,GAAA,KAAA,SAAA,EAAA,OAAA,EAAA;MACd,OAAA,GAAW,aAAS,EAAA,OAAA,EAAA;MACpB,CAAA,GAAM,CAAA,IAAE,EAAA,EAAM,OAAG,EAAA;MACjB;IACA,MAAA,MAAA,GAAA,IAAA,CAAA,KAAwB,CAAE,GAAA,CAAA;IAC1B,OAAO,KAAG,CAAA,OAAQ,CAAA,MAAA,CAAA,GAAA,MAAA,GAAA,EAAA;AAClB,EAAA,CAAA,CAAA,OAAA,CAAA,EAAA;IACA,OAAA,GAAA,CAAA,KAAgB,CAAC,IAAE,CAAA,CAAA,GAAO,CAAA,IAAA,IAAA,IAAA,CAAA,IAAA,EAAA,CAAA,CAAA,MAAA,CAAA,OAAA,CAAA,CAAA,GAAA,CAAA,IAAA,IAAA;MAC1B,MAAQ,CAAC,KAAE,EAAA,KAAO,CAAA,GAAA,IAAA,CAAA,KAAA,CAAA,GAAA,CAAA;MAClB,OAAA;QACA,KAAA,EAAA,CAAY,KAAG,IAAA,EAAQ,EAAA,IAAA,EAAA;QACvB,KAAS,EAAA,CAAA,KAAO,IAAA,KAAA,IAAA,EAAA,EAAA,IAAA;OAChB;IACA,CAAA,CAAA;;;MAGA,QAAA,GAAa,KAAE,IAAA,CAAA,KAAA,IAAA,EAAkB,EAAG,OAAA,CAAA,oBAAA,EAAA,OAAA,CAAA,CAAA,OAAA,CAAA,uBAAA,EAAA,OAAA,CAAA,CAAA,OAAA,CAAA,gBAAA,EAAA,GAAA,CAAA,CAAA,OAAA,CAAA,UAAA,EAAA,EAAA,CAAA,CAAA,WAAA,EAAA;MACpC,iBAAiB,GAAA,CAAA,MAAA,EAAA,UAAA,KAAA,MAAA,CAAA,GAAA,CAAA,KAAA,KAAA;MACjB,EAAA,KAAA,CAAA,IAAA;OACA,EAAA,KAAU,CAAA;AACb,EAAA,IAAA,EAAA,KAAA,CAAA,IAAA;AAED,EAAA,kBAAiB,CAAA,WAAA;oBACA,CAAA,WAAA;UACR,OAAQ,CAAC,QAAA;gBACF,KAAC,CAAA,YAAA,IAAA,EAAA;eACF,EAAE,MAAM,aAAC;UACpB,EAAA,KAAa,SAAO;cACV,OAAO,CAAC,QAAA,GAAA,KAAA,CAAA,YAAA,IAAA;IAClB,IAAA,EAAA,OAAY;IACZ,UAAA,EAAA,gBAAuB;AACvB,IAAA,SAAA,EAAA,KAAe,CAAA,SAAA,KAAA,UAAA,GAAA,CAAA,EAAA,QAAA,CAAA,UAAA,CAAA,CAAA,CAAA,EAAA,QAAA,CAAA,KAAA,CAAA,IAAA,CAAA,CAAA,CAAA,GAAA,QAAA,CAAA,KAAA,CAAA,IAAA,CAAA;AACX,GAAA,GAAA,IAAA;AACA,EAAA,QAAA,EAAA,KAAA,CAAU,QAAE;YACZ,EAAA,eAAkB,CAAA,KAAA,CAAA,UAAA,CAAA;UACpB,EAAA,KAAA,CAAA,QAAA;UACF,EAAQ,cAAU;aACT,EAAE,MAAM,WAAC,IAAA,SAAA;AAClB,EAAA,SAAA,EAAA,KAAY,CAAA,SAAY,IAAA,SAAA;cACd,OAAO,CAAA,YAAA,IAAA,SAAA;OACjB,EAAA,KAAU,CAAA,SAAS;;AAEX,MAAA,mBAAS,GAAA,CAAA,cAAA,EAAA,aAAA,KAAA;QACjB,IAAA,GAAW;IACX,EAAA,EAAA,cAAc,CAAA,EAAA;IACd,KAAA,EAAA,cAAkB,CAAA,KAAA;IAClB,WAAA,EAAY,cAAS,CAAA,WAAA;AACxB,IAAA,IAAA,EAAA,cAAA,CAAA,IAAA,IAAA;AAED,MAAM,oBAAW,CAAA,QAAA;MACX,qBAAS,CAAA,YAAA,GAAA;QACX,UAAc,cAAA,CAAA;OACd,GAAA;KACA;IACA,IAAA,EAAM,cAAS,CAAA,IAAA,IAAA,SAAA;IACf,KAAA,EAAA,cAAiB,CAAA,KAAA,IAAA,SAAA;IACjB,OAAA,EAAA,cAAqB,CAAA,OAAA;IACrB,MAAM,OAAO,CAAA,OAAA,CAAA,cAAA,CAAA,MAAA,CAAA,GAAA,cAAA,CAAA,MAAA,GAAA,WAAA,CAAA,cAAA,CAAA,MAAA,CAAA;IACb,aAAa,cAAC,CAAA,WAAA,CAAA,MAAA,GAAA,CAAA,GAAA,cAAA,CAAA,WAAA,GAAA,CAAA,SAAA,CAAA;IACd,0BAAiB,CAAA,UAAA,IAAA,CAAA,cAAA,CAAA,QAAA,CAAA;IACjB,MAAM,EAAE,iBAAO,CAAA,cAAA,CAAA,MAAA,EAAA,cAAA,CAAA,EAAA;AACf,GAAA;wBAAsB,KAAA,EAAA;AAAC,IAAA,OAAA;aAAU;iBAAkB,EAAA,cAAA,CAAA,WAAA,IAAA,SAAA;MAAG,MAAA,EAAA,cAAA,CAAA;AACtD,KAAA;AACA,EAAA;SACA;IACA,GAAA,IAAO;AACP,IAAA,WAAA,EAAA,cAAkB,CAAA,WAAqB;IACvC,yBAAyB,cAAA,CAAA,uBAAA;IACzB,OAAA,EAAQ,cAAS,CAAA,OAAA;IACjB,gCAAsB,CAAA,gBAAA;IACtB,gCAAsB,CAAA,gBAAA;IACtB,QAAQ,EAAE,cAAO,CAAA,QAAA;IACjB,aAAQ,EAAA,cAAqB,CAAC,aAAA;AACjC,IAAA,YAAA,EAAA,cAAA,CAAA;AAkED,GAAA;;;;;;;kBA9EmB;AAAgB,IAAA,WAAA,EAAA,CAAA,CAAA,WAAA,IAAA,EAAA;YAAE,CAAA,CAAA,MAAQ;AAAU,IAAA,WAAA,EAAA,CAAA,CAAA,WAAA,IAAA,EAAA;;;;;;;;;;;cAoD3B,MAAG,IAAA,EAAA;;;;;;;;AAjFjB,EAAA,GAAA,EAAA,CAAA,EAAA,CAAA,CAAA,EAAA,CAAA,IAAA,CAAA;;;;kBAiGsB,IAAG,EAAA;;sBAhDgB,EAAA;sBAAe;;;;;;;;;;;;;;;;;;;;;;6BApB7C,IAAA,IAAA,CAAA,SAAA,EAAA;AAAU,IAAA,MAAA,QAAA,GAAA,kCAAA,CAAA,gBAAA,EAAA;YAAE,EAAA,IAAA,CAAA;AAAkB,MAAA,QAAA,EAAA,CAAA,EAAA,QAAA,CAAA,eAAA,CAAA;;;;;;;;;;;gBAoD3B,CAAG,IAAA,KAAA,UAAA,IAAA,QAAA,CAAA,MAAA,CAAA,OAAA,EAAA;;;;;;;;AAjFjB,QAAA,UAAA,CAAA,CAAA,EAAA,EAAA,CAAO,SAAG,EAAA,CAAA,CAAA,MAAa,CAAA,CAAA,GAAA,CAAA,CAAA,KAAA;;uBAElB,YAAM,CAAA,CAAA,GAAA,CAAA,CAAA,IAAA,CAAA,MAAA;;kBA+FW,EAAA,EAAG,CAAA,aAAA,CAAA,CAAA,GAAA,CAAA,CAAA,IAAA,CAAA,OAAA;;oBAhDgB,EAAA,CAAA,YAAM,CAAA,CAAA,GAAA,CAAA,CAAA,WAAA;oBAAS,EAAA,CAAA,iBAAM,CAAA,CAAA,GAAA,CAAA,CAAA,gBAAA;;;;;;;;;MA+F1E,MAAA,CAAA,GAAA,QAAA,CAAA,MAAA,CAAA,OAAA;AA+CF,MAAA,MAAA,EAAA,GAAA,CAAA,EAAA,MAAgB,CAAA,eAAA,CAAA;AAmIhB,MAAA,UAAA,CAAA,CAAA,EAAA,EAAA,CAAA,MAAA,CAAA,CAAA,GAAA,CAAA,CAAA,KAAA;;;AAGG,MAAA,UAAA,CAAA,CAAA,EAAA,EAAA,CAAA,UAAA,CAAA,CAAA,GAAA,CAAA,CAAA,SAAA;AACH,IAAA;AAEA,EAAA;;;;;;;;;AASG,IAAA,IAAA,EAAA;AACH,GAAA;MAGQ,CAAA,aAAA,CAAA,OAAA,CAAA,CAAA,GAAA,EAAA,GAAA,KAAA;;IAEA,IAAA,CAAA,CAAA,EAAA,IAAA,CAAA,GAAA,CAAA,CAAA,GAAA,GAAA,CAAA,EAAA,IAAA,CAAA,IAAA,EAAA,IAAA,CAAA,MAAA,EAAA,CAAA,QAAA,CAAA,EAAA,CAAA,CAAA,SAAA,CAAA,CAAA,EAAA,EAAA,CAAA,CAAA,CAAA;;;IAIN,IAAA,GAAA,CAAA,UAAA,EAAA,IAAA,CAAA,CAAA,EAAA,IAAA,CAAA,WAAA,CAAA,CAAA,GAAA,GAAA,CAAA,UAAA;AAKF,IAAA,IAAA,GAAA,CAAA,SAAA,EAAA,IAAA,CAAA,CAAA,EAAA,IAAA,CAAA,UAAA,CAAA,CAAA,GAAA,GAAA,CAAA,SAAA;;;;;;;;;;;;AAYG,IAAA,2CAAA,EAAA,KAAA;AACH,IAAA,gCAAa,EAAA,WAAA;AAQb,IAAA,wCAAA,EAAA,OAAA;AACA,IAAA,oCAAa,EAAA,IAAA;AAGb,IAAA,iCAAA,EAAA,QAAA;AACA,IAAA,4CAAa,EAAA;AAGb,IAAA,+CAAA,EAAA,EAAA;AACA,IAAA,gDAA4C,CAAA;AAG5C,IAAA,+CAAA,EAAA,IAAA;;;;AAIG,IAAA,+BAAA,EAAA;AACH,GAAA;;;;AAQA;;;AAGG;AACH,MAAA,uBAAa,GAAA,IAAA,IAAA,IAAA,CAAA,aAAA,KAA0C,gBAAgB,IAAA,CAAM,mBAAgB,CAAA,GAAM,KAAA,GAAA,KAAA;;;;AAQnG;;AAEG;AACH;;;;AAmBA;AACA;AAGA;AACA;AAGA;AACA,MAAA,4CAA+C,IAAA;AAK/C,EAAA,MAAA,MAAA,GAAA,aAAA,CAAA,SAAA,CAAA;;;AAGG,IAAA,WAAA,EAAA,CAAA,EAAA,MAAA,CAAA,aAAA,CAAA;AACH;AAQA,IAAA,YAAA,EAAA,CAAA,EAAA,MAAA,CAAA,cAAA,CAAA;AACA,IAAA,MAAA,EAAA,CAAA,EAAO,MAAM;AA+2Cb,GAAA;AACI;;;;;;AAMG;;AAEN;AAED;AA2BA;AAwBA;;;;;;;;;;;;;AAqBE,MAAA,2BAAA,GAAA,SAAA,IAAA,+BAAA,CAAA,IAAA,CAAA,SAAA,IAAA,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
type JsonObject = Record<string, unknown>;
|
|
2
|
+
export interface IntegrationCommandParameter {
|
|
3
|
+
name: string;
|
|
4
|
+
schema: {
|
|
5
|
+
type: string;
|
|
6
|
+
description?: string;
|
|
7
|
+
[key: string]: unknown;
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
export interface IntegrationCommandExecution {
|
|
11
|
+
type: 'workflow';
|
|
12
|
+
namespace: string;
|
|
13
|
+
workflowSlug: string;
|
|
14
|
+
version: string;
|
|
15
|
+
paramBindings: Record<string, string>;
|
|
16
|
+
/** Parsed JSON body template. When present, the runtime resolves it via resolveInputTemplate instead of building a flat body from paramBindings. */
|
|
17
|
+
inputTemplate?: unknown;
|
|
18
|
+
}
|
|
19
|
+
export interface IntegrationCommand {
|
|
20
|
+
command: string;
|
|
21
|
+
title: string;
|
|
22
|
+
category?: string;
|
|
23
|
+
description?: string;
|
|
24
|
+
parameters: IntegrationCommandParameter[];
|
|
25
|
+
execution: IntegrationCommandExecution;
|
|
26
|
+
}
|
|
27
|
+
export interface FieldBinding {
|
|
28
|
+
userField?: string;
|
|
29
|
+
workflowNodeId?: string;
|
|
30
|
+
paramName?: string;
|
|
31
|
+
}
|
|
32
|
+
export interface ActionBinding {
|
|
33
|
+
action?: string;
|
|
34
|
+
label?: string;
|
|
35
|
+
workflow?: JsonObject;
|
|
36
|
+
fieldBindings?: FieldBinding[];
|
|
37
|
+
/** Optional JSON body template authored by the publisher; {{$user.<field>}} placeholders are filled with end-user values at run time. */
|
|
38
|
+
inputTemplate?: string;
|
|
39
|
+
}
|
|
40
|
+
export interface UserFieldDef {
|
|
41
|
+
type?: string;
|
|
42
|
+
title?: string;
|
|
43
|
+
format?: string;
|
|
44
|
+
enum?: unknown[];
|
|
45
|
+
}
|
|
46
|
+
export interface BuildActionsOptions {
|
|
47
|
+
slug: string;
|
|
48
|
+
category?: string;
|
|
49
|
+
namespace?: string;
|
|
50
|
+
userFields?: Record<string, UserFieldDef>;
|
|
51
|
+
}
|
|
52
|
+
export type MetadataSchemaEntry = {
|
|
53
|
+
schemaId?: string;
|
|
54
|
+
[key: string]: unknown;
|
|
55
|
+
};
|
|
56
|
+
export declare function parseInputTemplate(raw?: string): unknown;
|
|
57
|
+
/** Collects the user-field keys referenced as {{$user.<key>}} anywhere in a parsed template. */
|
|
58
|
+
export declare function extractTemplateUserFields(node: unknown, refs?: Set<string>): string[];
|
|
59
|
+
/**
|
|
60
|
+
* Fills {{$user.<key>}} placeholders with end-user values by walking the parsed template.
|
|
61
|
+
* A string that is exactly one placeholder is replaced with the raw typed value; placeholders
|
|
62
|
+
* embedded in a longer string are interpolated. Everything else (including workflow-native
|
|
63
|
+
* {{...}} expressions) passes through untouched.
|
|
64
|
+
*
|
|
65
|
+
* Values that the template never references are appended to the resolved root object so callers
|
|
66
|
+
* still receive them; template-authored keys always win over a same-named extra value.
|
|
67
|
+
*/
|
|
68
|
+
export declare function resolveInputTemplate(node: unknown, values: Record<string, unknown>): unknown;
|
|
69
|
+
export declare function buildParamBindings(action: ActionBinding): Record<string, string>;
|
|
70
|
+
export declare function buildCommandsFromActions(actions: ActionBinding[], opts: BuildActionsOptions): IntegrationCommand[];
|
|
71
|
+
export interface IntegrationMenuEntry {
|
|
72
|
+
command: string;
|
|
73
|
+
label: string;
|
|
74
|
+
enabled: boolean;
|
|
75
|
+
order: number;
|
|
76
|
+
}
|
|
77
|
+
export interface IntegrationMenusContributes {
|
|
78
|
+
commandPalette: IntegrationMenuEntry[];
|
|
79
|
+
}
|
|
80
|
+
export declare function buildMenusFromCommands(commands: IntegrationCommand[]): IntegrationMenusContributes;
|
|
81
|
+
export interface IntegrationConfigurationIdentity {
|
|
82
|
+
title?: string;
|
|
83
|
+
formId: string;
|
|
84
|
+
/** Identifies this template independently of formId — generated fresh if not supplied. */
|
|
85
|
+
formTemplateId?: string;
|
|
86
|
+
formExtensionId?: string;
|
|
87
|
+
description?: string;
|
|
88
|
+
projectType?: string;
|
|
89
|
+
tags?: string[];
|
|
90
|
+
}
|
|
91
|
+
export declare function buildIntegrationConfigurationContribution(userFields: Record<string, UserFieldDef>, slug: string, identity?: IntegrationConfigurationIdentity): Record<string, unknown>[];
|
|
92
|
+
export declare function extractUserFieldsFromStepperFormMetadata(metadataSchema: MetadataSchemaEntry[], stepKey?: string): Record<string, UserFieldDef>;
|
|
93
|
+
export {};
|
|
94
|
+
//# sourceMappingURL=integrationCommands.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"integrationCommands.d.ts","sourceRoot":"","sources":["../../src/utils/integrationCommands.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
import {v4}from'uuid';function normalizeWorkflowSelection(workflow) {
|
|
2
|
+
if (!workflow) return {};
|
|
3
|
+
if (typeof workflow === 'string') {
|
|
4
|
+
try {
|
|
5
|
+
return JSON.parse(workflow);
|
|
6
|
+
} catch (e) {
|
|
7
|
+
return {};
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
return workflow;
|
|
11
|
+
}
|
|
12
|
+
const USER_REF = /\{\{\$user\.([\w.-]+)\}\}/g;
|
|
13
|
+
const FULL_USER_REF = /^\{\{\$user\.([\w.-]+)\}\}$/;
|
|
14
|
+
function parseInputTemplate(raw) {
|
|
15
|
+
if (!raw?.trim()) return undefined;
|
|
16
|
+
try {
|
|
17
|
+
return JSON.parse(raw);
|
|
18
|
+
} catch (e) {
|
|
19
|
+
return undefined;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
/** Collects the user-field keys referenced as {{$user.<key>}} anywhere in a parsed template. */
|
|
23
|
+
function extractTemplateUserFields(node, refs = new Set()) {
|
|
24
|
+
if (typeof node === 'string') {
|
|
25
|
+
for (const m of node.matchAll(USER_REF)) refs.add(m[1]);
|
|
26
|
+
} else if (Array.isArray(node)) {
|
|
27
|
+
node.forEach(item => extractTemplateUserFields(item, refs));
|
|
28
|
+
} else if (node && typeof node === 'object') {
|
|
29
|
+
Object.values(node).forEach(value => extractTemplateUserFields(value, refs));
|
|
30
|
+
}
|
|
31
|
+
return [...refs];
|
|
32
|
+
}
|
|
33
|
+
function fillTemplateNode(node, values) {
|
|
34
|
+
if (typeof node === 'string') {
|
|
35
|
+
const full = FULL_USER_REF.exec(node);
|
|
36
|
+
if (full) return values[full[1]];
|
|
37
|
+
return node.replace(USER_REF, (_, key) => String(values[key] ?? ''));
|
|
38
|
+
}
|
|
39
|
+
if (Array.isArray(node)) return node.map(item => fillTemplateNode(item, values));
|
|
40
|
+
if (node && typeof node === 'object') {
|
|
41
|
+
return Object.fromEntries(Object.entries(node).map(([key, value]) => [key, fillTemplateNode(value, values)]));
|
|
42
|
+
}
|
|
43
|
+
return node;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Fills {{$user.<key>}} placeholders with end-user values by walking the parsed template.
|
|
47
|
+
* A string that is exactly one placeholder is replaced with the raw typed value; placeholders
|
|
48
|
+
* embedded in a longer string are interpolated. Everything else (including workflow-native
|
|
49
|
+
* {{...}} expressions) passes through untouched.
|
|
50
|
+
*
|
|
51
|
+
* Values that the template never references are appended to the resolved root object so callers
|
|
52
|
+
* still receive them; template-authored keys always win over a same-named extra value.
|
|
53
|
+
*/
|
|
54
|
+
function resolveInputTemplate(node, values) {
|
|
55
|
+
const resolved = fillTemplateNode(node, values);
|
|
56
|
+
if (!resolved || typeof resolved !== 'object' || Array.isArray(resolved)) return resolved;
|
|
57
|
+
const referenced = new Set(extractTemplateUserFields(node));
|
|
58
|
+
const extras = Object.entries(values).filter(([key]) => !referenced.has(key) && !(key in resolved));
|
|
59
|
+
return extras.length ? {
|
|
60
|
+
...resolved,
|
|
61
|
+
...Object.fromEntries(extras)
|
|
62
|
+
} : resolved;
|
|
63
|
+
}
|
|
64
|
+
function buildParamBindings(action) {
|
|
65
|
+
const map = {};
|
|
66
|
+
(action.fieldBindings || []).forEach(binding => {
|
|
67
|
+
if (!binding.userField) return;
|
|
68
|
+
const paramKey = binding.paramName || binding.userField;
|
|
69
|
+
map[paramKey] = binding.userField;
|
|
70
|
+
});
|
|
71
|
+
return map;
|
|
72
|
+
}
|
|
73
|
+
function buildCommandsFromActions(actions, opts) {
|
|
74
|
+
return (actions || []).filter(action => !!action && !!action.action).map(action => {
|
|
75
|
+
const id = `${opts.slug}.${action.action}`;
|
|
76
|
+
const title = action.label || action.action;
|
|
77
|
+
const workflow = normalizeWorkflowSelection(action.workflow);
|
|
78
|
+
const inputTemplate = parseInputTemplate(action.inputTemplate);
|
|
79
|
+
// Template mode: parameters come from the {{$user.*}} refs, keyed by user field name.
|
|
80
|
+
const paramSources = inputTemplate ? extractTemplateUserFields(inputTemplate).map(field => ({
|
|
81
|
+
name: field,
|
|
82
|
+
userField: field
|
|
83
|
+
})) : (action.fieldBindings || []).filter(b => !!(b.paramName || b.userField)).map(b => ({
|
|
84
|
+
name: b.paramName || b.userField,
|
|
85
|
+
userField: b.userField
|
|
86
|
+
}));
|
|
87
|
+
const parameters = paramSources.map(({
|
|
88
|
+
name,
|
|
89
|
+
userField
|
|
90
|
+
}) => {
|
|
91
|
+
const source = userField && opts.userFields?.[userField] || {};
|
|
92
|
+
const schema = {
|
|
93
|
+
type: source.type || 'string'
|
|
94
|
+
};
|
|
95
|
+
if (source.title) schema.description = source.title;
|
|
96
|
+
if (source.format) schema.format = source.format;
|
|
97
|
+
if (Array.isArray(source.enum)) schema.enum = source.enum;
|
|
98
|
+
return {
|
|
99
|
+
name,
|
|
100
|
+
schema
|
|
101
|
+
};
|
|
102
|
+
});
|
|
103
|
+
const cmd = {
|
|
104
|
+
command: id,
|
|
105
|
+
title,
|
|
106
|
+
parameters,
|
|
107
|
+
execution: {
|
|
108
|
+
type: 'workflow',
|
|
109
|
+
namespace: opts.namespace || '',
|
|
110
|
+
workflowSlug: workflow.workflowSlug || '',
|
|
111
|
+
version: workflow.version || '',
|
|
112
|
+
paramBindings: inputTemplate ? Object.fromEntries(paramSources.map(({
|
|
113
|
+
name
|
|
114
|
+
}) => [name, name])) : buildParamBindings(action),
|
|
115
|
+
...(inputTemplate !== undefined ? {
|
|
116
|
+
inputTemplate
|
|
117
|
+
} : {})
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
if (opts.category) cmd.category = opts.category;
|
|
121
|
+
return cmd;
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
function buildMenusFromCommands(commands) {
|
|
125
|
+
return {
|
|
126
|
+
commandPalette: commands.map((cmd, i) => ({
|
|
127
|
+
command: cmd.command,
|
|
128
|
+
label: cmd.title,
|
|
129
|
+
enabled: true,
|
|
130
|
+
order: i + 1
|
|
131
|
+
}))
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
function buildIntegrationConfigurationContribution(userFields, slug, identity) {
|
|
135
|
+
const formProperties = {
|
|
136
|
+
required: []
|
|
137
|
+
};
|
|
138
|
+
const formUIProperties = {};
|
|
139
|
+
const basePath = `integrationSettings.settings.integrationWorkflow.${slug}`;
|
|
140
|
+
const metaPaths = new Set();
|
|
141
|
+
const baseParts = basePath.split('.');
|
|
142
|
+
for (let i = 1; i <= baseParts.length; i++) {
|
|
143
|
+
metaPaths.add(baseParts.slice(0, i).join('.'));
|
|
144
|
+
}
|
|
145
|
+
Array.from(metaPaths).sort().forEach(path => {
|
|
146
|
+
const parts = path.split('.');
|
|
147
|
+
formProperties[`${path}.meta`] = {
|
|
148
|
+
title: parts[parts.length - 1],
|
|
149
|
+
description: '',
|
|
150
|
+
type: 'object',
|
|
151
|
+
position: 0
|
|
152
|
+
};
|
|
153
|
+
formProperties[`${path}.required`] = [];
|
|
154
|
+
});
|
|
155
|
+
if (identity) {
|
|
156
|
+
formProperties[`${basePath}.title`] = {
|
|
157
|
+
type: 'string',
|
|
158
|
+
title: 'title',
|
|
159
|
+
default: identity.title || ''
|
|
160
|
+
};
|
|
161
|
+
formProperties[`${basePath}.description`] = {
|
|
162
|
+
type: 'string',
|
|
163
|
+
title: 'description',
|
|
164
|
+
default: identity.description || ''
|
|
165
|
+
};
|
|
166
|
+
formProperties[`${basePath}.projectType`] = {
|
|
167
|
+
type: 'string',
|
|
168
|
+
title: 'projectType',
|
|
169
|
+
default: identity.projectType || 'Integration'
|
|
170
|
+
};
|
|
171
|
+
formProperties[`${basePath}.tags`] = {
|
|
172
|
+
type: 'array',
|
|
173
|
+
title: 'tags',
|
|
174
|
+
items: {
|
|
175
|
+
type: 'string'
|
|
176
|
+
},
|
|
177
|
+
uniqueItems: true,
|
|
178
|
+
default: identity.tags || ['integration']
|
|
179
|
+
};
|
|
180
|
+
formProperties[`${basePath}.formId`] = {
|
|
181
|
+
type: 'string',
|
|
182
|
+
title: 'formId',
|
|
183
|
+
default: identity.formId,
|
|
184
|
+
readOnly: true
|
|
185
|
+
};
|
|
186
|
+
formProperties[`${basePath}.formTemplateId`] = {
|
|
187
|
+
type: 'string',
|
|
188
|
+
title: 'formTemplateId',
|
|
189
|
+
default: identity.formTemplateId || v4(),
|
|
190
|
+
readOnly: true
|
|
191
|
+
};
|
|
192
|
+
formProperties[`${basePath}.formExtensionId`] = {
|
|
193
|
+
type: 'string',
|
|
194
|
+
title: 'formExtensionId',
|
|
195
|
+
default: identity.formExtensionId || '',
|
|
196
|
+
readOnly: true
|
|
197
|
+
};
|
|
198
|
+
formUIProperties[`${basePath}.formId`] = {
|
|
199
|
+
'ui:readonly': true
|
|
200
|
+
};
|
|
201
|
+
formUIProperties[`${basePath}.formTemplateId`] = {
|
|
202
|
+
'ui:readonly': true
|
|
203
|
+
};
|
|
204
|
+
formUIProperties[`${basePath}.formExtensionId`] = {
|
|
205
|
+
'ui:readonly': true
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
Object.entries(userFields).forEach(([key, def]) => {
|
|
209
|
+
formProperties[`${basePath}.${key}`] = {
|
|
210
|
+
type: def.type || 'string',
|
|
211
|
+
title: def.title || key,
|
|
212
|
+
...(def.format ? {
|
|
213
|
+
format: def.format
|
|
214
|
+
} : {}),
|
|
215
|
+
...(Array.isArray(def.enum) ? {
|
|
216
|
+
enum: def.enum
|
|
217
|
+
} : {})
|
|
218
|
+
};
|
|
219
|
+
});
|
|
220
|
+
return [{
|
|
221
|
+
type: 'form-metadata',
|
|
222
|
+
properties: {
|
|
223
|
+
schemaId: 'configuration'
|
|
224
|
+
}
|
|
225
|
+
}, {
|
|
226
|
+
type: 'form',
|
|
227
|
+
properties: formProperties
|
|
228
|
+
}, {
|
|
229
|
+
type: 'formUI',
|
|
230
|
+
properties: formUIProperties
|
|
231
|
+
}];
|
|
232
|
+
}
|
|
233
|
+
function extractUserFieldsFromStepperFormMetadata(metadataSchema, stepKey = 'userFields') {
|
|
234
|
+
const result = {};
|
|
235
|
+
const stepper = (metadataSchema || []).find(entry => entry?.schemaId === 'stepper-form');
|
|
236
|
+
const nodes = stepper?.configurationNodes || [];
|
|
237
|
+
const formNode = nodes.find(node => node?.type === 'form');
|
|
238
|
+
const props = formNode?.properties || {};
|
|
239
|
+
const prefix = `${stepKey}.`;
|
|
240
|
+
Object.keys(props).forEach(key => {
|
|
241
|
+
if (!key.startsWith(prefix)) return;
|
|
242
|
+
const rest = key.slice(prefix.length);
|
|
243
|
+
if (rest.includes('.')) return;
|
|
244
|
+
const def = props[key] || {};
|
|
245
|
+
result[rest] = {
|
|
246
|
+
type: def.type,
|
|
247
|
+
title: def.title,
|
|
248
|
+
format: def.format,
|
|
249
|
+
enum: def.enum
|
|
250
|
+
};
|
|
251
|
+
});
|
|
252
|
+
return result;
|
|
253
|
+
}export{buildCommandsFromActions,buildIntegrationConfigurationContribution,buildMenusFromCommands,buildParamBindings,extractTemplateUserFields,extractUserFieldsFromStepperFormMetadata,parseInputTemplate,resolveInputTemplate};//# sourceMappingURL=integrationCommands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"integrationCommands.js","sources":["../../src/utils/integrationCommands.ts"],"sourcesContent":[null],"names":[],"mappings":"sBAIA,mCAAiB,CAAA,QAA2B,EAAA;MACxC,CAAA,UAAa,OAAA,EAAA;AACb,EAAA,IAAA,OAAQ,QAAA,KAAA,QAAA,EAAA;QAAE;aAAc,IAAA,CAAA,KAAc,CAAA,QAAO,CAAA;AAAC,IAAA,CAAA,CAAA,OAAI,CAAE,EAAA;MAAmB,OAAA,EAAA;AAC1E,IAAA;AAED,EAAA;SACQ;;MAEJ,QAAA,GAAY,4BAAS;MACrB,aAAe,GAAC,6BAAA;AAChB,SAAA,kBAA8B,CAAA,GAAA,EAAM;MACpC,CAAA,GAAA,EAAA,IAAA,EAAA,EAAA,OAAA,SAAA;MACA;AACH,IAAA,OAAA,IAAA,CAAA,KAAA,CAAA,GAAA,CAAA;AAED,EAAA,CAAA,CAAA;IACI,OAAO,SAAS;;;;AAIhB,SAAY,yBAAA,CAAA,IAA8B,EAAA,IAAA,GAAA,IAAA,GAAA,EAAA,EAAA;MAC1C,OAAS;AACZ,IAAA,KAAA,MAAA,CAAA,IAAA,IAAA,CAAA,QAAA,CAAA,QAAA,CAAA,EAAA,IAAA,CAAA,GAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,EAAA,CAAA,eAAiB,CAAA,OAAA,CAAA,IAAY,CAAA,EAAA;IACzB,IAAA,CAAA,OAAY,CAAA,IAAA,IAAO,yBAAA,CAAA,IAAA,EAAA,IAAA,CAAA,CAAA;SACnB,IAAA,IAAA,IAAiB,OAAO,IAAA,KAAA,QAAA,EAAA;IACxB,MAAA,CAAA,MAAY,CAAA,IAAM,CAAC,CAAA,OAAA,CAAA,KAAA,IAAA,yBAAA,CAAA,KAAA,EAAA,IAAA,CAAA,CAAA;AACtB,EAAA;AAED,EAAA,eAAiB,CAAA;;SAER,gBAAU,CAAA,IAAA,EAAA,MAAA,EAAA;MACf,OAAS,IAAE,KAAA,QAAW,EAAA;AACtB,IAAA,MAAA,IAAA,GAAa,aAAG,CAAA,IAAe,CAAA,IAAA,CAAA;IAC/B,IAAA,IAAA,EAAA,OAAA,MAAA,CAAA,IAAA,CAAA,CAAA,CAAA,CAAA;IACA,OAAA,IAAA,CAAA,OAAgB,CAAA,QAAO,EAAA,CAAA,CAAA,EAAA,GAAA,KAAA,MAAA,CAAA,MAAA,CAAA,GAAA,CAAA,IAAA,EAAA,CAAA,CAAA;AAC1B,EAAA;AAED,EAAA,IAAM,aAAW,CAAA,IAAA,CAAA,EAAA,OAAY,IAAA,CAAA,GAAA,CAAA,IAAA,IAAA,gBAAA,CAAA,IAAA,EAAA,MAAA,CAAA,CAAA;MACzB,IAAK,IAAE,OAAO,IAAA,KAAA,QAAA,EAAA;IACd,OAAM,MAAE,CAAM,WAAC,CAAA,MAAA,CAAA,OAAA,CAAA,IAAA,CAAA,CAAA,GAAA,CAAA,CAAA,CAAA,GAAA,EAAA,KAAA,CAAA,KAAA,CAAA,GAAA,EAAA,gBAAA,CAAA,KAAA,EAAA,MAAA,CAAA,CAAA,CAAA,CAAA;;AAEf,EAAA,OAAK,IAAE;AACV;AAED;;;;;AAKC;AAED;;AAAuD;AAAyB,SAAA,oBAAA,CAAA,IAAA,EAAA,MAAA,EAAA;AAiBhF,EAAA,MAAA,QAAA,GAAA,gBAAgB,CAAA,IAAA,EAAkB,OAAO;AASzC,EAAA,IAAA,CAAA,QAAA,IAAA,OAAA,QAAA,KAAA,QAAA,IAAA,KAAA,CAAA,OAAA,CAAA,QAAA,CAAA,EAAA,OAAA,QAAA;AACA,EAAA,MAAA,UAAA,GAAA,IAAgB,GAAA,CAAA,yBAA8B,CAAA,IAAE,CAAA,CAAA;AAwBhD,EAAA,MAAA,MAAA,GAAA,MAAA,CAAA,OAAA,CAAA,MAAA,CAAA,CAAA,MAAA,CAAA,CAAA,CAAA,GAAA,CAAA,KAAA,CAAA,UAAA,CAAA,GAAA,CAAA,GAAA,CAAA,IAAA,EAAA,GAAA,IAAA,QAAA,CAAA,CAAA;;;;;;;;AAQG,EAAA,CAAA,MAAA,CAAA,aAAA,IAAA,EAAA,EAAA,OAAA,CAAA,OAAA,IAAA;AACH,IAAA,IAAA,CAAA,OAAA,CAAA;AASA,IAAA,MAAA,QAAA,GAAA,OAAgB,CAAA,SAAA,IAAkB,OAAO,CAAA,SAAE;AAU3C,IAAA,GAAA,CAAA,QAAA,CAAA,GAAA,OAAgB,CAAA,SAAA;AA6ChB,EAAA,CAAA,CAAA;SACI,GAAO;;AAEP,iCAAiB,CAAA,OAAA,EAAA,IAAA,EAAA;SACZ,CAAA,OAAQ,IAAC,EAAA,EAAA,MAAA,CAAA,MAAA,IAAA,CAAA,CAAA,MAAA,IAAA,CAAA,CAAA,MAAA,CAAA,MAAA,CAAA,CAAA,GAAA,CAAA,MAAA,IAAA;AACjB,IAAA,MAAA,EAAA,GAAA,CAAA,EAAA,IAAA,CAAA,IAAA,CAAA,CAAA,EAAA,MAAA,CAAA,MAAA,CAAA,CAAA;AAED,IAAA,cAAiB,MAAA,CAAA,KAAA,IAAA,MAAA,CAAA,MAA2B;IACxC,MAAA,QAAc,GAAE,0BAAuB,CAAA,MAAA,CAAA,QAAA,CAAA;AAC1C,IAAA,MAAA,aAAA,GAAA,kBAAA,CAAA,MAAA,CAAA,aAAA,CAAA;AAED;AAWA,IAAA,kBAAiB,GAAA,aAAA,GAAA,yBAAgC,CAAA,aAAA,CAAA,CAAA,GAAA,CAAA,KAAA,KAAA;MAC7C,IAAM,EAAE,KAAA;MACR;KACA,CAAA,CAAA,GAAA,CAAA,MAAA,CAAA,aAAA,IAAA,EAAA,EAAA,MAAA,CAAA,CAAA,IAAA,CAAA,EAAA,CAAA,CAAA,SAAA,IAAA,CAAA,CAAA,SAAA,CAAA,CAAA,CAAA,GAAA,CAAA,CAAA,KAAA;MACA,IAAA,EAAA,CAAA,CAAA,SAAiB,IAAM,CAAC,CAAA,SAAA;MACxB,SAAA,EAAA,CAAA,CAAe;KACf,CAAA,CAAA;IACA,MAAA,UAAc,GAAA,YAAO,CAAA,GAAA,CAAA,CAAA;AACrB,MAAA,IAAK;AACR,MAAA;AAED,KAAA,KAAA;AAqFA,MAAA,MAAA,MAAA,GAAA,6CACI,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@adminide-stack/form-builder-core",
|
|
3
|
-
"version": "5.1.8-alpha.
|
|
3
|
+
"version": "5.1.8-alpha.160",
|
|
4
4
|
"sideEffects": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "lib/index.js",
|
|
@@ -19,12 +19,11 @@
|
|
|
19
19
|
"watch": "npm run build:lib:watch"
|
|
20
20
|
},
|
|
21
21
|
"devDependencies": {
|
|
22
|
-
"
|
|
23
|
-
"common": "5.1.8-alpha.15",
|
|
22
|
+
"common": "5.1.8-alpha.158",
|
|
24
23
|
"typescript": "^5.4.0"
|
|
25
24
|
},
|
|
26
25
|
"publishConfig": {
|
|
27
26
|
"access": "public"
|
|
28
27
|
},
|
|
29
|
-
"gitHead": "
|
|
28
|
+
"gitHead": "78f6484cb34ad478ac6dda3ec4cec78bf4f8a09d"
|
|
30
29
|
}
|