@servicetitan/web-components 31.0.0 → 31.1.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
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { renderHook } from '@testing-library/react';
|
|
3
|
+
import { MFEDataContext, useMFEDataContext } from '../mfe-data-context';
|
|
4
|
+
describe(`[web-components] ${useMFEDataContext.name}`, ()=>{
|
|
5
|
+
const subject = (wrapper)=>renderHook(()=>useMFEDataContext(), {
|
|
6
|
+
wrapper
|
|
7
|
+
});
|
|
8
|
+
describe('when the MFEDataContext is provided by a parent', ()=>{
|
|
9
|
+
const data = {
|
|
10
|
+
foo: 'bar'
|
|
11
|
+
};
|
|
12
|
+
const Wrapper = ({ children })=>{
|
|
13
|
+
return /*#__PURE__*/ _jsx(MFEDataContext.Provider, {
|
|
14
|
+
value: data,
|
|
15
|
+
children: children
|
|
16
|
+
});
|
|
17
|
+
};
|
|
18
|
+
test('returns the context', ()=>{
|
|
19
|
+
expect(subject(Wrapper).result.current).toEqual(data);
|
|
20
|
+
});
|
|
21
|
+
});
|
|
22
|
+
describe('when the MFEDataContext is not provided by a parent', ()=>{
|
|
23
|
+
const Wrapper = ({ children })=>{
|
|
24
|
+
return /*#__PURE__*/ _jsx("div", {
|
|
25
|
+
children: children
|
|
26
|
+
});
|
|
27
|
+
};
|
|
28
|
+
test('returns an empty object', ()=>{
|
|
29
|
+
expect(subject(Wrapper).result.current).toEqual({});
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
//# sourceMappingURL=mfe-data-context.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/contexts/tests/mfe-data-context.test.tsx"],"sourcesContent":["import { FC, PropsWithChildren } from 'react';\nimport { renderHook } from '@testing-library/react';\nimport { MFEDataContext, useMFEDataContext } from '../mfe-data-context';\n\ndescribe(`[web-components] ${useMFEDataContext.name}`, () => {\n const subject = (wrapper?: FC) => renderHook(() => useMFEDataContext(), { wrapper });\n\n describe('when the MFEDataContext is provided by a parent', () => {\n const data = { foo: 'bar' };\n const Wrapper: FC<PropsWithChildren> = ({ children }) => {\n return <MFEDataContext.Provider value={data}>{children}</MFEDataContext.Provider>;\n };\n\n test('returns the context', () => {\n expect(subject(Wrapper).result.current).toEqual(data);\n });\n });\n\n describe('when the MFEDataContext is not provided by a parent', () => {\n const Wrapper: FC<PropsWithChildren> = ({ children }) => {\n return <div>{children}</div>;\n };\n\n test('returns an empty object', () => {\n expect(subject(Wrapper).result.current).toEqual({});\n });\n });\n});\n"],"names":["renderHook","MFEDataContext","useMFEDataContext","describe","name","subject","wrapper","data","foo","Wrapper","children","Provider","value","test","expect","result","current","toEqual","div"],"mappings":";AACA,SAASA,UAAU,QAAQ,yBAAyB;AACpD,SAASC,cAAc,EAAEC,iBAAiB,QAAQ,sBAAsB;AAExEC,SAAS,CAAC,iBAAiB,EAAED,kBAAkBE,IAAI,EAAE,EAAE;IACnD,MAAMC,UAAU,CAACC,UAAiBN,WAAW,IAAME,qBAAqB;YAAEI;QAAQ;IAElFH,SAAS,mDAAmD;QACxD,MAAMI,OAAO;YAAEC,KAAK;QAAM;QAC1B,MAAMC,UAAiC,CAAC,EAAEC,QAAQ,EAAE;YAChD,qBAAO,KAACT,eAAeU,QAAQ;gBAACC,OAAOL;0BAAOG;;QAClD;QAEAG,KAAK,uBAAuB;YACxBC,OAAOT,QAAQI,SAASM,MAAM,CAACC,OAAO,EAAEC,OAAO,CAACV;QACpD;IACJ;IAEAJ,SAAS,uDAAuD;QAC5D,MAAMM,UAAiC,CAAC,EAAEC,QAAQ,EAAE;YAChD,qBAAO,KAACQ;0BAAKR;;QACjB;QAEAG,KAAK,2BAA2B;YAC5BC,OAAOT,QAAQI,SAASM,MAAM,CAACC,OAAO,EAAEC,OAAO,CAAC,CAAC;QACrD;IACJ;AACJ"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { renderHook } from '@testing-library/react';
|
|
3
|
+
import { MFEMetadataContext, useMFEMetadataContext } from '../mfe-metadata-context';
|
|
4
|
+
describe(`[web-components] ${useMFEMetadataContext.name}`, ()=>{
|
|
5
|
+
const subject = (wrapper)=>renderHook(()=>useMFEMetadataContext(), {
|
|
6
|
+
wrapper
|
|
7
|
+
});
|
|
8
|
+
describe('when the MFEMetadataContext is provided by a parent', ()=>{
|
|
9
|
+
const shadowRoot = document.createElement('div').attachShadow({
|
|
10
|
+
mode: 'open'
|
|
11
|
+
});
|
|
12
|
+
const portalShadowRoot = document.createElement('span').attachShadow({
|
|
13
|
+
mode: 'open'
|
|
14
|
+
});
|
|
15
|
+
const metadata = {
|
|
16
|
+
shadowRoot,
|
|
17
|
+
portalShadowRoot
|
|
18
|
+
};
|
|
19
|
+
const Wrapper = ({ children })=>{
|
|
20
|
+
return /*#__PURE__*/ _jsx(MFEMetadataContext.Provider, {
|
|
21
|
+
value: metadata,
|
|
22
|
+
children: children
|
|
23
|
+
});
|
|
24
|
+
};
|
|
25
|
+
test('returns the context', ()=>{
|
|
26
|
+
expect(subject(Wrapper).result.current).toEqual(metadata);
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
describe('when the MFEMetadataContext is not provided by a parent', ()=>{
|
|
30
|
+
const Wrapper = ({ children })=>{
|
|
31
|
+
return /*#__PURE__*/ _jsx("div", {
|
|
32
|
+
children: children
|
|
33
|
+
});
|
|
34
|
+
};
|
|
35
|
+
test('returns an empty object', ()=>{
|
|
36
|
+
expect(subject(Wrapper).result.current).toEqual({});
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
//# sourceMappingURL=mfe-metadata-context.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/contexts/tests/mfe-metadata-context.test.tsx"],"sourcesContent":["import { FC, PropsWithChildren } from 'react';\nimport { renderHook } from '@testing-library/react';\nimport { MFEMetadataContext, useMFEMetadataContext } from '../mfe-metadata-context';\n\ndescribe(`[web-components] ${useMFEMetadataContext.name}`, () => {\n const subject = (wrapper?: FC) => renderHook(() => useMFEMetadataContext(), { wrapper });\n\n describe('when the MFEMetadataContext is provided by a parent', () => {\n const shadowRoot = document.createElement('div').attachShadow({ mode: 'open' });\n const portalShadowRoot = document.createElement('span').attachShadow({ mode: 'open' });\n const metadata = { shadowRoot, portalShadowRoot };\n const Wrapper: FC<PropsWithChildren> = ({ children }) => {\n return (\n <MFEMetadataContext.Provider value={metadata}>\n {children}\n </MFEMetadataContext.Provider>\n );\n };\n\n test('returns the context', () => {\n expect(subject(Wrapper).result.current).toEqual(metadata);\n });\n });\n\n describe('when the MFEMetadataContext is not provided by a parent', () => {\n const Wrapper: FC<PropsWithChildren> = ({ children }) => {\n return <div>{children}</div>;\n };\n\n test('returns an empty object', () => {\n expect(subject(Wrapper).result.current).toEqual({});\n });\n });\n});\n"],"names":["renderHook","MFEMetadataContext","useMFEMetadataContext","describe","name","subject","wrapper","shadowRoot","document","createElement","attachShadow","mode","portalShadowRoot","metadata","Wrapper","children","Provider","value","test","expect","result","current","toEqual","div"],"mappings":";AACA,SAASA,UAAU,QAAQ,yBAAyB;AACpD,SAASC,kBAAkB,EAAEC,qBAAqB,QAAQ,0BAA0B;AAEpFC,SAAS,CAAC,iBAAiB,EAAED,sBAAsBE,IAAI,EAAE,EAAE;IACvD,MAAMC,UAAU,CAACC,UAAiBN,WAAW,IAAME,yBAAyB;YAAEI;QAAQ;IAEtFH,SAAS,uDAAuD;QAC5D,MAAMI,aAAaC,SAASC,aAAa,CAAC,OAAOC,YAAY,CAAC;YAAEC,MAAM;QAAO;QAC7E,MAAMC,mBAAmBJ,SAASC,aAAa,CAAC,QAAQC,YAAY,CAAC;YAAEC,MAAM;QAAO;QACpF,MAAME,WAAW;YAAEN;YAAYK;QAAiB;QAChD,MAAME,UAAiC,CAAC,EAAEC,QAAQ,EAAE;YAChD,qBACI,KAACd,mBAAmBe,QAAQ;gBAACC,OAAOJ;0BAC/BE;;QAGb;QAEAG,KAAK,uBAAuB;YACxBC,OAAOd,QAAQS,SAASM,MAAM,CAACC,OAAO,EAAEC,OAAO,CAACT;QACpD;IACJ;IAEAV,SAAS,2DAA2D;QAChE,MAAMW,UAAiC,CAAC,EAAEC,QAAQ,EAAE;YAChD,qBAAO,KAACQ;0BAAKR;;QACjB;QAEAG,KAAK,2BAA2B;YAC5BC,OAAOd,QAAQS,SAASM,MAAM,CAACC,OAAO,EAAEC,OAAO,CAAC,CAAC;QACrD;IACJ;AACJ"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { UnrestrictedLoaderProps } from './loader';
|
|
2
|
+
type HeadlessLoaderProps<T> = Pick<UnrestrictedLoaderProps<T>, 'src' | 'fallbackSrc' | 'data' | 'className' | 'retries' | 'cache' | 'onRequestError'>;
|
|
3
|
+
export declare function HeadlessLoader<T>(props: Readonly<HeadlessLoaderProps<T>>): import("react/jsx-runtime").JSX.Element;
|
|
4
|
+
export {};
|
|
5
|
+
//# sourceMappingURL=headless-loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"headless-loader.d.ts","sourceRoot":"","sources":["../src/headless-loader.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAU,MAAM,UAAU,CAAC;AAE3D,KAAK,mBAAmB,CAAC,CAAC,IAAI,IAAI,CAC9B,uBAAuB,CAAC,CAAC,CAAC,EAC1B,KAAK,GAAG,aAAa,GAAG,MAAM,GAAG,WAAW,GAAG,SAAS,GAAG,OAAO,GAAG,gBAAgB,CACxF,CAAC;AAMF,wBAAgB,cAAc,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,2CASxE"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Loader } from './loader';
|
|
3
|
+
const UnrestrictedPropsLoader = (props)=>{
|
|
4
|
+
return /*#__PURE__*/ _jsx(Loader, {
|
|
5
|
+
...props
|
|
6
|
+
});
|
|
7
|
+
};
|
|
8
|
+
export function HeadlessLoader(props) {
|
|
9
|
+
return /*#__PURE__*/ _jsx(UnrestrictedPropsLoader, {
|
|
10
|
+
...props,
|
|
11
|
+
isHeadless: true,
|
|
12
|
+
loadingFallback: null,
|
|
13
|
+
errorFallback: null
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
//# sourceMappingURL=headless-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/headless-loader.tsx"],"sourcesContent":["import { UnrestrictedLoaderProps, Loader } from './loader';\n\ntype HeadlessLoaderProps<T> = Pick<\n UnrestrictedLoaderProps<T>,\n 'src' | 'fallbackSrc' | 'data' | 'className' | 'retries' | 'cache' | 'onRequestError'\n>;\n\nconst UnrestrictedPropsLoader = <T,>(props: UnrestrictedLoaderProps<T>) => {\n return <Loader {...props} />;\n};\n\nexport function HeadlessLoader<T>(props: Readonly<HeadlessLoaderProps<T>>) {\n return (\n <UnrestrictedPropsLoader<T>\n {...props}\n isHeadless\n loadingFallback={null}\n errorFallback={null}\n />\n );\n}\n"],"names":["Loader","UnrestrictedPropsLoader","props","HeadlessLoader","isHeadless","loadingFallback","errorFallback"],"mappings":";AAAA,SAAkCA,MAAM,QAAQ,WAAW;AAO3D,MAAMC,0BAA0B,CAAKC;IACjC,qBAAO,KAACF;QAAQ,GAAGE,KAAK;;AAC5B;AAEA,OAAO,SAASC,eAAkBD,KAAuC;IACrE,qBACI,KAACD;QACI,GAAGC,KAAK;QACTE,UAAU;QACVC,iBAAiB;QACjBC,eAAe;;AAG3B"}
|
package/dist/index.d.ts
CHANGED
|
@@ -2,8 +2,10 @@ export * from './common';
|
|
|
2
2
|
export * from './contexts';
|
|
3
3
|
export * from './event-bus';
|
|
4
4
|
export * from './get-value-for-environment';
|
|
5
|
+
export * from './headless-loader';
|
|
5
6
|
export * from './history-manager';
|
|
6
7
|
export * from './loader';
|
|
7
8
|
export * from './register';
|
|
9
|
+
export * from './register-headless';
|
|
8
10
|
export type { JSON, JSONPrimitive, Serializable } from './types';
|
|
9
11
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,6BAA6B,CAAC;AAC5C,cAAc,mBAAmB,CAAC;AAClC,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,6BAA6B,CAAC;AAC5C,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,qBAAqB,CAAC;AAEpC,YAAY,EAAE,IAAI,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -2,8 +2,10 @@ export * from './common';
|
|
|
2
2
|
export * from './contexts';
|
|
3
3
|
export * from './event-bus';
|
|
4
4
|
export * from './get-value-for-environment';
|
|
5
|
+
export * from './headless-loader';
|
|
5
6
|
export * from './history-manager';
|
|
6
7
|
export * from './loader';
|
|
7
8
|
export * from './register';
|
|
9
|
+
export * from './register-headless';
|
|
8
10
|
|
|
9
11
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export * from './common';\nexport * from './contexts';\nexport * from './event-bus';\nexport * from './get-value-for-environment';\nexport * from './history-manager';\nexport * from './loader';\nexport * from './register';\n\nexport type { JSON, JSONPrimitive, Serializable } from './types';\n"],"names":[],"mappings":"AAAA,cAAc,WAAW;AACzB,cAAc,aAAa;AAC3B,cAAc,cAAc;AAC5B,cAAc,8BAA8B;AAC5C,cAAc,oBAAoB;AAClC,cAAc,WAAW;AACzB,cAAc,aAAa"}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export * from './common';\nexport * from './contexts';\nexport * from './event-bus';\nexport * from './get-value-for-environment';\nexport * from './headless-loader';\nexport * from './history-manager';\nexport * from './loader';\nexport * from './register';\nexport * from './register-headless';\n\nexport type { JSON, JSONPrimitive, Serializable } from './types';\n"],"names":[],"mappings":"AAAA,cAAc,WAAW;AACzB,cAAc,aAAa;AAC3B,cAAc,cAAc;AAC5B,cAAc,8BAA8B;AAC5C,cAAc,oBAAoB;AAClC,cAAc,oBAAoB;AAClC,cAAc,WAAW;AACzB,cAAc,aAAa;AAC3B,cAAc,sBAAsB"}
|
package/dist/loader.d.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { ReactNode } from 'react';
|
|
1
|
+
import { ReactNode, Ref } from 'react';
|
|
2
2
|
import { GetJsonError } from './common';
|
|
3
3
|
import { MFEContextData } from './contexts/mfe-data-context';
|
|
4
4
|
import { EventBus } from './event-bus';
|
|
5
5
|
export type LoaderRef = EventBus;
|
|
6
6
|
export type FallbackNode = NonNullable<ReactNode> | null;
|
|
7
|
-
export interface
|
|
7
|
+
export interface UnrestrictedLoaderProps<T = {}> {
|
|
8
8
|
src: string;
|
|
9
9
|
fallbackSrc?: string;
|
|
10
10
|
/** Values in the object will be stringified and then parsed before being delivered to the MFE via props or context. */
|
|
@@ -15,11 +15,17 @@ export interface LoaderProps<T> {
|
|
|
15
15
|
errorFallback?: FallbackNode;
|
|
16
16
|
className?: string;
|
|
17
17
|
retries?: number;
|
|
18
|
+
isHeadless?: boolean;
|
|
18
19
|
cache?: boolean | number;
|
|
19
20
|
onRequestError?(error: GetJsonError): boolean;
|
|
20
21
|
}
|
|
21
|
-
export type
|
|
22
|
+
export type LoaderProps<T> = Pick<UnrestrictedLoaderProps<T>, 'src' | 'fallbackSrc' | 'data' | 'basename' | 'loadingFallback' | 'loadingFallbackDelayed' | 'errorFallback' | 'className' | 'retries' | 'cache' | 'onRequestError'>;
|
|
23
|
+
export type LoaderDataProps = Pick<UnrestrictedLoaderProps, 'data' | 'className'> & {
|
|
22
24
|
LoadingFallback: () => JSX.Element;
|
|
23
25
|
};
|
|
24
|
-
|
|
26
|
+
declare const UnrestrictedLoader: <T>(props: UnrestrictedLoaderProps<T>, ref: Ref<LoaderRef>) => import("react/jsx-runtime").JSX.Element;
|
|
27
|
+
export declare const Loader: <T = {}>(props: LoaderProps<T> & {
|
|
28
|
+
ref?: Ref<LoaderRef>;
|
|
29
|
+
}) => ReturnType<typeof UnrestrictedLoader>;
|
|
30
|
+
export {};
|
|
25
31
|
//# sourceMappingURL=loader.d.ts.map
|
package/dist/loader.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../src/loader.tsx"],"names":[],"mappings":"AAAA,OAAO,EAEH,SAAS,
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../src/loader.tsx"],"names":[],"mappings":"AAAA,OAAO,EAEH,SAAS,EACT,GAAG,EAQN,MAAM,OAAO,CAAC;AAMf,OAAO,EAKH,YAAY,EAEf,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAE7D,OAAO,EAAE,QAAQ,EAAmB,MAAM,aAAa,CAAC;AAWxD,MAAM,MAAM,SAAS,GAAG,QAAQ,CAAC;AAEjC,MAAM,MAAM,YAAY,GAAG,WAAW,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC;AAEzD,MAAM,WAAW,uBAAuB,CAAC,CAAC,GAAG,EAAE;IAC3C,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,uHAAuH;IACvH,IAAI,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,YAAY,CAAC;IAC/B,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,aAAa,CAAC,EAAE,YAAY,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IACzB,cAAc,CAAC,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC;CACjD;AAED,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI,IAAI,CAC7B,uBAAuB,CAAC,CAAC,CAAC,EACxB,KAAK,GACL,aAAa,GACb,MAAM,GACN,UAAU,GACV,iBAAiB,GACjB,wBAAwB,GACxB,eAAe,GACf,WAAW,GACX,SAAS,GACT,OAAO,GACP,gBAAgB,CACrB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG,IAAI,CAAC,uBAAuB,EAAE,MAAM,GAAG,WAAW,CAAC,GAAG;IAChF,eAAe,EAAE,MAAM,GAAG,CAAC,OAAO,CAAC;CACtC,CAAC;AAEF,QAAA,MAAM,kBAAkB,GAAI,CAAC,EAAG,OAAO,uBAAuB,CAAC,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,SAAS,CAAC,4CAyErF,CAAC;AAEF,eAAO,MAAM,MAAM,EAAqC,CAAC,CAAC,GAAG,EAAE,EAC3D,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG;IAAE,GAAG,CAAC,EAAE,GAAG,CAAC,SAAS,CAAC,CAAA;CAAE,KAC/C,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC"}
|
package/dist/loader.js
CHANGED
|
@@ -7,9 +7,9 @@ import { EXPOSED_DEPENDENCIES_TOKEN, EXPOSED_INSTANCE_DEPENDENCIES_TOKEN, useCan
|
|
|
7
7
|
import { Delayed } from './delayed';
|
|
8
8
|
import { EventBus, EVENT_BUS_TOKEN } from './event-bus';
|
|
9
9
|
import { EXPOSED_DEPENDENCIES, EXPOSED_INSTANCE_DEPENDENCIES } from './globals';
|
|
10
|
-
import {
|
|
11
|
-
|
|
12
|
-
const { cache =
|
|
10
|
+
import { getBundleInfo, getLDServiceToken, validateBundleInfo, loadScripts, webComponent } from './utils';
|
|
11
|
+
const UnrestrictedLoader = (props, ref)=>{
|
|
12
|
+
const { cache = -1, basename, fallbackSrc, isHeadless, onRequestError, retries, src } = props;
|
|
13
13
|
const { loadingFallback, loadingFallbackDelayed = true } = props;
|
|
14
14
|
const bus = useEventBus();
|
|
15
15
|
const [logService, exposedDependencies = EXPOSED_DEPENDENCIES, eventBus = bus] = useOptionalDependencies(Log, EXPOSED_DEPENDENCIES_TOKEN, EVENT_BUS_TOKEN);
|
|
@@ -46,6 +46,7 @@ export const Loader = /*#__PURE__*/ forwardRef((props, ref)=>{
|
|
|
46
46
|
exposedInstanceDependencies,
|
|
47
47
|
eventBus,
|
|
48
48
|
fallbackSrc,
|
|
49
|
+
isHeadless,
|
|
49
50
|
logService,
|
|
50
51
|
onRequestError,
|
|
51
52
|
retries,
|
|
@@ -57,9 +58,10 @@ export const Loader = /*#__PURE__*/ forwardRef((props, ref)=>{
|
|
|
57
58
|
exposedDependencies,
|
|
58
59
|
exposedInstanceDependencies,
|
|
59
60
|
eventBus,
|
|
61
|
+
fallbackSrc,
|
|
62
|
+
isHeadless,
|
|
60
63
|
logService,
|
|
61
64
|
onRequestError,
|
|
62
|
-
fallbackSrc,
|
|
63
65
|
retries,
|
|
64
66
|
src
|
|
65
67
|
]);
|
|
@@ -79,7 +81,8 @@ export const Loader = /*#__PURE__*/ forwardRef((props, ref)=>{
|
|
|
79
81
|
})
|
|
80
82
|
})
|
|
81
83
|
});
|
|
82
|
-
}
|
|
84
|
+
};
|
|
85
|
+
export const Loader = /*#__PURE__*/ forwardRef(UnrestrictedLoader);
|
|
83
86
|
function lazyLoader(props) {
|
|
84
87
|
const { cancelation } = props;
|
|
85
88
|
const LazyWebComponent = lazyWebComponent(props);
|
|
@@ -97,43 +100,36 @@ function lazyLoader(props) {
|
|
|
97
100
|
};
|
|
98
101
|
}
|
|
99
102
|
function lazyWebComponent(props) {
|
|
100
|
-
const { basename, cancelation, exposedDependencies, exposedInstanceDependencies, eventBus, fallbackSrc, logService, onRequestError, retries, src } = props;
|
|
101
|
-
let { cache } = props;
|
|
103
|
+
const { basename, cache, cancelation, exposedDependencies, exposedInstanceDependencies, eventBus, fallbackSrc, isHeadless, logService, onRequestError, retries, src } = props;
|
|
102
104
|
return /*#__PURE__*/ lazy(async ()=>{
|
|
103
105
|
var _exposedInstanceDependencies_launchDarkly;
|
|
104
|
-
let bundleInfo
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
exposedInstanceDependencies,
|
|
112
|
-
signal: cancelation.signal,
|
|
113
|
-
retries,
|
|
114
|
-
onRequestError
|
|
115
|
-
});
|
|
116
|
-
} catch (e) {
|
|
117
|
-
if (cancelation.signal.aborted) {
|
|
118
|
-
return {
|
|
119
|
-
default: ()=>null
|
|
120
|
-
};
|
|
121
|
-
}
|
|
122
|
-
throw e;
|
|
123
|
-
}
|
|
124
|
-
if (cache === true && !bundleInfo.mfeHasUniqueChunkNamespace) {
|
|
125
|
-
cache = -1;
|
|
126
|
-
}
|
|
127
|
-
if (cache) {
|
|
128
|
-
bundleCache.set(src, bundleInfo, typeof cache === 'number' ? cache : undefined);
|
|
129
|
-
}
|
|
130
|
-
validateBundleInfo(bundleInfo, {
|
|
106
|
+
let bundleInfo;
|
|
107
|
+
try {
|
|
108
|
+
bundleInfo = await getBundleInfo({
|
|
109
|
+
cache,
|
|
110
|
+
mainPackageUrl: src,
|
|
111
|
+
fallbackPackageUrl: fallbackSrc,
|
|
112
|
+
isHeadless,
|
|
131
113
|
exposedDependencies,
|
|
132
114
|
exposedInstanceDependencies,
|
|
133
|
-
|
|
134
|
-
|
|
115
|
+
signal: cancelation.signal,
|
|
116
|
+
retries,
|
|
117
|
+
onRequestError
|
|
135
118
|
});
|
|
119
|
+
} catch (e) {
|
|
120
|
+
if (cancelation.signal.aborted) {
|
|
121
|
+
return {
|
|
122
|
+
default: ()=>null
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
throw e;
|
|
136
126
|
}
|
|
127
|
+
validateBundleInfo(bundleInfo, {
|
|
128
|
+
exposedDependencies,
|
|
129
|
+
exposedInstanceDependencies,
|
|
130
|
+
logService,
|
|
131
|
+
packageUrl: src
|
|
132
|
+
});
|
|
137
133
|
await loadScripts(bundleInfo);
|
|
138
134
|
const ldService = bundleInfo.mfeHasCompatibleLaunchDarklyVersion ? exposedInstanceDependencies === null || exposedInstanceDependencies === void 0 ? void 0 : (_exposedInstanceDependencies_launchDarkly = exposedInstanceDependencies.launchDarkly) === null || _exposedInstanceDependencies_launchDarkly === void 0 ? void 0 : _exposedInstanceDependencies_launchDarkly.ldService : undefined;
|
|
139
135
|
return {
|
|
@@ -179,9 +175,5 @@ function ensureLDService(exposedInstanceDependencies, ldService) {
|
|
|
179
175
|
function useEventBus() {
|
|
180
176
|
return useRef(new EventBus()).current;
|
|
181
177
|
}
|
|
182
|
-
const MINUTE = 1000 * 60;
|
|
183
|
-
const bundleCache = new TtlCache({
|
|
184
|
-
ttlMs: 15 * MINUTE
|
|
185
|
-
});
|
|
186
178
|
|
|
187
179
|
//# sourceMappingURL=loader.js.map
|
package/dist/loader.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/loader.tsx"],"sourcesContent":["import {\n ReactElement,\n ReactNode,\n Suspense,\n forwardRef,\n lazy,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n} from 'react';\nimport { ErrorBoundary } from '@servicetitan/error-boundary';\nimport { type LDService } from '@servicetitan/launchdarkly-service';\nimport { Log } from '@servicetitan/log-service';\nimport { useOptionalDependencies } from '@servicetitan/react-ioc';\n\nimport {\n EXPOSED_DEPENDENCIES_TOKEN,\n EXPOSED_INSTANCE_DEPENDENCIES_TOKEN,\n ExposedDependencies,\n ExposedInstanceDependencies,\n GetJsonError,\n useCancelation,\n} from './common';\nimport { MFEContextData } from './contexts/mfe-data-context';\nimport { Delayed } from './delayed';\nimport { EventBus, EVENT_BUS_TOKEN } from './event-bus';\nimport { EXPOSED_DEPENDENCIES, EXPOSED_INSTANCE_DEPENDENCIES } from './globals';\nimport {\n BundleInfo,\n TtlCache,\n getBundleInfo,\n getLDServiceToken,\n validateBundleInfo,\n loadScripts,\n webComponent,\n} from './utils';\n\nexport type LoaderRef = EventBus;\n\nexport type FallbackNode = NonNullable<ReactNode> | null;\n\nexport interface LoaderProps<T> {\n src: string;\n fallbackSrc?: string;\n /** Values in the object will be stringified and then parsed before being delivered to the MFE via props or context. */\n data?: MFEContextData<T>;\n basename?: string;\n loadingFallback?: FallbackNode;\n loadingFallbackDelayed?: boolean;\n errorFallback?: FallbackNode;\n className?: string;\n retries?: number;\n cache?: boolean | number;\n onRequestError?(error: GetJsonError): boolean;\n}\n\nexport type LoaderDataProps = Pick<LoaderProps<{}>, 'data' | 'className'> & {\n LoadingFallback: () => JSX.Element;\n};\n\nexport const Loader = forwardRef<LoaderRef, LoaderProps<{}>>((props, ref) => {\n const { cache = true, basename, fallbackSrc, onRequestError, retries, src } = props;\n const { loadingFallback, loadingFallbackDelayed = true } = props;\n\n const bus = useEventBus();\n const [logService, exposedDependencies = EXPOSED_DEPENDENCIES, eventBus = bus] =\n useOptionalDependencies(Log, EXPOSED_DEPENDENCIES_TOKEN, EVENT_BUS_TOKEN);\n let [exposedInstanceDependencies = EXPOSED_INSTANCE_DEPENDENCIES] = useOptionalDependencies(\n EXPOSED_INSTANCE_DEPENDENCIES_TOKEN\n );\n const [ldService] = useOptionalDependencies(getLDServiceToken() ?? Symbol());\n const cancelation = useCancelation();\n\n const LoadingFallback = useMemo(() => {\n const message = `Loading${isLocalHost(src) ? ` ${src}` : ''}...`;\n return getFallback(loadingFallback, message, { delayed: loadingFallbackDelayed });\n }, [loadingFallback, loadingFallbackDelayed, src]);\n\n const ErrorFallback = useMemo(() => {\n const message = `Something went wrong${isLocalHost(src) ? ` loading ${src}` : ''}`;\n return getFallback(props.errorFallback, message);\n }, [props.errorFallback, src]);\n\n exposedInstanceDependencies = useMemo(\n () => ensureLDService(exposedInstanceDependencies, ldService),\n [exposedInstanceDependencies, ldService]\n );\n\n const Loader = useMemo(\n () =>\n lazyLoader({\n basename,\n cache,\n cancelation,\n exposedDependencies,\n exposedInstanceDependencies,\n eventBus,\n fallbackSrc,\n logService,\n onRequestError,\n retries,\n src,\n }),\n [\n basename,\n cache,\n cancelation,\n exposedDependencies,\n exposedInstanceDependencies,\n eventBus,\n logService,\n onRequestError,\n fallbackSrc,\n retries,\n src,\n ]\n );\n\n useImperativeHandle(ref, () => eventBus, [eventBus]);\n\n return (\n <ErrorBoundary moduleName={src} fallback={ErrorFallback}>\n <Suspense fallback={<LoadingFallback />}>\n <Loader\n data={props.data ?? {}}\n className={props.className}\n LoadingFallback={LoadingFallback}\n />\n </Suspense>\n </ErrorBoundary>\n );\n});\n\ntype LazyLoaderProps = LoaderProps<any> & {\n cancelation: AbortController;\n exposedDependencies?: ExposedDependencies;\n exposedInstanceDependencies?: ExposedInstanceDependencies;\n eventBus: EventBus;\n logService?: Log;\n};\n\nfunction lazyLoader(props: LazyLoaderProps) {\n const { cancelation } = props;\n\n const LazyWebComponent = lazyWebComponent(props);\n\n return (props: LoaderDataProps) => {\n useEffect(() => {\n return () => {\n cancelation.abort();\n };\n }, []);\n\n return (\n <LazyWebComponent\n data={props.data}\n className={props.className}\n LoadingFallback={props.LoadingFallback}\n />\n );\n };\n}\n\nfunction lazyWebComponent(props: LazyLoaderProps) {\n const {\n basename,\n cancelation,\n exposedDependencies,\n exposedInstanceDependencies,\n eventBus,\n fallbackSrc,\n logService,\n onRequestError,\n retries,\n src,\n } = props;\n\n let { cache } = props;\n\n return lazy<(_: LoaderDataProps) => JSX.Element | null>(async () => {\n let bundleInfo: BundleInfo | undefined = cache ? bundleCache.get(src) : undefined;\n if (!bundleInfo) {\n try {\n bundleInfo = await getBundleInfo({\n mainPackageUrl: src,\n fallbackPackageUrl: fallbackSrc,\n exposedDependencies,\n exposedInstanceDependencies,\n signal: cancelation.signal,\n retries,\n onRequestError,\n });\n } catch (e) {\n if (cancelation.signal.aborted) {\n return {\n default: () => null,\n };\n }\n\n throw e;\n }\n\n if (cache === true && !bundleInfo.mfeHasUniqueChunkNamespace) {\n cache = -1;\n }\n\n if (cache) {\n bundleCache.set(src, bundleInfo, typeof cache === 'number' ? cache : undefined);\n }\n\n validateBundleInfo(bundleInfo, {\n exposedDependencies,\n exposedInstanceDependencies,\n logService,\n packageUrl: src,\n });\n }\n\n await loadScripts(bundleInfo);\n\n const ldService = bundleInfo.mfeHasCompatibleLaunchDarklyVersion\n ? exposedInstanceDependencies?.launchDarkly?.ldService\n : undefined;\n\n return {\n default: webComponent({\n basename,\n bundleInfo,\n eventBus,\n exposedDependencies,\n exposedInstanceDependencies,\n ldService,\n logService,\n }),\n };\n });\n}\n\nfunction getFallback(\n node: FallbackNode | undefined,\n message: string,\n { delayed = false }: { delayed?: boolean } = {}\n) {\n const fallbackNode = node !== undefined ? (node as ReactElement) : <h2>{message}</h2>;\n return delayed ? () => <Delayed>{fallbackNode}</Delayed> : () => fallbackNode;\n}\n\nfunction isLocalHost(source: string) {\n return ['localhost', '127.0.0.1'].some(host => source.indexOf(host) >= 0);\n}\n\nfunction ensureLDService(\n exposedInstanceDependencies?: ExposedInstanceDependencies,\n ldService?: LDService\n) {\n const launchDarkly = exposedInstanceDependencies?.launchDarkly;\n if (launchDarkly?.version && !launchDarkly.ldService && ldService) {\n return { ...exposedInstanceDependencies, launchDarkly: { ...launchDarkly, ldService } };\n }\n return exposedInstanceDependencies;\n}\n\nfunction useEventBus() {\n return useRef(new EventBus()).current;\n}\n\nconst MINUTE = 1000 * 60;\nconst bundleCache = new TtlCache<BundleInfo>({ ttlMs: 15 * MINUTE });\n"],"names":["Suspense","forwardRef","lazy","useEffect","useImperativeHandle","useMemo","useRef","ErrorBoundary","Log","useOptionalDependencies","EXPOSED_DEPENDENCIES_TOKEN","EXPOSED_INSTANCE_DEPENDENCIES_TOKEN","useCancelation","Delayed","EventBus","EVENT_BUS_TOKEN","EXPOSED_DEPENDENCIES","EXPOSED_INSTANCE_DEPENDENCIES","TtlCache","getBundleInfo","getLDServiceToken","validateBundleInfo","loadScripts","webComponent","Loader","props","ref","cache","basename","fallbackSrc","onRequestError","retries","src","loadingFallback","loadingFallbackDelayed","bus","useEventBus","logService","exposedDependencies","eventBus","exposedInstanceDependencies","ldService","Symbol","cancelation","LoadingFallback","message","isLocalHost","getFallback","delayed","ErrorFallback","errorFallback","ensureLDService","lazyLoader","moduleName","fallback","data","className","LazyWebComponent","lazyWebComponent","abort","bundleInfo","bundleCache","get","undefined","mainPackageUrl","fallbackPackageUrl","signal","e","aborted","default","mfeHasUniqueChunkNamespace","set","packageUrl","mfeHasCompatibleLaunchDarklyVersion","launchDarkly","node","fallbackNode","h2","source","some","host","indexOf","version","current","MINUTE","ttlMs"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../src/loader.tsx"],"sourcesContent":["import {\n ReactElement,\n ReactNode,\n Ref,\n Suspense,\n forwardRef,\n lazy,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n} from 'react';\nimport { ErrorBoundary } from '@servicetitan/error-boundary';\nimport { type LDService } from '@servicetitan/launchdarkly-service';\nimport { Log } from '@servicetitan/log-service';\nimport { useOptionalDependencies } from '@servicetitan/react-ioc';\n\nimport {\n EXPOSED_DEPENDENCIES_TOKEN,\n EXPOSED_INSTANCE_DEPENDENCIES_TOKEN,\n ExposedDependencies,\n ExposedInstanceDependencies,\n GetJsonError,\n useCancelation,\n} from './common';\nimport { MFEContextData } from './contexts/mfe-data-context';\nimport { Delayed } from './delayed';\nimport { EventBus, EVENT_BUS_TOKEN } from './event-bus';\nimport { EXPOSED_DEPENDENCIES, EXPOSED_INSTANCE_DEPENDENCIES } from './globals';\nimport {\n BundleInfo,\n getBundleInfo,\n getLDServiceToken,\n validateBundleInfo,\n loadScripts,\n webComponent,\n} from './utils';\n\nexport type LoaderRef = EventBus;\n\nexport type FallbackNode = NonNullable<ReactNode> | null;\n\nexport interface UnrestrictedLoaderProps<T = {}> {\n src: string;\n fallbackSrc?: string;\n /** Values in the object will be stringified and then parsed before being delivered to the MFE via props or context. */\n data?: MFEContextData<T>;\n basename?: string;\n loadingFallback?: FallbackNode;\n loadingFallbackDelayed?: boolean;\n errorFallback?: FallbackNode;\n className?: string;\n retries?: number;\n isHeadless?: boolean;\n cache?: boolean | number;\n onRequestError?(error: GetJsonError): boolean;\n}\n\nexport type LoaderProps<T> = Pick<\n UnrestrictedLoaderProps<T>,\n | 'src'\n | 'fallbackSrc'\n | 'data'\n | 'basename'\n | 'loadingFallback'\n | 'loadingFallbackDelayed'\n | 'errorFallback'\n | 'className'\n | 'retries'\n | 'cache'\n | 'onRequestError'\n>;\n\nexport type LoaderDataProps = Pick<UnrestrictedLoaderProps, 'data' | 'className'> & {\n LoadingFallback: () => JSX.Element;\n};\n\nconst UnrestrictedLoader = <T,>(props: UnrestrictedLoaderProps<T>, ref: Ref<LoaderRef>) => {\n const { cache = -1, basename, fallbackSrc, isHeadless, onRequestError, retries, src } = props;\n const { loadingFallback, loadingFallbackDelayed = true } = props;\n\n const bus = useEventBus();\n const [logService, exposedDependencies = EXPOSED_DEPENDENCIES, eventBus = bus] =\n useOptionalDependencies(Log, EXPOSED_DEPENDENCIES_TOKEN, EVENT_BUS_TOKEN);\n let [exposedInstanceDependencies = EXPOSED_INSTANCE_DEPENDENCIES] = useOptionalDependencies(\n EXPOSED_INSTANCE_DEPENDENCIES_TOKEN\n );\n const [ldService] = useOptionalDependencies(getLDServiceToken() ?? Symbol());\n const cancelation = useCancelation();\n\n const LoadingFallback = useMemo(() => {\n const message = `Loading${isLocalHost(src) ? ` ${src}` : ''}...`;\n return getFallback(loadingFallback, message, { delayed: loadingFallbackDelayed });\n }, [loadingFallback, loadingFallbackDelayed, src]);\n\n const ErrorFallback = useMemo(() => {\n const message = `Something went wrong${isLocalHost(src) ? ` loading ${src}` : ''}`;\n return getFallback(props.errorFallback, message);\n }, [props.errorFallback, src]);\n\n exposedInstanceDependencies = useMemo(\n () => ensureLDService(exposedInstanceDependencies, ldService),\n [exposedInstanceDependencies, ldService]\n );\n\n const Loader = useMemo(\n () =>\n lazyLoader({\n basename,\n cache,\n cancelation,\n exposedDependencies,\n exposedInstanceDependencies,\n eventBus,\n fallbackSrc,\n isHeadless,\n logService,\n onRequestError,\n retries,\n src,\n }),\n [\n basename,\n cache,\n cancelation,\n exposedDependencies,\n exposedInstanceDependencies,\n eventBus,\n fallbackSrc,\n isHeadless,\n logService,\n onRequestError,\n retries,\n src,\n ]\n );\n\n useImperativeHandle(ref, () => eventBus, [eventBus]);\n\n return (\n <ErrorBoundary moduleName={src} fallback={ErrorFallback}>\n <Suspense fallback={<LoadingFallback />}>\n <Loader\n data={props.data ?? {}}\n className={props.className}\n LoadingFallback={LoadingFallback}\n />\n </Suspense>\n </ErrorBoundary>\n );\n};\n\nexport const Loader = forwardRef(UnrestrictedLoader) as <T = {}>(\n props: LoaderProps<T> & { ref?: Ref<LoaderRef> }\n) => ReturnType<typeof UnrestrictedLoader>;\n\ntype LazyLoaderProps = UnrestrictedLoaderProps<any> & {\n cancelation: AbortController;\n exposedDependencies?: ExposedDependencies;\n exposedInstanceDependencies?: ExposedInstanceDependencies;\n eventBus: EventBus;\n logService?: Log;\n cache: Required<UnrestrictedLoaderProps<any>>['cache'];\n};\n\nfunction lazyLoader(props: LazyLoaderProps) {\n const { cancelation } = props;\n\n const LazyWebComponent = lazyWebComponent(props);\n\n return (props: LoaderDataProps) => {\n useEffect(() => {\n return () => {\n cancelation.abort();\n };\n }, []);\n\n return (\n <LazyWebComponent\n data={props.data}\n className={props.className}\n LoadingFallback={props.LoadingFallback}\n />\n );\n };\n}\n\nfunction lazyWebComponent(props: LazyLoaderProps) {\n const {\n basename,\n cache,\n cancelation,\n exposedDependencies,\n exposedInstanceDependencies,\n eventBus,\n fallbackSrc,\n isHeadless,\n logService,\n onRequestError,\n retries,\n src,\n } = props;\n\n return lazy<(_: LoaderDataProps) => JSX.Element | null>(async () => {\n let bundleInfo: BundleInfo;\n try {\n bundleInfo = await getBundleInfo({\n cache,\n mainPackageUrl: src,\n fallbackPackageUrl: fallbackSrc,\n isHeadless,\n exposedDependencies,\n exposedInstanceDependencies,\n signal: cancelation.signal,\n retries,\n onRequestError,\n });\n } catch (e) {\n if (cancelation.signal.aborted) {\n return {\n default: () => null,\n };\n }\n\n throw e;\n }\n\n validateBundleInfo(bundleInfo, {\n exposedDependencies,\n exposedInstanceDependencies,\n logService,\n packageUrl: src,\n });\n\n await loadScripts(bundleInfo);\n\n const ldService = bundleInfo.mfeHasCompatibleLaunchDarklyVersion\n ? exposedInstanceDependencies?.launchDarkly?.ldService\n : undefined;\n\n return {\n default: webComponent({\n basename,\n bundleInfo,\n eventBus,\n exposedDependencies,\n exposedInstanceDependencies,\n ldService,\n logService,\n }),\n };\n });\n}\n\nfunction getFallback(\n node: FallbackNode | undefined,\n message: string,\n { delayed = false }: { delayed?: boolean } = {}\n) {\n const fallbackNode = node !== undefined ? (node as ReactElement) : <h2>{message}</h2>;\n return delayed ? () => <Delayed>{fallbackNode}</Delayed> : () => fallbackNode;\n}\n\nfunction isLocalHost(source: string) {\n return ['localhost', '127.0.0.1'].some(host => source.indexOf(host) >= 0);\n}\n\nfunction ensureLDService(\n exposedInstanceDependencies?: ExposedInstanceDependencies,\n ldService?: LDService\n) {\n const launchDarkly = exposedInstanceDependencies?.launchDarkly;\n if (launchDarkly?.version && !launchDarkly.ldService && ldService) {\n return { ...exposedInstanceDependencies, launchDarkly: { ...launchDarkly, ldService } };\n }\n return exposedInstanceDependencies;\n}\n\nfunction useEventBus() {\n return useRef(new EventBus()).current;\n}\n"],"names":["Suspense","forwardRef","lazy","useEffect","useImperativeHandle","useMemo","useRef","ErrorBoundary","Log","useOptionalDependencies","EXPOSED_DEPENDENCIES_TOKEN","EXPOSED_INSTANCE_DEPENDENCIES_TOKEN","useCancelation","Delayed","EventBus","EVENT_BUS_TOKEN","EXPOSED_DEPENDENCIES","EXPOSED_INSTANCE_DEPENDENCIES","getBundleInfo","getLDServiceToken","validateBundleInfo","loadScripts","webComponent","UnrestrictedLoader","props","ref","cache","basename","fallbackSrc","isHeadless","onRequestError","retries","src","loadingFallback","loadingFallbackDelayed","bus","useEventBus","logService","exposedDependencies","eventBus","exposedInstanceDependencies","ldService","Symbol","cancelation","LoadingFallback","message","isLocalHost","getFallback","delayed","ErrorFallback","errorFallback","ensureLDService","Loader","lazyLoader","moduleName","fallback","data","className","LazyWebComponent","lazyWebComponent","abort","bundleInfo","mainPackageUrl","fallbackPackageUrl","signal","e","aborted","default","packageUrl","mfeHasCompatibleLaunchDarklyVersion","launchDarkly","undefined","node","fallbackNode","h2","source","some","host","indexOf","version","current"],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Entries } from './common';
|
|
2
|
+
import { Serializable } from './types';
|
|
3
|
+
type HeadlessCallbackArgs<T> = Pick<Entries, 'ldService' | 'logService' | 'eventBus'> & {
|
|
4
|
+
mfeData?: Serializable<T>;
|
|
5
|
+
};
|
|
6
|
+
export type HeadlessCallback<T = undefined> = (params: HeadlessCallbackArgs<T>) => void;
|
|
7
|
+
export declare function registerHeadless(connectedCallback?: HeadlessCallback<unknown>, disconnectedCallback?: HeadlessCallback<unknown>): void;
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=register-headless.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register-headless.d.ts","sourceRoot":"","sources":["../src/register-headless.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAiB,MAAM,UAAU,CAAC;AAGvD,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,KAAK,oBAAoB,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,YAAY,GAAG,UAAU,CAAC,GAAG;IACpF,OAAO,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC;CAC7B,CAAC;AACF,MAAM,MAAM,gBAAgB,CAAC,CAAC,GAAG,SAAS,IAAI,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;AAExF,wBAAgB,gBAAgB,CAC5B,iBAAiB,CAAC,EAAE,gBAAgB,CAAC,OAAO,CAAC,EAC7C,oBAAoB,CAAC,EAAE,gBAAgB,CAAC,OAAO,CAAC,QAmEnD"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
function _define_property(obj, key, value) {
|
|
2
|
+
if (key in obj) {
|
|
3
|
+
Object.defineProperty(obj, key, {
|
|
4
|
+
value: value,
|
|
5
|
+
enumerable: true,
|
|
6
|
+
configurable: true,
|
|
7
|
+
writable: true
|
|
8
|
+
});
|
|
9
|
+
} else {
|
|
10
|
+
obj[key] = value;
|
|
11
|
+
}
|
|
12
|
+
return obj;
|
|
13
|
+
}
|
|
14
|
+
export function registerHeadless(connectedCallback, disconnectedCallback) {
|
|
15
|
+
class Headless extends HTMLElement {
|
|
16
|
+
async connectedCallback() {
|
|
17
|
+
await this.readyPromise;
|
|
18
|
+
connectedCallback === null || connectedCallback === void 0 ? void 0 : connectedCallback({
|
|
19
|
+
...this.services,
|
|
20
|
+
mfeData: this.mfeData
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
async disconnectedCallback() {
|
|
24
|
+
await this.readyPromise;
|
|
25
|
+
disconnectedCallback === null || disconnectedCallback === void 0 ? void 0 : disconnectedCallback({
|
|
26
|
+
...this.services,
|
|
27
|
+
mfeData: this.mfeData
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
connectedMoveCallback() {
|
|
31
|
+
/*
|
|
32
|
+
* Defining connectedMoveCallback prevents connectedCallback or disconnectedCallback
|
|
33
|
+
* from running when the element is moved in the DOM
|
|
34
|
+
* https://developer.mozilla.org/en-US/docs/Web/API/Web_components/Using_custom_elements#custom_element_lifecycle_callbacks
|
|
35
|
+
*/ }
|
|
36
|
+
get services() {
|
|
37
|
+
return {
|
|
38
|
+
ldService: this.ldService,
|
|
39
|
+
logService: this.logService,
|
|
40
|
+
eventBus: this.eventBus
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
get mfeData() {
|
|
44
|
+
var _this_dataset_mfeData;
|
|
45
|
+
return JSON.parse((_this_dataset_mfeData = this.dataset.mfeData) !== null && _this_dataset_mfeData !== void 0 ? _this_dataset_mfeData : '{}');
|
|
46
|
+
}
|
|
47
|
+
constructor(){
|
|
48
|
+
super(), _define_property(this, "ldService", void 0), _define_property(this, "logService", void 0), _define_property(this, "eventBus", void 0), _define_property(this, "readyPromise", void 0), _define_property(this, "resolveReadyPromise", void 0), _define_property(this, "provide", (entries)=>{
|
|
49
|
+
this.ldService = entries.ldService;
|
|
50
|
+
this.logService = entries.logService;
|
|
51
|
+
this.eventBus = entries.eventBus;
|
|
52
|
+
this.resolveReadyPromise();
|
|
53
|
+
});
|
|
54
|
+
this.readyPromise = new Promise((resolve)=>{
|
|
55
|
+
this.resolveReadyPromise = resolve;
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
if (!WEB_COMPONENT_NAME) {
|
|
60
|
+
// eslint-disable-next-line no-console
|
|
61
|
+
console.error('"WEB_COMPONENT_NAME" is not defined!');
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
window.customElements.define(`headless-${WEB_COMPONENT_NAME}`, Headless);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
//# sourceMappingURL=register-headless.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/register-headless.ts"],"sourcesContent":["import type { LDService } from '@servicetitan/launchdarkly-service';\nimport type { Entries, IWebComponent } from './common';\nimport type { EventBus } from './event-bus';\nimport type { Log } from '@servicetitan/log-service';\nimport { Serializable } from './types';\n\ntype HeadlessCallbackArgs<T> = Pick<Entries, 'ldService' | 'logService' | 'eventBus'> & {\n mfeData?: Serializable<T>;\n};\nexport type HeadlessCallback<T = undefined> = (params: HeadlessCallbackArgs<T>) => void;\n\nexport function registerHeadless(\n connectedCallback?: HeadlessCallback<unknown>,\n disconnectedCallback?: HeadlessCallback<unknown>\n) {\n class Headless extends HTMLElement implements IWebComponent {\n private ldService?: LDService;\n private logService?: Log;\n private eventBus?: EventBus;\n private readonly readyPromise: Promise<void>;\n private resolveReadyPromise!: () => void;\n\n constructor() {\n super();\n this.readyPromise = new Promise(resolve => {\n this.resolveReadyPromise = resolve;\n });\n }\n\n provide = (entries: Entries) => {\n this.ldService = entries.ldService;\n this.logService = entries.logService;\n this.eventBus = entries.eventBus;\n this.resolveReadyPromise();\n };\n\n async connectedCallback() {\n await this.readyPromise;\n connectedCallback?.({\n ...this.services,\n mfeData: this.mfeData,\n });\n }\n\n async disconnectedCallback() {\n await this.readyPromise;\n disconnectedCallback?.({\n ...this.services,\n mfeData: this.mfeData,\n });\n }\n\n connectedMoveCallback() {\n /*\n * Defining connectedMoveCallback prevents connectedCallback or disconnectedCallback\n * from running when the element is moved in the DOM\n * https://developer.mozilla.org/en-US/docs/Web/API/Web_components/Using_custom_elements#custom_element_lifecycle_callbacks\n */\n }\n\n private get services() {\n return {\n ldService: this.ldService,\n logService: this.logService,\n eventBus: this.eventBus,\n };\n }\n\n private get mfeData() {\n return JSON.parse(this.dataset.mfeData ?? '{}');\n }\n }\n\n if (!WEB_COMPONENT_NAME) {\n // eslint-disable-next-line no-console\n console.error('\"WEB_COMPONENT_NAME\" is not defined!');\n return;\n }\n\n window.customElements.define(`headless-${WEB_COMPONENT_NAME}`, Headless);\n}\n"],"names":["registerHeadless","connectedCallback","disconnectedCallback","Headless","HTMLElement","readyPromise","services","mfeData","connectedMoveCallback","ldService","logService","eventBus","JSON","parse","dataset","constructor","resolveReadyPromise","provide","entries","Promise","resolve","WEB_COMPONENT_NAME","console","error","window","customElements","define"],"mappings":";;;;;;;;;;;;;AAWA,OAAO,SAASA,iBACZC,iBAA6C,EAC7CC,oBAAgD;IAEhD,MAAMC,iBAAiBC;QAqBnB,MAAMH,oBAAoB;YACtB,MAAM,IAAI,CAACI,YAAY;YACvBJ,8BAAAA,wCAAAA,kBAAoB;gBAChB,GAAG,IAAI,CAACK,QAAQ;gBAChBC,SAAS,IAAI,CAACA,OAAO;YACzB;QACJ;QAEA,MAAML,uBAAuB;YACzB,MAAM,IAAI,CAACG,YAAY;YACvBH,iCAAAA,2CAAAA,qBAAuB;gBACnB,GAAG,IAAI,CAACI,QAAQ;gBAChBC,SAAS,IAAI,CAACA,OAAO;YACzB;QACJ;QAEAC,wBAAwB;QACpB;;;;aAIC,GACL;QAEA,IAAYF,WAAW;YACnB,OAAO;gBACHG,WAAW,IAAI,CAACA,SAAS;gBACzBC,YAAY,IAAI,CAACA,UAAU;gBAC3BC,UAAU,IAAI,CAACA,QAAQ;YAC3B;QACJ;QAEA,IAAYJ,UAAU;gBACA;YAAlB,OAAOK,KAAKC,KAAK,CAAC,CAAA,wBAAA,IAAI,CAACC,OAAO,CAACP,OAAO,cAApB,mCAAA,wBAAwB;QAC9C;QAhDAQ,aAAc;YACV,KAAK,IAPT,uBAAQN,aAAR,KAAA,IACA,uBAAQC,cAAR,KAAA,IACA,uBAAQC,YAAR,KAAA,IACA,uBAAiBN,gBAAjB,KAAA,IACA,uBAAQW,uBAAR,KAAA,IASAC,uBAAAA,WAAU,CAACC;gBACP,IAAI,CAACT,SAAS,GAAGS,QAAQT,SAAS;gBAClC,IAAI,CAACC,UAAU,GAAGQ,QAAQR,UAAU;gBACpC,IAAI,CAACC,QAAQ,GAAGO,QAAQP,QAAQ;gBAChC,IAAI,CAACK,mBAAmB;YAC5B;YAVI,IAAI,CAACX,YAAY,GAAG,IAAIc,QAAQC,CAAAA;gBAC5B,IAAI,CAACJ,mBAAmB,GAAGI;YAC/B;QACJ;IA4CJ;IAEA,IAAI,CAACC,oBAAoB;QACrB,sCAAsC;QACtCC,QAAQC,KAAK,CAAC;QACd;IACJ;IAEAC,OAAOC,cAAc,CAACC,MAAM,CAAC,CAAC,SAAS,EAAEL,oBAAoB,EAAElB;AACnE"}
|
package/dist/types.d.ts
CHANGED
|
@@ -5,4 +5,15 @@ export type JSON = JSONPrimitive | {
|
|
|
5
5
|
export type Serializable<T> = {
|
|
6
6
|
[P in keyof T]: T[P] extends JSONPrimitive ? T[P] : T[P] extends Function | Date | Map<any, any> | Set<any> | symbol ? never : T[P] extends (infer U)[] ? Serializable<U>[] : Serializable<T[P]>;
|
|
7
7
|
};
|
|
8
|
+
export interface Metadata {
|
|
9
|
+
name: string;
|
|
10
|
+
version?: string;
|
|
11
|
+
bundledWith?: Record<string, string | undefined>;
|
|
12
|
+
sharedDependencies: Record<string, string>;
|
|
13
|
+
dependencies?: Record<string, string>;
|
|
14
|
+
entrypoints?: Record<string, {
|
|
15
|
+
css: string[];
|
|
16
|
+
js: string[];
|
|
17
|
+
}>;
|
|
18
|
+
}
|
|
8
19
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC;AAEzE,MAAM,MAAM,IAAI,GAAG,aAAa,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG,IAAI,EAAE,CAAC;AAE7E,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI;KACzB,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,aAAa,GACpC,CAAC,CAAC,CAAC,CAAC,GACJ,CAAC,CAAC,CAAC,CAAC,SAAS,QAAQ,GAAG,IAAI,GAAG,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,MAAM,GAC9D,KAAK,GACL,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,GACtB,YAAY,CAAC,CAAC,CAAC,EAAE,GACjB,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAC/B,CAAC"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC;AAEzE,MAAM,MAAM,IAAI,GAAG,aAAa,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG,IAAI,EAAE,CAAC;AAE7E,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI;KACzB,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,aAAa,GACpC,CAAC,CAAC,CAAC,CAAC,GACJ,CAAC,CAAC,CAAC,CAAC,SAAS,QAAQ,GAAG,IAAI,GAAG,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,MAAM,GAC9D,KAAK,GACL,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,GACtB,YAAY,CAAC,CAAC,CAAC,EAAE,GACjB,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAC/B,CAAC;AAEF,MAAM,WAAW,QAAQ;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACjD,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3C,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,GAAG,EAAE,MAAM,EAAE,CAAC;QAAC,EAAE,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;CACjE"}
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types.ts"],"sourcesContent":["export type JSONPrimitive = string | number | boolean | null | undefined;\n\nexport type JSON = JSONPrimitive | { [key: string | number]: JSON } | JSON[];\n\nexport type Serializable<T> = {\n [P in keyof T]: T[P] extends JSONPrimitive\n ? T[P]\n : T[P] extends Function | Date | Map<any, any> | Set<any> | symbol\n ? never\n : T[P] extends (infer U)[]\n ? Serializable<U>[]\n : Serializable<T[P]>;\n};\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../src/types.ts"],"sourcesContent":["export type JSONPrimitive = string | number | boolean | null | undefined;\n\nexport type JSON = JSONPrimitive | { [key: string | number]: JSON } | JSON[];\n\nexport type Serializable<T> = {\n [P in keyof T]: T[P] extends JSONPrimitive\n ? T[P]\n : T[P] extends Function | Date | Map<any, any> | Set<any> | symbol\n ? never\n : T[P] extends (infer U)[]\n ? Serializable<U>[]\n : Serializable<T[P]>;\n};\n\nexport interface Metadata {\n name: string;\n version?: string;\n bundledWith?: Record<string, string | undefined>;\n sharedDependencies: Record<string, string>;\n dependencies?: Record<string, string>;\n entrypoints?: Record<string, { css: string[]; js: string[] }>;\n}\n"],"names":[],"mappings":"AAcA,WAOC"}
|
|
@@ -1,27 +1,18 @@
|
|
|
1
1
|
import { ExposedDependencies, ExposedInstanceDependencies, GetJsonError } from '../common';
|
|
2
2
|
import { EntryPoints } from './get-entry-points';
|
|
3
|
-
export interface Metadata {
|
|
4
|
-
name: string;
|
|
5
|
-
version?: string;
|
|
6
|
-
bundledWith?: Record<string, string | undefined>;
|
|
7
|
-
sharedDependencies: Record<string, string>;
|
|
8
|
-
dependencies?: Record<string, string>;
|
|
9
|
-
entrypoints?: Record<string, {
|
|
10
|
-
css: string[];
|
|
11
|
-
js: string[];
|
|
12
|
-
}>;
|
|
13
|
-
}
|
|
14
3
|
export type BundleInfo = Awaited<ReturnType<typeof getBundleInfo>>;
|
|
15
4
|
interface GetBundleInfoProps {
|
|
5
|
+
cache: boolean | number;
|
|
16
6
|
exposedDependencies?: ExposedDependencies;
|
|
17
7
|
exposedInstanceDependencies?: ExposedInstanceDependencies;
|
|
18
8
|
fallbackPackageUrl?: string;
|
|
9
|
+
isHeadless?: boolean;
|
|
19
10
|
mainPackageUrl: string;
|
|
20
11
|
onRequestError?: (error: GetJsonError) => void;
|
|
21
12
|
retries?: number;
|
|
22
13
|
signal?: AbortSignal;
|
|
23
14
|
}
|
|
24
|
-
export declare function getBundleInfo({ mainPackageUrl, fallbackPackageUrl, exposedDependencies, exposedInstanceDependencies, signal, retries, onRequestError, }: GetBundleInfoProps): Promise<{
|
|
15
|
+
export declare function getBundleInfo({ cache, mainPackageUrl, fallbackPackageUrl, exposedDependencies, exposedInstanceDependencies, isHeadless, signal, retries, onRequestError, }: GetBundleInfoProps): Promise<{
|
|
25
16
|
bundledWith: Record<string, string | undefined> | undefined;
|
|
26
17
|
disposer: () => void;
|
|
27
18
|
mfeSupportsRerendering: boolean;
|
|
@@ -31,6 +22,7 @@ export declare function getBundleInfo({ mainPackageUrl, fallbackPackageUrl, expo
|
|
|
31
22
|
host: string;
|
|
32
23
|
package: string;
|
|
33
24
|
}> | undefined;
|
|
25
|
+
resolvedBundleType: "headless" | "light" | "full";
|
|
34
26
|
urls: EntryPoints;
|
|
35
27
|
WebComponent: string;
|
|
36
28
|
version: string | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-bundle-info.d.ts","sourceRoot":"","sources":["../../src/utils/get-bundle-info.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,mBAAmB,EAAE,2BAA2B,EAAW,YAAY,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"get-bundle-info.d.ts","sourceRoot":"","sources":["../../src/utils/get-bundle-info.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,mBAAmB,EAAE,2BAA2B,EAAW,YAAY,EAAE,MAAM,WAAW,CAAC;AAGpG,OAAO,EAAE,WAAW,EAAkB,MAAM,oBAAoB,CAAC;AAOjE,MAAM,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC,CAAC;AAEnE,UAAU,kBAAkB;IACxB,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC;IACxB,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;IAC1C,2BAA2B,CAAC,EAAE,2BAA2B,CAAC;IAC1D,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,WAAW,CAAC;CACxB;AAED,wBAAsB,aAAa,CAAC,EAChC,KAAK,EACL,cAAc,EACd,kBAAkB,EAClB,mBAAwB,EACxB,2BAAgC,EAChC,UAAU,EACV,MAAM,EACN,OAAO,EACP,cAAc,GACjB,EAAE,kBAAkB;;;;;;;;;;;;;;GAiFpB"}
|