@descope/sdk-mixins 0.12.0 → 0.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/index.js +2 -0
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/mixins/descopeUiMixin/constants.js +6 -17
- package/dist/cjs/mixins/descopeUiMixin/constants.js.map +1 -1
- package/dist/cjs/mixins/descopeUiMixin/descopeUiMixin.js +17 -89
- package/dist/cjs/mixins/descopeUiMixin/descopeUiMixin.js.map +1 -1
- package/dist/cjs/mixins/descopeUiMixin/helpers.js +0 -10
- package/dist/cjs/mixins/descopeUiMixin/helpers.js.map +1 -1
- package/dist/cjs/mixins/injectNpmLibMixin/constants.js +10 -0
- package/dist/cjs/mixins/injectNpmLibMixin/constants.js.map +1 -0
- package/dist/cjs/mixins/injectNpmLibMixin/helpers.js +112 -0
- package/dist/cjs/mixins/injectNpmLibMixin/helpers.js.map +1 -0
- package/dist/cjs/mixins/injectNpmLibMixin/injectNpmLibMixin.js +28 -0
- package/dist/cjs/mixins/injectNpmLibMixin/injectNpmLibMixin.js.map +1 -0
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/mixins/descopeUiMixin/constants.js +4 -11
- package/dist/esm/mixins/descopeUiMixin/constants.js.map +1 -1
- package/dist/esm/mixins/descopeUiMixin/descopeUiMixin.js +18 -90
- package/dist/esm/mixins/descopeUiMixin/descopeUiMixin.js.map +1 -1
- package/dist/esm/mixins/descopeUiMixin/helpers.js +1 -9
- package/dist/esm/mixins/descopeUiMixin/helpers.js.map +1 -1
- package/dist/esm/mixins/injectNpmLibMixin/constants.js +8 -0
- package/dist/esm/mixins/injectNpmLibMixin/constants.js.map +1 -0
- package/dist/esm/mixins/injectNpmLibMixin/helpers.js +109 -0
- package/dist/esm/mixins/injectNpmLibMixin/helpers.js.map +1 -0
- package/dist/esm/mixins/injectNpmLibMixin/injectNpmLibMixin.js +26 -0
- package/dist/esm/mixins/injectNpmLibMixin/injectNpmLibMixin.js.map +1 -0
- package/dist/index.d.ts +509 -175
- package/dist/types/index.d.ts +1 -0
- package/dist/types/mixins/configMixin/configMixin.d.ts +12 -12
- package/dist/types/mixins/createStateManagementMixin.d.ts +2 -2
- package/dist/types/mixins/createValidateAttributesMixin/createValidateAttributesMixin.d.ts +5 -5
- package/dist/types/mixins/debuggerMixin/debuggerMixin.d.ts +8 -8
- package/dist/types/mixins/descopeUiMixin/constants.d.ts +3 -7
- package/dist/types/mixins/descopeUiMixin/descopeUiMixin.d.ts +26 -31
- package/dist/types/mixins/descopeUiMixin/helpers.d.ts +0 -1
- package/dist/types/mixins/formMixin.d.ts +2 -2
- package/dist/types/mixins/initLifecycleMixin.d.ts +1 -1
- package/dist/types/mixins/injectNpmLibMixin/constants.d.ts +1 -0
- package/dist/types/mixins/injectNpmLibMixin/helpers.d.ts +7 -0
- package/dist/types/mixins/injectNpmLibMixin/index.d.ts +1 -0
- package/dist/types/mixins/injectNpmLibMixin/injectNpmLibMixin.d.ts +343 -0
- package/dist/types/mixins/loggerMixin/loggerMixin.d.ts +2 -2
- package/dist/types/mixins/modalMixin/modalMixin.d.ts +28 -30
- package/dist/types/mixins/notificationsMixin/notificationsMixin.d.ts +28 -30
- package/dist/types/mixins/observeAttributesMixin/observeAttributesMixin.d.ts +4 -4
- package/dist/types/mixins/projectIdMixin.d.ts +5 -5
- package/dist/types/mixins/resetMixin.d.ts +6 -6
- package/dist/types/mixins/staticResourcesMixin/staticResourcesMixin.d.ts +8 -8
- package/dist/types/mixins/themeMixin/themeMixin.d.ts +33 -35
- package/package.json +10 -10
|
@@ -1,19 +1,18 @@
|
|
|
1
1
|
import { __classPrivateFieldGet, __classPrivateFieldSet } from 'tslib';
|
|
2
2
|
import { createSingletonMixin, compose } from '@descope/sdk-helpers';
|
|
3
3
|
import { configMixin } from '../configMixin/configMixin.js';
|
|
4
|
+
import { injectNpmLibMixin } from '../injectNpmLibMixin/injectNpmLibMixin.js';
|
|
4
5
|
import { loggerMixin } from '../loggerMixin/loggerMixin.js';
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
6
|
+
import { getDescopeUiComponentsList } from './helpers.js';
|
|
7
|
+
import { WEB_COMPONENTS_UI_LIB_NAME, JS_FILE_PATH, LOCAL_STORAGE_OVERRIDE } from './constants.js';
|
|
7
8
|
|
|
8
9
|
const descopeUiMixin = createSingletonMixin((superclass) => {
|
|
9
|
-
var _DescopeUiMixinClass_instances,
|
|
10
|
-
const BaseClass = compose(loggerMixin, configMixin)(superclass);
|
|
10
|
+
var _DescopeUiMixinClass_instances, _DescopeUiMixinClass_getComponentsVersion, _DescopeUiMixinClass_descopeUi, _DescopeUiMixinClass_loadDescopeUiComponent, _DescopeUiMixinClass_getDescopeUi, _a;
|
|
11
|
+
const BaseClass = compose(loggerMixin, configMixin, injectNpmLibMixin)(superclass);
|
|
11
12
|
return _a = class DescopeUiMixinClass extends BaseClass {
|
|
12
13
|
constructor() {
|
|
13
14
|
super(...arguments);
|
|
14
15
|
_DescopeUiMixinClass_instances.add(this);
|
|
15
|
-
_DescopeUiMixinClass_errorCbsSym.set(this, Symbol('errorCbs'));
|
|
16
|
-
_DescopeUiMixinClass_loadCbsSym.set(this, Symbol('loadCbs'));
|
|
17
16
|
_DescopeUiMixinClass_descopeUi.set(this, void 0);
|
|
18
17
|
}
|
|
19
18
|
get descopeUi() {
|
|
@@ -28,12 +27,7 @@ const descopeUiMixin = createSingletonMixin((superclass) => {
|
|
|
28
27
|
: getDescopeUiComponentsList(templateOrComponentNames);
|
|
29
28
|
return Promise.all(descopeUiComponentsList.map((componentName) => __classPrivateFieldGet(this, _DescopeUiMixinClass_instances, "m", _DescopeUiMixinClass_loadDescopeUiComponent).call(this, componentName)));
|
|
30
29
|
}
|
|
31
|
-
get baseCdnUrl() {
|
|
32
|
-
return this.getAttribute('base-cdn-url');
|
|
33
|
-
}
|
|
34
30
|
},
|
|
35
|
-
_DescopeUiMixinClass_errorCbsSym = new WeakMap(),
|
|
36
|
-
_DescopeUiMixinClass_loadCbsSym = new WeakMap(),
|
|
37
31
|
_DescopeUiMixinClass_descopeUi = new WeakMap(),
|
|
38
32
|
_DescopeUiMixinClass_instances = new WeakSet(),
|
|
39
33
|
_DescopeUiMixinClass_getComponentsVersion =
|
|
@@ -50,64 +44,6 @@ const descopeUiMixin = createSingletonMixin((superclass) => {
|
|
|
50
44
|
}
|
|
51
45
|
return componentsVersion;
|
|
52
46
|
},
|
|
53
|
-
_DescopeUiMixinClass_exposeAlternateEvents = function _DescopeUiMixinClass_exposeAlternateEvents(scriptEle) {
|
|
54
|
-
const errorCbsSym = __classPrivateFieldGet(this, _DescopeUiMixinClass_errorCbsSym, "f");
|
|
55
|
-
const loadCbsSym = __classPrivateFieldGet(this, _DescopeUiMixinClass_loadCbsSym, "f");
|
|
56
|
-
// eslint-disable-next-line no-param-reassign
|
|
57
|
-
scriptEle[errorCbsSym] = [];
|
|
58
|
-
// eslint-disable-next-line no-param-reassign
|
|
59
|
-
scriptEle[loadCbsSym] = [];
|
|
60
|
-
Object.defineProperty(scriptEle, 'onerror', {
|
|
61
|
-
set(cb) {
|
|
62
|
-
scriptEle[errorCbsSym].push(cb);
|
|
63
|
-
},
|
|
64
|
-
});
|
|
65
|
-
Object.defineProperty(scriptEle, 'onload', {
|
|
66
|
-
set(cb) {
|
|
67
|
-
scriptEle[loadCbsSym].push(cb);
|
|
68
|
-
},
|
|
69
|
-
});
|
|
70
|
-
},
|
|
71
|
-
_DescopeUiMixinClass_handleFallbackScript = async function _DescopeUiMixinClass_handleFallbackScript(errorCbs, loadCbs, elemId, scriptUrl) {
|
|
72
|
-
this.logger.debug('Trying to load DescopeUI from a fallback URL');
|
|
73
|
-
const fallbackScriptEle = setupScript(elemId);
|
|
74
|
-
document.body.append(fallbackScriptEle);
|
|
75
|
-
fallbackScriptEle.addEventListener('error', () => {
|
|
76
|
-
errorCbs.forEach((cb) => cb(`Cannot load DescopeUI from fallback URL, Make sure this URL is valid and return the correct script: "${fallbackScriptEle.src}"`));
|
|
77
|
-
});
|
|
78
|
-
fallbackScriptEle.addEventListener('load', () => {
|
|
79
|
-
loadCbs.forEach((cb) => cb());
|
|
80
|
-
});
|
|
81
|
-
fallbackScriptEle.src = generateScriptUrl(scriptUrl, await __classPrivateFieldGet(this, _DescopeUiMixinClass_instances, "m", _DescopeUiMixinClass_getComponentsVersion).call(this));
|
|
82
|
-
},
|
|
83
|
-
_DescopeUiMixinClass_registerEvents = function _DescopeUiMixinClass_registerEvents(scriptEle) {
|
|
84
|
-
scriptEle.addEventListener('error', () => {
|
|
85
|
-
scriptEle[__classPrivateFieldGet(this, _DescopeUiMixinClass_errorCbsSym, "f")].forEach((cb) => cb(`Cannot load DescopeUI from main URL, Make sure this URL is valid and return the correct script: "${scriptEle.src}"`));
|
|
86
|
-
// in case we could not load DescopeUI from the main URL, we are trying to load it from a fallback URL
|
|
87
|
-
__classPrivateFieldGet(this, _DescopeUiMixinClass_instances, "m", _DescopeUiMixinClass_handleFallbackScript).call(this, [
|
|
88
|
-
// we are adding a second fallback
|
|
89
|
-
__classPrivateFieldGet(this, _DescopeUiMixinClass_instances, "m", _DescopeUiMixinClass_handleFallbackScript).bind(this, scriptEle[__classPrivateFieldGet(this, _DescopeUiMixinClass_errorCbsSym, "f")], scriptEle[__classPrivateFieldGet(this, _DescopeUiMixinClass_loadCbsSym, "f")], DESCOPE_UI_FALLBACK_2_SCRIPT_ID, UI_COMPONENTS_FALLBACK_2_URL),
|
|
90
|
-
...scriptEle[__classPrivateFieldGet(this, _DescopeUiMixinClass_errorCbsSym, "f")],
|
|
91
|
-
], scriptEle[__classPrivateFieldGet(this, _DescopeUiMixinClass_loadCbsSym, "f")], DESCOPE_UI_FALLBACK_SCRIPT_ID, UI_COMPONENTS_FALLBACK_URL);
|
|
92
|
-
});
|
|
93
|
-
scriptEle.addEventListener('load', () => {
|
|
94
|
-
scriptEle[__classPrivateFieldGet(this, _DescopeUiMixinClass_loadCbsSym, "f")].forEach((cb) => cb());
|
|
95
|
-
});
|
|
96
|
-
},
|
|
97
|
-
_DescopeUiMixinClass_getDescopeUiLoadingScript = async function _DescopeUiMixinClass_getDescopeUiLoadingScript() {
|
|
98
|
-
if (!document.querySelector(`script#${DESCOPE_UI_SCRIPT_ID}`)) {
|
|
99
|
-
this.logger.debug('DescopeUI loading script does not exist, creating it', this);
|
|
100
|
-
const scriptEle = setupScript(DESCOPE_UI_SCRIPT_ID);
|
|
101
|
-
document.body.append(scriptEle);
|
|
102
|
-
__classPrivateFieldGet(this, _DescopeUiMixinClass_instances, "m", _DescopeUiMixinClass_exposeAlternateEvents).call(this, scriptEle);
|
|
103
|
-
__classPrivateFieldGet(this, _DescopeUiMixinClass_instances, "m", _DescopeUiMixinClass_registerEvents).call(this, scriptEle);
|
|
104
|
-
scriptEle.src = generateScriptUrl(this.baseCdnUrl || UI_COMPONENTS_URL, await __classPrivateFieldGet(this, _DescopeUiMixinClass_instances, "m", _DescopeUiMixinClass_getComponentsVersion).call(this));
|
|
105
|
-
}
|
|
106
|
-
else {
|
|
107
|
-
this.logger.debug('DescopeUI loading script already exists', this);
|
|
108
|
-
}
|
|
109
|
-
return document.getElementById(DESCOPE_UI_SCRIPT_ID);
|
|
110
|
-
},
|
|
111
47
|
_DescopeUiMixinClass_loadDescopeUiComponent = async function _DescopeUiMixinClass_loadDescopeUiComponent(componentName) {
|
|
112
48
|
const isComponentAlreadyDefined = !!customElements.get(componentName);
|
|
113
49
|
if (isComponentAlreadyDefined) {
|
|
@@ -137,27 +73,19 @@ const descopeUiMixin = createSingletonMixin((superclass) => {
|
|
|
137
73
|
}
|
|
138
74
|
return undefined;
|
|
139
75
|
},
|
|
140
|
-
_DescopeUiMixinClass_getDescopeUi = function _DescopeUiMixinClass_getDescopeUi() {
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
__classPrivateFieldGet(this, _DescopeUiMixinClass_instances, "m",
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
// in case the load event was dispatched before we registered, we have a fallback
|
|
154
|
-
setTimeout(() => {
|
|
155
|
-
if (globalThis.DescopeUI) {
|
|
156
|
-
res(globalThis.DescopeUI);
|
|
157
|
-
}
|
|
158
|
-
});
|
|
159
|
-
});
|
|
160
|
-
});
|
|
76
|
+
_DescopeUiMixinClass_getDescopeUi = async function _DescopeUiMixinClass_getDescopeUi() {
|
|
77
|
+
if (globalThis.DescopeUI) {
|
|
78
|
+
return globalThis.DescopeUI;
|
|
79
|
+
}
|
|
80
|
+
try {
|
|
81
|
+
await this.injectNpmLib(WEB_COMPONENTS_UI_LIB_NAME, await __classPrivateFieldGet(this, _DescopeUiMixinClass_instances, "m", _DescopeUiMixinClass_getComponentsVersion).call(this), JS_FILE_PATH, [LOCAL_STORAGE_OVERRIDE]);
|
|
82
|
+
this.logger.debug('DescopeUI was loaded');
|
|
83
|
+
return globalThis.DescopeUI;
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
this.logger.error(error);
|
|
87
|
+
throw new Error('DescopeUI was not loaded');
|
|
88
|
+
}
|
|
161
89
|
},
|
|
162
90
|
_a;
|
|
163
91
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"descopeUiMixin.js","sources":["../../../../src/mixins/descopeUiMixin/descopeUiMixin.ts"],"sourcesContent":["import { compose, createSingletonMixin } from '@descope/sdk-helpers';\nimport { configMixin } from '../configMixin';\nimport { loggerMixin } from '../loggerMixin';\nimport {\n DESCOPE_UI_FALLBACK_2_SCRIPT_ID,\n DESCOPE_UI_FALLBACK_SCRIPT_ID,\n DESCOPE_UI_SCRIPT_ID,\n UI_COMPONENTS_FALLBACK_2_URL,\n UI_COMPONENTS_FALLBACK_URL,\n UI_COMPONENTS_URL,\n} from './constants';\nimport {\n generateScriptUrl,\n getDescopeUiComponentsList,\n setupScript,\n} from './helpers';\n\ntype ErrorCb = (error: string) => void;\ntype LoadCb = () => void;\n\nexport const descopeUiMixin = createSingletonMixin(\n <T extends CustomElementConstructor>(superclass: T) => {\n const BaseClass = compose(loggerMixin, configMixin)(superclass);\n\n return class DescopeUiMixinClass extends BaseClass {\n #errorCbsSym = Symbol('errorCbs');\n\n #loadCbsSym = Symbol('loadCbs');\n\n // eslint-disable-next-line class-methods-use-this\n async #getComponentsVersion() {\n const config = await this.config;\n const componentsVersion = config?.projectConfig?.componentsVersion;\n\n if (!componentsVersion) {\n this.logger.error('Could not get components version');\n } else {\n this.logger.debug(`Got component version \"${componentsVersion}\"`);\n }\n\n return componentsVersion;\n }\n\n // in order to allow only single load of DescopeUI across different instances,\n // and also allow fallback in case the components cannot be loaded from descope domain\n // we are managing an alternative way to register to the script events\n #exposeAlternateEvents(scriptEle: HTMLScriptElement) {\n const errorCbsSym = this.#errorCbsSym;\n const loadCbsSym = this.#loadCbsSym;\n\n // eslint-disable-next-line no-param-reassign\n scriptEle[errorCbsSym] = [];\n // eslint-disable-next-line no-param-reassign\n scriptEle[loadCbsSym] = [];\n\n Object.defineProperty(scriptEle, 'onerror', {\n set(cb: ErrorCb) {\n scriptEle[errorCbsSym].push(cb);\n },\n });\n\n Object.defineProperty(scriptEle, 'onload', {\n set(cb: LoadCb) {\n scriptEle[loadCbsSym].push(cb);\n },\n });\n }\n\n async #handleFallbackScript(\n errorCbs: ErrorCb[],\n loadCbs: LoadCb[],\n elemId: string,\n scriptUrl: string,\n ) {\n this.logger.debug('Trying to load DescopeUI from a fallback URL');\n const fallbackScriptEle = setupScript(elemId);\n document.body.append(fallbackScriptEle);\n\n fallbackScriptEle.addEventListener('error', () => {\n errorCbs.forEach((cb: ErrorCb) =>\n cb(\n `Cannot load DescopeUI from fallback URL, Make sure this URL is valid and return the correct script: \"${fallbackScriptEle.src}\"`,\n ),\n );\n });\n\n fallbackScriptEle.addEventListener('load', () => {\n loadCbs.forEach((cb: LoadCb) => cb());\n });\n\n fallbackScriptEle.src = generateScriptUrl(\n scriptUrl,\n await this.#getComponentsVersion(),\n );\n }\n\n #registerEvents(scriptEle: HTMLScriptElement) {\n scriptEle.addEventListener('error', () => {\n scriptEle[this.#errorCbsSym].forEach((cb: ErrorCb) =>\n cb(\n `Cannot load DescopeUI from main URL, Make sure this URL is valid and return the correct script: \"${scriptEle.src}\"`,\n ),\n );\n\n // in case we could not load DescopeUI from the main URL, we are trying to load it from a fallback URL\n this.#handleFallbackScript(\n [\n // we are adding a second fallback\n this.#handleFallbackScript.bind(\n this,\n scriptEle[this.#errorCbsSym],\n scriptEle[this.#loadCbsSym],\n DESCOPE_UI_FALLBACK_2_SCRIPT_ID,\n UI_COMPONENTS_FALLBACK_2_URL,\n ),\n ...scriptEle[this.#errorCbsSym],\n ],\n scriptEle[this.#loadCbsSym],\n DESCOPE_UI_FALLBACK_SCRIPT_ID,\n UI_COMPONENTS_FALLBACK_URL,\n );\n });\n\n scriptEle.addEventListener('load', () => {\n scriptEle[this.#loadCbsSym].forEach((cb: LoadCb) => cb());\n });\n }\n\n async #getDescopeUiLoadingScript() {\n if (!document.querySelector(`script#${DESCOPE_UI_SCRIPT_ID}`)) {\n this.logger.debug(\n 'DescopeUI loading script does not exist, creating it',\n this,\n );\n\n const scriptEle = setupScript(DESCOPE_UI_SCRIPT_ID);\n\n document.body.append(scriptEle);\n\n this.#exposeAlternateEvents(scriptEle);\n this.#registerEvents(scriptEle);\n\n scriptEle.src = generateScriptUrl(\n this.baseCdnUrl || UI_COMPONENTS_URL,\n await this.#getComponentsVersion(),\n );\n } else {\n this.logger.debug('DescopeUI loading script already exists', this);\n }\n\n return document.getElementById(DESCOPE_UI_SCRIPT_ID);\n }\n\n #descopeUi: Promise<any>;\n\n get descopeUi() {\n if (!this.#descopeUi) {\n this.#descopeUi = this.#getDescopeUi();\n }\n\n return this.#descopeUi;\n }\n\n async #loadDescopeUiComponent(componentName: string) {\n const isComponentAlreadyDefined = !!customElements.get(componentName);\n\n if (isComponentAlreadyDefined) {\n this.logger.debug(\n `Loading component \"${componentName}\" is skipped as it is already defined`,\n );\n return undefined;\n }\n\n const descopeUI = await this.descopeUi;\n\n if (!descopeUI[componentName]) {\n this.logger.error(\n `Cannot load UI component \"${componentName}\"`,\n `Descope UI does not have a component named \"${componentName}\", available components are: \"${Object.keys(\n descopeUI,\n ).join(', ')}\"`,\n );\n return undefined;\n }\n\n try {\n // eslint-disable-next-line @typescript-eslint/return-await\n return await descopeUI[componentName]();\n } catch (e) {\n // this error is thrown when trying to register a component which is already registered\n // when running 2 flows on the same page, it might happen that the register fn is called twice\n // in case it happens, we are silently ignore the error\n if (e.name === 'NotSupportedError') {\n // eslint-disable-next-line no-console\n console.debug(\n `Encountered an error while attempting to define the \"${componentName}\" component, it is likely that this component is already defined`,\n );\n } else {\n throw e;\n }\n }\n\n return undefined;\n }\n\n async loadDescopeUiComponents(\n templateOrComponentNames: HTMLTemplateElement | string[],\n ) {\n const descopeUiComponentsList = Array.isArray(templateOrComponentNames)\n ? templateOrComponentNames\n : getDescopeUiComponentsList(templateOrComponentNames);\n\n return Promise.all(\n descopeUiComponentsList.map((componentName: string) =>\n this.#loadDescopeUiComponent(componentName),\n ),\n );\n }\n\n #getDescopeUi() {\n return new Promise((res) => {\n if (globalThis.DescopeUI) {\n res(globalThis.DescopeUI);\n }\n\n this.#getDescopeUiLoadingScript().then((scriptEle) => {\n // eslint-disable-next-line no-param-reassign\n scriptEle!.onerror = this.logger.error;\n // eslint-disable-next-line no-param-reassign\n scriptEle!.onload = () => {\n this.logger.debug('DescopeUI was loaded');\n res(globalThis.DescopeUI);\n };\n\n // in case the load event was dispatched before we registered, we have a fallback\n setTimeout(() => {\n if (globalThis.DescopeUI) {\n res(globalThis.DescopeUI);\n }\n });\n });\n });\n }\n\n get baseCdnUrl() {\n return this.getAttribute('base-cdn-url');\n }\n };\n },\n);\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"descopeUiMixin.js","sources":["../../../../src/mixins/descopeUiMixin/descopeUiMixin.ts"],"sourcesContent":["import { compose, createSingletonMixin } from '@descope/sdk-helpers';\nimport { configMixin } from '../configMixin';\nimport { injectNpmLibMixin } from '../injectNpmLibMixin';\nimport { loggerMixin } from '../loggerMixin';\nimport { getDescopeUiComponentsList } from './helpers';\nimport {\n JS_FILE_PATH,\n LOCAL_STORAGE_OVERRIDE,\n WEB_COMPONENTS_UI_LIB_NAME,\n} from './constants';\n\nexport const descopeUiMixin = createSingletonMixin(\n <T extends CustomElementConstructor>(superclass: T) => {\n const BaseClass = compose(\n loggerMixin,\n configMixin,\n injectNpmLibMixin,\n )(superclass);\n\n return class DescopeUiMixinClass extends BaseClass {\n // eslint-disable-next-line class-methods-use-this\n async #getComponentsVersion() {\n const config = await this.config;\n const componentsVersion = config?.projectConfig?.componentsVersion;\n\n if (!componentsVersion) {\n this.logger.error('Could not get components version');\n } else {\n this.logger.debug(`Got component version \"${componentsVersion}\"`);\n }\n\n return componentsVersion;\n }\n\n #descopeUi: Promise<any>;\n\n get descopeUi() {\n if (!this.#descopeUi) {\n this.#descopeUi = this.#getDescopeUi();\n }\n\n return this.#descopeUi;\n }\n\n async #loadDescopeUiComponent(componentName: string) {\n const isComponentAlreadyDefined = !!customElements.get(componentName);\n\n if (isComponentAlreadyDefined) {\n this.logger.debug(\n `Loading component \"${componentName}\" is skipped as it is already defined`,\n );\n return undefined;\n }\n\n const descopeUI = await this.descopeUi;\n\n if (!descopeUI[componentName]) {\n this.logger.error(\n `Cannot load UI component \"${componentName}\"`,\n `Descope UI does not have a component named \"${componentName}\", available components are: \"${Object.keys(\n descopeUI,\n ).join(', ')}\"`,\n );\n return undefined;\n }\n\n try {\n // eslint-disable-next-line @typescript-eslint/return-await\n return await descopeUI[componentName]();\n } catch (e) {\n // this error is thrown when trying to register a component which is already registered\n // when running 2 flows on the same page, it might happen that the register fn is called twice\n // in case it happens, we are silently ignore the error\n if (e.name === 'NotSupportedError') {\n // eslint-disable-next-line no-console\n console.debug(\n `Encountered an error while attempting to define the \"${componentName}\" component, it is likely that this component is already defined`,\n );\n } else {\n throw e;\n }\n }\n\n return undefined;\n }\n\n async #getDescopeUi() {\n if (globalThis.DescopeUI) {\n return globalThis.DescopeUI;\n }\n\n try {\n await this.injectNpmLib(\n WEB_COMPONENTS_UI_LIB_NAME,\n await this.#getComponentsVersion(),\n JS_FILE_PATH,\n [LOCAL_STORAGE_OVERRIDE],\n );\n this.logger.debug('DescopeUI was loaded');\n return globalThis.DescopeUI;\n } catch (error) {\n this.logger.error(error);\n throw new Error('DescopeUI was not loaded');\n }\n }\n\n async loadDescopeUiComponents(\n templateOrComponentNames: HTMLTemplateElement | string[],\n ) {\n const descopeUiComponentsList = Array.isArray(templateOrComponentNames)\n ? templateOrComponentNames\n : getDescopeUiComponentsList(templateOrComponentNames);\n\n return Promise.all(\n descopeUiComponentsList.map((componentName: string) =>\n this.#loadDescopeUiComponent(componentName),\n ),\n );\n }\n };\n },\n);\n"],"names":[],"mappings":"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"}
|
|
@@ -1,14 +1,6 @@
|
|
|
1
|
-
import { UI_COMPONENTS_URL_VERSION_PLACEHOLDER } from './constants.js';
|
|
2
|
-
|
|
3
|
-
const setupScript = (id) => {
|
|
4
|
-
const scriptEle = document.createElement('script');
|
|
5
|
-
scriptEle.id = id;
|
|
6
|
-
return scriptEle;
|
|
7
|
-
};
|
|
8
|
-
const generateScriptUrl = (urlTemplate, componentsVersion) => urlTemplate.replace(UI_COMPONENTS_URL_VERSION_PLACEHOLDER, componentsVersion);
|
|
9
1
|
const getDescopeUiComponentsList = (template) => [
|
|
10
2
|
...Array.from(template.content.querySelectorAll('*')).reduce((acc, el) => el.localName.startsWith('descope-') ? acc.add(el.localName) : acc, new Set()),
|
|
11
3
|
];
|
|
12
4
|
|
|
13
|
-
export {
|
|
5
|
+
export { getDescopeUiComponentsList };
|
|
14
6
|
//# sourceMappingURL=helpers.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.js","sources":["../../../../src/mixins/descopeUiMixin/helpers.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"file":"helpers.js","sources":["../../../../src/mixins/descopeUiMixin/helpers.ts"],"sourcesContent":["export const setupScript = (id: string) => {\n const scriptEle = document.createElement('script');\n scriptEle.id = id;\n\n return scriptEle;\n};\n\nexport const getDescopeUiComponentsList = (template: HTMLTemplateElement) => [\n ...Array.from(template.content.querySelectorAll('*')).reduce<Set<string>>(\n (acc, el: Element) =>\n el.localName.startsWith('descope-') ? acc.add(el.localName) : acc,\n new Set(),\n ),\n];\n"],"names":[],"mappings":"MAOa,0BAA0B,GAAG,CAAC,QAA6B,KAAK;IAC3E,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAC1D,CAAC,GAAG,EAAE,EAAW,KACf,EAAE,CAAC,SAAS,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC,GAAG,GAAG,EACnE,IAAI,GAAG,EAAE,CACV;;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sources":["../../../../src/mixins/injectNpmLibMixin/constants.ts"],"sourcesContent":["export const BASE_URLS = [\n 'https://descopecdn.com',\n 'https://static.descope.com',\n 'https://cdn.jsdelivr.net',\n];\n"],"names":[],"mappings":"AAAa,MAAA,SAAS,GAAG;IACvB,wBAAwB;IACxB,4BAA4B;IAC5B,0BAA0B;;;;;"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
const getExistingScript = (scriptId) => {
|
|
2
|
+
return document.querySelector(`script#${scriptId}`);
|
|
3
|
+
};
|
|
4
|
+
const isScriptLoaded = (script) => {
|
|
5
|
+
return script.getAttribute('status') === 'loaded';
|
|
6
|
+
};
|
|
7
|
+
const isScriptError = (script) => {
|
|
8
|
+
return script.getAttribute('status') === 'error';
|
|
9
|
+
};
|
|
10
|
+
const hashUrl = (url) => {
|
|
11
|
+
let hash = 0;
|
|
12
|
+
const urlStr = url.toString();
|
|
13
|
+
for (let i = 0; i < urlStr.length; i++) {
|
|
14
|
+
const char = urlStr.charCodeAt(i);
|
|
15
|
+
hash = (hash << 5) - hash + char;
|
|
16
|
+
hash = hash & hash; // Convert to 32-bit integer
|
|
17
|
+
}
|
|
18
|
+
return `${Math.abs(hash).toString()}`;
|
|
19
|
+
};
|
|
20
|
+
const setupScript = (id) => {
|
|
21
|
+
const scriptEle = document.createElement('script');
|
|
22
|
+
scriptEle.id = id;
|
|
23
|
+
return scriptEle;
|
|
24
|
+
};
|
|
25
|
+
const injectScript = (scriptId, url) => {
|
|
26
|
+
return new Promise((res, rej) => {
|
|
27
|
+
const scriptEle = setupScript(scriptId);
|
|
28
|
+
scriptEle.onerror = (error) => {
|
|
29
|
+
scriptEle.setAttribute('status', 'error');
|
|
30
|
+
rej(error);
|
|
31
|
+
};
|
|
32
|
+
scriptEle.onload = () => {
|
|
33
|
+
scriptEle.setAttribute('status', 'loaded');
|
|
34
|
+
res(scriptEle);
|
|
35
|
+
};
|
|
36
|
+
scriptEle.src = url.toString();
|
|
37
|
+
document.body.appendChild(scriptEle);
|
|
38
|
+
});
|
|
39
|
+
};
|
|
40
|
+
const handleExistingScript = (existingScript) => {
|
|
41
|
+
if (isScriptLoaded(existingScript)) {
|
|
42
|
+
return Promise.resolve(existingScript);
|
|
43
|
+
}
|
|
44
|
+
if (isScriptError(existingScript)) {
|
|
45
|
+
return Promise.reject();
|
|
46
|
+
}
|
|
47
|
+
return new Promise((res, rej) => {
|
|
48
|
+
existingScript.addEventListener('load', () => {
|
|
49
|
+
res(existingScript);
|
|
50
|
+
});
|
|
51
|
+
existingScript.addEventListener('error', (error) => {
|
|
52
|
+
rej(error);
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
};
|
|
56
|
+
const injectScriptWithFallbacks = async (scriptsData, onError) => {
|
|
57
|
+
for (const scriptData of scriptsData) {
|
|
58
|
+
const { id, url } = scriptData;
|
|
59
|
+
const existingScript = getExistingScript(id);
|
|
60
|
+
if (existingScript) {
|
|
61
|
+
try {
|
|
62
|
+
await handleExistingScript(existingScript);
|
|
63
|
+
return scriptData;
|
|
64
|
+
}
|
|
65
|
+
catch (e) {
|
|
66
|
+
onError(scriptData, true);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
try {
|
|
71
|
+
await injectScript(id, url);
|
|
72
|
+
return scriptData;
|
|
73
|
+
}
|
|
74
|
+
catch (e) {
|
|
75
|
+
onError(scriptData, false);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
throw new Error('All scripts failed to load');
|
|
80
|
+
};
|
|
81
|
+
const generateLibUrls = (baseUrls, libName, version, path = '') => baseUrls.reduce((prev, curr) => {
|
|
82
|
+
const baseUrl = curr;
|
|
83
|
+
if (!baseUrl) {
|
|
84
|
+
return prev;
|
|
85
|
+
}
|
|
86
|
+
let url;
|
|
87
|
+
try {
|
|
88
|
+
url = new URL(baseUrl);
|
|
89
|
+
}
|
|
90
|
+
catch (e) {
|
|
91
|
+
throw new Error(`Invalid URL: ${baseUrl}`);
|
|
92
|
+
}
|
|
93
|
+
const isUrlIncludesPath = url.pathname !== '/';
|
|
94
|
+
if (!isUrlIncludesPath) {
|
|
95
|
+
url.pathname = `/npm/${libName}@${version}/${path}`;
|
|
96
|
+
}
|
|
97
|
+
return [
|
|
98
|
+
...prev,
|
|
99
|
+
{
|
|
100
|
+
url: url,
|
|
101
|
+
id: `npmlib-${libName
|
|
102
|
+
.replaceAll('@', '')
|
|
103
|
+
.replaceAll('/', '_')}-${hashUrl(url)}`,
|
|
104
|
+
},
|
|
105
|
+
];
|
|
106
|
+
}, []);
|
|
107
|
+
|
|
108
|
+
export { generateLibUrls, injectScriptWithFallbacks };
|
|
109
|
+
//# sourceMappingURL=helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.js","sources":["../../../../src/mixins/injectNpmLibMixin/helpers.ts"],"sourcesContent":["const getExistingScript = (scriptId: string): HTMLScriptElement => {\n return document.querySelector(`script#${scriptId}`);\n};\n\nconst isScriptLoaded = (script: HTMLScriptElement) => {\n return script.getAttribute('status') === 'loaded';\n};\n\nconst isScriptError = (script: HTMLScriptElement) => {\n return script.getAttribute('status') === 'error';\n};\n\nconst hashUrl = (url: URL) => {\n let hash = 0;\n const urlStr = url.toString();\n\n for (let i = 0; i < urlStr.length; i++) {\n const char = urlStr.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash; // Convert to 32-bit integer\n }\n\n return `${Math.abs(hash).toString()}`;\n};\n\nconst setupScript = (id: string) => {\n const scriptEle = document.createElement('script');\n scriptEle.id = id;\n\n return scriptEle;\n};\n\ntype ScriptData = {\n id: string;\n url: URL;\n};\n\nconst injectScript = (scriptId: string, url: URL) => {\n return new Promise((res, rej) => {\n const scriptEle = setupScript(scriptId);\n\n scriptEle.onerror = (error) => {\n scriptEle.setAttribute('status', 'error');\n rej(error);\n };\n scriptEle.onload = () => {\n scriptEle.setAttribute('status', 'loaded');\n res(scriptEle);\n };\n\n scriptEle.src = url.toString();\n\n document.body.appendChild(scriptEle);\n });\n};\n\nconst handleExistingScript = (existingScript: HTMLScriptElement) => {\n if (isScriptLoaded(existingScript)) {\n return Promise.resolve(existingScript);\n }\n\n if (isScriptError(existingScript)) {\n return Promise.reject();\n }\n\n return new Promise((res, rej) => {\n existingScript.addEventListener('load', () => {\n res(existingScript);\n });\n\n existingScript.addEventListener('error', (error) => {\n rej(error);\n });\n });\n};\n\nexport const injectScriptWithFallbacks = async (\n scriptsData: ScriptData[],\n onError: (scriptData: ScriptData, existingScript: boolean) => void,\n) => {\n for (const scriptData of scriptsData) {\n const { id, url } = scriptData;\n const existingScript = getExistingScript(id);\n if (existingScript) {\n try {\n await handleExistingScript(existingScript);\n return scriptData;\n } catch (e) {\n onError(scriptData, true);\n }\n } else {\n try {\n await injectScript(id, url);\n return scriptData;\n } catch (e) {\n onError(scriptData, false);\n }\n }\n }\n throw new Error('All scripts failed to load');\n};\n\nexport const generateLibUrls = (\n baseUrls: string[],\n libName: string,\n version: string,\n path = '',\n) =>\n baseUrls.reduce((prev, curr) => {\n const baseUrl = curr;\n if (!baseUrl) {\n return prev;\n }\n\n let url: URL;\n try {\n url = new URL(baseUrl);\n } catch (e) {\n throw new Error(`Invalid URL: ${baseUrl}`);\n }\n\n const isUrlIncludesPath = url.pathname !== '/';\n\n if (!isUrlIncludesPath) {\n url.pathname = `/npm/${libName}@${version}/${path}`;\n }\n\n return [\n ...prev,\n {\n url: url,\n id: `npmlib-${libName\n .replaceAll('@', '')\n .replaceAll('/', '_')}-${hashUrl(url)}`,\n },\n ];\n }, []);\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { createSingletonMixin, compose } from '@descope/sdk-helpers';
|
|
2
|
+
import { loggerMixin } from '../loggerMixin/loggerMixin.js';
|
|
3
|
+
import { BASE_URLS } from './constants.js';
|
|
4
|
+
import { injectScriptWithFallbacks, generateLibUrls } from './helpers.js';
|
|
5
|
+
|
|
6
|
+
const injectNpmLibMixin = createSingletonMixin((superclass) => {
|
|
7
|
+
const BaseClass = compose(loggerMixin)(superclass);
|
|
8
|
+
return class InjectNpmLibMixinClass extends BaseClass {
|
|
9
|
+
get baseCdnUrl() {
|
|
10
|
+
return this.getAttribute('base-cdn-url');
|
|
11
|
+
}
|
|
12
|
+
injectNpmLib(libName, version, filePath = '', overrides = []) {
|
|
13
|
+
this.logger.debug(`Injecting npm lib: "${libName}" with version: "${version}"`);
|
|
14
|
+
return injectScriptWithFallbacks(generateLibUrls([...overrides, this.baseCdnUrl, ...BASE_URLS], libName, version, filePath), (scriptData, existingScript) => {
|
|
15
|
+
if (existingScript) {
|
|
16
|
+
this.logger.error(`Existing script cannot be loaded: "${scriptData.url}"`);
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
this.logger.error(`Cannot load script from URL, Make sure this URL is valid and return the correct script: "${scriptData.url}"`);
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
export { injectNpmLibMixin };
|
|
26
|
+
//# sourceMappingURL=injectNpmLibMixin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"injectNpmLibMixin.js","sources":["../../../../src/mixins/injectNpmLibMixin/injectNpmLibMixin.ts"],"sourcesContent":["import { compose, createSingletonMixin } from '@descope/sdk-helpers';\nimport { loggerMixin } from '../loggerMixin';\nimport { BASE_URLS } from './constants';\nimport { generateLibUrls, injectScriptWithFallbacks } from './helpers';\n\n// scripts load to window under descope object\ndeclare global {\n var descope: any;\n}\n\nexport const injectNpmLibMixin = createSingletonMixin(\n <T extends CustomElementConstructor>(superclass: T) => {\n const BaseClass = compose(loggerMixin)(superclass);\n\n return class InjectNpmLibMixinClass extends BaseClass {\n get baseCdnUrl() {\n return this.getAttribute('base-cdn-url');\n }\n\n injectNpmLib(\n libName: string,\n version: string,\n filePath = '',\n overrides: string[] = [],\n ) {\n this.logger.debug(\n `Injecting npm lib: \"${libName}\" with version: \"${version}\"`,\n );\n return injectScriptWithFallbacks(\n generateLibUrls(\n [...overrides, this.baseCdnUrl, ...BASE_URLS],\n libName,\n version,\n filePath,\n ),\n (scriptData, existingScript) => {\n if (existingScript) {\n this.logger.error(\n `Existing script cannot be loaded: \"${scriptData.url}\"`,\n );\n return;\n }\n this.logger.error(\n `Cannot load script from URL, Make sure this URL is valid and return the correct script: \"${scriptData.url}\"`,\n );\n },\n );\n }\n };\n },\n);\n"],"names":[],"mappings":";;;;;MAUa,iBAAiB,GAAG,oBAAoB,CACnD,CAAqC,UAAa,KAAI;IACpD,MAAM,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,UAAU,CAAC,CAAC;IAEnD,OAAO,MAAM,sBAAuB,SAAQ,SAAS,CAAA;AACnD,QAAA,IAAI,UAAU,GAAA;AACZ,YAAA,OAAO,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC;SAC1C;QAED,YAAY,CACV,OAAe,EACf,OAAe,EACf,QAAQ,GAAG,EAAE,EACb,SAAA,GAAsB,EAAE,EAAA;YAExB,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,CAAuB,oBAAA,EAAA,OAAO,CAAoB,iBAAA,EAAA,OAAO,CAAG,CAAA,CAAA,CAC7D,CAAC;AACF,YAAA,OAAO,yBAAyB,CAC9B,eAAe,CACb,CAAC,GAAG,SAAS,EAAE,IAAI,CAAC,UAAU,EAAE,GAAG,SAAS,CAAC,EAC7C,OAAO,EACP,OAAO,EACP,QAAQ,CACT,EACD,CAAC,UAAU,EAAE,cAAc,KAAI;gBAC7B,IAAI,cAAc,EAAE;oBAClB,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,CAAsC,mCAAA,EAAA,UAAU,CAAC,GAAG,CAAG,CAAA,CAAA,CACxD,CAAC;oBACF,OAAO;iBACR;gBACD,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,CAA4F,yFAAA,EAAA,UAAU,CAAC,GAAG,CAAG,CAAA,CAAA,CAC9G,CAAC;AACJ,aAAC,CACF,CAAC;SACH;KACF,CAAC;AACJ,CAAC;;;;"}
|