@servicetitan/web-components 33.1.0 → 34.0.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 (87) hide show
  1. package/dist/common.d.ts +1 -4
  2. package/dist/common.d.ts.map +1 -1
  3. package/dist/common.js +4 -4
  4. package/dist/common.js.map +1 -1
  5. package/dist/contexts/tests/mfe-data-context.test.js.map +1 -1
  6. package/dist/contexts/tests/mfe-metadata-context.test.js.map +1 -1
  7. package/dist/event-bus.d.ts.map +1 -1
  8. package/dist/event-bus.js.map +1 -1
  9. package/dist/globals.d.ts +2 -1
  10. package/dist/globals.d.ts.map +1 -1
  11. package/dist/globals.js +1 -1
  12. package/dist/globals.js.map +1 -1
  13. package/dist/headless-loader.d.ts.map +1 -1
  14. package/dist/headless-loader.js.map +1 -1
  15. package/dist/history-manager.d.ts.map +1 -1
  16. package/dist/history-manager.js.map +1 -1
  17. package/dist/loader.d.ts.map +1 -1
  18. package/dist/loader.js +4 -5
  19. package/dist/loader.js.map +1 -1
  20. package/dist/register-headless.d.ts.map +1 -1
  21. package/dist/register-headless.js.map +1 -1
  22. package/dist/register.d.ts.map +1 -1
  23. package/dist/register.js +5 -6
  24. package/dist/register.js.map +1 -1
  25. package/dist/render.js +1 -1
  26. package/dist/render.js.map +1 -1
  27. package/dist/use-prefetch.d.ts.map +1 -1
  28. package/dist/use-prefetch.js.map +1 -1
  29. package/dist/utils/get-bundle-info.d.ts +2 -1
  30. package/dist/utils/get-bundle-info.d.ts.map +1 -1
  31. package/dist/utils/get-bundle-info.js +4 -4
  32. package/dist/utils/get-bundle-info.js.map +1 -1
  33. package/dist/utils/get-entry-points.js +1 -1
  34. package/dist/utils/get-entry-points.js.map +1 -1
  35. package/dist/utils/get-ld-service-token.js +1 -1
  36. package/dist/utils/get-ld-service-token.js.map +1 -1
  37. package/dist/utils/get-mfe-supports-rerendering.js +1 -1
  38. package/dist/utils/get-mfe-supports-rerendering.js.map +1 -1
  39. package/dist/utils/index.d.ts +0 -1
  40. package/dist/utils/index.d.ts.map +1 -1
  41. package/dist/utils/index.js +0 -1
  42. package/dist/utils/index.js.map +1 -1
  43. package/dist/utils/validate-bundle-info.d.ts +2 -1
  44. package/dist/utils/validate-bundle-info.d.ts.map +1 -1
  45. package/dist/utils/validate-bundle-info.js +2 -2
  46. package/dist/utils/validate-bundle-info.js.map +1 -1
  47. package/dist/utils/web-component.d.ts +4 -3
  48. package/dist/utils/web-component.d.ts.map +1 -1
  49. package/dist/utils/web-component.js +2 -2
  50. package/dist/utils/web-component.js.map +1 -1
  51. package/package.json +15 -13
  52. package/src/__mocks__/test-component.tsx +1 -1
  53. package/src/__tests__/delayed.test.tsx +0 -1
  54. package/src/__tests__/event-bus.test.ts +1 -1
  55. package/src/__tests__/loader.test.tsx +7 -6
  56. package/src/__tests__/register-anvil2.test.tsx +0 -1
  57. package/src/__tests__/register-headless.test.tsx +0 -1
  58. package/src/__tests__/register.test.tsx +1 -1
  59. package/src/__tests__/use-prefetch.test.tsx +2 -2
  60. package/src/common.ts +3 -12
  61. package/src/contexts/tests/mfe-data-context.test.tsx +1 -1
  62. package/src/contexts/tests/mfe-metadata-context.test.tsx +1 -1
  63. package/src/event-bus.ts +0 -1
  64. package/src/globals.ts +2 -1
  65. package/src/headless-loader.tsx +1 -1
  66. package/src/history-manager.ts +1 -2
  67. package/src/loader.tsx +7 -8
  68. package/src/register-headless.ts +1 -1
  69. package/src/register.tsx +6 -7
  70. package/src/use-prefetch.ts +1 -1
  71. package/src/utils/__tests__/get-mfe-supports-rerendering.test.ts +1 -1
  72. package/src/utils/get-bundle-info.ts +6 -7
  73. package/src/utils/index.ts +0 -1
  74. package/src/utils/validate-bundle-info.ts +2 -1
  75. package/src/utils/web-component.tsx +6 -6
  76. package/dist/utils/get-version-mismatches.d.ts +0 -6
  77. package/dist/utils/get-version-mismatches.d.ts.map +0 -1
  78. package/dist/utils/get-version-mismatches.js +0 -30
  79. package/dist/utils/get-version-mismatches.js.map +0 -1
  80. package/dist/utils/is-compatible.d.ts +0 -2
  81. package/dist/utils/is-compatible.d.ts.map +0 -1
  82. package/dist/utils/is-compatible.js +0 -31
  83. package/dist/utils/is-compatible.js.map +0 -1
  84. package/src/utils/__tests__/get-version-mismatches.test.ts +0 -86
  85. package/src/utils/__tests__/is-compatible.test.ts +0 -91
  86. package/src/utils/get-version-mismatches.ts +0 -36
  87. package/src/utils/is-compatible.ts +0 -37
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/register.tsx"],"sourcesContent":["import { FC, ComponentType, ReactElement, useEffect } from 'react';\nimport { type LDService } from '@servicetitan/launchdarkly-service';\nimport { Log } from '@servicetitan/log-service';\nimport { Provider } from '@servicetitan/react-ioc';\n\nimport {\n BASENAME_TOKEN,\n EXPOSED_DEPENDENCIES_TOKEN,\n EXPOSED_INSTANCE_DEPENDENCIES_TOKEN,\n IS_WEB_COMPONENT_TOKEN,\n RENDER_ROOT_TOKEN,\n Entries,\n ExposedDependencies,\n ExposedInstanceDependencies,\n IWebComponent,\n} from './common';\nimport { MFEDataContext } from './contexts/mfe-data-context';\nimport { MFEMetadataContext } from './contexts/mfe-metadata-context';\nimport { EventBus, EVENT_BUS_TOKEN } from './event-bus';\nimport { WEB_COMPONENT_NAME } from './globals';\nimport { HistoryManager } from './history-manager';\nimport { render } from './render';\nimport { getElementName, getLDServiceToken } from './utils';\n\nfunction createLink(url: string, onLoad: () => void) {\n const element = document.createElement('link');\n\n element.href = url;\n element.rel = 'stylesheet';\n element.crossOrigin = 'anonymous';\n element.onload = onLoad;\n element.onerror = onLoad;\n\n return element;\n}\n\nconst Placeholder: FC = () => <div style={{ display: 'none' }} />;\n\nexport interface RegisterOptions {\n legacyRoot?: boolean;\n sharedDependenciesNames?: string[];\n}\n\nexport function register(Component: ComponentType, light: boolean, options?: RegisterOptions) {\n class WebComponent extends HTMLElement implements IWebComponent {\n private root?: ShadowRoot;\n private portal?: ShadowRoot;\n private portalAnvilContainer?: HTMLDivElement;\n\n private styles: {\n total: number;\n loaded: number;\n elements: HTMLElement[];\n } = { total: 0, loaded: 0, elements: [] };\n\n private ldService?: LDService;\n private logService?: Log;\n private historyManager?: HistoryManager;\n private exposedDependencies?: ExposedDependencies;\n private exposedInstanceDependencies?: ExposedInstanceDependencies;\n private eventBus?: EventBus;\n private basename?: string;\n private onReady?: () => void;\n private onDispose?: () => void;\n private view?: ReturnType<typeof render>;\n\n connectedCallback() {\n /*\n * connectedCallback can be called when DOM element has moved\n * check that root is still connected to the DOM\n * if that's the case we don't need to reconnect MFE\n */\n if (this.root?.isConnected) {\n return;\n }\n const sharedDependenciesNames = options?.sharedDependenciesNames ?? [];\n const styleUrls = getStyleUrls(light, sharedDependenciesNames, this);\n\n this.styles = {\n total: styleUrls.length * 2,\n loaded: 0,\n elements: [],\n };\n\n this.root = this.shadowRoot ?? this.attachShadow({ mode: 'open' });\n /*\n * Portal shadow dom is created at the bottom of the body in order to be used as\n * the element for the design system components to attach modals and popups to.\n * This element is passed down the tree through context, and used within\n * the design system components.\n */\n const portalElement = document.createElement('div');\n portalElement.setAttribute(\n 'data-mfe-portal-name',\n getElementName({ WebComponent: WEB_COMPONENT_NAME! })\n );\n this.portal = document.body.appendChild(portalElement).attachShadow({ mode: 'open' });\n /*\n * Add element inside of portal so that Anvil 2 can attach modals and popups to it\n * since floating-ui does not support attaching straight to shadow dom\n */\n this.portalAnvilContainer = document.createElement('div');\n this.portal.appendChild(this.portalAnvilContainer);\n\n this.view = render(<Placeholder />, this.root, options);\n\n this.styles.elements.push(\n ...this.attachStyles(this.root, styleUrls),\n ...this.attachStyles(this.portal, styleUrls)\n );\n }\n\n disconnectedCallback() {\n if (!this.root || this.root?.isConnected) {\n return;\n }\n for (const element of this.styles.elements) {\n element.remove();\n }\n\n this.view?.unmount();\n document.body.removeChild(this.portal!.host);\n this.root = undefined;\n this.portal = undefined;\n this.portalAnvilContainer = undefined;\n\n this.onDispose?.();\n }\n\n // Observe changes to the data-mfe-data attribute so that we can re-render when it changes\n static get observedAttributes() {\n return ['data-mfe-data'];\n }\n\n attributeChangedCallback() {\n this.render();\n }\n\n provide = (entries: Entries) => {\n for (const [key, value] of Object.entries(entries)) {\n this[key as keyof IWebComponent] = value;\n }\n\n if (this.styles.loaded === this.styles.total && Object.values(entries).some(v => !!v)) {\n this.render();\n }\n };\n\n private handleLoad = () => {\n this.styles.loaded++;\n\n if (this.styles.loaded === this.styles.total) {\n this.render();\n }\n };\n\n private attachStyles = (node: ShadowRoot, urls: string[]) => {\n const elements: HTMLElement[] = [];\n\n for (const url of urls) {\n const element = createLink(url, this.handleLoad);\n node.appendChild(element);\n elements.push(element);\n }\n\n return elements;\n };\n\n private withAnvil1Providers(children: ReactElement): ReactElement {\n try {\n /**\n * Note, the webpack.IgnorePlugin must be configured to ignore this dependency.\n * @see {@link file://./../../startup/src/webpack/configs/plugins/ignore-plugin/ignore-plugin.ts}\n */\n const { DefaultPortalContext, TablePopupPropsContext } =\n require('@servicetitan/design-system') as typeof import('@servicetitan/design-system');\n return (\n <DefaultPortalContext.Provider value={this.portal as unknown as HTMLElement}>\n <TablePopupPropsContext.Provider\n value={props => ({\n ...props,\n appendTo: this.root as unknown as HTMLElement,\n })}\n >\n {children}\n </TablePopupPropsContext.Provider>\n </DefaultPortalContext.Provider>\n );\n } catch {\n return children;\n }\n }\n\n private withAnvil2Providers(children: ReactElement): ReactElement {\n try {\n /**\n * Note, the webpack.IgnorePlugin must be configured to ignore this dependency.\n * @see {@link file://./../../startup/src/webpack/configs/plugins/ignore-plugin/ignore-plugin.ts}\n */\n const { PortalProvider } =\n require('@servicetitan/anvil2') as typeof import('@servicetitan/anvil2');\n return <PortalProvider root={this.portalAnvilContainer}>{children}</PortalProvider>;\n } catch {\n return children;\n }\n }\n\n private withProviders(children: ReactElement): ReactElement {\n return this.withAnvil2Providers(this.withAnvil1Providers(children));\n }\n\n private render = () => {\n /*\n * Check for this.root first, otherwise we get error when\n * attributeChangedCallback happens on load\n */\n if (this.root) {\n const mfeData = this.dataset.mfeData\n ? /*\n * Data was stringified in order to come through the data-mfe-data attribute\n * So we must JSON.parse it here to get an object back\n */\n JSON.parse(this.dataset.mfeData)\n : /*\n * If mfeData isn't there, then the Host may not be up to date with web-components\n * and is instead passing data through separate data-attributes, so we want to\n * spread all of those instead\n */\n { ...this.dataset };\n\n const metadata = {\n shadowRoot: this.root,\n portalShadowRoot: this.portal!,\n };\n\n this.view?.rerender(\n <Provider\n singletons={[\n { provide: IS_WEB_COMPONENT_TOKEN, useValue: true },\n { provide: RENDER_ROOT_TOKEN, useValue: this.root },\n ]}\n >\n <Provider\n singletons={[\n { provide: Log, useValue: this.logService },\n {\n provide: HistoryManager,\n useValue: this.historyManager,\n },\n {\n provide: EXPOSED_DEPENDENCIES_TOKEN,\n useValue: this.exposedDependencies,\n },\n {\n provide: EXPOSED_INSTANCE_DEPENDENCIES_TOKEN,\n useValue: this.exposedInstanceDependencies,\n },\n { provide: BASENAME_TOKEN, useValue: this.basename },\n { provide: EVENT_BUS_TOKEN, useValue: this.eventBus },\n { provide: getLDServiceToken(), useValue: this.ldService },\n ].filter(\n ({ provide, useValue }) =>\n useValue !== undefined && provide !== undefined\n )}\n >\n <MFEDataContext.Provider value={{ ...mfeData }}>\n <MFEMetadataContext.Provider value={metadata}>\n {this.withProviders(<Component {...mfeData} />)}\n {this.onReady && <RenderCallback callback={this.onReady} />}\n </MFEMetadataContext.Provider>\n </MFEDataContext.Provider>\n </Provider>\n </Provider>\n );\n }\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(WEB_COMPONENT_NAME, WebComponent);\n}\n\nfunction getStyleUrls(light: boolean, sharedDependenciesNames: string[], el: HTMLElement) {\n function getCssUrl(dependencyName: string, cssFileRegEx: RegExp) {\n if (light && sharedDependenciesNames.includes(dependencyName)) {\n return Array.from(document.getElementsByTagName('link')).find(\n ({ href }) => href && cssFileRegEx.test(href)\n )?.href;\n }\n }\n\n const designSystemUrl = getCssUrl(\n '@servicetitan/design-system',\n /design-system(\\..+)?\\.bundle\\.css/\n );\n const anvil2CssUrl = getCssUrl('@servicetitan/anvil2', /anvil2(\\..+)?\\.bundle\\.css/);\n\n return [\n ...(designSystemUrl ? [designSystemUrl] : []),\n ...(anvil2CssUrl ? [anvil2CssUrl] : []),\n ...(el.hasAttribute('style-urls')\n ? JSON.parse(decodeURIComponent(el.getAttribute('style-urls')!))\n : []),\n ];\n}\n\nfunction RenderCallback({ callback }: { callback: () => void }) {\n // eslint-disable-next-line react-hooks/exhaustive-deps\n useEffect(() => callback(), []);\n return null;\n}\n"],"names":["useEffect","Log","Provider","BASENAME_TOKEN","EXPOSED_DEPENDENCIES_TOKEN","EXPOSED_INSTANCE_DEPENDENCIES_TOKEN","IS_WEB_COMPONENT_TOKEN","RENDER_ROOT_TOKEN","MFEDataContext","MFEMetadataContext","EVENT_BUS_TOKEN","WEB_COMPONENT_NAME","HistoryManager","render","getElementName","getLDServiceToken","createLink","url","onLoad","element","document","createElement","href","rel","crossOrigin","onload","onerror","Placeholder","div","style","display","register","Component","light","options","WebComponent","HTMLElement","connectedCallback","root","isConnected","sharedDependenciesNames","styleUrls","getStyleUrls","styles","total","length","loaded","elements","shadowRoot","attachShadow","mode","portalElement","setAttribute","portal","body","appendChild","portalAnvilContainer","view","push","attachStyles","disconnectedCallback","remove","unmount","removeChild","host","undefined","onDispose","observedAttributes","attributeChangedCallback","withAnvil1Providers","children","DefaultPortalContext","TablePopupPropsContext","require","value","props","appendTo","withAnvil2Providers","PortalProvider","withProviders","ldService","logService","historyManager","exposedDependencies","exposedInstanceDependencies","eventBus","basename","onReady","provide","entries","key","Object","values","some","v","handleLoad","node","urls","mfeData","dataset","JSON","parse","metadata","portalShadowRoot","rerender","singletons","useValue","filter","RenderCallback","callback","console","error","window","customElements","define","el","getCssUrl","dependencyName","cssFileRegEx","includes","Array","from","getElementsByTagName","find","test","designSystemUrl","anvil2CssUrl","hasAttribute","decodeURIComponent","getAttribute"],"mappings":"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"}
1
+ {"version":3,"sources":["../src/register.tsx"],"sourcesContent":["import { type LDService } from '@servicetitan/launchdarkly-service';\nimport { Log } from '@servicetitan/log-service';\nimport { Provider } from '@servicetitan/react-ioc';\nimport { ExposedDependencies } from '@servicetitan/startup-utils';\nimport { ComponentType, FC, ReactElement, useEffect } from 'react';\nimport {\n BASENAME_TOKEN,\n Entries,\n EXPOSED_DEPENDENCIES_TOKEN,\n EXPOSED_INSTANCE_DEPENDENCIES_TOKEN,\n ExposedInstanceDependencies,\n IS_WEB_COMPONENT_TOKEN,\n IWebComponent,\n RENDER_ROOT_TOKEN,\n} from './common';\nimport { MFEDataContext } from './contexts/mfe-data-context';\nimport { MFEMetadataContext } from './contexts/mfe-metadata-context';\nimport { EVENT_BUS_TOKEN, EventBus } from './event-bus';\nimport { WEB_COMPONENT_NAME } from './globals';\nimport { HistoryManager } from './history-manager';\nimport { render } from './render';\nimport { getElementName, getLDServiceToken } from './utils';\n\nfunction createLink(url: string, onLoad: () => void) {\n const element = document.createElement('link');\n\n element.href = url;\n element.rel = 'stylesheet';\n element.crossOrigin = 'anonymous';\n element.onload = onLoad;\n element.onerror = onLoad;\n\n return element;\n}\n\nconst Placeholder: FC = () => <div style={{ display: 'none' }} />;\n\nexport interface RegisterOptions {\n legacyRoot?: boolean;\n sharedDependenciesNames?: string[];\n}\n\nexport function register(Component: ComponentType, light: boolean, options?: RegisterOptions) {\n class WebComponent extends HTMLElement implements IWebComponent {\n private root?: ShadowRoot;\n private portal?: ShadowRoot;\n private portalAnvilContainer?: HTMLDivElement;\n\n private styles: {\n total: number;\n loaded: number;\n elements: HTMLElement[];\n } = { total: 0, loaded: 0, elements: [] };\n\n private ldService?: LDService;\n private logService?: Log;\n private historyManager?: HistoryManager;\n private exposedDependencies?: ExposedDependencies;\n private exposedInstanceDependencies?: ExposedInstanceDependencies;\n private eventBus?: EventBus;\n private basename?: string;\n private onReady?: () => void;\n private onDispose?: () => void;\n private view?: ReturnType<typeof render>;\n\n connectedCallback() {\n /*\n * connectedCallback can be called when DOM element has moved\n * check that root is still connected to the DOM\n * if that's the case we don't need to reconnect MFE\n */\n if (this.root?.isConnected) {\n return;\n }\n const sharedDependenciesNames = options?.sharedDependenciesNames ?? [];\n const styleUrls = getStyleUrls(light, sharedDependenciesNames, this);\n\n this.styles = {\n total: styleUrls.length * 2,\n loaded: 0,\n elements: [],\n };\n\n this.root = this.shadowRoot ?? this.attachShadow({ mode: 'open' });\n /*\n * Portal shadow dom is created at the bottom of the body in order to be used as\n * the element for the design system components to attach modals and popups to.\n * This element is passed down the tree through context, and used within\n * the design system components.\n */\n const portalElement = document.createElement('div');\n portalElement.setAttribute(\n 'data-mfe-portal-name',\n getElementName({ WebComponent: WEB_COMPONENT_NAME! })\n );\n this.portal = document.body.appendChild(portalElement).attachShadow({ mode: 'open' });\n /*\n * Add element inside of portal so that Anvil 2 can attach modals and popups to it\n * since floating-ui does not support attaching straight to shadow dom\n */\n this.portalAnvilContainer = document.createElement('div');\n this.portal.appendChild(this.portalAnvilContainer);\n\n this.view = render(<Placeholder />, this.root, options);\n\n this.styles.elements.push(\n ...this.attachStyles(this.root, styleUrls),\n ...this.attachStyles(this.portal, styleUrls)\n );\n }\n\n disconnectedCallback() {\n if (!this.root || this.root?.isConnected) {\n return;\n }\n for (const element of this.styles.elements) {\n element.remove();\n }\n\n this.view?.unmount();\n document.body.removeChild(this.portal!.host);\n this.root = undefined;\n this.portal = undefined;\n this.portalAnvilContainer = undefined;\n\n this.onDispose?.();\n }\n\n // Observe changes to the data-mfe-data attribute so that we can re-render when it changes\n static get observedAttributes() {\n return ['data-mfe-data'];\n }\n\n attributeChangedCallback() {\n this.render();\n }\n\n provide = (entries: Entries) => {\n for (const [key, value] of Object.entries(entries)) {\n this[key as keyof IWebComponent] = value;\n }\n\n if (this.styles.loaded === this.styles.total && Object.values(entries).some(v => !!v)) {\n this.render();\n }\n };\n\n private handleLoad = () => {\n this.styles.loaded++;\n\n if (this.styles.loaded === this.styles.total) {\n this.render();\n }\n };\n\n private attachStyles = (node: ShadowRoot, urls: string[]) => {\n const elements: HTMLElement[] = [];\n\n for (const url of urls) {\n const element = createLink(url, this.handleLoad);\n node.appendChild(element);\n elements.push(element);\n }\n\n return elements;\n };\n\n private withAnvil1Providers(children: ReactElement): ReactElement {\n try {\n /**\n * Note, the webpack.IgnorePlugin must be configured to ignore this dependency.\n * @see {@link file://./../../startup/src/webpack/configs/plugins/ignore-plugin/ignore-plugin.ts}\n */\n const { DefaultPortalContext, TablePopupPropsContext } =\n require('@servicetitan/design-system') as typeof import('@servicetitan/design-system');\n return (\n <DefaultPortalContext.Provider value={this.portal as unknown as HTMLElement}>\n <TablePopupPropsContext.Provider\n value={props => ({\n ...props,\n appendTo: this.root as unknown as HTMLElement,\n })}\n >\n {children}\n </TablePopupPropsContext.Provider>\n </DefaultPortalContext.Provider>\n );\n } catch {\n return children;\n }\n }\n\n private withAnvil2Providers(children: ReactElement): ReactElement {\n try {\n /**\n * Note, the webpack.IgnorePlugin must be configured to ignore this dependency.\n * @see {@link file://./../../startup/src/webpack/configs/plugins/ignore-plugin/ignore-plugin.ts}\n */\n const { PortalProvider } =\n require('@servicetitan/anvil2') as typeof import('@servicetitan/anvil2');\n return <PortalProvider root={this.portalAnvilContainer}>{children}</PortalProvider>;\n } catch {\n return children;\n }\n }\n\n private withProviders(children: ReactElement): ReactElement {\n return this.withAnvil2Providers(this.withAnvil1Providers(children));\n }\n\n private render = () => {\n /*\n * Check for this.root first, otherwise we get error when\n * attributeChangedCallback happens on load\n */\n if (this.root) {\n const mfeData = this.dataset.mfeData\n ? /*\n * Data was stringified in order to come through the data-mfe-data attribute\n * So we must JSON.parse it here to get an object back\n */\n JSON.parse(this.dataset.mfeData)\n : /*\n * If mfeData isn't there, then the Host may not be up to date with web-components\n * and is instead passing data through separate data-attributes, so we want to\n * spread all of those instead\n */\n { ...this.dataset };\n\n const metadata = {\n shadowRoot: this.root,\n portalShadowRoot: this.portal!,\n };\n\n this.view?.rerender(\n <Provider\n singletons={[\n { provide: IS_WEB_COMPONENT_TOKEN, useValue: true },\n { provide: RENDER_ROOT_TOKEN, useValue: this.root },\n ]}\n >\n <Provider\n singletons={[\n { provide: Log, useValue: this.logService },\n {\n provide: HistoryManager,\n useValue: this.historyManager,\n },\n {\n provide: EXPOSED_DEPENDENCIES_TOKEN,\n useValue: this.exposedDependencies,\n },\n {\n provide: EXPOSED_INSTANCE_DEPENDENCIES_TOKEN,\n useValue: this.exposedInstanceDependencies,\n },\n { provide: BASENAME_TOKEN, useValue: this.basename },\n { provide: EVENT_BUS_TOKEN, useValue: this.eventBus },\n { provide: getLDServiceToken(), useValue: this.ldService },\n ].filter(\n ({ provide, useValue }) =>\n useValue !== undefined && provide !== undefined\n )}\n >\n <MFEDataContext.Provider value={{ ...mfeData }}>\n <MFEMetadataContext.Provider value={metadata}>\n {this.withProviders(<Component {...mfeData} />)}\n {this.onReady && <RenderCallback callback={this.onReady} />}\n </MFEMetadataContext.Provider>\n </MFEDataContext.Provider>\n </Provider>\n </Provider>\n );\n }\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(WEB_COMPONENT_NAME, WebComponent);\n}\n\nfunction getStyleUrls(light: boolean, sharedDependenciesNames: string[], el: HTMLElement) {\n function getCssUrl(dependencyName: string, cssFileRegEx: RegExp) {\n if (light && sharedDependenciesNames.includes(dependencyName)) {\n return Array.from(document.getElementsByTagName('link')).find(\n ({ href }) => href && cssFileRegEx.test(href)\n )?.href;\n }\n }\n\n const designSystemUrl = getCssUrl(\n '@servicetitan/design-system',\n /design-system(\\..+)?\\.bundle\\.css/\n );\n const anvil2CssUrl = getCssUrl('@servicetitan/anvil2', /anvil2(\\..+)?\\.bundle\\.css/);\n\n return [\n ...(designSystemUrl ? [designSystemUrl] : []),\n ...(anvil2CssUrl ? [anvil2CssUrl] : []),\n ...(el.hasAttribute('style-urls')\n ? JSON.parse(decodeURIComponent(el.getAttribute('style-urls')!))\n : []),\n ];\n}\n\nfunction RenderCallback({ callback }: { callback: () => void }) {\n // eslint-disable-next-line react-hooks/exhaustive-deps\n useEffect(() => callback(), []);\n return null;\n}\n"],"names":["Log","Provider","useEffect","BASENAME_TOKEN","EXPOSED_DEPENDENCIES_TOKEN","EXPOSED_INSTANCE_DEPENDENCIES_TOKEN","IS_WEB_COMPONENT_TOKEN","RENDER_ROOT_TOKEN","MFEDataContext","MFEMetadataContext","EVENT_BUS_TOKEN","WEB_COMPONENT_NAME","HistoryManager","render","getElementName","getLDServiceToken","createLink","url","onLoad","element","document","createElement","href","rel","crossOrigin","onload","onerror","Placeholder","div","style","display","register","Component","light","options","WebComponent","HTMLElement","connectedCallback","root","isConnected","sharedDependenciesNames","styleUrls","getStyleUrls","styles","total","length","loaded","elements","shadowRoot","attachShadow","mode","portalElement","setAttribute","portal","body","appendChild","portalAnvilContainer","view","push","attachStyles","disconnectedCallback","remove","unmount","removeChild","host","undefined","onDispose","observedAttributes","attributeChangedCallback","withAnvil1Providers","children","DefaultPortalContext","TablePopupPropsContext","require","value","props","appendTo","withAnvil2Providers","PortalProvider","withProviders","ldService","logService","historyManager","exposedDependencies","exposedInstanceDependencies","eventBus","basename","onReady","provide","entries","key","Object","values","some","v","handleLoad","node","urls","mfeData","dataset","JSON","parse","metadata","portalShadowRoot","rerender","singletons","useValue","filter","RenderCallback","callback","console","error","window","customElements","define","el","getCssUrl","dependencyName","cssFileRegEx","includes","Array","from","getElementsByTagName","find","test","designSystemUrl","anvil2CssUrl","hasAttribute","decodeURIComponent","getAttribute"],"mappings":"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"}
package/dist/render.js CHANGED
@@ -5,7 +5,7 @@ try {
5
5
  * Note, the webpack.IgnorePlugin must be configured to ignore this dependency.
6
6
  * @see {@link file://./../../startup/src/webpack/configs/plugins/ignore-plugin/ignore-plugin.ts}
7
7
  */ createRoot = require('react-dom/client').createRoot;
8
- } catch (e) {
8
+ } catch (unused) {
9
9
  // ignore
10
10
  }
11
11
  export function render(element, container, options) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/render.ts"],"sourcesContent":["/* eslint-disable react/no-deprecated */\nimport { ReactElement } from 'react';\nimport ReactDOM from 'react-dom';\nimport type ReactDOMClient from 'react-dom/client';\n\nlet createRoot: typeof ReactDOMClient.createRoot;\ntry {\n /**\n * Note, the webpack.IgnorePlugin must be configured to ignore this dependency.\n * @see {@link file://./../../startup/src/webpack/configs/plugins/ignore-plugin/ignore-plugin.ts}\n */\n createRoot = require('react-dom/client').createRoot;\n} catch {\n // ignore\n}\n\ninterface RenderOptions {\n legacyRoot?: boolean;\n}\n\ninterface RenderResult {\n rerender(element: ReactElement): void;\n unmount(): void;\n}\n\nexport function render(\n element: ReactElement,\n container: Element | DocumentFragment,\n options?: RenderOptions\n): RenderResult {\n if (typeof createRoot !== 'function' || options?.legacyRoot) {\n return renderLegacyRoot(element, container);\n }\n\n const root = createRoot(container);\n root.render(element);\n\n return {\n rerender(element: ReactElement) {\n root.render(element);\n },\n unmount() {\n root.unmount();\n },\n };\n}\n\nfunction renderLegacyRoot(\n element: ReactElement,\n container: Element | DocumentFragment\n): RenderResult {\n ReactDOM.render(element, container);\n\n return {\n rerender(element: ReactElement) {\n ReactDOM.render(element, container);\n },\n unmount() {\n ReactDOM.unmountComponentAtNode(container);\n },\n };\n}\n"],"names":["ReactDOM","createRoot","require","render","element","container","options","legacyRoot","renderLegacyRoot","root","rerender","unmount","unmountComponentAtNode"],"mappings":"AAAA,sCAAsC,GAEtC,OAAOA,cAAc,YAAY;AAGjC,IAAIC;AACJ,IAAI;IACA;;;KAGC,GACDA,aAAaC,QAAQ,oBAAoBD,UAAU;AACvD,EAAE,UAAM;AACJ,SAAS;AACb;AAWA,OAAO,SAASE,OACZC,OAAqB,EACrBC,SAAqC,EACrCC,OAAuB;IAEvB,IAAI,OAAOL,eAAe,eAAcK,oBAAAA,8BAAAA,QAASC,UAAU,GAAE;QACzD,OAAOC,iBAAiBJ,SAASC;IACrC;IAEA,MAAMI,OAAOR,WAAWI;IACxBI,KAAKN,MAAM,CAACC;IAEZ,OAAO;QACHM,UAASN,OAAqB;YAC1BK,KAAKN,MAAM,CAACC;QAChB;QACAO;YACIF,KAAKE,OAAO;QAChB;IACJ;AACJ;AAEA,SAASH,iBACLJ,OAAqB,EACrBC,SAAqC;IAErCL,SAASG,MAAM,CAACC,SAASC;IAEzB,OAAO;QACHK,UAASN,OAAqB;YAC1BJ,SAASG,MAAM,CAACC,SAASC;QAC7B;QACAM;YACIX,SAASY,sBAAsB,CAACP;QACpC;IACJ;AACJ"}
1
+ {"version":3,"sources":["../src/render.ts"],"sourcesContent":["/* eslint-disable react/no-deprecated */\nimport { ReactElement } from 'react';\nimport ReactDOM from 'react-dom';\nimport type ReactDOMClient from 'react-dom/client';\n\nlet createRoot: typeof ReactDOMClient.createRoot;\ntry {\n /**\n * Note, the webpack.IgnorePlugin must be configured to ignore this dependency.\n * @see {@link file://./../../startup/src/webpack/configs/plugins/ignore-plugin/ignore-plugin.ts}\n */\n createRoot = require('react-dom/client').createRoot;\n} catch {\n // ignore\n}\n\ninterface RenderOptions {\n legacyRoot?: boolean;\n}\n\ninterface RenderResult {\n rerender(element: ReactElement): void;\n unmount(): void;\n}\n\nexport function render(\n element: ReactElement,\n container: Element | DocumentFragment,\n options?: RenderOptions\n): RenderResult {\n if (typeof createRoot !== 'function' || options?.legacyRoot) {\n return renderLegacyRoot(element, container);\n }\n\n const root = createRoot(container);\n root.render(element);\n\n return {\n rerender(element: ReactElement) {\n root.render(element);\n },\n unmount() {\n root.unmount();\n },\n };\n}\n\nfunction renderLegacyRoot(\n element: ReactElement,\n container: Element | DocumentFragment\n): RenderResult {\n ReactDOM.render(element, container);\n\n return {\n rerender(element: ReactElement) {\n ReactDOM.render(element, container);\n },\n unmount() {\n ReactDOM.unmountComponentAtNode(container);\n },\n };\n}\n"],"names":["ReactDOM","createRoot","require","render","element","container","options","legacyRoot","renderLegacyRoot","root","rerender","unmount","unmountComponentAtNode"],"mappings":"AAAA,sCAAsC,GAEtC,OAAOA,cAAc,YAAY;AAGjC,IAAIC;AACJ,IAAI;IACA;;;KAGC,GACDA,aAAaC,QAAQ,oBAAoBD,UAAU;AACvD,EAAE,eAAM;AACJ,SAAS;AACb;AAWA,OAAO,SAASE,OACZC,OAAqB,EACrBC,SAAqC,EACrCC,OAAuB;IAEvB,IAAI,OAAOL,eAAe,eAAcK,oBAAAA,8BAAAA,QAASC,UAAU,GAAE;QACzD,OAAOC,iBAAiBJ,SAASC;IACrC;IAEA,MAAMI,OAAOR,WAAWI;IACxBI,KAAKN,MAAM,CAACC;IAEZ,OAAO;QACHM,UAASN,OAAqB;YAC1BK,KAAKN,MAAM,CAACC;QAChB;QACAO;YACIF,KAAKE,OAAO;QAChB;IACJ;AACJ;AAEA,SAASH,iBACLJ,OAAqB,EACrBC,SAAqC;IAErCL,SAASG,MAAM,CAACC,SAASC;IAEzB,OAAO;QACHK,UAASN,OAAqB;YAC1BJ,SAASG,MAAM,CAACC,SAASC;QAC7B;QACAM;YACIX,SAASY,sBAAsB,CAACP;QACpC;IACJ;AACJ"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-prefetch.d.ts","sourceRoot":"","sources":["../src/use-prefetch.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEvC;;;;GAIG;AACH,wBAAgB,WAAW;oBAQM,MAAM,cAAkB,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC;EAiCvF"}
1
+ {"version":3,"file":"use-prefetch.d.ts","sourceRoot":"","sources":["../src/use-prefetch.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAGvC;;;;GAIG;AACH,wBAAgB,WAAW;oBAQM,MAAM,cAAkB,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC;EAiCvF"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/use-prefetch.ts"],"sourcesContent":["import { Log } from '@servicetitan/log-service';\nimport { useOptionalDependencies } from '@servicetitan/react-ioc';\nimport { EXPOSED_DEPENDENCIES_TOKEN, EXPOSED_INSTANCE_DEPENDENCIES_TOKEN } from './common';\nimport { getBundleInfo, supportsPrefetch } from './utils';\nimport { LoaderProps } from './loader';\n\n/**\n * Prefetch and cache bundle info for a given MFE, so that Loader can load it faster later.\n * @param src - The main package URL for the MFE\n * @returns Promise resolving to the BundleInfo\n */\nexport function usePrefetch() {\n const [logService, exposedDependencies = EXPOSED_DEPENDENCIES] = useOptionalDependencies(\n Log,\n EXPOSED_DEPENDENCIES_TOKEN\n );\n const [exposedInstanceDependencies = EXPOSED_INSTANCE_DEPENDENCIES] = useOptionalDependencies(\n EXPOSED_INSTANCE_DEPENDENCIES_TOKEN\n );\n const prefetch = async (src: string, { cache = -1 }: Pick<LoaderProps<any>, 'cache'> = {}) => {\n try {\n const bundleInfo = await getBundleInfo({\n exposedDependencies,\n exposedInstanceDependencies,\n mainPackageUrl: src,\n cache,\n retries: 0,\n });\n\n if (bundleInfo.cacheHit) {\n return;\n }\n\n const { css, js } = bundleInfo.urls;\n if (supportsPrefetch()) {\n addLinks([\n ...css.map(href => ({ href, as: 'style' })),\n ...js.map(href => ({ href, as: 'script' })),\n ]);\n } else {\n await Promise.all([...css, ...js].map(url => fetch(url, { priority: 'low' })));\n }\n } catch (e: any) {\n logService?.warning({\n category: 'Microfrontends.Prefetch',\n message: `Failed to prefetch ${src}`,\n data: e,\n });\n }\n };\n\n return { prefetch };\n}\n\ninterface Link {\n as: string;\n href: string;\n}\n\nfunction addLinks(links: Link[]) {\n const existingLinks = document.head.getElementsByTagName('link');\n const existingHrefs = new Set(Array.from(existingLinks).map(({ href }) => href));\n\n links.forEach(({ as, href }) => {\n if (!existingHrefs.has(href)) {\n const link = document.createElement('link');\n link.as = as;\n link.crossOrigin = 'anonymous';\n link.href = href;\n link.rel = 'prefetch';\n document.head.append(link);\n }\n });\n}\n"],"names":["Log","useOptionalDependencies","EXPOSED_DEPENDENCIES_TOKEN","EXPOSED_INSTANCE_DEPENDENCIES_TOKEN","getBundleInfo","supportsPrefetch","usePrefetch","logService","exposedDependencies","EXPOSED_DEPENDENCIES","exposedInstanceDependencies","EXPOSED_INSTANCE_DEPENDENCIES","prefetch","src","cache","bundleInfo","mainPackageUrl","retries","cacheHit","css","js","urls","addLinks","map","href","as","Promise","all","url","fetch","priority","e","warning","category","message","data","links","existingLinks","document","head","getElementsByTagName","existingHrefs","Set","Array","from","forEach","has","link","createElement","crossOrigin","rel","append"],"mappings":"AAAA,SAASA,GAAG,QAAQ,4BAA4B;AAChD,SAASC,uBAAuB,QAAQ,0BAA0B;AAClE,SAASC,0BAA0B,EAAEC,mCAAmC,QAAQ,WAAW;AAC3F,SAASC,aAAa,EAAEC,gBAAgB,QAAQ,UAAU;AAG1D;;;;CAIC,GACD,OAAO,SAASC;IACZ,MAAM,CAACC,YAAYC,sBAAsBC,oBAAoB,CAAC,GAAGR,wBAC7DD,KACAE;IAEJ,MAAM,CAACQ,8BAA8BC,6BAA6B,CAAC,GAAGV,wBAClEE;IAEJ,MAAMS,WAAW,OAAOC,KAAa,EAAEC,QAAQ,CAAC,CAAC,EAAmC,GAAG,CAAC,CAAC;QACrF,IAAI;YACA,MAAMC,aAAa,MAAMX,cAAc;gBACnCI;gBACAE;gBACAM,gBAAgBH;gBAChBC;gBACAG,SAAS;YACb;YAEA,IAAIF,WAAWG,QAAQ,EAAE;gBACrB;YACJ;YAEA,MAAM,EAAEC,GAAG,EAAEC,EAAE,EAAE,GAAGL,WAAWM,IAAI;YACnC,IAAIhB,oBAAoB;gBACpBiB,SAAS;uBACFH,IAAII,GAAG,CAACC,CAAAA,OAAS,CAAA;4BAAEA;4BAAMC,IAAI;wBAAQ,CAAA;uBACrCL,GAAGG,GAAG,CAACC,CAAAA,OAAS,CAAA;4BAAEA;4BAAMC,IAAI;wBAAS,CAAA;iBAC3C;YACL,OAAO;gBACH,MAAMC,QAAQC,GAAG,CAAC;uBAAIR;uBAAQC;iBAAG,CAACG,GAAG,CAACK,CAAAA,MAAOC,MAAMD,KAAK;wBAAEE,UAAU;oBAAM;YAC9E;QACJ,EAAE,OAAOC,GAAQ;YACbxB,uBAAAA,iCAAAA,WAAYyB,OAAO,CAAC;gBAChBC,UAAU;gBACVC,SAAS,CAAC,mBAAmB,EAAErB,KAAK;gBACpCsB,MAAMJ;YACV;QACJ;IACJ;IAEA,OAAO;QAAEnB;IAAS;AACtB;AAOA,SAASU,SAASc,KAAa;IAC3B,MAAMC,gBAAgBC,SAASC,IAAI,CAACC,oBAAoB,CAAC;IACzD,MAAMC,gBAAgB,IAAIC,IAAIC,MAAMC,IAAI,CAACP,eAAed,GAAG,CAAC,CAAC,EAAEC,IAAI,EAAE,GAAKA;IAE1EY,MAAMS,OAAO,CAAC,CAAC,EAAEpB,EAAE,EAAED,IAAI,EAAE;QACvB,IAAI,CAACiB,cAAcK,GAAG,CAACtB,OAAO;YAC1B,MAAMuB,OAAOT,SAASU,aAAa,CAAC;YACpCD,KAAKtB,EAAE,GAAGA;YACVsB,KAAKE,WAAW,GAAG;YACnBF,KAAKvB,IAAI,GAAGA;YACZuB,KAAKG,GAAG,GAAG;YACXZ,SAASC,IAAI,CAACY,MAAM,CAACJ;QACzB;IACJ;AACJ"}
1
+ {"version":3,"sources":["../src/use-prefetch.ts"],"sourcesContent":["import { Log } from '@servicetitan/log-service';\nimport { useOptionalDependencies } from '@servicetitan/react-ioc';\nimport { EXPOSED_DEPENDENCIES_TOKEN, EXPOSED_INSTANCE_DEPENDENCIES_TOKEN } from './common';\nimport { LoaderProps } from './loader';\nimport { getBundleInfo, supportsPrefetch } from './utils';\n\n/**\n * Prefetch and cache bundle info for a given MFE, so that Loader can load it faster later.\n * @param src - The main package URL for the MFE\n * @returns Promise resolving to the BundleInfo\n */\nexport function usePrefetch() {\n const [logService, exposedDependencies = EXPOSED_DEPENDENCIES] = useOptionalDependencies(\n Log,\n EXPOSED_DEPENDENCIES_TOKEN\n );\n const [exposedInstanceDependencies = EXPOSED_INSTANCE_DEPENDENCIES] = useOptionalDependencies(\n EXPOSED_INSTANCE_DEPENDENCIES_TOKEN\n );\n const prefetch = async (src: string, { cache = -1 }: Pick<LoaderProps<any>, 'cache'> = {}) => {\n try {\n const bundleInfo = await getBundleInfo({\n exposedDependencies,\n exposedInstanceDependencies,\n mainPackageUrl: src,\n cache,\n retries: 0,\n });\n\n if (bundleInfo.cacheHit) {\n return;\n }\n\n const { css, js } = bundleInfo.urls;\n if (supportsPrefetch()) {\n addLinks([\n ...css.map(href => ({ href, as: 'style' })),\n ...js.map(href => ({ href, as: 'script' })),\n ]);\n } else {\n await Promise.all([...css, ...js].map(url => fetch(url, { priority: 'low' })));\n }\n } catch (e: any) {\n logService?.warning({\n category: 'Microfrontends.Prefetch',\n message: `Failed to prefetch ${src}`,\n data: e,\n });\n }\n };\n\n return { prefetch };\n}\n\ninterface Link {\n as: string;\n href: string;\n}\n\nfunction addLinks(links: Link[]) {\n const existingLinks = document.head.getElementsByTagName('link');\n const existingHrefs = new Set(Array.from(existingLinks).map(({ href }) => href));\n\n links.forEach(({ as, href }) => {\n if (!existingHrefs.has(href)) {\n const link = document.createElement('link');\n link.as = as;\n link.crossOrigin = 'anonymous';\n link.href = href;\n link.rel = 'prefetch';\n document.head.append(link);\n }\n });\n}\n"],"names":["Log","useOptionalDependencies","EXPOSED_DEPENDENCIES_TOKEN","EXPOSED_INSTANCE_DEPENDENCIES_TOKEN","getBundleInfo","supportsPrefetch","usePrefetch","logService","exposedDependencies","EXPOSED_DEPENDENCIES","exposedInstanceDependencies","EXPOSED_INSTANCE_DEPENDENCIES","prefetch","src","cache","bundleInfo","mainPackageUrl","retries","cacheHit","css","js","urls","addLinks","map","href","as","Promise","all","url","fetch","priority","e","warning","category","message","data","links","existingLinks","document","head","getElementsByTagName","existingHrefs","Set","Array","from","forEach","has","link","createElement","crossOrigin","rel","append"],"mappings":"AAAA,SAASA,GAAG,QAAQ,4BAA4B;AAChD,SAASC,uBAAuB,QAAQ,0BAA0B;AAClE,SAASC,0BAA0B,EAAEC,mCAAmC,QAAQ,WAAW;AAE3F,SAASC,aAAa,EAAEC,gBAAgB,QAAQ,UAAU;AAE1D;;;;CAIC,GACD,OAAO,SAASC;IACZ,MAAM,CAACC,YAAYC,sBAAsBC,oBAAoB,CAAC,GAAGR,wBAC7DD,KACAE;IAEJ,MAAM,CAACQ,8BAA8BC,6BAA6B,CAAC,GAAGV,wBAClEE;IAEJ,MAAMS,WAAW,OAAOC,KAAa,EAAEC,QAAQ,CAAC,CAAC,EAAmC,GAAG,CAAC,CAAC;QACrF,IAAI;YACA,MAAMC,aAAa,MAAMX,cAAc;gBACnCI;gBACAE;gBACAM,gBAAgBH;gBAChBC;gBACAG,SAAS;YACb;YAEA,IAAIF,WAAWG,QAAQ,EAAE;gBACrB;YACJ;YAEA,MAAM,EAAEC,GAAG,EAAEC,EAAE,EAAE,GAAGL,WAAWM,IAAI;YACnC,IAAIhB,oBAAoB;gBACpBiB,SAAS;uBACFH,IAAII,GAAG,CAACC,CAAAA,OAAS,CAAA;4BAAEA;4BAAMC,IAAI;wBAAQ,CAAA;uBACrCL,GAAGG,GAAG,CAACC,CAAAA,OAAS,CAAA;4BAAEA;4BAAMC,IAAI;wBAAS,CAAA;iBAC3C;YACL,OAAO;gBACH,MAAMC,QAAQC,GAAG,CAAC;uBAAIR;uBAAQC;iBAAG,CAACG,GAAG,CAACK,CAAAA,MAAOC,MAAMD,KAAK;wBAAEE,UAAU;oBAAM;YAC9E;QACJ,EAAE,OAAOC,GAAQ;YACbxB,uBAAAA,iCAAAA,WAAYyB,OAAO,CAAC;gBAChBC,UAAU;gBACVC,SAAS,CAAC,mBAAmB,EAAErB,KAAK;gBACpCsB,MAAMJ;YACV;QACJ;IACJ;IAEA,OAAO;QAAEnB;IAAS;AACtB;AAOA,SAASU,SAASc,KAAa;IAC3B,MAAMC,gBAAgBC,SAASC,IAAI,CAACC,oBAAoB,CAAC;IACzD,MAAMC,gBAAgB,IAAIC,IAAIC,MAAMC,IAAI,CAACP,eAAed,GAAG,CAAC,CAAC,EAAEC,IAAI,EAAE,GAAKA;IAE1EY,MAAMS,OAAO,CAAC,CAAC,EAAEpB,EAAE,EAAED,IAAI,EAAE;QACvB,IAAI,CAACiB,cAAcK,GAAG,CAACtB,OAAO;YAC1B,MAAMuB,OAAOT,SAASU,aAAa,CAAC;YACpCD,KAAKtB,EAAE,GAAGA;YACVsB,KAAKE,WAAW,GAAG;YACnBF,KAAKvB,IAAI,GAAGA;YACZuB,KAAKG,GAAG,GAAG;YACXZ,SAASC,IAAI,CAACY,MAAM,CAACJ;QACzB;IACJ;AACJ"}
@@ -1,4 +1,5 @@
1
- import { ExposedDependencies, ExposedInstanceDependencies, GetJsonError } from '../common';
1
+ import { ExposedDependencies } from '@servicetitan/startup-utils';
2
+ import { ExposedInstanceDependencies, GetJsonError } from '../common';
2
3
  import { EntryPoints } from './get-entry-points';
3
4
  export type BundleInfo = Awaited<ReturnType<typeof getBundleInfo>>;
4
5
  interface GetBundleInfoProps {
@@ -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;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;;;;;;;;;;;;;;;GAsFpB"}
1
+ {"version":3,"file":"get-bundle-info.d.ts","sourceRoot":"","sources":["../../src/utils/get-bundle-info.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAwB,MAAM,6BAA6B,CAAC;AAGxF,OAAO,EAAE,2BAA2B,EAAW,YAAY,EAAE,MAAM,WAAW,CAAC;AAI/E,OAAO,EAAE,WAAW,EAAkB,MAAM,oBAAoB,CAAC;AAKjE,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;;;;;;;;;;;;;;;GAsFpB"}
@@ -1,13 +1,13 @@
1
- import semver from 'semver';
1
+ import { getVersionMismatches } from '@servicetitan/startup-utils';
2
2
  import get from 'lodash.get';
3
+ import semver from 'semver';
3
4
  import { getJson } from '../common';
4
- import { getCachedMetadata } from './get-cached-metadata';
5
5
  import { getCacheSetting } from './get-cache-setting';
6
+ import { getCachedMetadata } from './get-cached-metadata';
6
7
  import { getEntrypoints } from './get-entry-points';
7
8
  import { getMFEHasCompatibleLaunchDarklyVersion } from './get-mfe-has-compatible-launchdarkly-version';
8
- import { getMFESupportsRerendering } from './get-mfe-supports-rerendering';
9
9
  import { getMFEHasUniqueChunkNamespace } from './get-mfe-has-unique-chunk-namespace';
10
- import { getVersionMismatches } from './get-version-mismatches';
10
+ import { getMFESupportsRerendering } from './get-mfe-supports-rerendering';
11
11
  export async function getBundleInfo({ cache, mainPackageUrl, fallbackPackageUrl, exposedDependencies = {}, exposedInstanceDependencies = {}, isHeadless, signal, retries, onRequestError }) {
12
12
  var _metadata_entrypoints;
13
13
  const { cacheHit, data: metadata, url: packageUrl } = await getCachedMetadata({
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/get-bundle-info.ts"],"sourcesContent":["import semver from 'semver';\nimport get from 'lodash.get';\n\nimport { ExposedDependencies, ExposedInstanceDependencies, getJson, GetJsonError } from '../common';\nimport { getCachedMetadata } from './get-cached-metadata';\nimport { getCacheSetting } from './get-cache-setting';\nimport { EntryPoints, getEntrypoints } from './get-entry-points';\nimport { getMFEHasCompatibleLaunchDarklyVersion } from './get-mfe-has-compatible-launchdarkly-version';\nimport { getMFESupportsRerendering } from './get-mfe-supports-rerendering';\nimport { getMFEHasUniqueChunkNamespace } from './get-mfe-has-unique-chunk-namespace';\nimport { getVersionMismatches } from './get-version-mismatches';\nimport type { Metadata } from '../types';\n\nexport type BundleInfo = Awaited<ReturnType<typeof getBundleInfo>>;\n\ninterface GetBundleInfoProps {\n cache: boolean | number;\n exposedDependencies?: ExposedDependencies;\n exposedInstanceDependencies?: ExposedInstanceDependencies;\n fallbackPackageUrl?: string;\n isHeadless?: boolean;\n mainPackageUrl: string;\n onRequestError?: (error: GetJsonError) => void;\n retries?: number;\n signal?: AbortSignal;\n}\n\nexport async function getBundleInfo({\n cache,\n mainPackageUrl,\n fallbackPackageUrl,\n exposedDependencies = {},\n exposedInstanceDependencies = {},\n isHeadless,\n signal,\n retries,\n onRequestError,\n}: GetBundleInfoProps) {\n const {\n cacheHit,\n data: metadata,\n url: packageUrl,\n } = await getCachedMetadata({\n cache,\n fallbackPackageUrl,\n mainPackageUrl,\n onRequestError,\n retries,\n signal,\n });\n\n const { bundledWith, name, sharedDependencies } = metadata;\n const exactPackageUrl = packageUrl.replace('/dist/metadata.json', '');\n const requestCache = getCacheSetting(exactPackageUrl);\n\n let dependencies: NonNullable<Metadata['dependencies']>;\n if (metadata.dependencies) {\n dependencies = metadata.dependencies;\n } else {\n const { data: packageJson } = await getJson(`${exactPackageUrl}/package.json`, {\n cache: requestCache,\n retries,\n signal,\n });\n\n dependencies = packageJson.dependencies;\n }\n\n let mismatch: ReturnType<typeof getVersionMismatches>;\n let resolvedBundleType: 'headless' | 'light' | 'full';\n\n if (isHeadless) {\n resolvedBundleType = 'headless';\n } else {\n mismatch = getVersionMismatches(exposedDependencies, dependencies, sharedDependencies);\n const startupVersion = bundledWith?.['@servicetitan/startup'];\n const supportLightBundles = !!startupVersion && semver.gte(startupVersion, '17.0.0');\n const embed = !mismatch && supportLightBundles;\n resolvedBundleType = embed ? 'light' : 'full';\n }\n\n const withBaseUrl = (path: string) =>\n `${exactPackageUrl}/dist/bundle/${resolvedBundleType}/${path}`;\n\n let entrypoints: EntryPoints;\n if (metadata.entrypoints?.[resolvedBundleType]) {\n entrypoints = metadata.entrypoints[resolvedBundleType];\n } else {\n entrypoints = await getEntrypoints(withBaseUrl('entrypoints.json'), requestCache);\n }\n\n const disposer = () => {\n if (resolvedBundleType === 'light') {\n const path = Object.values<string>(sharedDependencies).shift();\n if (path) {\n get(window, path).getStorage().clear(name);\n }\n }\n };\n\n const urls = Object.entries(entrypoints).reduce(\n (result, [key, value]) => ({ ...result, [key]: value.map(withBaseUrl) }),\n {} as EntryPoints\n );\n\n const elementName = resolvedBundleType === 'headless' ? `headless-${name}` : name;\n\n return {\n bundledWith,\n cacheHit,\n disposer,\n mfeSupportsRerendering: getMFESupportsRerendering(bundledWith, dependencies),\n mfeHasUniqueChunkNamespace: getMFEHasUniqueChunkNamespace(bundledWith),\n mfeHasCompatibleLaunchDarklyVersion: getMFEHasCompatibleLaunchDarklyVersion(\n bundledWith,\n exposedInstanceDependencies\n ),\n mismatch,\n resolvedBundleType,\n urls,\n WebComponent: elementName,\n version: metadata.version,\n };\n}\n"],"names":["semver","get","getJson","getCachedMetadata","getCacheSetting","getEntrypoints","getMFEHasCompatibleLaunchDarklyVersion","getMFESupportsRerendering","getMFEHasUniqueChunkNamespace","getVersionMismatches","getBundleInfo","cache","mainPackageUrl","fallbackPackageUrl","exposedDependencies","exposedInstanceDependencies","isHeadless","signal","retries","onRequestError","metadata","cacheHit","data","url","packageUrl","bundledWith","name","sharedDependencies","exactPackageUrl","replace","requestCache","dependencies","packageJson","mismatch","resolvedBundleType","startupVersion","supportLightBundles","gte","embed","withBaseUrl","path","entrypoints","disposer","Object","values","shift","window","getStorage","clear","urls","entries","reduce","result","key","value","map","elementName","mfeSupportsRerendering","mfeHasUniqueChunkNamespace","mfeHasCompatibleLaunchDarklyVersion","WebComponent","version"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/utils/get-bundle-info.ts"],"sourcesContent":["import { ExposedDependencies, getVersionMismatches } from '@servicetitan/startup-utils';\nimport get from 'lodash.get';\nimport semver from 'semver';\nimport { ExposedInstanceDependencies, getJson, GetJsonError } from '../common';\nimport type { Metadata } from '../types';\nimport { getCacheSetting } from './get-cache-setting';\nimport { getCachedMetadata } from './get-cached-metadata';\nimport { EntryPoints, getEntrypoints } from './get-entry-points';\nimport { getMFEHasCompatibleLaunchDarklyVersion } from './get-mfe-has-compatible-launchdarkly-version';\nimport { getMFEHasUniqueChunkNamespace } from './get-mfe-has-unique-chunk-namespace';\nimport { getMFESupportsRerendering } from './get-mfe-supports-rerendering';\n\nexport type BundleInfo = Awaited<ReturnType<typeof getBundleInfo>>;\n\ninterface GetBundleInfoProps {\n cache: boolean | number;\n exposedDependencies?: ExposedDependencies;\n exposedInstanceDependencies?: ExposedInstanceDependencies;\n fallbackPackageUrl?: string;\n isHeadless?: boolean;\n mainPackageUrl: string;\n onRequestError?: (error: GetJsonError) => void;\n retries?: number;\n signal?: AbortSignal;\n}\n\nexport async function getBundleInfo({\n cache,\n mainPackageUrl,\n fallbackPackageUrl,\n exposedDependencies = {},\n exposedInstanceDependencies = {},\n isHeadless,\n signal,\n retries,\n onRequestError,\n}: GetBundleInfoProps) {\n const {\n cacheHit,\n data: metadata,\n url: packageUrl,\n } = await getCachedMetadata({\n cache,\n fallbackPackageUrl,\n mainPackageUrl,\n onRequestError,\n retries,\n signal,\n });\n\n const { bundledWith, name, sharedDependencies } = metadata;\n const exactPackageUrl = packageUrl.replace('/dist/metadata.json', '');\n const requestCache = getCacheSetting(exactPackageUrl);\n\n let dependencies: NonNullable<Metadata['dependencies']>;\n if (metadata.dependencies) {\n dependencies = metadata.dependencies;\n } else {\n const { data: packageJson } = await getJson(`${exactPackageUrl}/package.json`, {\n cache: requestCache,\n retries,\n signal,\n });\n\n dependencies = packageJson.dependencies;\n }\n\n let mismatch: ReturnType<typeof getVersionMismatches>;\n let resolvedBundleType: 'headless' | 'light' | 'full';\n\n if (isHeadless) {\n resolvedBundleType = 'headless';\n } else {\n mismatch = getVersionMismatches(exposedDependencies, dependencies, sharedDependencies);\n const startupVersion = bundledWith?.['@servicetitan/startup'];\n const supportLightBundles = !!startupVersion && semver.gte(startupVersion, '17.0.0');\n const embed = !mismatch && supportLightBundles;\n resolvedBundleType = embed ? 'light' : 'full';\n }\n\n const withBaseUrl = (path: string) =>\n `${exactPackageUrl}/dist/bundle/${resolvedBundleType}/${path}`;\n\n let entrypoints: EntryPoints;\n if (metadata.entrypoints?.[resolvedBundleType]) {\n entrypoints = metadata.entrypoints[resolvedBundleType];\n } else {\n entrypoints = await getEntrypoints(withBaseUrl('entrypoints.json'), requestCache);\n }\n\n const disposer = () => {\n if (resolvedBundleType === 'light') {\n const path = Object.values<string>(sharedDependencies).shift();\n if (path) {\n get(window, path).getStorage().clear(name);\n }\n }\n };\n\n const urls = Object.entries(entrypoints).reduce(\n (result, [key, value]) => ({ ...result, [key]: value.map(withBaseUrl) }),\n {} as EntryPoints\n );\n\n const elementName = resolvedBundleType === 'headless' ? `headless-${name}` : name;\n\n return {\n bundledWith,\n cacheHit,\n disposer,\n mfeSupportsRerendering: getMFESupportsRerendering(bundledWith, dependencies),\n mfeHasUniqueChunkNamespace: getMFEHasUniqueChunkNamespace(bundledWith),\n mfeHasCompatibleLaunchDarklyVersion: getMFEHasCompatibleLaunchDarklyVersion(\n bundledWith,\n exposedInstanceDependencies\n ),\n mismatch,\n resolvedBundleType,\n urls,\n WebComponent: elementName,\n version: metadata.version,\n };\n}\n"],"names":["getVersionMismatches","get","semver","getJson","getCacheSetting","getCachedMetadata","getEntrypoints","getMFEHasCompatibleLaunchDarklyVersion","getMFEHasUniqueChunkNamespace","getMFESupportsRerendering","getBundleInfo","cache","mainPackageUrl","fallbackPackageUrl","exposedDependencies","exposedInstanceDependencies","isHeadless","signal","retries","onRequestError","metadata","cacheHit","data","url","packageUrl","bundledWith","name","sharedDependencies","exactPackageUrl","replace","requestCache","dependencies","packageJson","mismatch","resolvedBundleType","startupVersion","supportLightBundles","gte","embed","withBaseUrl","path","entrypoints","disposer","Object","values","shift","window","getStorage","clear","urls","entries","reduce","result","key","value","map","elementName","mfeSupportsRerendering","mfeHasUniqueChunkNamespace","mfeHasCompatibleLaunchDarklyVersion","WebComponent","version"],"mappings":"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"}
@@ -5,7 +5,7 @@ export async function getEntrypoints(url, cache, signal) {
5
5
  cache,
6
6
  signal
7
7
  })).data;
8
- } catch (e) {
8
+ } catch (unused) {
9
9
  return {
10
10
  css: [
11
11
  'index.css'
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/get-entry-points.ts"],"sourcesContent":["import { getJson } from '../common';\n\nexport interface EntryPoints {\n css: string[];\n js: string[];\n}\n\nexport async function getEntrypoints(\n url: string,\n cache: 'no-store' | undefined,\n signal?: AbortSignal\n): Promise<EntryPoints> {\n try {\n return (\n await getJson(url, {\n cache,\n signal,\n })\n ).data;\n } catch {\n return { css: ['index.css'], js: ['index.js'] };\n }\n}\n"],"names":["getJson","getEntrypoints","url","cache","signal","data","css","js"],"mappings":"AAAA,SAASA,OAAO,QAAQ,YAAY;AAOpC,OAAO,eAAeC,eAClBC,GAAW,EACXC,KAA6B,EAC7BC,MAAoB;IAEpB,IAAI;QACA,OAAO,AACH,CAAA,MAAMJ,QAAQE,KAAK;YACfC;YACAC;QACJ,EAAC,EACHC,IAAI;IACV,EAAE,UAAM;QACJ,OAAO;YAAEC,KAAK;gBAAC;aAAY;YAAEC,IAAI;gBAAC;aAAW;QAAC;IAClD;AACJ"}
1
+ {"version":3,"sources":["../../src/utils/get-entry-points.ts"],"sourcesContent":["import { getJson } from '../common';\n\nexport interface EntryPoints {\n css: string[];\n js: string[];\n}\n\nexport async function getEntrypoints(\n url: string,\n cache: 'no-store' | undefined,\n signal?: AbortSignal\n): Promise<EntryPoints> {\n try {\n return (\n await getJson(url, {\n cache,\n signal,\n })\n ).data;\n } catch {\n return { css: ['index.css'], js: ['index.js'] };\n }\n}\n"],"names":["getJson","getEntrypoints","url","cache","signal","data","css","js"],"mappings":"AAAA,SAASA,OAAO,QAAQ,YAAY;AAOpC,OAAO,eAAeC,eAClBC,GAAW,EACXC,KAA6B,EAC7BC,MAAoB;IAEpB,IAAI;QACA,OAAO,AACH,CAAA,MAAMJ,QAAQE,KAAK;YACfC;YACAC;QACJ,EAAC,EACHC,IAAI;IACV,EAAE,eAAM;QACJ,OAAO;YAAEC,KAAK;gBAAC;aAAY;YAAEC,IAAI;gBAAC;aAAW;QAAC;IAClD;AACJ"}
@@ -1,7 +1,7 @@
1
1
  let token;
2
2
  try {
3
3
  token = require('@servicetitan/launchdarkly-service').LD_SERVICE_TOKEN;
4
- } catch (e) {
4
+ } catch (unused) {
5
5
  // ignore
6
6
  }
7
7
  export function getLDServiceToken() {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/get-ld-service-token.ts"],"sourcesContent":["import { type LDService } from '@servicetitan/launchdarkly-service';\nimport { SymbolToken } from '@servicetitan/react-ioc';\n\nlet token: SymbolToken<LDService>;\ntry {\n token = require('@servicetitan/launchdarkly-service').LD_SERVICE_TOKEN;\n} catch {\n // ignore\n}\n\nexport function getLDServiceToken() {\n return token;\n}\n"],"names":["token","require","LD_SERVICE_TOKEN","getLDServiceToken"],"mappings":"AAGA,IAAIA;AACJ,IAAI;IACAA,QAAQC,QAAQ,sCAAsCC,gBAAgB;AAC1E,EAAE,UAAM;AACJ,SAAS;AACb;AAEA,OAAO,SAASC;IACZ,OAAOH;AACX"}
1
+ {"version":3,"sources":["../../src/utils/get-ld-service-token.ts"],"sourcesContent":["import { type LDService } from '@servicetitan/launchdarkly-service';\nimport { SymbolToken } from '@servicetitan/react-ioc';\n\nlet token: SymbolToken<LDService>;\ntry {\n token = require('@servicetitan/launchdarkly-service').LD_SERVICE_TOKEN;\n} catch {\n // ignore\n}\n\nexport function getLDServiceToken() {\n return token;\n}\n"],"names":["token","require","LD_SERVICE_TOKEN","getLDServiceToken"],"mappings":"AAGA,IAAIA;AACJ,IAAI;IACAA,QAAQC,QAAQ,sCAAsCC,gBAAgB;AAC1E,EAAE,eAAM;AACJ,SAAS;AACb;AAEA,OAAO,SAASC;IACZ,OAAOH;AACX"}
@@ -9,7 +9,7 @@ import semver from 'semver';
9
9
  * `bundledWith.@servicetitan/startup` is checked third, with the hope that the startup version
10
10
  * matches web-components
11
11
  */ export function getMFESupportsRerendering(bundledWith, dependencies) {
12
- var _isSupportedVersion, _ref;
12
+ var _ref, _isSupportedVersion;
13
13
  return !!((_ref = (_isSupportedVersion = isSupportedVersion(bundledWith === null || bundledWith === void 0 ? void 0 : bundledWith['@servicetitan/web-components'])) !== null && _isSupportedVersion !== void 0 ? _isSupportedVersion : isSupportedVersion(dependencies === null || dependencies === void 0 ? void 0 : dependencies['@servicetitan/web-components'])) !== null && _ref !== void 0 ? _ref : isSupportedVersion(bundledWith === null || bundledWith === void 0 ? void 0 : bundledWith['@servicetitan/startup']));
14
14
  }
15
15
  function isSupportedVersion(version) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/get-mfe-supports-rerendering.ts"],"sourcesContent":["import semver from 'semver';\nimport type { Metadata } from '../types';\n\n/*\n * Check if the MFE supports re-rendering itself when data changes\n *\n * `bundledWith.@servicetitan/web-components` is checked first, as that guarantees support\n * `dependencies.@servicetitan/web-components` is checked second, in the case of the MFE's startup\n * hasn't been updated to add web-components to bundledWith yet, and the MFE's web-component\n * dependency is set in it's own package's package.json instead of the monorepo's root package.json\n * `bundledWith.@servicetitan/startup` is checked third, with the hope that the startup version\n * matches web-components\n */\nexport function getMFESupportsRerendering(\n bundledWith: Metadata['bundledWith'],\n dependencies: Metadata['dependencies']\n) {\n return !!(\n isSupportedVersion(bundledWith?.['@servicetitan/web-components']) ??\n isSupportedVersion(dependencies?.['@servicetitan/web-components']) ??\n isSupportedVersion(bundledWith?.['@servicetitan/startup'])\n );\n}\n\nfunction isSupportedVersion(version?: string) {\n const minVersion = version && semver.minVersion(version);\n if (minVersion) {\n return semver.gte(minVersion, '22.12.0');\n }\n}\n"],"names":["semver","getMFESupportsRerendering","bundledWith","dependencies","isSupportedVersion","version","minVersion","gte"],"mappings":"AAAA,OAAOA,YAAY,SAAS;AAG5B;;;;;;;;;CASC,GACD,OAAO,SAASC,0BACZC,WAAoC,EACpCC,YAAsC;QAGlCC,qBAAAA;IADJ,OAAO,CAAC,CACJA,CAAAA,CAAAA,OAAAA,CAAAA,sBAAAA,mBAAmBF,wBAAAA,kCAAAA,WAAa,CAAC,+BAA+B,eAAhEE,iCAAAA,sBACAA,mBAAmBD,yBAAAA,mCAAAA,YAAc,CAAC,+BAA+B,eADjEC,kBAAAA,OAEAA,mBAAmBF,wBAAAA,kCAAAA,WAAa,CAAC,wBAAwB,CAAA;AAEjE;AAEA,SAASE,mBAAmBC,OAAgB;IACxC,MAAMC,aAAaD,WAAWL,OAAOM,UAAU,CAACD;IAChD,IAAIC,YAAY;QACZ,OAAON,OAAOO,GAAG,CAACD,YAAY;IAClC;AACJ"}
1
+ {"version":3,"sources":["../../src/utils/get-mfe-supports-rerendering.ts"],"sourcesContent":["import semver from 'semver';\nimport type { Metadata } from '../types';\n\n/*\n * Check if the MFE supports re-rendering itself when data changes\n *\n * `bundledWith.@servicetitan/web-components` is checked first, as that guarantees support\n * `dependencies.@servicetitan/web-components` is checked second, in the case of the MFE's startup\n * hasn't been updated to add web-components to bundledWith yet, and the MFE's web-component\n * dependency is set in it's own package's package.json instead of the monorepo's root package.json\n * `bundledWith.@servicetitan/startup` is checked third, with the hope that the startup version\n * matches web-components\n */\nexport function getMFESupportsRerendering(\n bundledWith: Metadata['bundledWith'],\n dependencies: Metadata['dependencies']\n) {\n return !!(\n isSupportedVersion(bundledWith?.['@servicetitan/web-components']) ??\n isSupportedVersion(dependencies?.['@servicetitan/web-components']) ??\n isSupportedVersion(bundledWith?.['@servicetitan/startup'])\n );\n}\n\nfunction isSupportedVersion(version?: string) {\n const minVersion = version && semver.minVersion(version);\n if (minVersion) {\n return semver.gte(minVersion, '22.12.0');\n }\n}\n"],"names":["semver","getMFESupportsRerendering","bundledWith","dependencies","isSupportedVersion","version","minVersion","gte"],"mappings":"AAAA,OAAOA,YAAY,SAAS;AAG5B;;;;;;;;;CASC,GACD,OAAO,SAASC,0BACZC,WAAoC,EACpCC,YAAsC;QAGlCC,MAAAA;IADJ,OAAO,CAAC,GACJA,QAAAA,sBAAAA,mBAAmBF,wBAAAA,kCAAAA,WAAa,CAAC,+BAA+B,eAAhEE,iCAAAA,sBACAA,mBAAmBD,yBAAAA,mCAAAA,YAAc,CAAC,+BAA+B,eADjEC,kBAAAA,OAEAA,mBAAmBF,wBAAAA,kCAAAA,WAAa,CAAC,wBAAwB;AAEjE;AAEA,SAASE,mBAAmBC,OAAgB;IACxC,MAAMC,aAAaD,WAAWL,OAAOM,UAAU,CAACD;IAChD,IAAIC,YAAY;QACZ,OAAON,OAAOO,GAAG,CAACD,YAAY;IAClC;AACJ"}
@@ -3,7 +3,6 @@ export * from './get-element-name';
3
3
  export * from './get-entry-points';
4
4
  export * from './get-ld-service-token';
5
5
  export * from './get-mfe-supports-rerendering';
6
- export * from './get-version-mismatches';
7
6
  export * from './is-versioned-url';
8
7
  export * from './load-scripts';
9
8
  export * from './supports-prefetch';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC;AACvC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,0BAA0B,CAAC;AACzC,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,qBAAqB,CAAC;AACpC,cAAc,aAAa,CAAC;AAC5B,cAAc,wBAAwB,CAAC;AACvC,cAAc,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC;AACvC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,qBAAqB,CAAC;AACpC,cAAc,aAAa,CAAC;AAC5B,cAAc,wBAAwB,CAAC;AACvC,cAAc,iBAAiB,CAAC"}
@@ -3,7 +3,6 @@ export * from './get-element-name';
3
3
  export * from './get-entry-points';
4
4
  export * from './get-ld-service-token';
5
5
  export * from './get-mfe-supports-rerendering';
6
- export * from './get-version-mismatches';
7
6
  export * from './is-versioned-url';
8
7
  export * from './load-scripts';
9
8
  export * from './supports-prefetch';
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/index.ts"],"sourcesContent":["export * from './get-bundle-info';\nexport * from './get-element-name';\nexport * from './get-entry-points';\nexport * from './get-ld-service-token';\nexport * from './get-mfe-supports-rerendering';\nexport * from './get-version-mismatches';\nexport * from './is-versioned-url';\nexport * from './load-scripts';\nexport * from './supports-prefetch';\nexport * from './ttl-cache';\nexport * from './validate-bundle-info';\nexport * from './web-component';\n"],"names":[],"mappings":"AAAA,cAAc,oBAAoB;AAClC,cAAc,qBAAqB;AACnC,cAAc,qBAAqB;AACnC,cAAc,yBAAyB;AACvC,cAAc,iCAAiC;AAC/C,cAAc,2BAA2B;AACzC,cAAc,qBAAqB;AACnC,cAAc,iBAAiB;AAC/B,cAAc,sBAAsB;AACpC,cAAc,cAAc;AAC5B,cAAc,yBAAyB;AACvC,cAAc,kBAAkB"}
1
+ {"version":3,"sources":["../../src/utils/index.ts"],"sourcesContent":["export * from './get-bundle-info';\nexport * from './get-element-name';\nexport * from './get-entry-points';\nexport * from './get-ld-service-token';\nexport * from './get-mfe-supports-rerendering';\nexport * from './is-versioned-url';\nexport * from './load-scripts';\nexport * from './supports-prefetch';\nexport * from './ttl-cache';\nexport * from './validate-bundle-info';\nexport * from './web-component';\n"],"names":[],"mappings":"AAAA,cAAc,oBAAoB;AAClC,cAAc,qBAAqB;AACnC,cAAc,qBAAqB;AACnC,cAAc,yBAAyB;AACvC,cAAc,iCAAiC;AAC/C,cAAc,qBAAqB;AACnC,cAAc,iBAAiB;AAC/B,cAAc,sBAAsB;AACpC,cAAc,cAAc;AAC5B,cAAc,yBAAyB;AACvC,cAAc,kBAAkB"}
@@ -1,5 +1,6 @@
1
1
  import { Log } from '@servicetitan/log-service';
2
- import { ExposedDependencies, ExposedInstanceDependencies } from '../common';
2
+ import { ExposedDependencies } from '@servicetitan/startup-utils';
3
+ import { ExposedInstanceDependencies } from '../common';
3
4
  import { BundleInfo } from './get-bundle-info';
4
5
  interface Context {
5
6
  exposedDependencies?: ExposedDependencies;
@@ -1 +1 @@
1
- {"version":3,"file":"validate-bundle-info.d.ts","sourceRoot":"","sources":["../../src/utils/validate-bundle-info.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,2BAA2B,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,2BAA2B,EAAE,MAAM,WAAW,CAAC;AAC7E,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,UAAU,OAAO;IACb,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;IAC1C,2BAA2B,CAAC,EAAE,2BAA2B,CAAC;IAC1D,UAAU,CAAC,EAAE,GAAG,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACtB;AACD,wBAAgB,kBAAkB,CAC9B,EAAE,QAAQ,EAAE,mCAAmC,EAAE,EAAE,UAAU,EAC7D,EAAE,mBAAwB,EAAE,2BAA2B,EAAE,UAAU,EAAE,UAAU,EAAE,EAAE,OAAO,QAwC7F"}
1
+ {"version":3,"file":"validate-bundle-info.d.ts","sourceRoot":"","sources":["../../src/utils/validate-bundle-info.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,2BAA2B,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,2BAA2B,EAAE,MAAM,WAAW,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,UAAU,OAAO;IACb,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;IAC1C,2BAA2B,CAAC,EAAE,2BAA2B,CAAC;IAC1D,UAAU,CAAC,EAAE,GAAG,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACtB;AACD,wBAAgB,kBAAkB,CAC9B,EAAE,QAAQ,EAAE,mCAAmC,EAAE,EAAE,UAAU,EAC7D,EAAE,mBAAwB,EAAE,2BAA2B,EAAE,UAAU,EAAE,UAAU,EAAE,EAAE,OAAO,QAwC7F"}
@@ -25,11 +25,11 @@ export function validateBundleInfo({ mismatch, mfeHasCompatibleLaunchDarklyVersi
25
25
  * Note, only checking false here because the value is undefined when the host
26
26
  * or the MFE isn't using LaunchDarkly at all.
27
27
  */ if (mfeHasCompatibleLaunchDarklyVersion === false) {
28
+ var _ref;
28
29
  var _exposedInstanceDependencies_launchDarkly;
29
- var _exposedInstanceDependencies_launchDarkly_version;
30
30
  const data = {
31
31
  package: packageUrl,
32
- hostVersion: (_exposedInstanceDependencies_launchDarkly_version = exposedInstanceDependencies === null || exposedInstanceDependencies === void 0 ? void 0 : (_exposedInstanceDependencies_launchDarkly = exposedInstanceDependencies.launchDarkly) === null || _exposedInstanceDependencies_launchDarkly === void 0 ? void 0 : _exposedInstanceDependencies_launchDarkly.version) !== null && _exposedInstanceDependencies_launchDarkly_version !== void 0 ? _exposedInstanceDependencies_launchDarkly_version : ''
32
+ hostVersion: (_ref = exposedInstanceDependencies === null || exposedInstanceDependencies === void 0 ? void 0 : (_exposedInstanceDependencies_launchDarkly = exposedInstanceDependencies.launchDarkly) === null || _exposedInstanceDependencies_launchDarkly === void 0 ? void 0 : _exposedInstanceDependencies_launchDarkly.version) !== null && _ref !== void 0 ? _ref : ''
33
33
  };
34
34
  logService.warning({
35
35
  category: 'MicroFrontends.LaunchDarklyMismatch',
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/validate-bundle-info.ts"],"sourcesContent":["import { Log } from '@servicetitan/log-service';\nimport { ExposedDependencies, ExposedInstanceDependencies } from '../common';\nimport { BundleInfo } from './get-bundle-info';\n\ninterface Context {\n exposedDependencies?: ExposedDependencies;\n exposedInstanceDependencies?: ExposedInstanceDependencies;\n logService?: Log;\n packageUrl: string;\n}\nexport function validateBundleInfo(\n { mismatch, mfeHasCompatibleLaunchDarklyVersion }: BundleInfo,\n { exposedDependencies = {}, exposedInstanceDependencies, logService, packageUrl }: Context\n) {\n if (!logService) {\n return;\n }\n\n if (mismatch) {\n const data = { package: packageUrl, dependencies: JSON.stringify(mismatch) };\n if (Object.keys(exposedDependencies).length === 0) {\n logService.warning({\n category: 'MicroFrontends.NoExposedDependencies',\n message:\n 'Cannot use light bundle because the host is not exposing dependencies or the list of shared dependencies is empty.',\n data,\n });\n } else {\n logService.warning({\n category: 'MicroFrontends.DependenciesMismatch',\n message: 'Some of the package dependencies have incompatible versions.',\n data,\n });\n }\n }\n\n /**\n * Note, only checking false here because the value is undefined when the host\n * or the MFE isn't using LaunchDarkly at all.\n */\n\n if (mfeHasCompatibleLaunchDarklyVersion === false) {\n const data = {\n package: packageUrl,\n hostVersion: exposedInstanceDependencies?.launchDarkly?.version ?? '',\n };\n logService.warning({\n category: 'MicroFrontends.LaunchDarklyMismatch',\n message: 'LaunchDarkly versions are incompatible',\n data,\n });\n }\n}\n"],"names":["validateBundleInfo","mismatch","mfeHasCompatibleLaunchDarklyVersion","exposedDependencies","exposedInstanceDependencies","logService","packageUrl","data","package","dependencies","JSON","stringify","Object","keys","length","warning","category","message","hostVersion","launchDarkly","version"],"mappings":"AAUA,OAAO,SAASA,mBACZ,EAAEC,QAAQ,EAAEC,mCAAmC,EAAc,EAC7D,EAAEC,sBAAsB,CAAC,CAAC,EAAEC,2BAA2B,EAAEC,UAAU,EAAEC,UAAU,EAAW;IAE1F,IAAI,CAACD,YAAY;QACb;IACJ;IAEA,IAAIJ,UAAU;QACV,MAAMM,OAAO;YAAEC,SAASF;YAAYG,cAAcC,KAAKC,SAAS,CAACV;QAAU;QAC3E,IAAIW,OAAOC,IAAI,CAACV,qBAAqBW,MAAM,KAAK,GAAG;YAC/CT,WAAWU,OAAO,CAAC;gBACfC,UAAU;gBACVC,SACI;gBACJV;YACJ;QACJ,OAAO;YACHF,WAAWU,OAAO,CAAC;gBACfC,UAAU;gBACVC,SAAS;gBACTV;YACJ;QACJ;IACJ;IAEA;;;KAGC,GAED,IAAIL,wCAAwC,OAAO;YAG9BE;YAAAA;QAFjB,MAAMG,OAAO;YACTC,SAASF;YACTY,aAAad,CAAAA,oDAAAA,wCAAAA,mDAAAA,4CAAAA,4BAA6Be,YAAY,cAAzCf,gEAAAA,0CAA2CgB,OAAO,cAAlDhB,+DAAAA,oDAAsD;QACvE;QACAC,WAAWU,OAAO,CAAC;YACfC,UAAU;YACVC,SAAS;YACTV;QACJ;IACJ;AACJ"}
1
+ {"version":3,"sources":["../../src/utils/validate-bundle-info.ts"],"sourcesContent":["import { Log } from '@servicetitan/log-service';\nimport { ExposedDependencies } from '@servicetitan/startup-utils';\nimport { ExposedInstanceDependencies } from '../common';\nimport { BundleInfo } from './get-bundle-info';\n\ninterface Context {\n exposedDependencies?: ExposedDependencies;\n exposedInstanceDependencies?: ExposedInstanceDependencies;\n logService?: Log;\n packageUrl: string;\n}\nexport function validateBundleInfo(\n { mismatch, mfeHasCompatibleLaunchDarklyVersion }: BundleInfo,\n { exposedDependencies = {}, exposedInstanceDependencies, logService, packageUrl }: Context\n) {\n if (!logService) {\n return;\n }\n\n if (mismatch) {\n const data = { package: packageUrl, dependencies: JSON.stringify(mismatch) };\n if (Object.keys(exposedDependencies).length === 0) {\n logService.warning({\n category: 'MicroFrontends.NoExposedDependencies',\n message:\n 'Cannot use light bundle because the host is not exposing dependencies or the list of shared dependencies is empty.',\n data,\n });\n } else {\n logService.warning({\n category: 'MicroFrontends.DependenciesMismatch',\n message: 'Some of the package dependencies have incompatible versions.',\n data,\n });\n }\n }\n\n /**\n * Note, only checking false here because the value is undefined when the host\n * or the MFE isn't using LaunchDarkly at all.\n */\n\n if (mfeHasCompatibleLaunchDarklyVersion === false) {\n const data = {\n package: packageUrl,\n hostVersion: exposedInstanceDependencies?.launchDarkly?.version ?? '',\n };\n logService.warning({\n category: 'MicroFrontends.LaunchDarklyMismatch',\n message: 'LaunchDarkly versions are incompatible',\n data,\n });\n }\n}\n"],"names":["validateBundleInfo","mismatch","mfeHasCompatibleLaunchDarklyVersion","exposedDependencies","exposedInstanceDependencies","logService","packageUrl","data","package","dependencies","JSON","stringify","Object","keys","length","warning","category","message","hostVersion","launchDarkly","version"],"mappings":"AAWA,OAAO,SAASA,mBACZ,EAAEC,QAAQ,EAAEC,mCAAmC,EAAc,EAC7D,EAAEC,sBAAsB,CAAC,CAAC,EAAEC,2BAA2B,EAAEC,UAAU,EAAEC,UAAU,EAAW;IAE1F,IAAI,CAACD,YAAY;QACb;IACJ;IAEA,IAAIJ,UAAU;QACV,MAAMM,OAAO;YAAEC,SAASF;YAAYG,cAAcC,KAAKC,SAAS,CAACV;QAAU;QAC3E,IAAIW,OAAOC,IAAI,CAACV,qBAAqBW,MAAM,KAAK,GAAG;YAC/CT,WAAWU,OAAO,CAAC;gBACfC,UAAU;gBACVC,SACI;gBACJV;YACJ;QACJ,OAAO;YACHF,WAAWU,OAAO,CAAC;gBACfC,UAAU;gBACVC,SAAS;gBACTV;YACJ;QACJ;IACJ;IAEA;;;KAGC,GAED,IAAIL,wCAAwC,OAAO;;YAG9BE;QAFjB,MAAMG,OAAO;YACTC,SAASF;YACTY,WAAW,UAAEd,wCAAAA,mDAAAA,4CAAAA,4BAA6Be,YAAY,cAAzCf,gEAAAA,0CAA2CgB,OAAO,uCAAI;QACvE;QACAf,WAAWU,OAAO,CAAC;YACfC,UAAU;YACVC,SAAS;YACTV;QACJ;IACJ;AACJ"}
@@ -1,9 +1,10 @@
1
- import { Log } from '@servicetitan/log-service';
2
1
  import { type LDService } from '@servicetitan/launchdarkly-service';
3
- import { ExposedDependencies, ExposedInstanceDependencies } from '../common';
2
+ import { Log } from '@servicetitan/log-service';
3
+ import { ExposedDependencies } from '@servicetitan/startup-utils';
4
+ import { ExposedInstanceDependencies } from '../common';
4
5
  import { EventBus } from '../event-bus';
5
- import { BundleInfo } from './get-bundle-info';
6
6
  import { LoaderDataProps } from '../loader';
7
+ import { BundleInfo } from './get-bundle-info';
7
8
  interface WebComponentProps {
8
9
  basename?: string;
9
10
  bundleInfo: BundleInfo;
@@ -1 +1 @@
1
- {"version":3,"file":"web-component.d.ts","sourceRoot":"","sources":["../../src/utils/web-component.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,MAAM,2BAA2B,CAAC;AAChD,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,oCAAoC,CAAC;AAGpE,OAAO,EAAE,mBAAmB,EAAE,2BAA2B,EAAiB,MAAM,WAAW,CAAC;AAE5F,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAG/C,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAE5C,UAAU,iBAAiB;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,UAAU,CAAC;IACvB,QAAQ,EAAE,QAAQ,CAAC;IACnB,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;IAC1C,2BAA2B,CAAC,EAAE,2BAA2B,CAAC;IAC1D,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,UAAU,CAAC,EAAE,GAAG,CAAC;CACpB;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,IAWzC,oCAAoC,eAAe,6CAyD9D"}
1
+ {"version":3,"file":"web-component.d.ts","sourceRoot":"","sources":["../../src/utils/web-component.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,oCAAoC,CAAC;AACpE,OAAO,EAAE,GAAG,EAAE,MAAM,2BAA2B,CAAC;AAEhD,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAElE,OAAO,EAAE,2BAA2B,EAAiB,MAAM,WAAW,CAAC;AAEvE,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAExC,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAG/C,UAAU,iBAAiB;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,UAAU,CAAC;IACvB,QAAQ,EAAE,QAAQ,CAAC;IACnB,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;IAC1C,2BAA2B,CAAC,EAAE,2BAA2B,CAAC;IAC1D,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,UAAU,CAAC,EAAE,GAAG,CAAC;CACpB;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,IAWzC,oCAAoC,eAAe,6CAyD9D"}
@@ -1,8 +1,8 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { Fragment, useMemo, useState } from 'react';
3
2
  import { useOptionalDependencies } from '@servicetitan/react-ioc';
4
- import { getElementName } from './get-element-name';
3
+ import { Fragment, useMemo, useState } from 'react';
5
4
  import { HistoryManager } from '../history-manager';
5
+ import { getElementName } from './get-element-name';
6
6
  export function webComponent(props) {
7
7
  var _bundleInfo_bundledWith;
8
8
  const { basename, bundleInfo, eventBus, exposedDependencies, ldService, logService } = props;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/web-component.tsx"],"sourcesContent":["import { Fragment, useMemo, useState } from 'react';\nimport { Log } from '@servicetitan/log-service';\nimport { type LDService } from '@servicetitan/launchdarkly-service';\nimport { useOptionalDependencies } from '@servicetitan/react-ioc';\n\nimport { ExposedDependencies, ExposedInstanceDependencies, IWebComponent } from '../common';\nimport { MFEContextData } from '../contexts/mfe-data-context';\nimport { EventBus } from '../event-bus';\nimport { BundleInfo } from './get-bundle-info';\nimport { getElementName } from './get-element-name';\nimport { HistoryManager } from '../history-manager';\nimport { LoaderDataProps } from '../loader';\n\ninterface WebComponentProps {\n basename?: string;\n bundleInfo: BundleInfo;\n eventBus: EventBus;\n exposedDependencies?: ExposedDependencies;\n exposedInstanceDependencies?: ExposedInstanceDependencies;\n ldService?: LDService;\n logService?: Log;\n}\n\nexport function webComponent(props: WebComponentProps) {\n const { basename, bundleInfo, eventBus, exposedDependencies, ldService, logService } = props;\n const { WebComponent, resolvedBundleType, disposer, mfeSupportsRerendering, version } =\n bundleInfo;\n const elementName = getElementName(bundleInfo);\n\n const exposedInstanceDependencies = ensureLDVersion(\n props.exposedInstanceDependencies,\n bundleInfo.bundledWith?.['launchdarkly-js-client-sdk']\n );\n\n return ({ LoadingFallback, ...innerProps }: LoaderDataProps) => {\n const [isLoading, setIsLoading] = useState(true);\n const [historyManager] = useOptionalDependencies(HistoryManager);\n\n const handleRef = (webComponent: IWebComponent | null) => {\n webComponent?.provide({\n ldService,\n logService,\n historyManager,\n exposedDependencies,\n exposedInstanceDependencies,\n eventBus,\n basename,\n onReady: () => {\n setIsLoading(false);\n },\n onDispose: () => {\n disposer();\n },\n });\n };\n\n // Stringify data object so that it can be passed as a data-attribute\n const stringifiedData = useMemo(() => JSON.stringify(innerProps.data), [innerProps.data]);\n\n /*\n * Set key for rendering the web component so that if the data from the Host change,\n * and the MFE's version of startup doesn't support watching for data changes, then\n * the web component will be re-mounted whenever the data changes.\n * This is only used as a fallback when the MFE's version is older.\n */\n const key = mfeSupportsRerendering ? undefined : stringifiedData;\n const dataAttrs = useMemo(() => composeDataAttributes(innerProps.data), [innerProps.data]);\n const styleUrls = getStyleUrls(bundleInfo);\n\n return (\n <Fragment>\n {isLoading && <LoadingFallback />}\n <WebComponent\n key={key}\n ref={handleRef}\n class={innerProps.className}\n {...(styleUrls && { 'style-urls': styleUrls })}\n /*\n * Continue to spread data as separate data attributes for backwards compatibility,\n * in case the Host has updated web-components, but the MFE has not\n */\n {...dataAttrs}\n data-mfe-data={stringifiedData}\n data-mfe-name={elementName}\n {...(version && { 'data-mfe-version': version })}\n // @ts-expect-error style exists on HTMLElement\n style={resolvedBundleType === 'headless' ? { display: 'none' } : undefined}\n />\n </Fragment>\n );\n };\n}\n\n/*\n * Convert camelCase data props to kebab-case data attributes, prepended with data-\n * Ex: fooBar -> data-foo-bar\n */\nfunction composeDataAttributes(data: MFEContextData<{}> | undefined = {}) {\n return Object.fromEntries(\n Object.entries(data).map(([key, value]) => [\n 'data-' + key.replace(/[A-Z]/g, letter => '-' + letter.toLowerCase()),\n value,\n ])\n );\n}\n\nfunction ensureLDVersion(\n exposedInstanceDependencies: ExposedInstanceDependencies = {},\n version?: string\n) {\n if (version && !exposedInstanceDependencies.launchDarkly?.ldService) {\n return { ...exposedInstanceDependencies, launchDarkly: { version } };\n }\n return exposedInstanceDependencies;\n}\n\nfunction getStyleUrls({ urls }: Pick<BundleInfo, 'urls'>) {\n if (urls.css.length) {\n return encodeURIComponent(JSON.stringify(urls.css));\n }\n}\n"],"names":["Fragment","useMemo","useState","useOptionalDependencies","getElementName","HistoryManager","webComponent","props","bundleInfo","basename","eventBus","exposedDependencies","ldService","logService","WebComponent","resolvedBundleType","disposer","mfeSupportsRerendering","version","elementName","exposedInstanceDependencies","ensureLDVersion","bundledWith","LoadingFallback","innerProps","isLoading","setIsLoading","historyManager","handleRef","provide","onReady","onDispose","stringifiedData","JSON","stringify","data","key","undefined","dataAttrs","composeDataAttributes","styleUrls","getStyleUrls","ref","class","className","data-mfe-data","data-mfe-name","style","display","Object","fromEntries","entries","map","value","replace","letter","toLowerCase","launchDarkly","urls","css","length","encodeURIComponent"],"mappings":";AAAA,SAASA,QAAQ,EAAEC,OAAO,EAAEC,QAAQ,QAAQ,QAAQ;AAGpD,SAASC,uBAAuB,QAAQ,0BAA0B;AAMlE,SAASC,cAAc,QAAQ,qBAAqB;AACpD,SAASC,cAAc,QAAQ,qBAAqB;AAapD,OAAO,SAASC,aAAaC,KAAwB;QAQ7CC;IAPJ,MAAM,EAAEC,QAAQ,EAAED,UAAU,EAAEE,QAAQ,EAAEC,mBAAmB,EAAEC,SAAS,EAAEC,UAAU,EAAE,GAAGN;IACvF,MAAM,EAAEO,YAAY,EAAEC,kBAAkB,EAAEC,QAAQ,EAAEC,sBAAsB,EAAEC,OAAO,EAAE,GACjFV;IACJ,MAAMW,cAAcf,eAAeI;IAEnC,MAAMY,8BAA8BC,gBAChCd,MAAMa,2BAA2B,GACjCZ,0BAAAA,WAAWc,WAAW,cAAtBd,8CAAAA,uBAAwB,CAAC,6BAA6B;IAG1D,OAAO,CAAC,EAAEe,eAAe,EAAE,GAAGC,YAA6B;QACvD,MAAM,CAACC,WAAWC,aAAa,GAAGxB,SAAS;QAC3C,MAAM,CAACyB,eAAe,GAAGxB,wBAAwBE;QAEjD,MAAMuB,YAAY,CAACtB;YACfA,yBAAAA,mCAAAA,aAAcuB,OAAO,CAAC;gBAClBjB;gBACAC;gBACAc;gBACAhB;gBACAS;gBACAV;gBACAD;gBACAqB,SAAS;oBACLJ,aAAa;gBACjB;gBACAK,WAAW;oBACPf;gBACJ;YACJ;QACJ;QAEA,qEAAqE;QACrE,MAAMgB,kBAAkB/B,QAAQ,IAAMgC,KAAKC,SAAS,CAACV,WAAWW,IAAI,GAAG;YAACX,WAAWW,IAAI;SAAC;QAExF;;;;;SAKC,GACD,MAAMC,MAAMnB,yBAAyBoB,YAAYL;QACjD,MAAMM,YAAYrC,QAAQ,IAAMsC,sBAAsBf,WAAWW,IAAI,GAAG;YAACX,WAAWW,IAAI;SAAC;QACzF,MAAMK,YAAYC,aAAajC;QAE/B,qBACI,MAACR;;gBACIyB,2BAAa,KAACF;8BACf,KAACT;oBAEG4B,KAAKd;oBACLe,OAAOnB,WAAWoB,SAAS;oBAC1B,GAAIJ,aAAa;wBAAE,cAAcA;oBAAU,CAAC;oBAK5C,GAAGF,SAAS;oBACbO,iBAAeb;oBACfc,iBAAe3B;oBACd,GAAID,WAAW;wBAAE,oBAAoBA;oBAAQ,CAAC;oBAC/C,+CAA+C;oBAC/C6B,OAAOhC,uBAAuB,aAAa;wBAAEiC,SAAS;oBAAO,IAAIX;mBAb5DD;;;IAiBrB;AACJ;AAEA;;;CAGC,GACD,SAASG,sBAAsBJ,OAAuC,CAAC,CAAC;IACpE,OAAOc,OAAOC,WAAW,CACrBD,OAAOE,OAAO,CAAChB,MAAMiB,GAAG,CAAC,CAAC,CAAChB,KAAKiB,MAAM,GAAK;YACvC,UAAUjB,IAAIkB,OAAO,CAAC,UAAUC,CAAAA,SAAU,MAAMA,OAAOC,WAAW;YAClEH;SACH;AAET;AAEA,SAAShC,gBACLD,8BAA2D,CAAC,CAAC,EAC7DF,OAAgB;QAEAE;IAAhB,IAAIF,WAAW,GAACE,4CAAAA,4BAA4BqC,YAAY,cAAxCrC,gEAAAA,0CAA0CR,SAAS,GAAE;QACjE,OAAO;YAAE,GAAGQ,2BAA2B;YAAEqC,cAAc;gBAAEvC;YAAQ;QAAE;IACvE;IACA,OAAOE;AACX;AAEA,SAASqB,aAAa,EAAEiB,IAAI,EAA4B;IACpD,IAAIA,KAAKC,GAAG,CAACC,MAAM,EAAE;QACjB,OAAOC,mBAAmB5B,KAAKC,SAAS,CAACwB,KAAKC,GAAG;IACrD;AACJ"}
1
+ {"version":3,"sources":["../../src/utils/web-component.tsx"],"sourcesContent":["import { type LDService } from '@servicetitan/launchdarkly-service';\nimport { Log } from '@servicetitan/log-service';\nimport { useOptionalDependencies } from '@servicetitan/react-ioc';\nimport { ExposedDependencies } from '@servicetitan/startup-utils';\nimport { Fragment, useMemo, useState } from 'react';\nimport { ExposedInstanceDependencies, IWebComponent } from '../common';\nimport { MFEContextData } from '../contexts/mfe-data-context';\nimport { EventBus } from '../event-bus';\nimport { HistoryManager } from '../history-manager';\nimport { LoaderDataProps } from '../loader';\nimport { BundleInfo } from './get-bundle-info';\nimport { getElementName } from './get-element-name';\n\ninterface WebComponentProps {\n basename?: string;\n bundleInfo: BundleInfo;\n eventBus: EventBus;\n exposedDependencies?: ExposedDependencies;\n exposedInstanceDependencies?: ExposedInstanceDependencies;\n ldService?: LDService;\n logService?: Log;\n}\n\nexport function webComponent(props: WebComponentProps) {\n const { basename, bundleInfo, eventBus, exposedDependencies, ldService, logService } = props;\n const { WebComponent, resolvedBundleType, disposer, mfeSupportsRerendering, version } =\n bundleInfo;\n const elementName = getElementName(bundleInfo);\n\n const exposedInstanceDependencies = ensureLDVersion(\n props.exposedInstanceDependencies,\n bundleInfo.bundledWith?.['launchdarkly-js-client-sdk']\n );\n\n return ({ LoadingFallback, ...innerProps }: LoaderDataProps) => {\n const [isLoading, setIsLoading] = useState(true);\n const [historyManager] = useOptionalDependencies(HistoryManager);\n\n const handleRef = (webComponent: IWebComponent | null) => {\n webComponent?.provide({\n ldService,\n logService,\n historyManager,\n exposedDependencies,\n exposedInstanceDependencies,\n eventBus,\n basename,\n onReady: () => {\n setIsLoading(false);\n },\n onDispose: () => {\n disposer();\n },\n });\n };\n\n // Stringify data object so that it can be passed as a data-attribute\n const stringifiedData = useMemo(() => JSON.stringify(innerProps.data), [innerProps.data]);\n\n /*\n * Set key for rendering the web component so that if the data from the Host change,\n * and the MFE's version of startup doesn't support watching for data changes, then\n * the web component will be re-mounted whenever the data changes.\n * This is only used as a fallback when the MFE's version is older.\n */\n const key = mfeSupportsRerendering ? undefined : stringifiedData;\n const dataAttrs = useMemo(() => composeDataAttributes(innerProps.data), [innerProps.data]);\n const styleUrls = getStyleUrls(bundleInfo);\n\n return (\n <Fragment>\n {isLoading && <LoadingFallback />}\n <WebComponent\n key={key}\n ref={handleRef}\n class={innerProps.className}\n {...(styleUrls && { 'style-urls': styleUrls })}\n /*\n * Continue to spread data as separate data attributes for backwards compatibility,\n * in case the Host has updated web-components, but the MFE has not\n */\n {...dataAttrs}\n data-mfe-data={stringifiedData}\n data-mfe-name={elementName}\n {...(version && { 'data-mfe-version': version })}\n // @ts-expect-error style exists on HTMLElement\n style={resolvedBundleType === 'headless' ? { display: 'none' } : undefined}\n />\n </Fragment>\n );\n };\n}\n\n/*\n * Convert camelCase data props to kebab-case data attributes, prepended with data-\n * Ex: fooBar -> data-foo-bar\n */\nfunction composeDataAttributes(data: MFEContextData<{}> | undefined = {}) {\n return Object.fromEntries(\n Object.entries(data).map(([key, value]) => [\n 'data-' + key.replace(/[A-Z]/g, letter => '-' + letter.toLowerCase()),\n value,\n ])\n );\n}\n\nfunction ensureLDVersion(\n exposedInstanceDependencies: ExposedInstanceDependencies = {},\n version?: string\n) {\n if (version && !exposedInstanceDependencies.launchDarkly?.ldService) {\n return { ...exposedInstanceDependencies, launchDarkly: { version } };\n }\n return exposedInstanceDependencies;\n}\n\nfunction getStyleUrls({ urls }: Pick<BundleInfo, 'urls'>) {\n if (urls.css.length) {\n return encodeURIComponent(JSON.stringify(urls.css));\n }\n}\n"],"names":["useOptionalDependencies","Fragment","useMemo","useState","HistoryManager","getElementName","webComponent","props","bundleInfo","basename","eventBus","exposedDependencies","ldService","logService","WebComponent","resolvedBundleType","disposer","mfeSupportsRerendering","version","elementName","exposedInstanceDependencies","ensureLDVersion","bundledWith","LoadingFallback","innerProps","isLoading","setIsLoading","historyManager","handleRef","provide","onReady","onDispose","stringifiedData","JSON","stringify","data","key","undefined","dataAttrs","composeDataAttributes","styleUrls","getStyleUrls","ref","class","className","data-mfe-data","data-mfe-name","style","display","Object","fromEntries","entries","map","value","replace","letter","toLowerCase","launchDarkly","urls","css","length","encodeURIComponent"],"mappings":";AAEA,SAASA,uBAAuB,QAAQ,0BAA0B;AAElE,SAASC,QAAQ,EAAEC,OAAO,EAAEC,QAAQ,QAAQ,QAAQ;AAIpD,SAASC,cAAc,QAAQ,qBAAqB;AAGpD,SAASC,cAAc,QAAQ,qBAAqB;AAYpD,OAAO,SAASC,aAAaC,KAAwB;QAQ7CC;IAPJ,MAAM,EAAEC,QAAQ,EAAED,UAAU,EAAEE,QAAQ,EAAEC,mBAAmB,EAAEC,SAAS,EAAEC,UAAU,EAAE,GAAGN;IACvF,MAAM,EAAEO,YAAY,EAAEC,kBAAkB,EAAEC,QAAQ,EAAEC,sBAAsB,EAAEC,OAAO,EAAE,GACjFV;IACJ,MAAMW,cAAcd,eAAeG;IAEnC,MAAMY,8BAA8BC,gBAChCd,MAAMa,2BAA2B,GACjCZ,0BAAAA,WAAWc,WAAW,cAAtBd,8CAAAA,uBAAwB,CAAC,6BAA6B;IAG1D,OAAO,CAAC,EAAEe,eAAe,EAAE,GAAGC,YAA6B;QACvD,MAAM,CAACC,WAAWC,aAAa,GAAGvB,SAAS;QAC3C,MAAM,CAACwB,eAAe,GAAG3B,wBAAwBI;QAEjD,MAAMwB,YAAY,CAACtB;YACfA,yBAAAA,mCAAAA,aAAcuB,OAAO,CAAC;gBAClBjB;gBACAC;gBACAc;gBACAhB;gBACAS;gBACAV;gBACAD;gBACAqB,SAAS;oBACLJ,aAAa;gBACjB;gBACAK,WAAW;oBACPf;gBACJ;YACJ;QACJ;QAEA,qEAAqE;QACrE,MAAMgB,kBAAkB9B,QAAQ,IAAM+B,KAAKC,SAAS,CAACV,WAAWW,IAAI,GAAG;YAACX,WAAWW,IAAI;SAAC;QAExF;;;;;SAKC,GACD,MAAMC,MAAMnB,yBAAyBoB,YAAYL;QACjD,MAAMM,YAAYpC,QAAQ,IAAMqC,sBAAsBf,WAAWW,IAAI,GAAG;YAACX,WAAWW,IAAI;SAAC;QACzF,MAAMK,YAAYC,aAAajC;QAE/B,qBACI,MAACP;;gBACIwB,2BAAa,KAACF;8BACf,KAACT;oBAEG4B,KAAKd;oBACLe,OAAOnB,WAAWoB,SAAS;oBAC1B,GAAIJ,aAAa;wBAAE,cAAcA;oBAAU,CAAC;oBAK5C,GAAGF,SAAS;oBACbO,iBAAeb;oBACfc,iBAAe3B;oBACd,GAAID,WAAW;wBAAE,oBAAoBA;oBAAQ,CAAC;oBAC/C,+CAA+C;oBAC/C6B,OAAOhC,uBAAuB,aAAa;wBAAEiC,SAAS;oBAAO,IAAIX;mBAb5DD;;;IAiBrB;AACJ;AAEA;;;CAGC,GACD,SAASG,sBAAsBJ,OAAuC,CAAC,CAAC;IACpE,OAAOc,OAAOC,WAAW,CACrBD,OAAOE,OAAO,CAAChB,MAAMiB,GAAG,CAAC,CAAC,CAAChB,KAAKiB,MAAM,GAAK;YACvC,UAAUjB,IAAIkB,OAAO,CAAC,UAAUC,CAAAA,SAAU,MAAMA,OAAOC,WAAW;YAClEH;SACH;AAET;AAEA,SAAShC,gBACLD,8BAA2D,CAAC,CAAC,EAC7DF,OAAgB;QAEAE;IAAhB,IAAIF,WAAW,GAACE,4CAAAA,4BAA4BqC,YAAY,cAAxCrC,gEAAAA,0CAA0CR,SAAS,GAAE;QACjE,OAAO;YAAE,GAAGQ,2BAA2B;YAAEqC,cAAc;gBAAEvC;YAAQ;QAAE;IACvE;IACA,OAAOE;AACX;AAEA,SAASqB,aAAa,EAAEiB,IAAI,EAA4B;IACpD,IAAIA,KAAKC,GAAG,CAACC,MAAM,EAAE;QACjB,OAAOC,mBAAmB5B,KAAKC,SAAS,CAACwB,KAAKC,GAAG;IACrD;AACJ"}
package/package.json CHANGED
@@ -1,7 +1,8 @@
1
1
  {
2
2
  "name": "@servicetitan/web-components",
3
- "version": "33.1.0",
4
- "description": "",
3
+ "version": "34.0.0",
4
+ "description": "Framework to build, register, and load Microfrontends into host applications",
5
+ "homepage": "https://docs.st.dev/docs/frontend/uikit/web-components",
5
6
  "repository": {
6
7
  "type": "git",
7
8
  "url": "https://github.com/servicetitan/uikit.git",
@@ -15,20 +16,21 @@
15
16
  "src"
16
17
  ],
17
18
  "dependencies": {
18
- "@servicetitan/error-boundary": "33.1.0",
19
+ "@servicetitan/error-boundary": "34.0.0",
20
+ "@servicetitan/startup-utils": "34.0.0",
19
21
  "lodash.get": "~4.4.2",
20
22
  "mitt": "~3.0.1",
21
23
  "semver": "~7.7.3"
22
24
  },
23
25
  "devDependencies": {
24
- "@servicetitan/anvil2": "^1.47.1",
26
+ "@servicetitan/anvil2": "^2.0.1",
25
27
  "@servicetitan/design-system": "~14.5.3",
26
- "@servicetitan/launchdarkly-service": "33.1.0",
27
- "@servicetitan/log-service": "33.1.0",
28
- "@servicetitan/react-ioc": "33.1.0",
28
+ "@servicetitan/launchdarkly-service": "34.0.0",
29
+ "@servicetitan/log-service": "34.0.0",
30
+ "@servicetitan/react-ioc": "34.0.0",
29
31
  "@testing-library/dom": "^10.4.1",
30
32
  "@testing-library/jest-dom": "^6.9.1",
31
- "@testing-library/react": "^16.3.0",
33
+ "@testing-library/react": "^16.3.2",
32
34
  "@types/history": "~4.7.10",
33
35
  "@types/lodash.get": "~4.4.6",
34
36
  "@types/react": "~18.3.3",
@@ -41,11 +43,11 @@
41
43
  "shadow-dom-testing-library": "^1.13.1"
42
44
  },
43
45
  "peerDependencies": {
44
- "@servicetitan/anvil2": ">=1.47.1",
46
+ "@servicetitan/anvil2": ">=1.5.0",
45
47
  "@servicetitan/design-system": ">=14.5.3",
46
- "@servicetitan/launchdarkly-service": "33.1.0",
47
- "@servicetitan/log-service": "33.1.0",
48
- "@servicetitan/react-ioc": "33.1.0",
48
+ "@servicetitan/launchdarkly-service": "34.0.0",
49
+ "@servicetitan/log-service": "34.0.0",
50
+ "@servicetitan/react-ioc": "34.0.0",
49
51
  "history": "~4.10.1",
50
52
  "react": ">=17.0.2",
51
53
  "react-dom": ">=17.0.2"
@@ -67,5 +69,5 @@
67
69
  "cli": {
68
70
  "webpack": false
69
71
  },
70
- "gitHead": "126948560bcb684f276373beb7ce45faac94205c"
72
+ "gitHead": "e193dc22703963f67099874a24de535d0696b6e2"
71
73
  }
@@ -1,5 +1,5 @@
1
- import { FC, useContext } from 'react';
2
1
  import { TablePopupPropsContext } from '@servicetitan/design-system';
2
+ import { FC, useContext } from 'react';
3
3
  import { useMFEDataContext, useMFEMetadataContext } from '../contexts';
4
4
 
5
5
  jest.mock('@progress/kendo-licensing', () => ({ validatePackage: jest.fn() }));
@@ -1,6 +1,5 @@
1
1
  import '@testing-library/jest-dom';
2
2
  import { act, render, screen } from '@testing-library/react';
3
-
4
3
  import { Delayed, DelayedProps } from '../delayed';
5
4
 
6
5
  describe(`${Delayed.name}`, () => {
@@ -1,5 +1,5 @@
1
1
  import * as mitt from 'mitt';
2
- import { EventBus, typedEventBusToken, EVENT_BUS_TOKEN } from '../event-bus';
2
+ import { EVENT_BUS_TOKEN, EventBus, typedEventBusToken } from '../event-bus';
3
3
 
4
4
  jest.mock('mitt', () => jest.fn());
5
5
 
@@ -1,10 +1,10 @@
1
- import '@testing-library/jest-dom';
2
- import { act, render, screen, waitFor } from '@testing-library/react';
3
1
  import { LD_SERVICE_TOKEN } from '@servicetitan/launchdarkly-service';
4
2
  import { Log } from '@servicetitan/log-service';
5
3
  import { Provider, ProviderProps } from '@servicetitan/react-ioc';
4
+ import { getVersionMismatches } from '@servicetitan/startup-utils';
5
+ import '@testing-library/jest-dom';
6
+ import { act, render, screen, waitFor } from '@testing-library/react';
6
7
  import { FC, ReactNode, RefObject, useEffect, useRef } from 'react';
7
-
8
8
  import * as common from '../common';
9
9
  import {
10
10
  EXPOSED_DEPENDENCIES_TOKEN,
@@ -16,14 +16,15 @@ import {
16
16
  import { EVENT_BUS_TOKEN } from '../event-bus';
17
17
  import { HistoryManager } from '../history-manager';
18
18
  import { Loader, LoaderProps, UnrestrictedLoaderProps } from '../loader';
19
- import { Metadata } from '../utils/get-bundle-info';
19
+ import { Metadata } from '../types';
20
20
  import { getMFEHasCompatibleLaunchDarklyVersion } from '../utils/get-mfe-has-compatible-launchdarkly-version';
21
21
  import { getMFEHasUniqueChunkNamespace } from '../utils/get-mfe-has-unique-chunk-namespace';
22
- import { getVersionMismatches } from '../utils/get-version-mismatches';
23
22
 
23
+ jest.mock('@servicetitan/startup-utils', () => ({
24
+ getVersionMismatches: jest.fn(),
25
+ }));
24
26
  jest.mock('../utils/get-mfe-has-compatible-launchdarkly-version');
25
27
  jest.mock('../utils/get-mfe-has-unique-chunk-namespace');
26
- jest.mock('../utils/get-version-mismatches');
27
28
 
28
29
  describe('[web-components] Loader', () => {
29
30
  const localHosts = ['localhost', '127.0.0.1'];