@descope/sdk-mixins 0.5.2 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. package/dist/cjs/mixins/staticResourcesMixin/fetchWithFallbacks.js +30 -0
  2. package/dist/cjs/mixins/staticResourcesMixin/fetchWithFallbacks.js.map +1 -0
  3. package/dist/cjs/mixins/staticResourcesMixin/index.js +9 -0
  4. package/dist/cjs/mixins/staticResourcesMixin/index.js.map +1 -0
  5. package/dist/cjs/mixins/staticResourcesMixin/staticResourcesMixin.js +79 -18
  6. package/dist/cjs/mixins/staticResourcesMixin/staticResourcesMixin.js.map +1 -1
  7. package/dist/esm/mixins/staticResourcesMixin/fetchWithFallbacks.js +28 -0
  8. package/dist/esm/mixins/staticResourcesMixin/fetchWithFallbacks.js.map +1 -0
  9. package/dist/esm/mixins/staticResourcesMixin/index.js +2 -0
  10. package/dist/esm/mixins/staticResourcesMixin/index.js.map +1 -0
  11. package/dist/esm/mixins/staticResourcesMixin/staticResourcesMixin.js +80 -19
  12. package/dist/esm/mixins/staticResourcesMixin/staticResourcesMixin.js.map +1 -1
  13. package/dist/index.d.ts +177 -128
  14. package/dist/types/mixins/configMixin/configMixin.d.ts +14 -7
  15. package/dist/types/mixins/createStateManagementMixin.d.ts +2 -2
  16. package/dist/types/mixins/createValidateAttributesMixin/createValidateAttributesMixin.d.ts +5 -5
  17. package/dist/types/mixins/debuggerMixin/debuggerMixin.d.ts +8 -8
  18. package/dist/types/mixins/descopeUiMixin/descopeUiMixin.d.ts +24 -17
  19. package/dist/types/mixins/formMixin.d.ts +2 -2
  20. package/dist/types/mixins/initLifecycleMixin.d.ts +1 -1
  21. package/dist/types/mixins/loggerMixin/loggerMixin.d.ts +2 -2
  22. package/dist/types/mixins/modalMixin/modalMixin.d.ts +27 -20
  23. package/dist/types/mixins/notificationsMixin/notificationsMixin.d.ts +27 -20
  24. package/dist/types/mixins/observeAttributesMixin/observeAttributesMixin.d.ts +4 -4
  25. package/dist/types/mixins/projectIdMixin.d.ts +5 -5
  26. package/dist/types/mixins/staticResourcesMixin/fetchWithFallbacks.d.ts +7 -0
  27. package/dist/types/mixins/staticResourcesMixin/staticResourcesMixin.d.ts +12 -6
  28. package/dist/types/mixins/themeMixin/themeMixin.d.ts +44 -29
  29. package/package.json +13 -3
@@ -0,0 +1,30 @@
1
+ 'use strict';
2
+
3
+ const notLastMsgSuffix = 'Trying the next fallback URL...';
4
+ const fetchWithFallbacks = async (fallbacks, init, { logger, onSuccess, }) => {
5
+ const fallbacksArr = Array.isArray(fallbacks) ? fallbacks : [fallbacks];
6
+ for (let index = 0; index < fallbacksArr.length; index++) {
7
+ const url = fallbacksArr[index];
8
+ const isLast = index === fallbacksArr.length - 1;
9
+ try {
10
+ const res = await fetch(url.toString(), init);
11
+ if (res.ok) {
12
+ onSuccess === null || onSuccess === void 0 ? void 0 : onSuccess(index);
13
+ return res;
14
+ }
15
+ const errMsg = `Error fetching URL ${url} [${res.status}]`;
16
+ if (isLast)
17
+ throw new Error(errMsg);
18
+ logger === null || logger === void 0 ? void 0 : logger.debug(`${errMsg}. ${notLastMsgSuffix}`);
19
+ }
20
+ catch (e) {
21
+ const errMsg = `Error fetching URL ${url} [${e.message}]`;
22
+ if (isLast)
23
+ throw new Error(errMsg);
24
+ logger === null || logger === void 0 ? void 0 : logger.debug(`${errMsg}. ${notLastMsgSuffix}`);
25
+ }
26
+ }
27
+ };
28
+
29
+ exports.fetchWithFallbacks = fetchWithFallbacks;
30
+ //# sourceMappingURL=fetchWithFallbacks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetchWithFallbacks.js","sources":["../../../../src/mixins/staticResourcesMixin/fetchWithFallbacks.ts"],"sourcesContent":["import { Logger } from '../loggerMixin';\n\ntype FetchParams = Parameters<typeof fetch>;\nconst notLastMsgSuffix = 'Trying the next fallback URL...';\n\nexport const fetchWithFallbacks = async (\n fallbacks: FetchParams['0'] | FetchParams['0'][],\n init: FetchParams['1'],\n {\n logger,\n onSuccess,\n }: { logger?: Logger; onSuccess?: (urlIndex: number) => void },\n): ReturnType<typeof fetch> => {\n const fallbacksArr = Array.isArray(fallbacks) ? fallbacks : [fallbacks];\n\n for (let index = 0; index < fallbacksArr.length; index++) {\n const url = fallbacksArr[index];\n const isLast = index === fallbacksArr.length - 1;\n\n try {\n const res = await fetch(url.toString(), init);\n if (res.ok) {\n onSuccess?.(index);\n return res;\n }\n\n const errMsg = `Error fetching URL ${url} [${res.status}]`;\n\n if (isLast) throw new Error(errMsg);\n\n logger?.debug(`${errMsg}. ${notLastMsgSuffix}`);\n } catch (e) {\n const errMsg = `Error fetching URL ${url} [${e.message}]`;\n\n if (isLast) throw new Error(errMsg);\n\n logger?.debug(`${errMsg}. ${notLastMsgSuffix}`);\n }\n }\n};\n"],"names":[],"mappings":";;AAGA,MAAM,gBAAgB,GAAG,iCAAiC,CAAC;AAE9C,MAAA,kBAAkB,GAAG,OAChC,SAAgD,EAChD,IAAsB,EACtB,EACE,MAAM,EACN,SAAS,GACmD,KAClC;AAC5B,IAAA,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,SAAS,GAAG,CAAC,SAAS,CAAC,CAAC;AAExE,IAAA,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,YAAY,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;AACxD,QAAA,MAAM,GAAG,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;QAChC,MAAM,MAAM,GAAG,KAAK,KAAK,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;AAEjD,QAAA,IAAI;AACF,YAAA,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,CAAC;AAC9C,YAAA,IAAI,GAAG,CAAC,EAAE,EAAE;AACV,gBAAA,SAAS,aAAT,SAAS,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAT,SAAS,CAAG,KAAK,CAAC,CAAC;AACnB,gBAAA,OAAO,GAAG,CAAC;aACZ;YAED,MAAM,MAAM,GAAG,CAAsB,mBAAA,EAAA,GAAG,KAAK,GAAG,CAAC,MAAM,CAAA,CAAA,CAAG,CAAC;AAE3D,YAAA,IAAI,MAAM;AAAE,gBAAA,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC;AAEpC,YAAA,MAAM,KAAN,IAAA,IAAA,MAAM,KAAN,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,MAAM,CAAE,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,EAAA,EAAK,gBAAgB,CAAA,CAAE,CAAC,CAAC;SACjD;QAAC,OAAO,CAAC,EAAE;YACV,MAAM,MAAM,GAAG,CAAsB,mBAAA,EAAA,GAAG,KAAK,CAAC,CAAC,OAAO,CAAA,CAAA,CAAG,CAAC;AAE1D,YAAA,IAAI,MAAM;AAAE,gBAAA,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC;AAEpC,YAAA,MAAM,KAAN,IAAA,IAAA,MAAM,KAAN,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,MAAM,CAAE,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,EAAA,EAAK,gBAAgB,CAAA,CAAE,CAAC,CAAC;SACjD;KACF;AACH;;;;"}
@@ -0,0 +1,9 @@
1
+ 'use strict';
2
+
3
+ var staticResourcesMixin = require('./staticResourcesMixin.js');
4
+
5
+
6
+
7
+ exports.getResourceUrl = staticResourcesMixin.getResourceUrl;
8
+ exports.staticResourcesMixin = staticResourcesMixin.staticResourcesMixin;
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;"}
@@ -1,38 +1,99 @@
1
1
  'use strict';
