@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.
Files changed (78) hide show
  1. package/dist/contexts/tests/mfe-data-context.test.js +34 -0
  2. package/dist/contexts/tests/mfe-data-context.test.js.map +1 -0
  3. package/dist/contexts/tests/mfe-metadata-context.test.js +41 -0
  4. package/dist/contexts/tests/mfe-metadata-context.test.js.map +1 -0
  5. package/dist/headless-loader.d.ts +5 -0
  6. package/dist/headless-loader.d.ts.map +1 -0
  7. package/dist/headless-loader.js +17 -0
  8. package/dist/headless-loader.js.map +1 -0
  9. package/dist/index.d.ts +2 -0
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +2 -0
  12. package/dist/index.js.map +1 -1
  13. package/dist/loader.d.ts +10 -4
  14. package/dist/loader.d.ts.map +1 -1
  15. package/dist/loader.js +32 -40
  16. package/dist/loader.js.map +1 -1
  17. package/dist/register-headless.d.ts +9 -0
  18. package/dist/register-headless.d.ts.map +1 -0
  19. package/dist/register-headless.js +67 -0
  20. package/dist/register-headless.js.map +1 -0
  21. package/dist/types.d.ts +11 -0
  22. package/dist/types.d.ts.map +1 -1
  23. package/dist/types.js.map +1 -1
  24. package/dist/utils/get-bundle-info.d.ts +4 -12
  25. package/dist/utils/get-bundle-info.d.ts.map +1 -1
  26. package/dist/utils/get-bundle-info.js +29 -42
  27. package/dist/utils/get-bundle-info.js.map +1 -1
  28. package/dist/utils/get-cache-setting.d.ts +2 -0
  29. package/dist/utils/get-cache-setting.d.ts.map +1 -0
  30. package/dist/utils/get-cache-setting.js +6 -0
  31. package/dist/utils/get-cache-setting.js.map +1 -0
  32. package/dist/utils/get-cached-metadata.d.ts +18 -0
  33. package/dist/utils/get-cached-metadata.d.ts.map +1 -0
  34. package/dist/utils/get-cached-metadata.js +47 -0
  35. package/dist/utils/get-cached-metadata.js.map +1 -0
  36. package/dist/utils/get-mfe-has-compatible-launchdarkly-version.d.ts +1 -1
  37. package/dist/utils/get-mfe-has-compatible-launchdarkly-version.d.ts.map +1 -1
  38. package/dist/utils/get-mfe-has-compatible-launchdarkly-version.js.map +1 -1
  39. package/dist/utils/get-mfe-has-unique-chunk-namespace.d.ts +1 -1
  40. package/dist/utils/get-mfe-has-unique-chunk-namespace.d.ts.map +1 -1
  41. package/dist/utils/get-mfe-has-unique-chunk-namespace.js.map +1 -1
  42. package/dist/utils/get-mfe-supports-rerendering.d.ts +1 -1
  43. package/dist/utils/get-mfe-supports-rerendering.d.ts.map +1 -1
  44. package/dist/utils/get-mfe-supports-rerendering.js.map +1 -1
  45. package/dist/utils/get-version-mismatches.d.ts +1 -1
  46. package/dist/utils/get-version-mismatches.d.ts.map +1 -1
  47. package/dist/utils/get-version-mismatches.js +1 -1
  48. package/dist/utils/get-version-mismatches.js.map +1 -1
  49. package/dist/utils/web-component.d.ts +1 -1
  50. package/dist/utils/web-component.d.ts.map +1 -1
  51. package/dist/utils/web-component.js +12 -9
  52. package/dist/utils/web-component.js.map +1 -1
  53. package/package.json +12 -12
  54. package/src/__tests__/headless-loader.test.tsx +123 -0
  55. package/src/__tests__/loader.test.tsx +33 -11
  56. package/src/__tests__/register-headless.test.tsx +98 -0
  57. package/src/headless-loader.tsx +21 -0
  58. package/src/index.ts +2 -0
  59. package/src/loader.tsx +58 -46
  60. package/src/register-headless.ts +81 -0
  61. package/src/types.ts +9 -0
  62. package/src/utils/__tests__/get-version-mismatches.test.ts +1 -1
  63. package/src/utils/get-bundle-info.ts +37 -60
  64. package/src/utils/get-cache-setting.ts +5 -0
  65. package/src/utils/get-cached-metadata.ts +72 -0
  66. package/src/utils/get-mfe-has-compatible-launchdarkly-version.ts +1 -1
  67. package/src/utils/get-mfe-has-unique-chunk-namespace.ts +1 -1
  68. package/src/utils/get-mfe-supports-rerendering.ts +1 -1
  69. package/src/utils/get-version-mismatches.ts +1 -1
  70. package/src/utils/web-component.tsx +8 -6
  71. package/dist/__mocks__/expect-styles-in-dom.d.ts +0 -3
  72. package/dist/__mocks__/expect-styles-in-dom.d.ts.map +0 -1
  73. package/dist/__mocks__/index.d.ts +0 -4
  74. package/dist/__mocks__/index.d.ts.map +0 -1
  75. package/dist/__mocks__/register-component.d.ts +0 -4
  76. package/dist/__mocks__/register-component.d.ts.map +0 -1
  77. package/dist/__mocks__/test-component.d.ts +0 -3
  78. 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
