@servicetitan/web-components 31.0.0 → 31.2.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/contexts/tests/mfe-data-context.test.js +34 -0
- package/dist/contexts/tests/mfe-data-context.test.js.map +1 -0
- package/dist/contexts/tests/mfe-metadata-context.test.js +41 -0
- package/dist/contexts/tests/mfe-metadata-context.test.js.map +1 -0
- package/dist/headless-loader.d.ts +5 -0
- package/dist/headless-loader.d.ts.map +1 -0
- package/dist/headless-loader.js +17 -0
- package/dist/headless-loader.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/loader.d.ts +10 -4
- package/dist/loader.d.ts.map +1 -1
- package/dist/loader.js +32 -40
- package/dist/loader.js.map +1 -1
- package/dist/register-headless.d.ts +9 -0
- package/dist/register-headless.d.ts.map +1 -0
- package/dist/register-headless.js +67 -0
- package/dist/register-headless.js.map +1 -0
- package/dist/types.d.ts +11 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utils/get-bundle-info.d.ts +4 -12
- package/dist/utils/get-bundle-info.d.ts.map +1 -1
- package/dist/utils/get-bundle-info.js +29 -42
- package/dist/utils/get-bundle-info.js.map +1 -1
- package/dist/utils/get-cache-setting.d.ts +2 -0
- package/dist/utils/get-cache-setting.d.ts.map +1 -0
- package/dist/utils/get-cache-setting.js +6 -0
- package/dist/utils/get-cache-setting.js.map +1 -0
- package/dist/utils/get-cached-metadata.d.ts +18 -0
- package/dist/utils/get-cached-metadata.d.ts.map +1 -0
- package/dist/utils/get-cached-metadata.js +47 -0
- package/dist/utils/get-cached-metadata.js.map +1 -0
- package/dist/utils/get-mfe-has-compatible-launchdarkly-version.d.ts +1 -1
- package/dist/utils/get-mfe-has-compatible-launchdarkly-version.d.ts.map +1 -1
- package/dist/utils/get-mfe-has-compatible-launchdarkly-version.js.map +1 -1
- package/dist/utils/get-mfe-has-unique-chunk-namespace.d.ts +1 -1
- package/dist/utils/get-mfe-has-unique-chunk-namespace.d.ts.map +1 -1
- package/dist/utils/get-mfe-has-unique-chunk-namespace.js.map +1 -1
- package/dist/utils/get-mfe-supports-rerendering.d.ts +1 -1
- package/dist/utils/get-mfe-supports-rerendering.d.ts.map +1 -1
- package/dist/utils/get-mfe-supports-rerendering.js.map +1 -1
- package/dist/utils/get-version-mismatches.d.ts +1 -1
- package/dist/utils/get-version-mismatches.d.ts.map +1 -1
- package/dist/utils/get-version-mismatches.js +1 -1
- package/dist/utils/get-version-mismatches.js.map +1 -1
- package/dist/utils/web-component.d.ts +1 -1
- package/dist/utils/web-component.d.ts.map +1 -1
- package/dist/utils/web-component.js +12 -9
- package/dist/utils/web-component.js.map +1 -1
- package/package.json +12 -12
- package/src/__tests__/headless-loader.test.tsx +123 -0
- package/src/__tests__/loader.test.tsx +33 -11
- package/src/__tests__/register-headless.test.tsx +98 -0
- package/src/headless-loader.tsx +21 -0
- package/src/index.ts +2 -0
- package/src/loader.tsx +58 -46
- package/src/register-headless.ts +81 -0
- package/src/types.ts +9 -0
- package/src/utils/__tests__/get-version-mismatches.test.ts +1 -1
- package/src/utils/get-bundle-info.ts +37 -60
- package/src/utils/get-cache-setting.ts +5 -0
- package/src/utils/get-cached-metadata.ts +72 -0
- package/src/utils/get-mfe-has-compatible-launchdarkly-version.ts +1 -1
- package/src/utils/get-mfe-has-unique-chunk-namespace.ts +1 -1
- package/src/utils/get-mfe-supports-rerendering.ts +1 -1
- package/src/utils/get-version-mismatches.ts +1 -1
- package/src/utils/web-component.tsx +8 -6
- package/dist/__mocks__/expect-styles-in-dom.d.ts +0 -3
- package/dist/__mocks__/expect-styles-in-dom.d.ts.map +0 -1
- package/dist/__mocks__/index.d.ts +0 -4
- package/dist/__mocks__/index.d.ts.map +0 -1
- package/dist/__mocks__/register-component.d.ts +0 -4
- package/dist/__mocks__/register-component.d.ts.map +0 -1
- package/dist/__mocks__/test-component.d.ts +0 -3
- package/dist/__mocks__/test-component.d.ts.map +0 -1
|
@@ -1,15 +1,17 @@
|
|
|
1
1
|
import semver from 'semver';
|
|
2
2
|
import get from 'lodash.get';
|
|
3
3
|
import { getJson } from '../common';
|
|
4
|
+
import { getCachedMetadata } from './get-cached-metadata';
|
|
5
|
+
import { getCacheSetting } from './get-cache-setting';
|
|
4
6
|
import { getEntrypoints } from './get-entry-points';
|
|
5
|
-
import { getMFESupportsRerendering } from './get-mfe-supports-rerendering';
|
|
6
|
-
import { getVersionMismatches } from './get-version-mismatches';
|
|
7
|
-
import { isVersionedUrl } from './is-versioned-url';
|
|
8
7
|
import { getMFEHasCompatibleLaunchDarklyVersion } from './get-mfe-has-compatible-launchdarkly-version';
|
|
8
|
+
import { getMFESupportsRerendering } from './get-mfe-supports-rerendering';
|
|
9
9
|
import { getMFEHasUniqueChunkNamespace } from './get-mfe-has-unique-chunk-namespace';
|
|
10
|
-
|
|
10
|
+
import { getVersionMismatches } from './get-version-mismatches';
|
|
11
|
+
export async function getBundleInfo({ cache, mainPackageUrl, fallbackPackageUrl, exposedDependencies = {}, exposedInstanceDependencies = {}, isHeadless, signal, retries, onRequestError }) {
|
|
11
12
|
var _metadata_entrypoints;
|
|
12
|
-
const { data: metadata, url: packageUrl } = await
|
|
13
|
+
const { data: metadata, url: packageUrl } = await getCachedMetadata({
|
|
14
|
+
cache,
|
|
13
15
|
fallbackPackageUrl,
|
|
14
16
|
mainPackageUrl,
|
|
15
17
|
onRequestError,
|
|
@@ -18,33 +20,38 @@ export async function getBundleInfo({ mainPackageUrl, fallbackPackageUrl, expose
|
|
|
18
20
|
});
|
|
19
21
|
const { bundledWith, name, sharedDependencies } = metadata;
|
|
20
22
|
const exactPackageUrl = packageUrl.replace('/dist/metadata.json', '');
|
|
21
|
-
const
|
|
23
|
+
const requestCache = getCacheSetting(exactPackageUrl);
|
|
22
24
|
let dependencies;
|
|
23
25
|
if (metadata.dependencies) {
|
|
24
26
|
dependencies = metadata.dependencies;
|
|
25
27
|
} else {
|
|
26
28
|
const { data: packageJson } = await getJson(`${exactPackageUrl}/package.json`, {
|
|
27
|
-
cache,
|
|
29
|
+
cache: requestCache,
|
|
28
30
|
retries,
|
|
29
31
|
signal
|
|
30
32
|
});
|
|
31
33
|
dependencies = packageJson.dependencies;
|
|
32
34
|
}
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
35
|
+
let mismatch;
|
|
36
|
+
let resolvedBundleType;
|
|
37
|
+
if (isHeadless) {
|
|
38
|
+
resolvedBundleType = 'headless';
|
|
39
|
+
} else {
|
|
40
|
+
mismatch = getVersionMismatches(exposedDependencies, dependencies, sharedDependencies);
|
|
41
|
+
const startupVersion = bundledWith === null || bundledWith === void 0 ? void 0 : bundledWith['@servicetitan/startup'];
|
|
42
|
+
const supportLightBundles = !!startupVersion && semver.gte(startupVersion, '17.0.0');
|
|
43
|
+
const embed = !mismatch && supportLightBundles;
|
|
44
|
+
resolvedBundleType = embed ? 'light' : 'full';
|
|
45
|
+
}
|
|
46
|
+
const withBaseUrl = (path)=>`${exactPackageUrl}/dist/bundle/${resolvedBundleType}/${path}`;
|
|
40
47
|
let entrypoints;
|
|
41
|
-
if ((_metadata_entrypoints = metadata.entrypoints) === null || _metadata_entrypoints === void 0 ? void 0 : _metadata_entrypoints[
|
|
42
|
-
entrypoints = metadata.entrypoints[
|
|
48
|
+
if ((_metadata_entrypoints = metadata.entrypoints) === null || _metadata_entrypoints === void 0 ? void 0 : _metadata_entrypoints[resolvedBundleType]) {
|
|
49
|
+
entrypoints = metadata.entrypoints[resolvedBundleType];
|
|
43
50
|
} else {
|
|
44
|
-
entrypoints = await getEntrypoints(withBaseUrl('entrypoints.json'),
|
|
51
|
+
entrypoints = await getEntrypoints(withBaseUrl('entrypoints.json'), requestCache);
|
|
45
52
|
}
|
|
46
53
|
const disposer = ()=>{
|
|
47
|
-
if (
|
|
54
|
+
if (resolvedBundleType === 'light') {
|
|
48
55
|
const path = Object.values(sharedDependencies).shift();
|
|
49
56
|
if (path) {
|
|
50
57
|
get(window, path).getStorage().clear(name);
|
|
@@ -55,39 +62,19 @@ export async function getBundleInfo({ mainPackageUrl, fallbackPackageUrl, expose
|
|
|
55
62
|
...result,
|
|
56
63
|
[key]: value.map(withBaseUrl)
|
|
57
64
|
}), {});
|
|
65
|
+
const elementName = resolvedBundleType === 'headless' ? `headless-${name}` : name;
|
|
58
66
|
return {
|
|
59
67
|
bundledWith,
|
|
60
68
|
disposer,
|
|
61
69
|
mfeSupportsRerendering: getMFESupportsRerendering(bundledWith, dependencies),
|
|
62
70
|
mfeHasUniqueChunkNamespace: getMFEHasUniqueChunkNamespace(bundledWith),
|
|
63
71
|
mfeHasCompatibleLaunchDarklyVersion: getMFEHasCompatibleLaunchDarklyVersion(bundledWith, exposedInstanceDependencies),
|
|
64
|
-
mismatch
|
|
72
|
+
mismatch,
|
|
73
|
+
resolvedBundleType,
|
|
65
74
|
urls,
|
|
66
|
-
WebComponent:
|
|
75
|
+
WebComponent: elementName,
|
|
67
76
|
version: metadata.version
|
|
68
77
|
};
|
|
69
78
|
}
|
|
70
|
-
async function getMetadata(props) {
|
|
71
|
-
const { fallbackPackageUrl, mainPackageUrl, onRequestError, retries, signal } = props;
|
|
72
|
-
return getJson(`${mainPackageUrl}/dist/metadata.json`, {
|
|
73
|
-
cache: getCacheSetting(mainPackageUrl),
|
|
74
|
-
retries: fallbackPackageUrl ? 0 : retries,
|
|
75
|
-
onRequestError,
|
|
76
|
-
signal
|
|
77
|
-
}).catch((e)=>{
|
|
78
|
-
if (!fallbackPackageUrl) {
|
|
79
|
-
throw e;
|
|
80
|
-
}
|
|
81
|
-
return getJson(`${fallbackPackageUrl}/dist/metadata.json`, {
|
|
82
|
-
retries,
|
|
83
|
-
onRequestError,
|
|
84
|
-
cache: getCacheSetting(fallbackPackageUrl),
|
|
85
|
-
signal
|
|
86
|
-
});
|
|
87
|
-
});
|
|
88
|
-
}
|
|
89
|
-
function getCacheSetting(url) {
|
|
90
|
-
return isVersionedUrl(url) ? undefined : 'no-store';
|
|
91
|
-
}
|
|
92
79
|
|
|
93
80
|
//# sourceMappingURL=get-bundle-info.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utils/get-bundle-info.ts"],"sourcesContent":["import semver from 'semver';\nimport get from 'lodash.get';\n\nimport { ExposedDependencies, ExposedInstanceDependencies, getJson, GetJsonError } from '../common';\nimport {
|
|
1
|
+
{"version":3,"sources":["../../src/utils/get-bundle-info.ts"],"sourcesContent":["import semver from 'semver';\nimport get from 'lodash.get';\n\nimport { ExposedDependencies, ExposedInstanceDependencies, getJson, GetJsonError } from '../common';\nimport { getCachedMetadata } from './get-cached-metadata';\nimport { getCacheSetting } from './get-cache-setting';\nimport { EntryPoints, getEntrypoints } from './get-entry-points';\nimport { getMFEHasCompatibleLaunchDarklyVersion } from './get-mfe-has-compatible-launchdarkly-version';\nimport { getMFESupportsRerendering } from './get-mfe-supports-rerendering';\nimport { getMFEHasUniqueChunkNamespace } from './get-mfe-has-unique-chunk-namespace';\nimport { getVersionMismatches } from './get-version-mismatches';\nimport type { Metadata } from '../types';\n\nexport type BundleInfo = Awaited<ReturnType<typeof getBundleInfo>>;\n\ninterface GetBundleInfoProps {\n cache: boolean | number;\n exposedDependencies?: ExposedDependencies;\n exposedInstanceDependencies?: ExposedInstanceDependencies;\n fallbackPackageUrl?: string;\n isHeadless?: boolean;\n mainPackageUrl: string;\n onRequestError?: (error: GetJsonError) => void;\n retries?: number;\n signal?: AbortSignal;\n}\n\nexport async function getBundleInfo({\n cache,\n mainPackageUrl,\n fallbackPackageUrl,\n exposedDependencies = {},\n exposedInstanceDependencies = {},\n isHeadless,\n signal,\n retries,\n onRequestError,\n}: GetBundleInfoProps) {\n const { data: metadata, url: packageUrl } = await getCachedMetadata({\n cache,\n fallbackPackageUrl,\n mainPackageUrl,\n onRequestError,\n retries,\n signal,\n });\n\n const { bundledWith, name, sharedDependencies } = metadata;\n const exactPackageUrl = packageUrl.replace('/dist/metadata.json', '');\n const requestCache = getCacheSetting(exactPackageUrl);\n\n let dependencies: NonNullable<Metadata['dependencies']>;\n if (metadata.dependencies) {\n dependencies = metadata.dependencies;\n } else {\n const { data: packageJson } = await getJson(`${exactPackageUrl}/package.json`, {\n cache: requestCache,\n retries,\n signal,\n });\n\n dependencies = packageJson.dependencies;\n }\n\n let mismatch: ReturnType<typeof getVersionMismatches>;\n let resolvedBundleType: 'headless' | 'light' | 'full';\n\n if (isHeadless) {\n resolvedBundleType = 'headless';\n } else {\n mismatch = getVersionMismatches(exposedDependencies, dependencies, sharedDependencies);\n const startupVersion = bundledWith?.['@servicetitan/startup'];\n const supportLightBundles = !!startupVersion && semver.gte(startupVersion, '17.0.0');\n const embed = !mismatch && supportLightBundles;\n resolvedBundleType = embed ? 'light' : 'full';\n }\n\n const withBaseUrl = (path: string) =>\n `${exactPackageUrl}/dist/bundle/${resolvedBundleType}/${path}`;\n\n let entrypoints: EntryPoints;\n if (metadata.entrypoints?.[resolvedBundleType]) {\n entrypoints = metadata.entrypoints[resolvedBundleType];\n } else {\n entrypoints = await getEntrypoints(withBaseUrl('entrypoints.json'), requestCache);\n }\n\n const disposer = () => {\n if (resolvedBundleType === 'light') {\n const path = Object.values<string>(sharedDependencies).shift();\n if (path) {\n get(window, path).getStorage().clear(name);\n }\n }\n };\n\n const urls = Object.entries(entrypoints).reduce(\n (result, [key, value]) => ({ ...result, [key]: value.map(withBaseUrl) }),\n {} as EntryPoints\n );\n\n const elementName = resolvedBundleType === 'headless' ? `headless-${name}` : name;\n\n return {\n bundledWith,\n disposer,\n mfeSupportsRerendering: getMFESupportsRerendering(bundledWith, dependencies),\n mfeHasUniqueChunkNamespace: getMFEHasUniqueChunkNamespace(bundledWith),\n mfeHasCompatibleLaunchDarklyVersion: getMFEHasCompatibleLaunchDarklyVersion(\n bundledWith,\n exposedInstanceDependencies\n ),\n mismatch,\n resolvedBundleType,\n urls,\n WebComponent: elementName,\n version: metadata.version,\n };\n}\n"],"names":["semver","get","getJson","getCachedMetadata","getCacheSetting","getEntrypoints","getMFEHasCompatibleLaunchDarklyVersion","getMFESupportsRerendering","getMFEHasUniqueChunkNamespace","getVersionMismatches","getBundleInfo","cache","mainPackageUrl","fallbackPackageUrl","exposedDependencies","exposedInstanceDependencies","isHeadless","signal","retries","onRequestError","metadata","data","url","packageUrl","bundledWith","name","sharedDependencies","exactPackageUrl","replace","requestCache","dependencies","packageJson","mismatch","resolvedBundleType","startupVersion","supportLightBundles","gte","embed","withBaseUrl","path","entrypoints","disposer","Object","values","shift","window","getStorage","clear","urls","entries","reduce","result","key","value","map","elementName","mfeSupportsRerendering","mfeHasUniqueChunkNamespace","mfeHasCompatibleLaunchDarklyVersion","WebComponent","version"],"mappings":"AAAA,OAAOA,YAAY,SAAS;AAC5B,OAAOC,SAAS,aAAa;AAE7B,SAA2DC,OAAO,QAAsB,YAAY;AACpG,SAASC,iBAAiB,QAAQ,wBAAwB;AAC1D,SAASC,eAAe,QAAQ,sBAAsB;AACtD,SAAsBC,cAAc,QAAQ,qBAAqB;AACjE,SAASC,sCAAsC,QAAQ,gDAAgD;AACvG,SAASC,yBAAyB,QAAQ,iCAAiC;AAC3E,SAASC,6BAA6B,QAAQ,uCAAuC;AACrF,SAASC,oBAAoB,QAAQ,2BAA2B;AAiBhE,OAAO,eAAeC,cAAc,EAChCC,KAAK,EACLC,cAAc,EACdC,kBAAkB,EAClBC,sBAAsB,CAAC,CAAC,EACxBC,8BAA8B,CAAC,CAAC,EAChCC,UAAU,EACVC,MAAM,EACNC,OAAO,EACPC,cAAc,EACG;QA4CbC;IA3CJ,MAAM,EAAEC,MAAMD,QAAQ,EAAEE,KAAKC,UAAU,EAAE,GAAG,MAAMpB,kBAAkB;QAChEQ;QACAE;QACAD;QACAO;QACAD;QACAD;IACJ;IAEA,MAAM,EAAEO,WAAW,EAAEC,IAAI,EAAEC,kBAAkB,EAAE,GAAGN;IAClD,MAAMO,kBAAkBJ,WAAWK,OAAO,CAAC,uBAAuB;IAClE,MAAMC,eAAezB,gBAAgBuB;IAErC,IAAIG;IACJ,IAAIV,SAASU,YAAY,EAAE;QACvBA,eAAeV,SAASU,YAAY;IACxC,OAAO;QACH,MAAM,EAAET,MAAMU,WAAW,EAAE,GAAG,MAAM7B,QAAQ,GAAGyB,gBAAgB,aAAa,CAAC,EAAE;YAC3EhB,OAAOkB;YACPX;YACAD;QACJ;QAEAa,eAAeC,YAAYD,YAAY;IAC3C;IAEA,IAAIE;IACJ,IAAIC;IAEJ,IAAIjB,YAAY;QACZiB,qBAAqB;IACzB,OAAO;QACHD,WAAWvB,qBAAqBK,qBAAqBgB,cAAcJ;QACnE,MAAMQ,iBAAiBV,wBAAAA,kCAAAA,WAAa,CAAC,wBAAwB;QAC7D,MAAMW,sBAAsB,CAAC,CAACD,kBAAkBlC,OAAOoC,GAAG,CAACF,gBAAgB;QAC3E,MAAMG,QAAQ,CAACL,YAAYG;QAC3BF,qBAAqBI,QAAQ,UAAU;IAC3C;IAEA,MAAMC,cAAc,CAACC,OACjB,GAAGZ,gBAAgB,aAAa,EAAEM,mBAAmB,CAAC,EAAEM,MAAM;IAElE,IAAIC;IACJ,KAAIpB,wBAAAA,SAASoB,WAAW,cAApBpB,4CAAAA,qBAAsB,CAACa,mBAAmB,EAAE;QAC5CO,cAAcpB,SAASoB,WAAW,CAACP,mBAAmB;IAC1D,OAAO;QACHO,cAAc,MAAMnC,eAAeiC,YAAY,qBAAqBT;IACxE;IAEA,MAAMY,WAAW;QACb,IAAIR,uBAAuB,SAAS;YAChC,MAAMM,OAAOG,OAAOC,MAAM,CAASjB,oBAAoBkB,KAAK;YAC5D,IAAIL,MAAM;gBACNtC,IAAI4C,QAAQN,MAAMO,UAAU,GAAGC,KAAK,CAACtB;YACzC;QACJ;IACJ;IAEA,MAAMuB,OAAON,OAAOO,OAAO,CAACT,aAAaU,MAAM,CAC3C,CAACC,QAAQ,CAACC,KAAKC,MAAM,GAAM,CAAA;YAAE,GAAGF,MAAM;YAAE,CAACC,IAAI,EAAEC,MAAMC,GAAG,CAAChB;QAAa,CAAA,GACtE,CAAC;IAGL,MAAMiB,cAActB,uBAAuB,aAAa,CAAC,SAAS,EAAER,MAAM,GAAGA;IAE7E,OAAO;QACHD;QACAiB;QACAe,wBAAwBjD,0BAA0BiB,aAAaM;QAC/D2B,4BAA4BjD,8BAA8BgB;QAC1DkC,qCAAqCpD,uCACjCkB,aACAT;QAEJiB;QACAC;QACAe;QACAW,cAAcJ;QACdK,SAASxC,SAASwC,OAAO;IAC7B;AACJ"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-cache-setting.d.ts","sourceRoot":"","sources":["../../src/utils/get-cache-setting.ts"],"names":[],"mappings":"AAEA,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,0BAE1C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utils/get-cache-setting.ts"],"sourcesContent":["import { isVersionedUrl } from './is-versioned-url';\n\nexport function getCacheSetting(url: string) {\n return isVersionedUrl(url) ? undefined : 'no-store';\n}\n"],"names":["isVersionedUrl","getCacheSetting","url","undefined"],"mappings":"AAAA,SAASA,cAAc,QAAQ,qBAAqB;AAEpD,OAAO,SAASC,gBAAgBC,GAAW;IACvC,OAAOF,eAAeE,OAAOC,YAAY;AAC7C"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { GetJsonError } from '../common';
|
|
2
|
+
import type { Metadata } from '../types';
|
|
3
|
+
interface GetMetadataProps {
|
|
4
|
+
fallbackPackageUrl?: string;
|
|
5
|
+
mainPackageUrl: string;
|
|
6
|
+
onRequestError?: (error: GetJsonError) => void;
|
|
7
|
+
signal?: AbortSignal;
|
|
8
|
+
retries?: number;
|
|
9
|
+
}
|
|
10
|
+
export declare function getCachedMetadata(props: GetMetadataProps & {
|
|
11
|
+
cache: boolean | number;
|
|
12
|
+
}): Promise<{
|
|
13
|
+
data: Metadata;
|
|
14
|
+
headers: Headers;
|
|
15
|
+
url: string;
|
|
16
|
+
}>;
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=get-cached-metadata.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-cached-metadata.d.ts","sourceRoot":"","sources":["../../src/utils/get-cached-metadata.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,YAAY,EAAE,MAAM,WAAW,CAAC;AAClD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAWzC,UAAU,gBAAgB;IACtB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;IAC/C,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AA0BD,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,gBAAgB,GAAG;IAAE,KAAK,EAAE,OAAO,GAAG,MAAM,CAAA;CAAE;;;;GA2B5F"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { getJson } from '../common';
|
|
2
|
+
import { getCacheSetting } from './get-cache-setting';
|
|
3
|
+
import { getMFEHasUniqueChunkNamespace } from './get-mfe-has-unique-chunk-namespace';
|
|
4
|
+
import { TtlCache } from './ttl-cache';
|
|
5
|
+
const MINUTE = 1000 * 60;
|
|
6
|
+
const metadataResponseCache = new TtlCache({
|
|
7
|
+
ttlMs: 15 * MINUTE
|
|
8
|
+
});
|
|
9
|
+
async function getMetadata(props) {
|
|
10
|
+
const { fallbackPackageUrl, mainPackageUrl, onRequestError, retries, signal } = props;
|
|
11
|
+
try {
|
|
12
|
+
return await getJson(`${mainPackageUrl}/dist/metadata.json`, {
|
|
13
|
+
cache: getCacheSetting(mainPackageUrl),
|
|
14
|
+
retries: fallbackPackageUrl ? 0 : retries,
|
|
15
|
+
onRequestError,
|
|
16
|
+
signal
|
|
17
|
+
});
|
|
18
|
+
} catch (e) {
|
|
19
|
+
if (!fallbackPackageUrl) {
|
|
20
|
+
throw e;
|
|
21
|
+
}
|
|
22
|
+
return getJson(`${fallbackPackageUrl}/dist/metadata.json`, {
|
|
23
|
+
retries,
|
|
24
|
+
onRequestError,
|
|
25
|
+
cache: getCacheSetting(fallbackPackageUrl),
|
|
26
|
+
signal
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
export async function getCachedMetadata(props) {
|
|
31
|
+
let cache = props.cache;
|
|
32
|
+
const cacheKey = props.mainPackageUrl;
|
|
33
|
+
let metadataResponse = cache ? metadataResponseCache.get(cacheKey) : undefined;
|
|
34
|
+
if (!metadataResponse) {
|
|
35
|
+
metadataResponse = await getMetadata(props);
|
|
36
|
+
const mfeHasUniqueChunkNamespace = getMFEHasUniqueChunkNamespace(metadataResponse.data.bundledWith);
|
|
37
|
+
if (cache === true && !mfeHasUniqueChunkNamespace) {
|
|
38
|
+
cache = -1;
|
|
39
|
+
}
|
|
40
|
+
if (cache) {
|
|
41
|
+
metadataResponseCache.set(cacheKey, metadataResponse, typeof cache === 'number' ? cache : undefined);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return metadataResponse;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
//# sourceMappingURL=get-cached-metadata.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utils/get-cached-metadata.ts"],"sourcesContent":["import { getJson, GetJsonError } from '../common';\nimport type { Metadata } from '../types';\nimport { getCacheSetting } from './get-cache-setting';\nimport { getMFEHasUniqueChunkNamespace } from './get-mfe-has-unique-chunk-namespace';\nimport { TtlCache } from './ttl-cache';\n\nconst MINUTE = 1000 * 60;\n\nconst metadataResponseCache = new TtlCache<Awaited<ReturnType<typeof getMetadata>>>({\n ttlMs: 15 * MINUTE,\n});\n\ninterface GetMetadataProps {\n fallbackPackageUrl?: string;\n mainPackageUrl: string;\n onRequestError?: (error: GetJsonError) => void;\n signal?: AbortSignal;\n retries?: number;\n}\n\nasync function getMetadata(props: GetMetadataProps) {\n const { fallbackPackageUrl, mainPackageUrl, onRequestError, retries, signal } = props;\n\n try {\n return await getJson<Metadata>(`${mainPackageUrl}/dist/metadata.json`, {\n cache: getCacheSetting(mainPackageUrl),\n retries: fallbackPackageUrl ? 0 : retries,\n onRequestError,\n signal,\n });\n } catch (e) {\n if (!fallbackPackageUrl) {\n throw e;\n }\n\n return getJson<Metadata>(`${fallbackPackageUrl}/dist/metadata.json`, {\n retries,\n onRequestError,\n cache: getCacheSetting(fallbackPackageUrl),\n signal,\n });\n }\n}\n\nexport async function getCachedMetadata(props: GetMetadataProps & { cache: boolean | number }) {\n let cache = props.cache;\n const cacheKey = props.mainPackageUrl;\n\n let metadataResponse = cache ? metadataResponseCache.get(cacheKey) : undefined;\n\n if (!metadataResponse) {\n metadataResponse = await getMetadata(props);\n\n const mfeHasUniqueChunkNamespace = getMFEHasUniqueChunkNamespace(\n metadataResponse.data.bundledWith\n );\n\n if (cache === true && !mfeHasUniqueChunkNamespace) {\n cache = -1;\n }\n\n if (cache) {\n metadataResponseCache.set(\n cacheKey,\n metadataResponse,\n typeof cache === 'number' ? cache : undefined\n );\n }\n }\n\n return metadataResponse;\n}\n"],"names":["getJson","getCacheSetting","getMFEHasUniqueChunkNamespace","TtlCache","MINUTE","metadataResponseCache","ttlMs","getMetadata","props","fallbackPackageUrl","mainPackageUrl","onRequestError","retries","signal","cache","e","getCachedMetadata","cacheKey","metadataResponse","get","undefined","mfeHasUniqueChunkNamespace","data","bundledWith","set"],"mappings":"AAAA,SAASA,OAAO,QAAsB,YAAY;AAElD,SAASC,eAAe,QAAQ,sBAAsB;AACtD,SAASC,6BAA6B,QAAQ,uCAAuC;AACrF,SAASC,QAAQ,QAAQ,cAAc;AAEvC,MAAMC,SAAS,OAAO;AAEtB,MAAMC,wBAAwB,IAAIF,SAAkD;IAChFG,OAAO,KAAKF;AAChB;AAUA,eAAeG,YAAYC,KAAuB;IAC9C,MAAM,EAAEC,kBAAkB,EAAEC,cAAc,EAAEC,cAAc,EAAEC,OAAO,EAAEC,MAAM,EAAE,GAAGL;IAEhF,IAAI;QACA,OAAO,MAAMR,QAAkB,GAAGU,eAAe,mBAAmB,CAAC,EAAE;YACnEI,OAAOb,gBAAgBS;YACvBE,SAASH,qBAAqB,IAAIG;YAClCD;YACAE;QACJ;IACJ,EAAE,OAAOE,GAAG;QACR,IAAI,CAACN,oBAAoB;YACrB,MAAMM;QACV;QAEA,OAAOf,QAAkB,GAAGS,mBAAmB,mBAAmB,CAAC,EAAE;YACjEG;YACAD;YACAG,OAAOb,gBAAgBQ;YACvBI;QACJ;IACJ;AACJ;AAEA,OAAO,eAAeG,kBAAkBR,KAAqD;IACzF,IAAIM,QAAQN,MAAMM,KAAK;IACvB,MAAMG,WAAWT,MAAME,cAAc;IAErC,IAAIQ,mBAAmBJ,QAAQT,sBAAsBc,GAAG,CAACF,YAAYG;IAErE,IAAI,CAACF,kBAAkB;QACnBA,mBAAmB,MAAMX,YAAYC;QAErC,MAAMa,6BAA6BnB,8BAC/BgB,iBAAiBI,IAAI,CAACC,WAAW;QAGrC,IAAIT,UAAU,QAAQ,CAACO,4BAA4B;YAC/CP,QAAQ,CAAC;QACb;QAEA,IAAIA,OAAO;YACPT,sBAAsBmB,GAAG,CACrBP,UACAC,kBACA,OAAOJ,UAAU,WAAWA,QAAQM;QAE5C;IACJ;IAEA,OAAOF;AACX"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ExposedInstanceDependencies } from '../common';
|
|
2
|
-
import { Metadata } from '
|
|
2
|
+
import type { Metadata } from '../types';
|
|
3
3
|
/**
|
|
4
4
|
* @param bundledWith THe MFE's metadata.bundledWith.
|
|
5
5
|
* @param exposedInstanceDependencies The hosts's EXPOSED_INSTANCE_DEPENDENCIES, if any.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-mfe-has-compatible-launchdarkly-version.d.ts","sourceRoot":"","sources":["../../src/utils/get-mfe-has-compatible-launchdarkly-version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,MAAM,WAAW,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"get-mfe-has-compatible-launchdarkly-version.d.ts","sourceRoot":"","sources":["../../src/utils/get-mfe-has-compatible-launchdarkly-version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,MAAM,WAAW,CAAC;AACxD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC;;;;;;GAMG;AACH,wBAAgB,sCAAsC,CAClD,WAAW,EAAE,QAAQ,CAAC,aAAa,CAAC,EACpC,2BAA2B,EAAE,2BAA2B,uBAO3D"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utils/get-mfe-has-compatible-launchdarkly-version.ts"],"sourcesContent":["import { ExposedInstanceDependencies } from '../common';\nimport { Metadata } from '
|
|
1
|
+
{"version":3,"sources":["../../src/utils/get-mfe-has-compatible-launchdarkly-version.ts"],"sourcesContent":["import { ExposedInstanceDependencies } from '../common';\nimport type { Metadata } from '../types';\n\n/**\n * @param bundledWith THe MFE's metadata.bundledWith.\n * @param exposedInstanceDependencies The hosts's EXPOSED_INSTANCE_DEPENDENCIES, if any.\n * @returns Returns true when host and MFE use compatible version of LaunchDarkly\n * and returns false when host and MGE use incompatible version.\n * Returns undefined when either the host or MFE doesn't expose LaunchDarkly.\n */\nexport function getMFEHasCompatibleLaunchDarklyVersion(\n bundledWith: Metadata['bundledWith'],\n exposedInstanceDependencies: ExposedInstanceDependencies\n) {\n const mfeVersion = bundledWith?.['launchdarkly-js-client-sdk'];\n const hostVersion = exposedInstanceDependencies.launchDarkly?.version;\n if (hostVersion && mfeVersion) {\n return hostVersion === mfeVersion;\n }\n}\n"],"names":["getMFEHasCompatibleLaunchDarklyVersion","bundledWith","exposedInstanceDependencies","mfeVersion","hostVersion","launchDarkly","version"],"mappings":"AAGA;;;;;;CAMC,GACD,OAAO,SAASA,uCACZC,WAAoC,EACpCC,2BAAwD;QAGpCA;IADpB,MAAMC,aAAaF,wBAAAA,kCAAAA,WAAa,CAAC,6BAA6B;IAC9D,MAAMG,eAAcF,4CAAAA,4BAA4BG,YAAY,cAAxCH,gEAAAA,0CAA0CI,OAAO;IACrE,IAAIF,eAAeD,YAAY;QAC3B,OAAOC,gBAAgBD;IAC3B;AACJ"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-mfe-has-unique-chunk-namespace.d.ts","sourceRoot":"","sources":["../../src/utils/get-mfe-has-unique-chunk-namespace.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"get-mfe-has-unique-chunk-namespace.d.ts","sourceRoot":"","sources":["../../src/utils/get-mfe-has-unique-chunk-namespace.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAGzC,wBAAgB,6BAA6B,CAAC,WAAW,EAAE,QAAQ,CAAC,aAAa,CAAC,WAEjF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utils/get-mfe-has-unique-chunk-namespace.ts"],"sourcesContent":["import semver from 'semver';\nimport { Metadata } from '
|
|
1
|
+
{"version":3,"sources":["../../src/utils/get-mfe-has-unique-chunk-namespace.ts"],"sourcesContent":["import semver from 'semver';\nimport type { Metadata } from '../types';\n\n// Check if the MFE loads it's chunks into a unique global chunk namespace\nexport function getMFEHasUniqueChunkNamespace(bundledWith: Metadata['bundledWith']) {\n return !!isSupportedVersion(bundledWith?.['@servicetitan/startup']);\n}\n\nfunction isSupportedVersion(version?: string) {\n const minVersion = version && semver.minVersion(version);\n if (minVersion) {\n return semver.gte(minVersion, '27.2.0');\n }\n}\n"],"names":["semver","getMFEHasUniqueChunkNamespace","bundledWith","isSupportedVersion","version","minVersion","gte"],"mappings":"AAAA,OAAOA,YAAY,SAAS;AAG5B,0EAA0E;AAC1E,OAAO,SAASC,8BAA8BC,WAAoC;IAC9E,OAAO,CAAC,CAACC,mBAAmBD,wBAAAA,kCAAAA,WAAa,CAAC,wBAAwB;AACtE;AAEA,SAASC,mBAAmBC,OAAgB;IACxC,MAAMC,aAAaD,WAAWJ,OAAOK,UAAU,CAACD;IAChD,IAAIC,YAAY;QACZ,OAAOL,OAAOM,GAAG,CAACD,YAAY;IAClC;AACJ"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { Metadata } from '
|
|
1
|
+
import type { Metadata } from '../types';
|
|
2
2
|
export declare function getMFESupportsRerendering(bundledWith: Metadata['bundledWith'], dependencies: Metadata['dependencies']): boolean;
|
|
3
3
|
//# sourceMappingURL=get-mfe-supports-rerendering.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-mfe-supports-rerendering.d.ts","sourceRoot":"","sources":["../../src/utils/get-mfe-supports-rerendering.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"get-mfe-supports-rerendering.d.ts","sourceRoot":"","sources":["../../src/utils/get-mfe-supports-rerendering.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAYzC,wBAAgB,yBAAyB,CACrC,WAAW,EAAE,QAAQ,CAAC,aAAa,CAAC,EACpC,YAAY,EAAE,QAAQ,CAAC,cAAc,CAAC,WAOzC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utils/get-mfe-supports-rerendering.ts"],"sourcesContent":["import semver from 'semver';\nimport { Metadata } from '
|
|
1
|
+
{"version":3,"sources":["../../src/utils/get-mfe-supports-rerendering.ts"],"sourcesContent":["import semver from 'semver';\nimport type { Metadata } from '../types';\n\n/*\n * Check if the MFE supports re-rendering itself when data changes\n *\n * `bundledWith.@servicetitan/web-components` is checked first, as that guarantees support\n * `dependencies.@servicetitan/web-components` is checked second, in the case of the MFE's startup\n * hasn't been updated to add web-components to bundledWith yet, and the MFE's web-component\n * dependency is set in it's own package's package.json instead of the monorepo's root package.json\n * `bundledWith.@servicetitan/startup` is checked third, with the hope that the startup version\n * matches web-components\n */\nexport function getMFESupportsRerendering(\n bundledWith: Metadata['bundledWith'],\n dependencies: Metadata['dependencies']\n) {\n return !!(\n isSupportedVersion(bundledWith?.['@servicetitan/web-components']) ??\n isSupportedVersion(dependencies?.['@servicetitan/web-components']) ??\n isSupportedVersion(bundledWith?.['@servicetitan/startup'])\n );\n}\n\nfunction isSupportedVersion(version?: string) {\n const minVersion = version && semver.minVersion(version);\n if (minVersion) {\n return semver.gte(minVersion, '22.12.0');\n }\n}\n"],"names":["semver","getMFESupportsRerendering","bundledWith","dependencies","isSupportedVersion","version","minVersion","gte"],"mappings":"AAAA,OAAOA,YAAY,SAAS;AAG5B;;;;;;;;;CASC,GACD,OAAO,SAASC,0BACZC,WAAoC,EACpCC,YAAsC;QAGlCC,qBAAAA;IADJ,OAAO,CAAC,CACJA,CAAAA,CAAAA,OAAAA,CAAAA,sBAAAA,mBAAmBF,wBAAAA,kCAAAA,WAAa,CAAC,+BAA+B,eAAhEE,iCAAAA,sBACAA,mBAAmBD,yBAAAA,mCAAAA,YAAc,CAAC,+BAA+B,eADjEC,kBAAAA,OAEAA,mBAAmBF,wBAAAA,kCAAAA,WAAa,CAAC,wBAAwB,CAAA;AAEjE;AAEA,SAASE,mBAAmBC,OAAgB;IACxC,MAAMC,aAAaD,WAAWL,OAAOM,UAAU,CAACD;IAChD,IAAIC,YAAY;QACZ,OAAON,OAAOO,GAAG,CAACD,YAAY;IAClC;AACJ"}
|
|
@@ -2,5 +2,5 @@ import { ExposedDependencies } from '../common';
|
|
|
2
2
|
export declare const getVersionMismatches: (exposedDependencies: ExposedDependencies, dependencies: Record<string, string>, sharedDependencies: Record<string, string>) => Record<string, {
|
|
3
3
|
host: string;
|
|
4
4
|
package: string;
|
|
5
|
-
}
|
|
5
|
+
}> | undefined;
|
|
6
6
|
//# sourceMappingURL=get-version-mismatches.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-version-mismatches.d.ts","sourceRoot":"","sources":["../../src/utils/get-version-mismatches.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAGhD,eAAO,MAAM,oBAAoB,GAC7B,qBAAqB,mBAAmB,EACxC,cAAc,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACpC,oBAAoB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;UAeT,MAAM;aAAW,MAAM;
|
|
1
|
+
{"version":3,"file":"get-version-mismatches.d.ts","sourceRoot":"","sources":["../../src/utils/get-version-mismatches.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAGhD,eAAO,MAAM,oBAAoB,GAC7B,qBAAqB,mBAAmB,EACxC,cAAc,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACpC,oBAAoB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;UAeT,MAAM;aAAW,MAAM;cAc3D,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utils/get-version-mismatches.ts"],"sourcesContent":["import { ExposedDependencies } from '../common';\nimport { isCompatible } from './is-compatible';\n\nexport const getVersionMismatches = (\n exposedDependencies: ExposedDependencies,\n dependencies: Record<string, string>,\n sharedDependencies: Record<string, string>\n) => {\n const mismatch = Object.entries(exposedDependencies).reduce(\n (result, [dependency, { version: hostVersion }]) => {\n const packageVersion = dependencies[dependency];\n if (\n packageVersion &&\n !!sharedDependencies[dependency] &&\n !isCompatible(hostVersion, packageVersion)\n ) {\n result[dependency] = { host: hostVersion, package: packageVersion };\n }\n\n return result;\n },\n {} as Record<string, { host: string; package: string }>\n );\n\n for (const [dependency, variable] of Object.entries(sharedDependencies)) {\n const packageVersion = dependencies[dependency];\n\n if (!exposedDependencies[dependency]) {\n mismatch[dependency] = { host: 'missing', package: packageVersion };\n } else if (exposedDependencies[dependency].variable !== variable) {\n mismatch[dependency] = { host: 'wrong global variable', package: packageVersion };\n }\n }\n\n return mismatch;\n};\n"],"names":["isCompatible","getVersionMismatches","exposedDependencies","dependencies","sharedDependencies","mismatch","Object","entries","reduce","result","dependency","version","hostVersion","packageVersion","host","package","variable"],"mappings":"AACA,SAASA,YAAY,QAAQ,kBAAkB;AAE/C,OAAO,MAAMC,uBAAuB,CAChCC,qBACAC,cACAC;IAEA,MAAMC,WAAWC,OAAOC,OAAO,CAACL,qBAAqBM,MAAM,CACvD,CAACC,QAAQ,CAACC,YAAY,EAAEC,SAASC,WAAW,EAAE,CAAC;QAC3C,MAAMC,iBAAiBV,YAAY,CAACO,WAAW;QAC/C,IACIG,kBACA,CAAC,CAACT,kBAAkB,CAACM,WAAW,IAChC,CAACV,aAAaY,aAAaC,iBAC7B;YACEJ,MAAM,CAACC,WAAW,GAAG;gBAAEI,MAAMF;gBAAaG,SAASF;YAAe;QACtE;QAEA,OAAOJ;IACX,GACA,CAAC;IAGL,KAAK,MAAM,CAACC,YAAYM,SAAS,IAAIV,OAAOC,OAAO,CAACH,oBAAqB;QACrE,MAAMS,iBAAiBV,YAAY,CAACO,WAAW;QAE/C,IAAI,CAACR,mBAAmB,CAACQ,WAAW,EAAE;YAClCL,QAAQ,CAACK,WAAW,GAAG;gBAAEI,MAAM;gBAAWC,SAASF;YAAe;QACtE,OAAO,IAAIX,mBAAmB,CAACQ,WAAW,CAACM,QAAQ,KAAKA,UAAU;YAC9DX,QAAQ,CAACK,WAAW,GAAG;gBAAEI,MAAM;gBAAyBC,SAASF;YAAe;QACpF;IACJ;IAEA,
|
|
1
|
+
{"version":3,"sources":["../../src/utils/get-version-mismatches.ts"],"sourcesContent":["import { ExposedDependencies } from '../common';\nimport { isCompatible } from './is-compatible';\n\nexport const getVersionMismatches = (\n exposedDependencies: ExposedDependencies,\n dependencies: Record<string, string>,\n sharedDependencies: Record<string, string>\n) => {\n const mismatch = Object.entries(exposedDependencies).reduce(\n (result, [dependency, { version: hostVersion }]) => {\n const packageVersion = dependencies[dependency];\n if (\n packageVersion &&\n !!sharedDependencies[dependency] &&\n !isCompatible(hostVersion, packageVersion)\n ) {\n result[dependency] = { host: hostVersion, package: packageVersion };\n }\n\n return result;\n },\n {} as Record<string, { host: string; package: string }>\n );\n\n for (const [dependency, variable] of Object.entries(sharedDependencies)) {\n const packageVersion = dependencies[dependency];\n\n if (!exposedDependencies[dependency]) {\n mismatch[dependency] = { host: 'missing', package: packageVersion };\n } else if (exposedDependencies[dependency].variable !== variable) {\n mismatch[dependency] = { host: 'wrong global variable', package: packageVersion };\n }\n }\n\n return Object.keys(mismatch).length ? mismatch : undefined;\n};\n"],"names":["isCompatible","getVersionMismatches","exposedDependencies","dependencies","sharedDependencies","mismatch","Object","entries","reduce","result","dependency","version","hostVersion","packageVersion","host","package","variable","keys","length","undefined"],"mappings":"AACA,SAASA,YAAY,QAAQ,kBAAkB;AAE/C,OAAO,MAAMC,uBAAuB,CAChCC,qBACAC,cACAC;IAEA,MAAMC,WAAWC,OAAOC,OAAO,CAACL,qBAAqBM,MAAM,CACvD,CAACC,QAAQ,CAACC,YAAY,EAAEC,SAASC,WAAW,EAAE,CAAC;QAC3C,MAAMC,iBAAiBV,YAAY,CAACO,WAAW;QAC/C,IACIG,kBACA,CAAC,CAACT,kBAAkB,CAACM,WAAW,IAChC,CAACV,aAAaY,aAAaC,iBAC7B;YACEJ,MAAM,CAACC,WAAW,GAAG;gBAAEI,MAAMF;gBAAaG,SAASF;YAAe;QACtE;QAEA,OAAOJ;IACX,GACA,CAAC;IAGL,KAAK,MAAM,CAACC,YAAYM,SAAS,IAAIV,OAAOC,OAAO,CAACH,oBAAqB;QACrE,MAAMS,iBAAiBV,YAAY,CAACO,WAAW;QAE/C,IAAI,CAACR,mBAAmB,CAACQ,WAAW,EAAE;YAClCL,QAAQ,CAACK,WAAW,GAAG;gBAAEI,MAAM;gBAAWC,SAASF;YAAe;QACtE,OAAO,IAAIX,mBAAmB,CAACQ,WAAW,CAACM,QAAQ,KAAKA,UAAU;YAC9DX,QAAQ,CAACK,WAAW,GAAG;gBAAEI,MAAM;gBAAyBC,SAASF;YAAe;QACpF;IACJ;IAEA,OAAOP,OAAOW,IAAI,CAACZ,UAAUa,MAAM,GAAGb,WAAWc;AACrD,EAAE"}
|
|
@@ -13,6 +13,6 @@ interface WebComponentProps {
|
|
|
13
13
|
ldService?: LDService;
|
|
14
14
|
logService?: Log;
|
|
15
15
|
}
|
|
16
|
-
export declare function webComponent(props: WebComponentProps): ({ LoadingFallback, ...
|
|
16
|
+
export declare function webComponent(props: WebComponentProps): ({ LoadingFallback, ...innerProps }: LoaderDataProps) => import("react/jsx-runtime").JSX.Element;
|
|
17
17
|
export {};
|
|
18
18
|
//# sourceMappingURL=web-component.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web-component.d.ts","sourceRoot":"","sources":["../../src/utils/web-component.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,MAAM,2BAA2B,CAAC;AAChD,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,oCAAoC,CAAC;AAGpE,OAAO,EAAE,mBAAmB,EAAE,2BAA2B,EAAiB,MAAM,WAAW,CAAC;AAE5F,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAG/C,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAE5C,UAAU,iBAAiB;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,UAAU,CAAC;IACvB,QAAQ,EAAE,QAAQ,CAAC;IACnB,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;IAC1C,2BAA2B,CAAC,EAAE,2BAA2B,CAAC;IAC1D,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,UAAU,CAAC,EAAE,GAAG,CAAC;CACpB;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,
|
|
1
|
+
{"version":3,"file":"web-component.d.ts","sourceRoot":"","sources":["../../src/utils/web-component.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,MAAM,2BAA2B,CAAC;AAChD,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,oCAAoC,CAAC;AAGpE,OAAO,EAAE,mBAAmB,EAAE,2BAA2B,EAAiB,MAAM,WAAW,CAAC;AAE5F,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAG/C,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAE5C,UAAU,iBAAiB;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,UAAU,CAAC;IACvB,QAAQ,EAAE,QAAQ,CAAC;IACnB,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;IAC1C,2BAA2B,CAAC,EAAE,2BAA2B,CAAC;IAC1D,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,UAAU,CAAC,EAAE,GAAG,CAAC;CACpB;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,IAWzC,oCAAoC,eAAe,6CAyD9D"}
|
|
@@ -6,10 +6,10 @@ import { HistoryManager } from '../history-manager';
|
|
|
6
6
|
export function webComponent(props) {
|
|
7
7
|
var _bundleInfo_bundledWith;
|
|
8
8
|
const { basename, bundleInfo, eventBus, exposedDependencies, ldService, logService } = props;
|
|
9
|
-
const { WebComponent, disposer, mfeSupportsRerendering, version } = bundleInfo;
|
|
9
|
+
const { WebComponent, resolvedBundleType, disposer, mfeSupportsRerendering, version } = bundleInfo;
|
|
10
10
|
const elementName = getElementName(bundleInfo);
|
|
11
11
|
const exposedInstanceDependencies = ensureLDVersion(props.exposedInstanceDependencies, (_bundleInfo_bundledWith = bundleInfo.bundledWith) === null || _bundleInfo_bundledWith === void 0 ? void 0 : _bundleInfo_bundledWith['launchdarkly-js-client-sdk']);
|
|
12
|
-
return ({ LoadingFallback, ...
|
|
12
|
+
return ({ LoadingFallback, ...innerProps })=>{
|
|
13
13
|
const [isLoading, setIsLoading] = useState(true);
|
|
14
14
|
const [historyManager] = useOptionalDependencies(HistoryManager);
|
|
15
15
|
const handleRef = (webComponent)=>{
|
|
@@ -30,8 +30,8 @@ export function webComponent(props) {
|
|
|
30
30
|
});
|
|
31
31
|
};
|
|
32
32
|
// Stringify data object so that it can be passed as a data-attribute
|
|
33
|
-
const stringifiedData = useMemo(()=>JSON.stringify(
|
|
34
|
-
|
|
33
|
+
const stringifiedData = useMemo(()=>JSON.stringify(innerProps.data), [
|
|
34
|
+
innerProps.data
|
|
35
35
|
]);
|
|
36
36
|
/*
|
|
37
37
|
* Set key for rendering the web component so that if the data from the Host change,
|
|
@@ -39,17 +39,16 @@ export function webComponent(props) {
|
|
|
39
39
|
* the web component will be re-mounted whenever the data changes.
|
|
40
40
|
* This is only used as a fallback when the MFE's version is older.
|
|
41
41
|
*/ const key = mfeSupportsRerendering ? undefined : stringifiedData;
|
|
42
|
-
const dataAttrs = useMemo(()=>composeDataAttributes(
|
|
43
|
-
|
|
42
|
+
const dataAttrs = useMemo(()=>composeDataAttributes(innerProps.data), [
|
|
43
|
+
innerProps.data
|
|
44
44
|
]);
|
|
45
45
|
const styleUrls = getStyleUrls(bundleInfo);
|
|
46
46
|
return /*#__PURE__*/ _jsxs(Fragment, {
|
|
47
47
|
children: [
|
|
48
48
|
isLoading && /*#__PURE__*/ _jsx(LoadingFallback, {}),
|
|
49
49
|
/*#__PURE__*/ _jsx(WebComponent, {
|
|
50
|
-
// @ts-expect-error because property ref does not exist on IntrinsicAttributes
|
|
51
50
|
ref: handleRef,
|
|
52
|
-
class:
|
|
51
|
+
class: innerProps.className,
|
|
53
52
|
...styleUrls && {
|
|
54
53
|
'style-urls': styleUrls
|
|
55
54
|
},
|
|
@@ -58,7 +57,11 @@ export function webComponent(props) {
|
|
|
58
57
|
"data-mfe-name": elementName,
|
|
59
58
|
...version && {
|
|
60
59
|
'data-mfe-version': version
|
|
61
|
-
}
|
|
60
|
+
},
|
|
61
|
+
// @ts-expect-error style exists on HTMLElement
|
|
62
|
+
style: resolvedBundleType === 'headless' ? {
|
|
63
|
+
display: 'none'
|
|
64
|
+
} : undefined
|
|
62
65
|
}, key)
|
|
63
66
|
]
|
|
64
67
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utils/web-component.tsx"],"sourcesContent":["import { Fragment, useMemo, useState } from 'react';\nimport { Log } from '@servicetitan/log-service';\nimport { type LDService } from '@servicetitan/launchdarkly-service';\nimport { useOptionalDependencies } from '@servicetitan/react-ioc';\n\nimport { ExposedDependencies, ExposedInstanceDependencies, IWebComponent } from '../common';\nimport { MFEContextData } from '../contexts/mfe-data-context';\nimport { EventBus } from '../event-bus';\nimport { BundleInfo } from './get-bundle-info';\nimport { getElementName } from './get-element-name';\nimport { HistoryManager } from '../history-manager';\nimport { LoaderDataProps } from '../loader';\n\ninterface WebComponentProps {\n basename?: string;\n bundleInfo: BundleInfo;\n eventBus: EventBus;\n exposedDependencies?: ExposedDependencies;\n exposedInstanceDependencies?: ExposedInstanceDependencies;\n ldService?: LDService;\n logService?: Log;\n}\n\nexport function webComponent(props: WebComponentProps) {\n const { basename, bundleInfo, eventBus, exposedDependencies, ldService, logService } = props;\n const { WebComponent, disposer, mfeSupportsRerendering, version }
|
|
1
|
+
{"version":3,"sources":["../../src/utils/web-component.tsx"],"sourcesContent":["import { Fragment, useMemo, useState } from 'react';\nimport { Log } from '@servicetitan/log-service';\nimport { type LDService } from '@servicetitan/launchdarkly-service';\nimport { useOptionalDependencies } from '@servicetitan/react-ioc';\n\nimport { ExposedDependencies, ExposedInstanceDependencies, IWebComponent } from '../common';\nimport { MFEContextData } from '../contexts/mfe-data-context';\nimport { EventBus } from '../event-bus';\nimport { BundleInfo } from './get-bundle-info';\nimport { getElementName } from './get-element-name';\nimport { HistoryManager } from '../history-manager';\nimport { LoaderDataProps } from '../loader';\n\ninterface WebComponentProps {\n basename?: string;\n bundleInfo: BundleInfo;\n eventBus: EventBus;\n exposedDependencies?: ExposedDependencies;\n exposedInstanceDependencies?: ExposedInstanceDependencies;\n ldService?: LDService;\n logService?: Log;\n}\n\nexport function webComponent(props: WebComponentProps) {\n const { basename, bundleInfo, eventBus, exposedDependencies, ldService, logService } = props;\n const { WebComponent, resolvedBundleType, disposer, mfeSupportsRerendering, version } =\n bundleInfo;\n const elementName = getElementName(bundleInfo);\n\n const exposedInstanceDependencies = ensureLDVersion(\n props.exposedInstanceDependencies,\n bundleInfo.bundledWith?.['launchdarkly-js-client-sdk']\n );\n\n return ({ LoadingFallback, ...innerProps }: LoaderDataProps) => {\n const [isLoading, setIsLoading] = useState(true);\n const [historyManager] = useOptionalDependencies(HistoryManager);\n\n const handleRef = (webComponent: IWebComponent | null) => {\n webComponent?.provide({\n ldService,\n logService,\n historyManager,\n exposedDependencies,\n exposedInstanceDependencies,\n eventBus,\n basename,\n onReady: () => {\n setIsLoading(false);\n },\n onDispose: () => {\n disposer();\n },\n });\n };\n\n // Stringify data object so that it can be passed as a data-attribute\n const stringifiedData = useMemo(() => JSON.stringify(innerProps.data), [innerProps.data]);\n\n /*\n * Set key for rendering the web component so that if the data from the Host change,\n * and the MFE's version of startup doesn't support watching for data changes, then\n * the web component will be re-mounted whenever the data changes.\n * This is only used as a fallback when the MFE's version is older.\n */\n const key = mfeSupportsRerendering ? undefined : stringifiedData;\n const dataAttrs = useMemo(() => composeDataAttributes(innerProps.data), [innerProps.data]);\n const styleUrls = getStyleUrls(bundleInfo);\n\n return (\n <Fragment>\n {isLoading && <LoadingFallback />}\n <WebComponent\n key={key}\n ref={handleRef}\n class={innerProps.className}\n {...(styleUrls && { 'style-urls': styleUrls })}\n /*\n * Continue to spread data as separate data attributes for backwards compatibility,\n * in case the Host has updated web-components, but the MFE has not\n */\n {...dataAttrs}\n data-mfe-data={stringifiedData}\n data-mfe-name={elementName}\n {...(version && { 'data-mfe-version': version })}\n // @ts-expect-error style exists on HTMLElement\n style={resolvedBundleType === 'headless' ? { display: 'none' } : undefined}\n />\n </Fragment>\n );\n };\n}\n\n/*\n * Convert camelCase data props to kebab-case data attributes, prepended with data-\n * Ex: fooBar -> data-foo-bar\n */\nfunction composeDataAttributes(data: MFEContextData<{}> | undefined = {}) {\n return Object.fromEntries(\n Object.entries(data).map(([key, value]) => [\n 'data-' + key.replace(/[A-Z]/g, letter => '-' + letter.toLowerCase()),\n value,\n ])\n );\n}\n\nfunction ensureLDVersion(\n exposedInstanceDependencies: ExposedInstanceDependencies = {},\n version?: string\n) {\n if (version && !exposedInstanceDependencies.launchDarkly?.ldService) {\n return { ...exposedInstanceDependencies, launchDarkly: { version } };\n }\n return exposedInstanceDependencies;\n}\n\nfunction getStyleUrls({ urls }: Pick<BundleInfo, 'urls'>) {\n if (urls.css.length) {\n return encodeURIComponent(JSON.stringify(urls.css));\n }\n}\n"],"names":["Fragment","useMemo","useState","useOptionalDependencies","getElementName","HistoryManager","webComponent","props","bundleInfo","basename","eventBus","exposedDependencies","ldService","logService","WebComponent","resolvedBundleType","disposer","mfeSupportsRerendering","version","elementName","exposedInstanceDependencies","ensureLDVersion","bundledWith","LoadingFallback","innerProps","isLoading","setIsLoading","historyManager","handleRef","provide","onReady","onDispose","stringifiedData","JSON","stringify","data","key","undefined","dataAttrs","composeDataAttributes","styleUrls","getStyleUrls","ref","class","className","data-mfe-data","data-mfe-name","style","display","Object","fromEntries","entries","map","value","replace","letter","toLowerCase","launchDarkly","urls","css","length","encodeURIComponent"],"mappings":";AAAA,SAASA,QAAQ,EAAEC,OAAO,EAAEC,QAAQ,QAAQ,QAAQ;AAGpD,SAASC,uBAAuB,QAAQ,0BAA0B;AAMlE,SAASC,cAAc,QAAQ,qBAAqB;AACpD,SAASC,cAAc,QAAQ,qBAAqB;AAapD,OAAO,SAASC,aAAaC,KAAwB;QAQ7CC;IAPJ,MAAM,EAAEC,QAAQ,EAAED,UAAU,EAAEE,QAAQ,EAAEC,mBAAmB,EAAEC,SAAS,EAAEC,UAAU,EAAE,GAAGN;IACvF,MAAM,EAAEO,YAAY,EAAEC,kBAAkB,EAAEC,QAAQ,EAAEC,sBAAsB,EAAEC,OAAO,EAAE,GACjFV;IACJ,MAAMW,cAAcf,eAAeI;IAEnC,MAAMY,8BAA8BC,gBAChCd,MAAMa,2BAA2B,GACjCZ,0BAAAA,WAAWc,WAAW,cAAtBd,8CAAAA,uBAAwB,CAAC,6BAA6B;IAG1D,OAAO,CAAC,EAAEe,eAAe,EAAE,GAAGC,YAA6B;QACvD,MAAM,CAACC,WAAWC,aAAa,GAAGxB,SAAS;QAC3C,MAAM,CAACyB,eAAe,GAAGxB,wBAAwBE;QAEjD,MAAMuB,YAAY,CAACtB;YACfA,yBAAAA,mCAAAA,aAAcuB,OAAO,CAAC;gBAClBjB;gBACAC;gBACAc;gBACAhB;gBACAS;gBACAV;gBACAD;gBACAqB,SAAS;oBACLJ,aAAa;gBACjB;gBACAK,WAAW;oBACPf;gBACJ;YACJ;QACJ;QAEA,qEAAqE;QACrE,MAAMgB,kBAAkB/B,QAAQ,IAAMgC,KAAKC,SAAS,CAACV,WAAWW,IAAI,GAAG;YAACX,WAAWW,IAAI;SAAC;QAExF;;;;;SAKC,GACD,MAAMC,MAAMnB,yBAAyBoB,YAAYL;QACjD,MAAMM,YAAYrC,QAAQ,IAAMsC,sBAAsBf,WAAWW,IAAI,GAAG;YAACX,WAAWW,IAAI;SAAC;QACzF,MAAMK,YAAYC,aAAajC;QAE/B,qBACI,MAACR;;gBACIyB,2BAAa,KAACF;8BACf,KAACT;oBAEG4B,KAAKd;oBACLe,OAAOnB,WAAWoB,SAAS;oBAC1B,GAAIJ,aAAa;wBAAE,cAAcA;oBAAU,CAAC;oBAK5C,GAAGF,SAAS;oBACbO,iBAAeb;oBACfc,iBAAe3B;oBACd,GAAID,WAAW;wBAAE,oBAAoBA;oBAAQ,CAAC;oBAC/C,+CAA+C;oBAC/C6B,OAAOhC,uBAAuB,aAAa;wBAAEiC,SAAS;oBAAO,IAAIX;mBAb5DD;;;IAiBrB;AACJ;AAEA;;;CAGC,GACD,SAASG,sBAAsBJ,OAAuC,CAAC,CAAC;IACpE,OAAOc,OAAOC,WAAW,CACrBD,OAAOE,OAAO,CAAChB,MAAMiB,GAAG,CAAC,CAAC,CAAChB,KAAKiB,MAAM,GAAK;YACvC,UAAUjB,IAAIkB,OAAO,CAAC,UAAUC,CAAAA,SAAU,MAAMA,OAAOC,WAAW;YAClEH;SACH;AAET;AAEA,SAAShC,gBACLD,8BAA2D,CAAC,CAAC,EAC7DF,OAAgB;QAEAE;IAAhB,IAAIF,WAAW,GAACE,4CAAAA,4BAA4BqC,YAAY,cAAxCrC,gEAAAA,0CAA0CR,SAAS,GAAE;QACjE,OAAO;YAAE,GAAGQ,2BAA2B;YAAEqC,cAAc;gBAAEvC;YAAQ;QAAE;IACvE;IACA,OAAOE;AACX;AAEA,SAASqB,aAAa,EAAEiB,IAAI,EAA4B;IACpD,IAAIA,KAAKC,GAAG,CAACC,MAAM,EAAE;QACjB,OAAOC,mBAAmB5B,KAAKC,SAAS,CAACwB,KAAKC,GAAG;IACrD;AACJ"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@servicetitan/web-components",
|
|
3
|
-
"version": "31.
|
|
3
|
+
"version": "31.2.0",
|
|
4
4
|
"description": "",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -15,17 +15,17 @@
|
|
|
15
15
|
"src"
|
|
16
16
|
],
|
|
17
17
|
"dependencies": {
|
|
18
|
-
"@servicetitan/error-boundary": "31.
|
|
18
|
+
"@servicetitan/error-boundary": "31.2.0",
|
|
19
19
|
"lodash.get": "~4.4.2",
|
|
20
20
|
"mitt": "~3.0.1",
|
|
21
21
|
"semver": "~7.7.2"
|
|
22
22
|
},
|
|
23
23
|
"devDependencies": {
|
|
24
|
-
"@servicetitan/anvil2": "^1.
|
|
24
|
+
"@servicetitan/anvil2": "^1.39.0",
|
|
25
25
|
"@servicetitan/design-system": "~14.5.3",
|
|
26
|
-
"@servicetitan/launchdarkly-service": "31.
|
|
27
|
-
"@servicetitan/log-service": "31.
|
|
28
|
-
"@servicetitan/react-ioc": "31.
|
|
26
|
+
"@servicetitan/launchdarkly-service": "31.2.0",
|
|
27
|
+
"@servicetitan/log-service": "31.2.0",
|
|
28
|
+
"@servicetitan/react-ioc": "31.2.0",
|
|
29
29
|
"@testing-library/dom": "^10.4.0",
|
|
30
30
|
"@testing-library/jest-dom": "^6.6.3",
|
|
31
31
|
"@testing-library/react": "^16.3.0",
|
|
@@ -35,17 +35,17 @@
|
|
|
35
35
|
"@types/react-dom": "~18.3.0",
|
|
36
36
|
"@types/semver": "~7.7.0",
|
|
37
37
|
"history": "~4.10.1",
|
|
38
|
-
"launchdarkly-react-client-sdk": "
|
|
38
|
+
"launchdarkly-react-client-sdk": "3.6.1",
|
|
39
39
|
"react": "~18.3.1",
|
|
40
40
|
"react-dom": "~18.3.1",
|
|
41
41
|
"shadow-dom-testing-library": "^1.12.0"
|
|
42
42
|
},
|
|
43
43
|
"peerDependencies": {
|
|
44
|
-
"@servicetitan/anvil2": ">=1.
|
|
44
|
+
"@servicetitan/anvil2": ">=1.39.0",
|
|
45
45
|
"@servicetitan/design-system": ">=14.5.3",
|
|
46
|
-
"@servicetitan/launchdarkly-service": "31.
|
|
47
|
-
"@servicetitan/log-service": "31.
|
|
48
|
-
"@servicetitan/react-ioc": "31.
|
|
46
|
+
"@servicetitan/launchdarkly-service": "31.2.0",
|
|
47
|
+
"@servicetitan/log-service": "31.2.0",
|
|
48
|
+
"@servicetitan/react-ioc": "31.2.0",
|
|
49
49
|
"history": "~4.10.1",
|
|
50
50
|
"react": ">=17.0.2",
|
|
51
51
|
"react-dom": ">=17.0.2"
|
|
@@ -67,5 +67,5 @@
|
|
|
67
67
|
"cli": {
|
|
68
68
|
"webpack": false
|
|
69
69
|
},
|
|
70
|
-
"gitHead": "
|
|
70
|
+
"gitHead": "a12efe0333352598f98e5f8772458c8b8d64aa74"
|
|
71
71
|
}
|