2
2
 
3
+ var tslib = require('tslib');
3
4
  var sdkHelpers = require('@descope/sdk-helpers');
4
5
  var loggerMixin = require('../loggerMixin/loggerMixin.js');
5
6
  var constants = require('./constants.js');
6
7
  var projectIdMixin = require('../projectIdMixin.js');
7
8
  var baseUrlMixin = require('../baseUrlMixin.js');
9
+ var fetchWithFallbacks = require('./fetchWithFallbacks.js');
8
10
 
9
- function getResourceUrl({ projectId, filename, assetsFolder = constants.ASSETS_FOLDER, baseUrl, }) {
10
- const url = new URL(constants.OVERRIDE_CONTENT_URL || baseUrl || constants.BASE_CONTENT_URL);
11
+ function getResourceUrl({ projectId, filename, assetsFolder = constants.ASSETS_FOLDER, baseUrl = constants.BASE_CONTENT_URL, }) {
12
+ const url = new URL(baseUrl);
11
13
  url.pathname = sdkHelpers.pathJoin(url.pathname, projectId, assetsFolder, filename);
12
- return url.toString();
14
+ // we want to keep the baseUrl so we can use it later
15
+ url.baseUrl = baseUrl;
16
+ return url;
13
17
  }
14
18
  const staticResourcesMixin = sdkHelpers.createSingletonMixin((superclass) => {
19
+ var _StaticResourcesMixinClass_instances, _StaticResourcesMixinClass_lastBaseUrl, _StaticResourcesMixinClass_workingBaseUrl, _StaticResourcesMixinClass_getResourceUrls, _a;
15
20
  const BaseClass = sdkHelpers.compose(loggerMixin.loggerMixin, projectIdMixin.projectIdMixin, baseUrlMixin.baseUrlMixin)(superclass);
16
- return class StaticResourcesMixinClass extends BaseClass {
17
- async fetchStaticResource(filename, format) {
21
+ // the logic should be as following:
22
+ // if there is a local storage override, use it
23
+ // otherwise, if there is a base-static-url attribute, use it
24
+ // otherwise, try to use base-url, and check if it's working
25
+ // if it's working, use it
26
+ // if not, use the default content url
27
+ return _a = class StaticResourcesMixinClass extends BaseClass {
28
+ constructor() {
29
+ super(...arguments);
30
+ _StaticResourcesMixinClass_instances.add(this);
31
+ _StaticResourcesMixinClass_lastBaseUrl.set(this, void 0);
32
+ _StaticResourcesMixinClass_workingBaseUrl.set(this, void 0);
33
+ }
34
+ async fetchStaticResource(filename, format) {
35
+ const resourceUrls = tslib.__classPrivateFieldGet(this, _StaticResourcesMixinClass_instances, "m", _StaticResourcesMixinClass_getResourceUrls).call(this, filename);
36
+ // if there are multiple resource urls, it means that there are fallbacks,
37
+ // if one of the options (which is not the last) is working, we want to keep using it by updating the workingBaseUrl
38
+ const onSuccess = !Array.isArray(resourceUrls)
39
+ ? null
40
+ : (index) => {
41
+ if (index !== resourceUrls.length - 1) {
42
+ const { baseUrl } = resourceUrls[index];
43
+ tslib.__classPrivateFieldSet(this, _StaticResourcesMixinClass_workingBaseUrl, baseUrl, "f");
44
+ }
45
+ };
46
+ try {
47
+ const res = await fetchWithFallbacks.fetchWithFallbacks(resourceUrls, { cache: 'default' }, { logger: this.logger, onSuccess });
48
+ return {
49
+ body: await res[format](),
50
+ headers: Object.fromEntries(res.headers.entries()),
51
+ };
52
+ }
53
+ catch (e) {
54
+ this.logger.error(e.message);
55
+ }
56
+ }
57
+ get baseStaticUrl() {
58
+ return this.getAttribute('base-static-url');
59
+ }
60
+ },
61
+ _StaticResourcesMixinClass_lastBaseUrl = new WeakMap(),
62
+ _StaticResourcesMixinClass_workingBaseUrl = new WeakMap(),
63
+ _StaticResourcesMixinClass_instances = new WeakSet(),
64
+ _StaticResourcesMixinClass_getResourceUrls = function _StaticResourcesMixinClass_getResourceUrls(filename) {
65
+ const overrideUrl = constants.OVERRIDE_CONTENT_URL || this.baseStaticUrl;
66
+ if (overrideUrl) {
67
+ return getResourceUrl({
68
+ projectId: this.projectId,
69
+ filename,
70
+ baseUrl: overrideUrl,
71
+ });
72
+ }
73
+ const isBaseUrlUpdated = tslib.__classPrivateFieldGet(this, _StaticResourcesMixinClass_lastBaseUrl, "f") !== this.baseUrl;
74
+ const shouldFallbackFetch = isBaseUrlUpdated && !!this.baseUrl;
75
+ // if the base url has changed, reset the working base url
76
+ if (isBaseUrlUpdated) {
77
+ tslib.__classPrivateFieldSet(this, _StaticResourcesMixinClass_lastBaseUrl, this.baseUrl, "f");
78
+ tslib.__classPrivateFieldSet(this, _StaticResourcesMixinClass_workingBaseUrl, undefined, "f");
79
+ }
18
80
  const resourceUrl = getResourceUrl({
19
81
  projectId: this.projectId,
20
82
  filename,
21
- baseUrl: this.baseStaticUrl,
83
+ baseUrl: tslib.__classPrivateFieldGet(this, _StaticResourcesMixinClass_workingBaseUrl, "f"),
22
84
  });
23
- const res = await fetch(resourceUrl, { cache: 'default' });
24
- if (!res.ok) {
25
- this.logger.error(`Error fetching URL ${resourceUrl} [${res.status}]`);
85
+ // if there is no reason to check the baseUrl, generate the resource url according to the priority
86
+ if (!shouldFallbackFetch) {
87
+ return resourceUrl;
26
88
  }
27
- return {
28
- body: await res[format](),
29
- headers: Object.fromEntries(res.headers.entries()),
30
- };
31
- }
32
- get baseStaticUrl() {
33
- return this.getAttribute('base-static-url');
34
- }
35
- };
89
+ const resourceUrlFromBaseUrl = getResourceUrl({
90
+ projectId: this.projectId,
91
+ filename,
92
+ baseUrl: this.baseUrl + '/pages',
93
+ });
94
+ return [resourceUrlFromBaseUrl, resourceUrl];
95
+ },
96
+ _a;
36
97
  });
37
98
 
38
99
  exports.getResourceUrl = getResourceUrl;
@@ -1 +1 @@
1
- {"version":3,"file":"staticResourcesMixin.js","sources":["../../../../src/mixins/staticResourcesMixin/staticResourcesMixin.ts"],"sourcesContent":["import { pathJoin, compose, createSingletonMixin } from '@descope/sdk-helpers';\nimport { loggerMixin } from '../loggerMixin';\nimport {\n ASSETS_FOLDER,\n BASE_CONTENT_URL,\n OVERRIDE_CONTENT_URL,\n} from './constants';\nimport { projectIdMixin } from '../projectIdMixin';\nimport { baseUrlMixin } from '../baseUrlMixin';\n\ntype Format = 'text' | 'json';\n\nexport function getResourceUrl({\n projectId,\n filename,\n assetsFolder = ASSETS_FOLDER,\n baseUrl,\n}: {\n projectId: string;\n filename: string;\n assetsFolder?: string;\n baseUrl?: string;\n}) {\n const url = new URL(OVERRIDE_CONTENT_URL || baseUrl || BASE_CONTENT_URL);\n url.pathname = pathJoin(url.pathname, projectId, assetsFolder, filename);\n\n return url.toString();\n}\n\nexport const staticResourcesMixin = createSingletonMixin(\n <T extends CustomElementConstructor>(superclass: T) => {\n const BaseClass = compose(\n loggerMixin,\n projectIdMixin,\n baseUrlMixin,\n )(superclass);\n\n return class StaticResourcesMixinClass extends BaseClass {\n async fetchStaticResource<F extends Format>(\n filename: string,\n format: F,\n ): Promise<{\n body: F extends 'json' ? Record<string, any> : string;\n headers: Record<string, string>;\n }> {\n const resourceUrl = getResourceUrl({\n projectId: this.projectId,\n filename,\n baseUrl: this.baseStaticUrl,\n });\n const res = await fetch(resourceUrl, { cache: 'default' });\n if (!res.ok) {\n this.logger.error(\n `Error fetching URL ${resourceUrl} [${res.status}]`,\n );\n }\n\n return {\n body: await res[format](),\n headers: Object.fromEntries(res.headers.entries()),\n };\n }\n\n get baseStaticUrl() {\n return this.getAttribute('base-static-url');\n }\n };\n },\n);\n"],"names":["ASSETS_FOLDER","OVERRIDE_CONTENT_URL","BASE_CONTENT_URL","pathJoin","createSingletonMixin","compose","loggerMixin","projectIdMixin","baseUrlMixin"],"mappings":";;;;;;;;AAYgB,SAAA,cAAc,CAAC,EAC7B,SAAS,EACT,QAAQ,EACR,YAAY,GAAGA,uBAAa,EAC5B,OAAO,GAMR,EAAA;IACC,MAAM,GAAG,GAAG,IAAI,GAAG,CAACC,8BAAoB,IAAI,OAAO,IAAIC,0BAAgB,CAAC,CAAC;AACzE,IAAA,GAAG,CAAC,QAAQ,GAAGC,mBAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;AAEzE,IAAA,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;AACxB,CAAC;MAEY,oBAAoB,GAAGC,+BAAoB,CACtD,CAAqC,UAAa,KAAI;AACpD,IAAA,MAAM,SAAS,GAAGC,kBAAO,CACvBC,uBAAW,EACXC,6BAAc,EACdC,yBAAY,CACb,CAAC,UAAU,CAAC,CAAC;IAEd,OAAO,MAAM,yBAA0B,SAAQ,SAAS,CAAA;AACtD,QAAA,MAAM,mBAAmB,CACvB,QAAgB,EAChB,MAAS,EAAA;YAKT,MAAM,WAAW,GAAG,cAAc,CAAC;gBACjC,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,QAAQ;gBACR,OAAO,EAAE,IAAI,CAAC,aAAa;AAC5B,aAAA,CAAC,CAAC;AACH,YAAA,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;AAC3D,YAAA,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE;AACX,gBAAA,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,CAAA,mBAAA,EAAsB,WAAW,CAAA,EAAA,EAAK,GAAG,CAAC,MAAM,CAAA,CAAA,CAAG,CACpD,CAAC;aACH;YAED,OAAO;AACL,gBAAA,IAAI,EAAE,MAAM,GAAG,CAAC,MAAM,CAAC,EAAE;gBACzB,OAAO,EAAE,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;aACnD,CAAC;SACH;AAED,QAAA,IAAI,aAAa,GAAA;AACf,YAAA,OAAO,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAAC,CAAC;SAC7C;KACF,CAAC;AACJ,CAAC;;;;;"}
1
+ {"version":3,"file":"staticResourcesMixin.js","sources":["../../../../src/mixins/staticResourcesMixin/staticResourcesMixin.ts"],"sourcesContent":["import { pathJoin, compose, createSingletonMixin } from '@descope/sdk-helpers';\nimport { loggerMixin } from '../loggerMixin';\nimport {\n ASSETS_FOLDER,\n BASE_CONTENT_URL,\n OVERRIDE_CONTENT_URL,\n} from './constants';\nimport { projectIdMixin } from '../projectIdMixin';\nimport { baseUrlMixin } from '../baseUrlMixin';\nimport { fetchWithFallbacks } from './fetchWithFallbacks';\n\ntype Format = 'text' | 'json';\n\ntype CustomUrl = URL & { baseUrl: string };\n\nexport function getResourceUrl({\n projectId,\n filename,\n assetsFolder = ASSETS_FOLDER,\n baseUrl = BASE_CONTENT_URL,\n}: {\n projectId: string;\n filename: string;\n assetsFolder?: string;\n baseUrl?: string;\n}) {\n const url: CustomUrl = new URL(baseUrl) as any;\n url.pathname = pathJoin(url.pathname, projectId, assetsFolder, filename);\n // we want to keep the baseUrl so we can use it later\n url.baseUrl = baseUrl;\n\n return url;\n}\n\nexport const staticResourcesMixin = createSingletonMixin(\n <T extends CustomElementConstructor>(superclass: T) => {\n const BaseClass = compose(\n loggerMixin,\n projectIdMixin,\n baseUrlMixin,\n )(superclass);\n\n // the logic should be as following:\n // if there is a local storage override, use it\n // otherwise, if there is a base-static-url attribute, use it\n // otherwise, try to use base-url, and check if it's working\n // if it's working, use it\n // if not, use the default content url\n return class StaticResourcesMixinClass extends BaseClass {\n #lastBaseUrl?: string;\n #workingBaseUrl?: string;\n\n #getResourceUrls(filename: string): CustomUrl[] | CustomUrl {\n const overrideUrl = OVERRIDE_CONTENT_URL || this.baseStaticUrl;\n\n if (overrideUrl) {\n return getResourceUrl({\n projectId: this.projectId,\n filename,\n baseUrl: overrideUrl,\n });\n }\n\n const isBaseUrlUpdated = this.#lastBaseUrl !== this.baseUrl;\n const shouldFallbackFetch = isBaseUrlUpdated && !!this.baseUrl;\n\n // if the base url has changed, reset the working base url\n if (isBaseUrlUpdated) {\n this.#lastBaseUrl = this.baseUrl;\n this.#workingBaseUrl = undefined;\n }\n\n const resourceUrl = getResourceUrl({\n projectId: this.projectId,\n filename,\n baseUrl: this.#workingBaseUrl,\n });\n\n // if there is no reason to check the baseUrl, generate the resource url according to the priority\n if (!shouldFallbackFetch) {\n return resourceUrl;\n }\n\n const resourceUrlFromBaseUrl = getResourceUrl({\n projectId: this.projectId,\n filename,\n baseUrl: this.baseUrl + '/pages',\n });\n\n return [resourceUrlFromBaseUrl, resourceUrl];\n }\n\n async fetchStaticResource<F extends Format>(\n filename: string,\n format: F,\n ): Promise<{\n body: F extends 'json' ? Record<string, any> : string;\n headers: Record<string, string>;\n }> {\n const resourceUrls = this.#getResourceUrls(filename);\n\n // if there are multiple resource urls, it means that there are fallbacks,\n // if one of the options (which is not the last) is working, we want to keep using it by updating the workingBaseUrl\n const onSuccess = !Array.isArray(resourceUrls)\n ? null\n : (index: number) => {\n if (index !== resourceUrls.length - 1) {\n const { baseUrl } = resourceUrls[index];\n this.#workingBaseUrl = baseUrl;\n }\n };\n\n try {\n const res = await fetchWithFallbacks(\n resourceUrls,\n { cache: 'default' },\n { logger: this.logger, onSuccess },\n );\n\n return {\n body: await res[format](),\n headers: Object.fromEntries(res.headers.entries()),\n };\n } catch (e) {\n this.logger.error(e.message);\n }\n }\n\n get baseStaticUrl() {\n return this.getAttribute('base-static-url');\n }\n };\n },\n);\n"],"names":["ASSETS_FOLDER","BASE_CONTENT_URL","pathJoin","createSingletonMixin","compose","loggerMixin","projectIdMixin","baseUrlMixin","__classPrivateFieldGet","__classPrivateFieldSet","fetchWithFallbacks","OVERRIDE_CONTENT_URL"],"mappings":";;;;;;;;;;AAegB,SAAA,cAAc,CAAC,EAC7B,SAAS,EACT,QAAQ,EACR,YAAY,GAAGA,uBAAa,EAC5B,OAAO,GAAGC,0BAAgB,GAM3B,EAAA;AACC,IAAA,MAAM,GAAG,GAAc,IAAI,GAAG,CAAC,OAAO,CAAQ,CAAC;AAC/C,IAAA,GAAG,CAAC,QAAQ,GAAGC,mBAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;;AAEzE,IAAA,GAAG,CAAC,OAAO,GAAG,OAAO,CAAC;AAEtB,IAAA,OAAO,GAAG,CAAC;AACb,CAAC;MAEY,oBAAoB,GAAGC,+BAAoB,CACtD,CAAqC,UAAa,KAAI;;AACpD,IAAA,MAAM,SAAS,GAAGC,kBAAO,CACvBC,uBAAW,EACXC,6BAAc,EACdC,yBAAY,CACb,CAAC,UAAU,CAAC,CAAC;;;;;;;IAQd,OAAO,EAAA,GAAA,MAAM,yBAA0B,SAAQ,SAAS,CAAA;AAAjD,YAAA,WAAA,GAAA;;;gBACL,sCAAsB,CAAA,GAAA,CAAA,IAAA,EAAA,KAAA,CAAA,CAAA,CAAA;gBACtB,yCAAyB,CAAA,GAAA,CAAA,IAAA,EAAA,KAAA,CAAA,CAAA,CAAA;aAiF1B;AAvCC,YAAA,MAAM,mBAAmB,CACvB,QAAgB,EAChB,MAAS,EAAA;gBAKT,MAAM,YAAY,GAAGC,4BAAA,CAAA,IAAI,EAAA,oCAAA,EAAA,GAAA,EAAA,0CAAA,CAAiB,MAArB,IAAI,EAAkB,QAAQ,CAAC,CAAC;;;gBAIrD,MAAM,SAAS,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC;AAC5C,sBAAE,IAAI;AACN,sBAAE,CAAC,KAAa,KAAI;wBAChB,IAAI,KAAK,KAAK,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE;4BACrC,MAAM,EAAE,OAAO,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;AACxC,4BAAAC,4BAAA,CAAA,IAAI,EAAA,yCAAA,EAAmB,OAAO,EAAA,GAAA,CAAA,CAAC;yBAChC;AACH,qBAAC,CAAC;AAEN,gBAAA,IAAI;oBACF,MAAM,GAAG,GAAG,MAAMC,qCAAkB,CAClC,YAAY,EACZ,EAAE,KAAK,EAAE,SAAS,EAAE,EACpB,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,CACnC,CAAC;oBAEF,OAAO;AACL,wBAAA,IAAI,EAAE,MAAM,GAAG,CAAC,MAAM,CAAC,EAAE;wBACzB,OAAO,EAAE,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;qBACnD,CAAC;iBACH;gBAAC,OAAO,CAAC,EAAE;oBACV,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;iBAC9B;aACF;AAED,YAAA,IAAI,aAAa,GAAA;AACf,gBAAA,OAAO,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAAC,CAAC;aAC7C;AACF,SAAA;;;;yGA/EkB,QAAgB,EAAA;AAC/B,YAAA,MAAM,WAAW,GAAGC,8BAAoB,IAAI,IAAI,CAAC,aAAa,CAAC;YAE/D,IAAI,WAAW,EAAE;AACf,gBAAA,OAAO,cAAc,CAAC;oBACpB,SAAS,EAAE,IAAI,CAAC,SAAS;oBACzB,QAAQ;AACR,oBAAA,OAAO,EAAE,WAAW;AACrB,iBAAA,CAAC,CAAC;aACJ;YAED,MAAM,gBAAgB,GAAGH,4BAAA,CAAA,IAAI,8CAAa,KAAK,IAAI,CAAC,OAAO,CAAC;YAC5D,MAAM,mBAAmB,GAAG,gBAAgB,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC;;YAG/D,IAAI,gBAAgB,EAAE;AACpB,gBAAAC,4BAAA,CAAA,IAAI,EAAgB,sCAAA,EAAA,IAAI,CAAC,OAAO,MAAA,CAAC;AACjC,gBAAAA,4BAAA,CAAA,IAAI,EAAA,yCAAA,EAAmB,SAAS,EAAA,GAAA,CAAA,CAAC;aAClC;YAED,MAAM,WAAW,GAAG,cAAc,CAAC;gBACjC,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,QAAQ;gBACR,OAAO,EAAED,4BAAA,CAAA,IAAI,EAAgB,yCAAA,EAAA,GAAA,CAAA;AAC9B,aAAA,CAAC,CAAC;;YAGH,IAAI,CAAC,mBAAmB,EAAE;AACxB,gBAAA,OAAO,WAAW,CAAC;aACpB;YAED,MAAM,sBAAsB,GAAG,cAAc,CAAC;gBAC5C,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,QAAQ;AACR,gBAAA,OAAO,EAAE,IAAI,CAAC,OAAO,GAAG,QAAQ;AACjC,aAAA,CAAC,CAAC;AAEH,YAAA,OAAO,CAAC,sBAAsB,EAAE,WAAW,CAAC,CAAC;SAC9C;AAyCD,QAAA,EAAA,CAAA;AACJ,CAAC;;;;;"}
@@ -0,0 +1,28 @@
1
+ const notLastMsgSuffix = 'Trying the next fallback URL...';
2
+ const fetchWithFallbacks = async (fallbacks, init, { logger, onSuccess, }) => {
3
+ const fallbacksArr = Array.isArray(fallbacks) ? fallbacks : [fallbacks];
4
+ for (let index = 0; index < fallbacksArr.length; index++) {
5
+ const url = fallbacksArr[index];
6
+ const isLast = index === fallbacksArr.length - 1;
7
+ try {
8
+ const res = await fetch(url.toString(), init);
9
+ if (res.ok) {
10
+ onSuccess === null || onSuccess === void 0 ? void 0 : onSuccess(index);
11
+ return res;
12
+ }
13
+ const errMsg = `Error fetching URL ${url} [${res.status}]`;
14
+ if (isLast)
15
+ throw new Error(errMsg);
16
+ logger === null || logger === void 0 ? void 0 : logger.debug(`${errMsg}. ${notLastMsgSuffix}`);
17
+ }
18
+ catch (e) {
19
+ const errMsg = `Error fetching URL ${url} [${e.message}]`;
20
+ if (isLast)
21
+ throw new Error(errMsg);
22
+ logger === null || logger === void 0 ? void 0 : logger.debug(`${errMsg}. ${notLastMsgSuffix}`);
23
+ }
24
+ }
25
+ };
26
+
27
+ export { fetchWithFallbacks };
28
+ //# sourceMappingURL=fetchWithFallbacks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetchWithFallbacks.js","sources":["../../../../src/mixins/staticResourcesMixin/fetchWithFallbacks.ts"],"sourcesContent":["import { Logger } from '../loggerMixin';\n\ntype FetchParams = Parameters<typeof fetch>;\nconst notLastMsgSuffix = 'Trying the next fallback URL...';\n\nexport const fetchWithFallbacks = async (\n fallbacks: FetchParams['0'] | FetchParams['0'][],\n init: FetchParams['1'],\n {\n logger,\n onSuccess,\n }: { logger?: Logger; onSuccess?: (urlIndex: number) => void },\n): ReturnType<typeof fetch> => {\n const fallbacksArr = Array.isArray(fallbacks) ? fallbacks : [fallbacks];\n\n for (let index = 0; index < fallbacksArr.length; index++) {\n const url = fallbacksArr[index];\n const isLast = index === fallbacksArr.length - 1;\n\n try {\n const res = await fetch(url.toString(), init);\n if (res.ok) {\n onSuccess?.(index);\n return res;\n }\n\n const errMsg = `Error fetching URL ${url} [${res.status}]`;\n\n if (isLast) throw new Error(errMsg);\n\n logger?.debug(`${errMsg}. ${notLastMsgSuffix}`);\n } catch (e) {\n const errMsg = `Error fetching URL ${url} [${e.message}]`;\n\n if (isLast) throw new Error(errMsg);\n\n logger?.debug(`${errMsg}. ${notLastMsgSuffix}`);\n }\n }\n};\n"],"names":[],"mappings":"AAGA,MAAM,gBAAgB,GAAG,iCAAiC,CAAC;AAE9C,MAAA,kBAAkB,GAAG,OAChC,SAAgD,EAChD,IAAsB,EACtB,EACE,MAAM,EACN,SAAS,GACmD,KAClC;AAC5B,IAAA,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,SAAS,GAAG,CAAC,SAAS,CAAC,CAAC;AAExE,IAAA,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,YAAY,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;AACxD,QAAA,MAAM,GAAG,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;QAChC,MAAM,MAAM,GAAG,KAAK,KAAK,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;AAEjD,QAAA,IAAI;AACF,YAAA,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,CAAC;AAC9C,YAAA,IAAI,GAAG,CAAC,EAAE,EAAE;AACV,gBAAA,SAAS,aAAT,SAAS,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAT,SAAS,CAAG,KAAK,CAAC,CAAC;AACnB,gBAAA,OAAO,GAAG,CAAC;aACZ;YAED,MAAM,MAAM,GAAG,CAAsB,mBAAA,EAAA,GAAG,KAAK,GAAG,CAAC,MAAM,CAAA,CAAA,CAAG,CAAC;AAE3D,YAAA,IAAI,MAAM;AAAE,gBAAA,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC;AAEpC,YAAA,MAAM,KAAN,IAAA,IAAA,MAAM,KAAN,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,MAAM,CAAE,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,EAAA,EAAK,gBAAgB,CAAA,CAAE,CAAC,CAAC;SACjD;QAAC,OAAO,CAAC,EAAE;YACV,MAAM,MAAM,GAAG,CAAsB,mBAAA,EAAA,GAAG,KAAK,CAAC,CAAC,OAAO,CAAA,CAAA,CAAG,CAAC;AAE1D,YAAA,IAAI,MAAM;AAAE,gBAAA,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC;AAEpC,YAAA,MAAM,KAAN,IAAA,IAAA,MAAM,KAAN,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,MAAM,CAAE,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,EAAA,EAAK,gBAAgB,CAAA,CAAE,CAAC,CAAC;SACjD;KACF;AACH;;;;"}
@@ -0,0 +1,2 @@
1
+ export { getResourceUrl, staticResourcesMixin } from './staticResourcesMixin.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -1,36 +1,97 @@
1
+ import { __classPrivateFieldGet, __classPrivateFieldSet } from 'tslib';
1
2
  import { createSingletonMixin, compose, pathJoin } from '@descope/sdk-helpers';
2
3
  import { loggerMixin } from '../loggerMixin/loggerMixin.js';
3
- import { OVERRIDE_CONTENT_URL, BASE_CONTENT_URL, ASSETS_FOLDER } from './constants.js';
4
+ import { ASSETS_FOLDER, BASE_CONTENT_URL, OVERRIDE_CONTENT_URL } from './constants.js';
4
5
  import { projectIdMixin } from '../projectIdMixin.js';
5
6
  import { baseUrlMixin } from '../baseUrlMixin.js';
7
+ import { fetchWithFallbacks } from './fetchWithFallbacks.js';
6
8
 
7
- function getResourceUrl({ projectId, filename, assetsFolder = ASSETS_FOLDER, baseUrl, }) {
8
- const url = new URL(OVERRIDE_CONTENT_URL || baseUrl || BASE_CONTENT_URL);
9
+ function getResourceUrl({ projectId, filename, assetsFolder = ASSETS_FOLDER, baseUrl = BASE_CONTENT_URL, }) {
10
+ const url = new URL(baseUrl);
9
11
  url.pathname = pathJoin(url.pathname, projectId, assetsFolder, filename);
10
- return url.toString();
12
+ // we want to keep the baseUrl so we can use it later
13
+ url.baseUrl = baseUrl;
14
+ return url;
11
15
  }
12
16
  const staticResourcesMixin = createSingletonMixin((superclass) => {
17
+ var _StaticResourcesMixinClass_instances, _StaticResourcesMixinClass_lastBaseUrl, _StaticResourcesMixinClass_workingBaseUrl, _StaticResourcesMixinClass_getResourceUrls, _a;
13
18
  const BaseClass = compose(loggerMixin, projectIdMixin, baseUrlMixin)(superclass);
14
- return class StaticResourcesMixinClass extends BaseClass {
15
- async fetchStaticResource(filename, format) {
19
+ // the logic should be as following:
20
+ // if there is a local storage override, use it
21
+ // otherwise, if there is a base-static-url attribute, use it
22
+ // otherwise, try to use base-url, and check if it's working
23
+ // if it's working, use it
24
+ // if not, use the default content url
25
+ return _a = class StaticResourcesMixinClass extends BaseClass {
26
+ constructor() {
27
+ super(...arguments);
28
+ _StaticResourcesMixinClass_instances.add(this);
29
+ _StaticResourcesMixinClass_lastBaseUrl.set(this, void 0);
30
+ _StaticResourcesMixinClass_workingBaseUrl.set(this, void 0);
31
+ }
32
+ async fetchStaticResource(filename, format) {
33
+ const resourceUrls = __classPrivateFieldGet(this, _StaticResourcesMixinClass_instances, "m", _StaticResourcesMixinClass_getResourceUrls).call(this, filename);
34
+ // if there are multiple resource urls, it means that there are fallbacks,
35
+ // if one of the options (which is not the last) is working, we want to keep using it by updating the workingBaseUrl
36
+ const onSuccess = !Array.isArray(resourceUrls)
37
+ ? null
38
+ : (index) => {
39
+ if (index !== resourceUrls.length - 1) {
40
+ const { baseUrl } = resourceUrls[index];
41
+ __classPrivateFieldSet(this, _StaticResourcesMixinClass_workingBaseUrl, baseUrl, "f");
42
+ }
43
+ };
44
+ try {
45
+ const res = await fetchWithFallbacks(resourceUrls, { cache: 'default' }, { logger: this.logger, onSuccess });
46
+ return {
47
+ body: await res[format](),
48
+ headers: Object.fromEntries(res.headers.entries()),
49
+ };
50
+ }
51
+ catch (e) {
52
+ this.logger.error(e.message);
53
+ }
54
+ }
55
+ get baseStaticUrl() {
56
+ return this.getAttribute('base-static-url');
57
+ }
58
+ },
59
+ _StaticResourcesMixinClass_lastBaseUrl = new WeakMap(),
60
+ _StaticResourcesMixinClass_workingBaseUrl = new WeakMap(),
61
+ _StaticResourcesMixinClass_instances = new WeakSet(),
62
+ _StaticResourcesMixinClass_getResourceUrls = function _StaticResourcesMixinClass_getResourceUrls(filename) {
63
+ const overrideUrl = OVERRIDE_CONTENT_URL || this.baseStaticUrl;
64
+ if (overrideUrl) {
65
+ return getResourceUrl({
66
+ projectId: this.projectId,
67
+ filename,
68
+ baseUrl: overrideUrl,
69
+ });
70
+ }
71
+ const isBaseUrlUpdated = __classPrivateFieldGet(this, _StaticResourcesMixinClass_lastBaseUrl, "f") !== this.baseUrl;
72
+ const shouldFallbackFetch = isBaseUrlUpdated && !!this.baseUrl;
73
+ // if the base url has changed, reset the working base url
74
+ if (isBaseUrlUpdated) {
75
+ __classPrivateFieldSet(this, _StaticResourcesMixinClass_lastBaseUrl, this.baseUrl, "f");
76
+ __classPrivateFieldSet(this, _StaticResourcesMixinClass_workingBaseUrl, undefined, "f");
77
+ }
16
78
  const resourceUrl = getResourceUrl({
17
79
  projectId: this.projectId,
18
80
  filename,
19
- baseUrl: this.baseStaticUrl,
81
+ baseUrl: __classPrivateFieldGet(this, _StaticResourcesMixinClass_workingBaseUrl, "f"),
20
82
  });
21
- const res = await fetch(resourceUrl, { cache: 'default' });
22
- if (!res.ok) {
23
- this.logger.error(`Error fetching URL ${resourceUrl} [${res.status}]`);
83
+ // if there is no reason to check the baseUrl, generate the resource url according to the priority
84
+ if (!shouldFallbackFetch) {
85
+ return resourceUrl;
24
86
  }
25
- return {
26
- body: await res[format](),
27
- headers: Object.fromEntries(res.headers.entries()),
28
- };
29
- }
30
- get baseStaticUrl() {
31
- return this.getAttribute('base-static-url');
32
- }
33
- };
87
+ const resourceUrlFromBaseUrl = getResourceUrl({
88
+ projectId: this.projectId,
89
+ filename,
90
+ baseUrl: this.baseUrl + '/pages',
91
+ });
92
+ return [resourceUrlFromBaseUrl, resourceUrl];
93
+ },
94
+ _a;
34
95
  });
35
96
 
36
97
  export { getResourceUrl, staticResourcesMixin };
@@ -1 +1 @@
1
- {"version":3,"file":"staticResourcesMixin.js","sources":["../../../../src/mixins/staticResourcesMixin/staticResourcesMixin.ts"],"sourcesContent":["import { pathJoin, compose, createSingletonMixin } from '@descope/sdk-helpers';\nimport { loggerMixin } from '../loggerMixin';\nimport {\n ASSETS_FOLDER,\n BASE_CONTENT_URL,\n OVERRIDE_CONTENT_URL,\n} from './constants';\nimport { projectIdMixin } from '../projectIdMixin';\nimport { baseUrlMixin } from '../baseUrlMixin';\n\ntype Format = 'text' | 'json';\n\nexport function getResourceUrl({\n projectId,\n filename,\n assetsFolder = ASSETS_FOLDER,\n baseUrl,\n}: {\n projectId: string;\n filename: string;\n assetsFolder?: string;\n baseUrl?: string;\n}) {\n const url = new URL(OVERRIDE_CONTENT_URL || baseUrl || BASE_CONTENT_URL);\n url.pathname = pathJoin(url.pathname, projectId, assetsFolder, filename);\n\n return url.toString();\n}\n\nexport const staticResourcesMixin = createSingletonMixin(\n <T extends CustomElementConstructor>(superclass: T) => {\n const BaseClass = compose(\n loggerMixin,\n projectIdMixin,\n baseUrlMixin,\n )(superclass);\n\n return class StaticResourcesMixinClass extends BaseClass {\n async fetchStaticResource<F extends Format>(\n filename: string,\n format: F,\n ): Promise<{\n body: F extends 'json' ? Record<string, any> : string;\n headers: Record<string, string>;\n }> {\n const resourceUrl = getResourceUrl({\n projectId: this.projectId,\n filename,\n baseUrl: this.baseStaticUrl,\n });\n const res = await fetch(resourceUrl, { cache: 'default' });\n if (!res.ok) {\n this.logger.error(\n `Error fetching URL ${resourceUrl} [${res.status}]`,\n );\n }\n\n return {\n body: await res[format](),\n headers: Object.fromEntries(res.headers.entries()),\n };\n }\n\n get baseStaticUrl() {\n return this.getAttribute('base-static-url');\n }\n };\n },\n);\n"],"names":[],"mappings":";;;;;;AAYgB,SAAA,cAAc,CAAC,EAC7B,SAAS,EACT,QAAQ,EACR,YAAY,GAAG,aAAa,EAC5B,OAAO,GAMR,EAAA;IACC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,oBAAoB,IAAI,OAAO,IAAI,gBAAgB,CAAC,CAAC;AACzE,IAAA,GAAG,CAAC,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;AAEzE,IAAA,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;AACxB,CAAC;MAEY,oBAAoB,GAAG,oBAAoB,CACtD,CAAqC,UAAa,KAAI;AACpD,IAAA,MAAM,SAAS,GAAG,OAAO,CACvB,WAAW,EACX,cAAc,EACd,YAAY,CACb,CAAC,UAAU,CAAC,CAAC;IAEd,OAAO,MAAM,yBAA0B,SAAQ,SAAS,CAAA;AACtD,QAAA,MAAM,mBAAmB,CACvB,QAAgB,EAChB,MAAS,EAAA;YAKT,MAAM,WAAW,GAAG,cAAc,CAAC;gBACjC,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,QAAQ;gBACR,OAAO,EAAE,IAAI,CAAC,aAAa;AAC5B,aAAA,CAAC,CAAC;AACH,YAAA,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;AAC3D,YAAA,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE;AACX,gBAAA,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,CAAA,mBAAA,EAAsB,WAAW,CAAA,EAAA,EAAK,GAAG,CAAC,MAAM,CAAA,CAAA,CAAG,CACpD,CAAC;aACH;YAED,OAAO;AACL,gBAAA,IAAI,EAAE,MAAM,GAAG,CAAC,MAAM,CAAC,EAAE;gBACzB,OAAO,EAAE,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;aACnD,CAAC;SACH;AAED,QAAA,IAAI,aAAa,GAAA;AACf,YAAA,OAAO,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAAC,CAAC;SAC7C;KACF,CAAC;AACJ,CAAC;;;;"}
1
+ {"version":3,"file":"staticResourcesMixin.js","sources":["../../../../src/mixins/staticResourcesMixin/staticResourcesMixin.ts"],"sourcesContent":["import { pathJoin, compose, createSingletonMixin } from '@descope/sdk-helpers';\nimport { loggerMixin } from '../loggerMixin';\nimport {\n ASSETS_FOLDER,\n BASE_CONTENT_URL,\n OVERRIDE_CONTENT_URL,\n} from './constants';\nimport { projectIdMixin } from '../projectIdMixin';\nimport { baseUrlMixin } from '../baseUrlMixin';\nimport { fetchWithFallbacks } from './fetchWithFallbacks';\n\ntype Format = 'text' | 'json';\n\ntype CustomUrl = URL & { baseUrl: string };\n\nexport function getResourceUrl({\n projectId,\n filename,\n assetsFolder = ASSETS_FOLDER,\n baseUrl = BASE_CONTENT_URL,\n}: {\n projectId: string;\n filename: string;\n assetsFolder?: string;\n baseUrl?: string;\n}) {\n const url: CustomUrl = new URL(baseUrl) as any;\n url.pathname = pathJoin(url.pathname, projectId, assetsFolder, filename);\n // we want to keep the baseUrl so we can use it later\n url.baseUrl = baseUrl;\n\n return url;\n}\n\nexport const staticResourcesMixin = createSingletonMixin(\n <T extends CustomElementConstructor>(superclass: T) => {\n const BaseClass = compose(\n loggerMixin,\n projectIdMixin,\n baseUrlMixin,\n )(superclass);\n\n // the logic should be as following:\n // if there is a local storage override, use it\n // otherwise, if there is a base-static-url attribute, use it\n // otherwise, try to use base-url, and check if it's working\n // if it's working, use it\n // if not, use the default content url\n return class StaticResourcesMixinClass extends BaseClass {\n #lastBaseUrl?: string;\n #workingBaseUrl?: string;\n\n #getResourceUrls(filename: string): CustomUrl[] | CustomUrl {\n const overrideUrl = OVERRIDE_CONTENT_URL || this.baseStaticUrl;\n\n if (overrideUrl) {\n return getResourceUrl({\n projectId: this.projectId,\n filename,\n baseUrl: overrideUrl,\n });\n }\n\n const isBaseUrlUpdated = this.#lastBaseUrl !== this.baseUrl;\n const shouldFallbackFetch = isBaseUrlUpdated && !!this.baseUrl;\n\n // if the base url has changed, reset the working base url\n if (isBaseUrlUpdated) {\n this.#lastBaseUrl = this.baseUrl;\n this.#workingBaseUrl = undefined;\n }\n\n const resourceUrl = getResourceUrl({\n projectId: this.projectId,\n filename,\n baseUrl: this.#workingBaseUrl,\n });\n\n // if there is no reason to check the baseUrl, generate the resource url according to the priority\n if (!shouldFallbackFetch) {\n return resourceUrl;\n }\n\n const resourceUrlFromBaseUrl = getResourceUrl({\n projectId: this.projectId,\n filename,\n baseUrl: this.baseUrl + '/pages',\n });\n\n return [resourceUrlFromBaseUrl, resourceUrl];\n }\n\n async fetchStaticResource<F extends Format>(\n filename: string,\n format: F,\n ): Promise<{\n body: F extends 'json' ? Record<string, any> : string;\n headers: Record<string, string>;\n }> {\n const resourceUrls = this.#getResourceUrls(filename);\n\n // if there are multiple resource urls, it means that there are fallbacks,\n // if one of the options (which is not the last) is working, we want to keep using it by updating the workingBaseUrl\n const onSuccess = !Array.isArray(resourceUrls)\n ? null\n : (index: number) => {\n if (index !== resourceUrls.length - 1) {\n const { baseUrl } = resourceUrls[index];\n this.#workingBaseUrl = baseUrl;\n }\n };\n\n try {\n const res = await fetchWithFallbacks(\n resourceUrls,\n { cache: 'default' },\n { logger: this.logger, onSuccess },\n );\n\n return {\n body: await res[format](),\n headers: Object.fromEntries(res.headers.entries()),\n };\n } catch (e) {\n this.logger.error(e.message);\n }\n }\n\n get baseStaticUrl() {\n return this.getAttribute('base-static-url');\n }\n };\n },\n);\n"],"names":[],"mappings":"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"}