@@ -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;AAE3B,YAAY,EAAE,IAAI,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,SAAS,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 LoaderProps<T> {
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 LoaderDataProps = Pick<LoaderProps<{}>, 'data' | 'className'> & {
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
- export declare const Loader: import("react").ForwardRefExoticComponent<LoaderProps<{}> & import("react").RefAttributes<LoaderRef>>;
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
@@ -1 +1 @@
1
- {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../src/loader.tsx"],"names":[],"mappings":"AAAA,OAAO,EAEH,SAAS,EAQZ,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;AAYxD,MAAM,MAAM,SAAS,GAAG,QAAQ,CAAC;AAEjC,MAAM,MAAM,YAAY,GAAG,WAAW,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC;AAEzD,MAAM,WAAW,WAAW,CAAC,CAAC;IAC1B,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,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IACzB,cAAc,CAAC,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC;CACjD;AAED,MAAM,MAAM,eAAe,GAAG,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,WAAW,CAAC,GAAG;IACxE,eAAe,EAAE,MAAM,GAAG,CAAC,OAAO,CAAC;CACtC,CAAC;AAEF,eAAO,MAAM,MAAM,uGAuEjB,CAAC"}
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 { TtlCache, getBundleInfo, getLDServiceToken, validateBundleInfo, loadScripts, webComponent } from './utils';
11
- export const Loader = /*#__PURE__*/ forwardRef((props, ref)=>{
12
- const { cache = true, basename, fallbackSrc, onRequestError, retries, src } = props;
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 = cache ? bundleCache.get(src) : undefined;
105
- if (!bundleInfo) {
106
- try {
107
- bundleInfo = await getBundleInfo({
108
- mainPackageUrl: src,
109
- fallbackPackageUrl: fallbackSrc,
110
- exposedDependencies,
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
- logService,
134
- packageUrl: src
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
@@ -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
@@ -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":"AAIA,WAQE"}
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;AACpG,OAAO,EAAE,WAAW,EAAkB,MAAM,oBAAoB,CAAC;AAOjE,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;AAED,MAAM,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC,CAAC;AAEnE,UAAU,kBAAkB;IACxB,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;IAC1C,2BAA2B,CAAC,EAAE,2BAA2B,CAAC;IAC1D,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,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,cAAc,EACd,kBAAkB,EAClB,mBAAwB,EACxB,2BAAgC,EAChC,MAAM,EACN,OAAO,EACP,cAAc,GACjB,EAAE,kBAAkB;;;;;;;;;;;;;GAqEpB"}
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"}