@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.
- package/dist/cjs/mixins/staticResourcesMixin/fetchWithFallbacks.js +30 -0
- package/dist/cjs/mixins/staticResourcesMixin/fetchWithFallbacks.js.map +1 -0
- package/dist/cjs/mixins/staticResourcesMixin/index.js +9 -0
- package/dist/cjs/mixins/staticResourcesMixin/index.js.map +1 -0
- package/dist/cjs/mixins/staticResourcesMixin/staticResourcesMixin.js +79 -18
- package/dist/cjs/mixins/staticResourcesMixin/staticResourcesMixin.js.map +1 -1
- package/dist/esm/mixins/staticResourcesMixin/fetchWithFallbacks.js +28 -0
- package/dist/esm/mixins/staticResourcesMixin/fetchWithFallbacks.js.map +1 -0
- package/dist/esm/mixins/staticResourcesMixin/index.js +2 -0
- package/dist/esm/mixins/staticResourcesMixin/index.js.map +1 -0
- package/dist/esm/mixins/staticResourcesMixin/staticResourcesMixin.js +80 -19
- package/dist/esm/mixins/staticResourcesMixin/staticResourcesMixin.js.map +1 -1
- package/dist/index.d.ts +177 -128
- package/dist/types/mixins/configMixin/configMixin.d.ts +14 -7
- 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/descopeUiMixin.d.ts +24 -17
- package/dist/types/mixins/formMixin.d.ts +2 -2
- package/dist/types/mixins/initLifecycleMixin.d.ts +1 -1
- package/dist/types/mixins/loggerMixin/loggerMixin.d.ts +2 -2
- package/dist/types/mixins/modalMixin/modalMixin.d.ts +27 -20
- package/dist/types/mixins/notificationsMixin/notificationsMixin.d.ts +27 -20
- package/dist/types/mixins/observeAttributesMixin/observeAttributesMixin.d.ts +4 -4
- package/dist/types/mixins/projectIdMixin.d.ts +5 -5
- package/dist/types/mixins/staticResourcesMixin/fetchWithFallbacks.d.ts +7 -0
- package/dist/types/mixins/staticResourcesMixin/staticResourcesMixin.d.ts +12 -6
- package/dist/types/mixins/themeMixin/themeMixin.d.ts +44 -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(
|
|
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
|
-
|
|
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
|
-
|
|
17
|
-
|
|
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
|
|
83
|
+
baseUrl: tslib.__classPrivateFieldGet(this, _StaticResourcesMixinClass_workingBaseUrl, "f"),
|
|
22
84
|
});
|
|
23
|
-
|
|
24
|
-
if (!
|
|
25
|
-
|
|
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
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
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(
|
|
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":"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"}
|
|
@@ -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 @@
|
|
|
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 {
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
15
|
-
|
|
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
|
|
81
|
+
baseUrl: __classPrivateFieldGet(this, _StaticResourcesMixinClass_workingBaseUrl, "f"),
|
|
20
82
|
});
|
|
21
|
-
|
|
22
|
-
if (!
|
|
23
|
-
|
|
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
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
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(
|
|
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":";;;;;;;;AAegB,SAAA,cAAc,CAAC,EAC7B,SAAS,EACT,QAAQ,EACR,YAAY,GAAG,aAAa,EAC5B,OAAO,GAAG,gBAAgB,GAM3B,EAAA;AACC,IAAA,MAAM,GAAG,GAAc,IAAI,GAAG,CAAC,OAAO,CAAQ,CAAC;AAC/C,IAAA,GAAG,CAAC,QAAQ,GAAG,QAAQ,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,GAAG,oBAAoB,CACtD,CAAqC,UAAa,KAAI;;AACpD,IAAA,MAAM,SAAS,GAAG,OAAO,CACvB,WAAW,EACX,cAAc,EACd,YAAY,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,GAAG,sBAAA,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,4BAAA,sBAAA,CAAA,IAAI,EAAA,yCAAA,EAAmB,OAAO,EAAA,GAAA,CAAA,CAAC;yBAChC;AACH,qBAAC,CAAC;AAEN,gBAAA,IAAI;oBACF,MAAM,GAAG,GAAG,MAAM,kBAAkB,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,GAAG,oBAAoB,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,GAAG,sBAAA,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,gBAAA,sBAAA,CAAA,IAAI,EAAgB,sCAAA,EAAA,IAAI,CAAC,OAAO,MAAA,CAAC;AACjC,gBAAA,sBAAA,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,EAAE,sBAAA,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;;;;"}
|