@servicetitan/web-components 36.3.1 → 37.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 (73) hide show
  1. package/dist/anvil1-providers.d.ts +6 -0
  2. package/dist/anvil1-providers.d.ts.map +1 -0
  3. package/dist/anvil1-providers.js +23 -0
  4. package/dist/anvil1-providers.js.map +1 -0
  5. package/dist/anvil2-providers.d.ts +5 -0
  6. package/dist/anvil2-providers.d.ts.map +1 -0
  7. package/dist/anvil2-providers.js +13 -0
  8. package/dist/anvil2-providers.js.map +1 -0
  9. package/dist/css-injector/index.d.ts +3 -0
  10. package/dist/css-injector/index.d.ts.map +1 -0
  11. package/dist/css-injector/index.js +4 -0
  12. package/dist/css-injector/index.js.map +1 -0
  13. package/dist/css-injector/mfe-style-registry.d.ts +14 -0
  14. package/dist/css-injector/mfe-style-registry.d.ts.map +1 -0
  15. package/dist/css-injector/mfe-style-registry.js +63 -0
  16. package/dist/css-injector/mfe-style-registry.js.map +1 -0
  17. package/dist/css-injector/with-css-injector.d.ts +6 -0
  18. package/dist/css-injector/with-css-injector.d.ts.map +1 -0
  19. package/dist/css-injector/with-css-injector.js +38 -0
  20. package/dist/css-injector/with-css-injector.js.map +1 -0
  21. package/dist/get-style-urls.d.ts +2 -0
  22. package/dist/get-style-urls.d.ts.map +1 -0
  23. package/dist/get-style-urls.js +21 -0
  24. package/dist/get-style-urls.js.map +1 -0
  25. package/dist/globals.d.ts +3 -3
  26. package/dist/globals.d.ts.map +1 -1
  27. package/dist/globals.js +19 -4
  28. package/dist/globals.js.map +1 -1
  29. package/dist/index.d.ts +1 -0
  30. package/dist/index.d.ts.map +1 -1
  31. package/dist/index.js +1 -0
  32. package/dist/index.js.map +1 -1
  33. package/dist/register-headless.d.ts.map +1 -1
  34. package/dist/register-headless.js +1 -0
  35. package/dist/register-headless.js.map +1 -1
  36. package/dist/register.d.ts.map +1 -1
  37. package/dist/register.js +14 -55
  38. package/dist/register.js.map +1 -1
  39. package/dist/render.d.ts.map +1 -1
  40. package/dist/render.js +3 -11
  41. package/dist/render.js.map +1 -1
  42. package/dist/utils/get-bundle-info.d.ts.map +1 -1
  43. package/dist/utils/get-bundle-info.js +11 -4
  44. package/dist/utils/get-bundle-info.js.map +1 -1
  45. package/dist/utils/get-entry-points.d.ts +1 -0
  46. package/dist/utils/get-entry-points.d.ts.map +1 -1
  47. package/dist/utils/get-entry-points.js.map +1 -1
  48. package/dist/utils/get-ld-service-token.d.ts +2 -3
  49. package/dist/utils/get-ld-service-token.d.ts.map +1 -1
  50. package/dist/utils/get-ld-service-token.js +2 -7
  51. package/dist/utils/get-ld-service-token.js.map +1 -1
  52. package/package.json +36 -14
  53. package/src/__mocks__/register-anvil2-harness.tsx +49 -0
  54. package/src/__mocks__/test-component.tsx +9 -2
  55. package/src/__tests__/loader.test.tsx +32 -0
  56. package/src/__tests__/register-anvil2-optional.test.tsx +32 -0
  57. package/src/__tests__/register-anvil2.test.tsx +11 -64
  58. package/src/anvil1-providers.tsx +28 -0
  59. package/src/anvil2-providers.tsx +13 -0
  60. package/src/css-injector/__tests__/mfe-style-registry.test.ts +163 -0
  61. package/src/css-injector/__tests__/with-css-injector.test.tsx +128 -0
  62. package/src/css-injector/index.ts +2 -0
  63. package/src/css-injector/mfe-style-registry.ts +48 -0
  64. package/src/css-injector/with-css-injector.tsx +40 -0
  65. package/src/get-style-urls.ts +23 -0
  66. package/src/globals.ts +30 -10
  67. package/src/index.ts +1 -0
  68. package/src/register-headless.ts +1 -0
  69. package/src/register.tsx +15 -66
  70. package/src/render.ts +3 -14
  71. package/src/utils/get-bundle-info.ts +12 -5
  72. package/src/utils/get-entry-points.ts +1 -0
  73. package/src/utils/get-ld-service-token.ts +2 -10
@@ -0,0 +1,6 @@
1
+ import { FC, PropsWithChildren } from 'react';
2
+ export declare const Anvil1Providers: FC<{
3
+ root: ShadowRoot;
4
+ portal: ShadowRoot;
5
+ } & PropsWithChildren>;
6
+ //# sourceMappingURL=anvil1-providers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anvil1-providers.d.ts","sourceRoot":"","sources":["../src/anvil1-providers.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,EAAE,EAAE,iBAAiB,EAAe,MAAM,OAAO,CAAC;AAE3D,eAAO,MAAM,eAAe,EAAE,EAAE,CAAC;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,UAAU,CAAA;CAAE,GAAG,iBAAiB,CAwB5F,CAAC"}
@@ -0,0 +1,23 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import * as Anvil1 from '@servicetitan/design-system';
3
+ import { useCallback } from 'react';
4
+ export const Anvil1Providers = ({ root, portal, children })=>{
5
+ const getTablePopupProps = useCallback((props)=>({
6
+ ...props,
7
+ appendTo: root
8
+ }), [
9
+ root
10
+ ]);
11
+ if (Anvil1.DefaultPortalContext === undefined || Anvil1.TablePopupPropsContext === undefined) {
12
+ return children;
13
+ }
14
+ return /*#__PURE__*/ _jsx(Anvil1.DefaultPortalContext.Provider, {
15
+ value: portal,
16
+ children: /*#__PURE__*/ _jsx(Anvil1.TablePopupPropsContext.Provider, {
17
+ value: getTablePopupProps,
18
+ children: children
19
+ })
20
+ });
21
+ };
22
+
23
+ //# sourceMappingURL=anvil1-providers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/anvil1-providers.tsx"],"sourcesContent":["import * as Anvil1 from '@servicetitan/design-system';\nimport { FC, PropsWithChildren, useCallback } from 'react';\n\nexport const Anvil1Providers: FC<{ root: ShadowRoot; portal: ShadowRoot } & PropsWithChildren> = ({\n root,\n portal,\n children,\n}) => {\n const getTablePopupProps = useCallback(\n (props: object) => ({\n ...props,\n appendTo: root as unknown as HTMLElement,\n }),\n [root]\n );\n\n if (Anvil1.DefaultPortalContext === undefined || Anvil1.TablePopupPropsContext === undefined) {\n return children;\n }\n\n return (\n <Anvil1.DefaultPortalContext.Provider value={portal as unknown as HTMLElement}>\n <Anvil1.TablePopupPropsContext.Provider value={getTablePopupProps}>\n {children}\n </Anvil1.TablePopupPropsContext.Provider>\n </Anvil1.DefaultPortalContext.Provider>\n );\n};\n"],"names":["Anvil1","useCallback","Anvil1Providers","root","portal","children","getTablePopupProps","props","appendTo","DefaultPortalContext","undefined","TablePopupPropsContext","Provider","value"],"mappings":";AAAA,YAAYA,YAAY,8BAA8B;AACtD,SAAgCC,WAAW,QAAQ,QAAQ;AAE3D,OAAO,MAAMC,kBAAoF,CAAC,EAC9FC,IAAI,EACJC,MAAM,EACNC,QAAQ,EACX;IACG,MAAMC,qBAAqBL,YACvB,CAACM,QAAmB,CAAA;YAChB,GAAGA,KAAK;YACRC,UAAUL;QACd,CAAA,GACA;QAACA;KAAK;IAGV,IAAIH,OAAOS,oBAAoB,KAAKC,aAAaV,OAAOW,sBAAsB,KAAKD,WAAW;QAC1F,OAAOL;IACX;IAEA,qBACI,KAACL,OAAOS,oBAAoB,CAACG,QAAQ;QAACC,OAAOT;kBACzC,cAAA,KAACJ,OAAOW,sBAAsB,CAACC,QAAQ;YAACC,OAAOP;sBAC1CD;;;AAIjB,EAAE"}
@@ -0,0 +1,5 @@
1
+ import { FC, PropsWithChildren } from 'react';
2
+ export declare const Anvil2Providers: FC<{
3
+ portalAnvilContainer: HTMLDivElement;
4
+ } & PropsWithChildren>;
5
+ //# sourceMappingURL=anvil2-providers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anvil2-providers.d.ts","sourceRoot":"","sources":["../src/anvil2-providers.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,EAAE,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAE9C,eAAO,MAAM,eAAe,EAAE,EAAE,CAAC;IAAE,oBAAoB,EAAE,cAAc,CAAA;CAAE,GAAG,iBAAiB,CAS5F,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import * as Anvil2 from '@servicetitan/anvil2';
3
+ export const Anvil2Providers = ({ portalAnvilContainer, children })=>{
4
+ if (Anvil2.PortalProvider === undefined) {
5
+ return children;
6
+ }
7
+ return /*#__PURE__*/ _jsx(Anvil2.PortalProvider, {
8
+ root: portalAnvilContainer,
9
+ children: children
10
+ });
11
+ };
12
+
13
+ //# sourceMappingURL=anvil2-providers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/anvil2-providers.tsx"],"sourcesContent":["import * as Anvil2 from '@servicetitan/anvil2';\nimport { FC, PropsWithChildren } from 'react';\n\nexport const Anvil2Providers: FC<{ portalAnvilContainer: HTMLDivElement } & PropsWithChildren> = ({\n portalAnvilContainer,\n children,\n}) => {\n if (Anvil2.PortalProvider === undefined) {\n return children;\n }\n\n return <Anvil2.PortalProvider root={portalAnvilContainer}>{children}</Anvil2.PortalProvider>;\n};\n"],"names":["Anvil2","Anvil2Providers","portalAnvilContainer","children","PortalProvider","undefined","root"],"mappings":";AAAA,YAAYA,YAAY,uBAAuB;AAG/C,OAAO,MAAMC,kBAAoF,CAAC,EAC9FC,oBAAoB,EACpBC,QAAQ,EACX;IACG,IAAIH,OAAOI,cAAc,KAAKC,WAAW;QACrC,OAAOF;IACX;IAEA,qBAAO,KAACH,OAAOI,cAAc;QAACE,MAAMJ;kBAAuBC;;AAC/D,EAAE"}
@@ -0,0 +1,3 @@
1
+ export { MfeStyleRegistry } from './mfe-style-registry';
2
+ export { withCssInjector } from './with-css-injector';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/css-injector/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { MfeStyleRegistry } from './mfe-style-registry';
2
+ export { withCssInjector } from './with-css-injector';
3
+
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/css-injector/index.ts"],"sourcesContent":["export { MfeStyleRegistry } from './mfe-style-registry';\nexport { withCssInjector } from './with-css-injector';\n"],"names":["MfeStyleRegistry","withCssInjector"],"mappings":"AAAA,SAASA,gBAAgB,QAAQ,uBAAuB;AACxD,SAASC,eAAe,QAAQ,sBAAsB"}
@@ -0,0 +1,14 @@
1
+ declare global {
2
+ var __mfeStyles__: Record<string, MfeStyleRegistry> | undefined;
3
+ }
4
+ type StyleRoot = ShadowRoot | Document;
5
+ export declare class MfeStyleRegistry {
6
+ readonly sheets: Map<string, CSSStyleSheet>;
7
+ readonly roots: Set<StyleRoot>;
8
+ static for(componentName: string): MfeStyleRegistry;
9
+ injectSheet(sheetId: string, css: string): void;
10
+ observeRoot(root: StyleRoot): void;
11
+ unobserveRoot(root: StyleRoot): void;
12
+ }
13
+ export {};
14
+ //# sourceMappingURL=mfe-style-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mfe-style-registry.d.ts","sourceRoot":"","sources":["../../src/css-injector/mfe-style-registry.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,CAAC;IAEX,IAAI,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,GAAG,SAAS,CAAC;CACnE;AAED,KAAK,SAAS,GAAG,UAAU,GAAG,QAAQ,CAAC;AAEvC,qBAAa,gBAAgB;IACzB,QAAQ,CAAC,MAAM,6BAAoC;IACnD,QAAQ,CAAC,KAAK,iBAAwB;IAGtC,MAAM,CAAC,GAAG,CAAC,aAAa,EAAE,MAAM,GAAG,gBAAgB;IAMnD,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM;IAcxC,WAAW,CAAC,IAAI,EAAE,SAAS;IAS3B,aAAa,CAAC,IAAI,EAAE,SAAS;CAMhC"}
@@ -0,0 +1,63 @@
1
+ function _define_property(obj, key, value) {
2
+ if (key in obj) {
3
+ Object.defineProperty(obj, key, {
4
+ value: value,
5
+ enumerable: true,
6
+ configurable: true,
7
+ writable: true
8
+ });
9
+ } else {
10
+ obj[key] = value;
11
+ }
12
+ return obj;
13
+ }
14
+ export class MfeStyleRegistry {
15
+ // Per-component state stored on globalThis.__mfeStyles__ so it survives Vite HMR module reloads.
16
+ static for(componentName) {
17
+ var _globalThis, ___mfeStyles__, _globalThis___mfeStyles__, _componentName, _;
18
+ (___mfeStyles__ = (_globalThis = globalThis).__mfeStyles__) !== null && ___mfeStyles__ !== void 0 ? ___mfeStyles__ : _globalThis.__mfeStyles__ = {};
19
+ (_ = (_globalThis___mfeStyles__ = globalThis.__mfeStyles__)[_componentName = componentName]) !== null && _ !== void 0 ? _ : _globalThis___mfeStyles__[_componentName] = new MfeStyleRegistry();
20
+ return globalThis.__mfeStyles__[componentName];
21
+ }
22
+ injectSheet(sheetId, css) {
23
+ let sheet = this.sheets.get(sheetId);
24
+ if (sheet) {
25
+ sheet.replaceSync(css);
26
+ } else {
27
+ sheet = new CSSStyleSheet();
28
+ sheet.replaceSync(css);
29
+ this.sheets.set(sheetId, sheet);
30
+ for (const root of this.roots){
31
+ root.adoptedStyleSheets = [
32
+ ...root.adoptedStyleSheets,
33
+ sheet
34
+ ];
35
+ }
36
+ }
37
+ }
38
+ observeRoot(root) {
39
+ var _root, _adoptedStyleSheets;
40
+ if (this.roots.has(root)) {
41
+ return;
42
+ }
43
+ this.roots.add(root);
44
+ (_adoptedStyleSheets = (_root = root).adoptedStyleSheets) !== null && _adoptedStyleSheets !== void 0 ? _adoptedStyleSheets : _root.adoptedStyleSheets = [];
45
+ root.adoptedStyleSheets = [
46
+ ...root.adoptedStyleSheets,
47
+ ...this.sheets.values()
48
+ ];
49
+ }
50
+ unobserveRoot(root) {
51
+ var _root, _adoptedStyleSheets;
52
+ this.roots.delete(root);
53
+ const sheets = new Set(this.sheets.values());
54
+ (_adoptedStyleSheets = (_root = root).adoptedStyleSheets) !== null && _adoptedStyleSheets !== void 0 ? _adoptedStyleSheets : _root.adoptedStyleSheets = [];
55
+ root.adoptedStyleSheets = root.adoptedStyleSheets.filter((s)=>!sheets.has(s));
56
+ }
57
+ constructor(){
58
+ _define_property(this, "sheets", new Map());
59
+ _define_property(this, "roots", new Set());
60
+ }
61
+ }
62
+
63
+ //# sourceMappingURL=mfe-style-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/css-injector/mfe-style-registry.ts"],"sourcesContent":["declare global {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n var __mfeStyles__: Record<string, MfeStyleRegistry> | undefined;\n}\n\ntype StyleRoot = ShadowRoot | Document;\n\nexport class MfeStyleRegistry {\n readonly sheets = new Map<string, CSSStyleSheet>();\n readonly roots = new Set<StyleRoot>();\n\n // Per-component state stored on globalThis.__mfeStyles__ so it survives Vite HMR module reloads.\n static for(componentName: string): MfeStyleRegistry {\n globalThis.__mfeStyles__ ??= {};\n globalThis.__mfeStyles__[componentName] ??= new MfeStyleRegistry();\n return globalThis.__mfeStyles__[componentName];\n }\n\n injectSheet(sheetId: string, css: string) {\n let sheet = this.sheets.get(sheetId);\n if (sheet) {\n sheet.replaceSync(css);\n } else {\n sheet = new CSSStyleSheet();\n sheet.replaceSync(css);\n this.sheets.set(sheetId, sheet);\n for (const root of this.roots) {\n root.adoptedStyleSheets = [...root.adoptedStyleSheets, sheet];\n }\n }\n }\n\n observeRoot(root: StyleRoot) {\n if (this.roots.has(root)) {\n return;\n }\n this.roots.add(root);\n root.adoptedStyleSheets ??= [];\n root.adoptedStyleSheets = [...root.adoptedStyleSheets, ...this.sheets.values()];\n }\n\n unobserveRoot(root: StyleRoot) {\n this.roots.delete(root);\n const sheets = new Set(this.sheets.values());\n root.adoptedStyleSheets ??= [];\n root.adoptedStyleSheets = root.adoptedStyleSheets.filter(s => !sheets.has(s));\n }\n}\n"],"names":["MfeStyleRegistry","for","componentName","globalThis","__mfeStyles__","injectSheet","sheetId","css","sheet","sheets","get","replaceSync","CSSStyleSheet","set","root","roots","adoptedStyleSheets","observeRoot","has","add","values","unobserveRoot","delete","Set","filter","s","Map"],"mappings":";;;;;;;;;;;;;AAOA,OAAO,MAAMA;IAIT,iGAAiG;IACjG,OAAOC,IAAIC,aAAqB,EAAoB;YAChDC,aAAAA,gBACAA,2BAAyBD,gBAAzBC;SADAA,iBAAAA,CAAAA,cAAAA,YAAWC,aAAa,cAAxBD,4BAAAA,iBAAAA,YAAWC,aAAa,GAAK,CAAC;SAC9BD,IAAAA,CAAAA,4BAAAA,WAAWC,aAAa,CAAA,CAACF,iBAAAA,cAAc,cAAvCC,eAAAA,IAAAA,yBAAwB,CAACD,eAAc,GAAK,IAAIF;QAChD,OAAOG,WAAWC,aAAa,CAACF,cAAc;IAClD;IAEAG,YAAYC,OAAe,EAAEC,GAAW,EAAE;QACtC,IAAIC,QAAQ,IAAI,CAACC,MAAM,CAACC,GAAG,CAACJ;QAC5B,IAAIE,OAAO;YACPA,MAAMG,WAAW,CAACJ;QACtB,OAAO;YACHC,QAAQ,IAAII;YACZJ,MAAMG,WAAW,CAACJ;YAClB,IAAI,CAACE,MAAM,CAACI,GAAG,CAACP,SAASE;YACzB,KAAK,MAAMM,QAAQ,IAAI,CAACC,KAAK,CAAE;gBAC3BD,KAAKE,kBAAkB,GAAG;uBAAIF,KAAKE,kBAAkB;oBAAER;iBAAM;YACjE;QACJ;IACJ;IAEAS,YAAYH,IAAe,EAAE;YAKzBA,OAAAA;QAJA,IAAI,IAAI,CAACC,KAAK,CAACG,GAAG,CAACJ,OAAO;YACtB;QACJ;QACA,IAAI,CAACC,KAAK,CAACI,GAAG,CAACL;SACfA,sBAAAA,CAAAA,QAAAA,MAAKE,kBAAkB,cAAvBF,iCAAAA,sBAAAA,MAAKE,kBAAkB,GAAK,EAAE;QAC9BF,KAAKE,kBAAkB,GAAG;eAAIF,KAAKE,kBAAkB;eAAK,IAAI,CAACP,MAAM,CAACW,MAAM;SAAG;IACnF;IAEAC,cAAcP,IAAe,EAAE;YAG3BA,OAAAA;QAFA,IAAI,CAACC,KAAK,CAACO,MAAM,CAACR;QAClB,MAAML,SAAS,IAAIc,IAAI,IAAI,CAACd,MAAM,CAACW,MAAM;SACzCN,sBAAAA,CAAAA,QAAAA,MAAKE,kBAAkB,cAAvBF,iCAAAA,sBAAAA,MAAKE,kBAAkB,GAAK,EAAE;QAC9BF,KAAKE,kBAAkB,GAAGF,KAAKE,kBAAkB,CAACQ,MAAM,CAACC,CAAAA,IAAK,CAAChB,OAAOS,GAAG,CAACO;IAC9E;;QAtCA,uBAAShB,UAAS,IAAIiB;QACtB,uBAASX,SAAQ,IAAIQ;;AAsCzB"}
@@ -0,0 +1,6 @@
1
+ import { ComponentType } from 'react';
2
+ declare global {
3
+ var __mfeSelfHosted__: boolean | undefined;
4
+ }
5
+ export declare function withCssInjector<P extends object>(Component: ComponentType<P>): ComponentType<P>;
6
+ //# sourceMappingURL=with-css-injector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"with-css-injector.d.ts","sourceRoot":"","sources":["../../src/css-injector/with-css-injector.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAmB,MAAM,OAAO,CAAC;AAKvD,OAAO,CAAC,MAAM,CAAC;IAEX,IAAI,iBAAiB,EAAE,OAAO,GAAG,SAAS,CAAC;CAC9C;AAMD,wBAAgB,eAAe,CAAC,CAAC,SAAS,MAAM,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAyB/F"}
@@ -0,0 +1,38 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useLayoutEffect } from 'react';
3
+ import { useMFEMetadataContext } from '../contexts/mfe-metadata-context';
4
+ import { WEB_COMPONENT_NAME } from '../globals';
5
+ import { MfeStyleRegistry } from './mfe-style-registry';
6
+ /*
7
+ * HOC wrapping the MFE's root component in register(). Adopts sheets from the registry into
8
+ * the MFE's shadow roots. Only active in development; eliminated by Vite in production builds.
9
+ */ export function withCssInjector(Component) {
10
+ if (process.env.NODE_ENV === 'production') {
11
+ return Component;
12
+ }
13
+ return function CssInjectorWrapper(props) {
14
+ const { shadowRoot, portalShadowRoot } = useMFEMetadataContext();
15
+ useLayoutEffect(()=>{
16
+ const registry = MfeStyleRegistry.for(WEB_COMPONENT_NAME);
17
+ const roots = [
18
+ shadowRoot,
19
+ portalShadowRoot,
20
+ ...globalThis.__mfeSelfHosted__ ? [
21
+ document
22
+ ] : []
23
+ ];
24
+ roots.forEach((root)=>registry.observeRoot(root));
25
+ return ()=>{
26
+ roots.forEach((root)=>registry.unobserveRoot(root));
27
+ };
28
+ }, [
29
+ shadowRoot,
30
+ portalShadowRoot
31
+ ]);
32
+ return /*#__PURE__*/ _jsx(Component, {
33
+ ...props
34
+ });
35
+ };
36
+ }
37
+
38
+ //# sourceMappingURL=with-css-injector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/css-injector/with-css-injector.tsx"],"sourcesContent":["import { ComponentType, useLayoutEffect } from 'react';\nimport { useMFEMetadataContext } from '../contexts/mfe-metadata-context';\nimport { WEB_COMPONENT_NAME } from '../globals';\nimport { MfeStyleRegistry } from './mfe-style-registry';\n\ndeclare global {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n var __mfeSelfHosted__: boolean | undefined;\n}\n\n/*\n * HOC wrapping the MFE's root component in register(). Adopts sheets from the registry into\n * the MFE's shadow roots. Only active in development; eliminated by Vite in production builds.\n */\nexport function withCssInjector<P extends object>(Component: ComponentType<P>): ComponentType<P> {\n if (process.env.NODE_ENV === 'production') {\n return Component;\n }\n\n return function CssInjectorWrapper(props: P) {\n const { shadowRoot, portalShadowRoot } = useMFEMetadataContext();\n\n useLayoutEffect(() => {\n const registry = MfeStyleRegistry.for(WEB_COMPONENT_NAME);\n const roots = [\n shadowRoot,\n portalShadowRoot,\n ...(globalThis.__mfeSelfHosted__ ? [document] : []),\n ];\n\n roots.forEach(root => registry.observeRoot(root));\n\n return () => {\n roots.forEach(root => registry.unobserveRoot(root));\n };\n }, [shadowRoot, portalShadowRoot]);\n\n return <Component {...props} />;\n };\n}\n"],"names":["useLayoutEffect","useMFEMetadataContext","WEB_COMPONENT_NAME","MfeStyleRegistry","withCssInjector","Component","process","env","NODE_ENV","CssInjectorWrapper","props","shadowRoot","portalShadowRoot","registry","for","roots","globalThis","__mfeSelfHosted__","document","forEach","root","observeRoot","unobserveRoot"],"mappings":";AAAA,SAAwBA,eAAe,QAAQ,QAAQ;AACvD,SAASC,qBAAqB,QAAQ,mCAAmC;AACzE,SAASC,kBAAkB,QAAQ,aAAa;AAChD,SAASC,gBAAgB,QAAQ,uBAAuB;AAOxD;;;CAGC,GACD,OAAO,SAASC,gBAAkCC,SAA2B;IACzE,IAAIC,QAAQC,GAAG,CAACC,QAAQ,KAAK,cAAc;QACvC,OAAOH;IACX;IAEA,OAAO,SAASI,mBAAmBC,KAAQ;QACvC,MAAM,EAAEC,UAAU,EAAEC,gBAAgB,EAAE,GAAGX;QAEzCD,gBAAgB;YACZ,MAAMa,WAAWV,iBAAiBW,GAAG,CAACZ;YACtC,MAAMa,QAAQ;gBACVJ;gBACAC;mBACII,WAAWC,iBAAiB,GAAG;oBAACC;iBAAS,GAAG,EAAE;aACrD;YAEDH,MAAMI,OAAO,CAACC,CAAAA,OAAQP,SAASQ,WAAW,CAACD;YAE3C,OAAO;gBACHL,MAAMI,OAAO,CAACC,CAAAA,OAAQP,SAASS,aAAa,CAACF;YACjD;QACJ,GAAG;YAACT;YAAYC;SAAiB;QAEjC,qBAAO,KAACP;YAAW,GAAGK,KAAK;;IAC/B;AACJ"}
@@ -0,0 +1,2 @@
1
+ export declare function getStyleUrls(light: boolean, sharedDependenciesNames: string[], el: HTMLElement): any[];
2
+ //# sourceMappingURL=get-style-urls.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-style-urls.d.ts","sourceRoot":"","sources":["../src/get-style-urls.ts"],"names":[],"mappings":"AAAA,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,uBAAuB,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,WAAW,SAsB9F"}
@@ -0,0 +1,21 @@
1
+ export function getStyleUrls(light, sharedDependenciesNames, el) {
2
+ function getCssUrl(dependencyName, cssFileRegEx) {
3
+ if (light && sharedDependenciesNames.includes(dependencyName)) {
4
+ var _Array_from_find;
5
+ return (_Array_from_find = Array.from(document.getElementsByTagName('link')).find(({ href })=>href && cssFileRegEx.test(href))) === null || _Array_from_find === void 0 ? void 0 : _Array_from_find.href;
6
+ }
7
+ }
8
+ const designSystemUrl = getCssUrl('@servicetitan/design-system', /design-system(\..+)?\.bundle\.css/);
9
+ const anvil2CssUrl = getCssUrl('@servicetitan/anvil2', /anvil2(\..+)?\.bundle\.css/);
10
+ return [
11
+ ...designSystemUrl ? [
12
+ designSystemUrl
13
+ ] : [],
14
+ ...anvil2CssUrl ? [
15
+ anvil2CssUrl
16
+ ] : [],
17
+ ...el.hasAttribute('style-urls') ? JSON.parse(decodeURIComponent(el.getAttribute('style-urls'))) : []
18
+ ];
19
+ }
20
+
21
+ //# sourceMappingURL=get-style-urls.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/get-style-urls.ts"],"sourcesContent":["export function 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"],"names":["getStyleUrls","light","sharedDependenciesNames","el","getCssUrl","dependencyName","cssFileRegEx","includes","Array","from","document","getElementsByTagName","find","href","test","designSystemUrl","anvil2CssUrl","hasAttribute","JSON","parse","decodeURIComponent","getAttribute"],"mappings":"AAAA,OAAO,SAASA,aAAaC,KAAc,EAAEC,uBAAiC,EAAEC,EAAe;IAC3F,SAASC,UAAUC,cAAsB,EAAEC,YAAoB;QAC3D,IAAIL,SAASC,wBAAwBK,QAAQ,CAACF,iBAAiB;gBACpDG;YAAP,QAAOA,mBAAAA,MAAMC,IAAI,CAACC,SAASC,oBAAoB,CAAC,SAASC,IAAI,CACzD,CAAC,EAAEC,IAAI,EAAE,GAAKA,QAAQP,aAAaQ,IAAI,CAACD,oBADrCL,uCAAAA,iBAEJK,IAAI;QACX;IACJ;IAEA,MAAME,kBAAkBX,UACpB,+BACA;IAEJ,MAAMY,eAAeZ,UAAU,wBAAwB;IAEvD,OAAO;WACCW,kBAAkB;YAACA;SAAgB,GAAG,EAAE;WACxCC,eAAe;YAACA;SAAa,GAAG,EAAE;WAClCb,GAAGc,YAAY,CAAC,gBACdC,KAAKC,KAAK,CAACC,mBAAmBjB,GAAGkB,YAAY,CAAC,kBAC9C,EAAE;KACX;AACL"}
package/dist/globals.d.ts CHANGED
@@ -5,8 +5,8 @@ declare global {
5
5
  export const EXPOSED_INSTANCE_DEPENDENCIES: ExposedInstanceDependencies | undefined;
6
6
  export const WEB_COMPONENT_NAME: string | undefined;
7
7
  }
8
- declare const _EXPOSED_DEPENDENCIES: ExposedDependencies | undefined;
9
- declare const _WEB_COMPONENT_NAME: string | undefined;
10
- declare const _EXPOSED_INSTANCE_DEPENDENCIES: ExposedInstanceDependencies | undefined;
8
+ declare const _EXPOSED_DEPENDENCIES: any;
9
+ declare const _WEB_COMPONENT_NAME: any;
10
+ declare const _EXPOSED_INSTANCE_DEPENDENCIES: any;
11
11
  export { _EXPOSED_DEPENDENCIES as EXPOSED_DEPENDENCIES, _EXPOSED_INSTANCE_DEPENDENCIES as EXPOSED_INSTANCE_DEPENDENCIES, _WEB_COMPONENT_NAME as WEB_COMPONENT_NAME, };
12
12
  //# sourceMappingURL=globals.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"globals.d.ts","sourceRoot":"","sources":["../src/globals.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,2BAA2B,EAAE,MAAM,UAAU,CAAC;AAEvD,OAAO,CAAC,MAAM,CAAC;IACX,MAAM,CAAC,MAAM,oBAAoB,EAAE,mBAAmB,GAAG,SAAS,CAAC;IACnE,MAAM,CAAC,MAAM,6BAA6B,EAAE,2BAA2B,GAAG,SAAS,CAAC;IACpF,MAAM,CAAC,MAAM,kBAAkB,EAAE,MAAM,GAAG,SAAS,CAAC;CACvD;AAUD,QAAA,MAAM,qBAAqB,iCAEzB,CAAC;AAEH,QAAA,MAAM,mBAAmB,oBAEvB,CAAC;AAEH,QAAA,MAAM,8BAA8B,yCAElC,CAAC;AAEH,OAAO,EACH,qBAAqB,IAAI,oBAAoB,EAC7C,8BAA8B,IAAI,6BAA6B,EAC/D,mBAAmB,IAAI,kBAAkB,GAC5C,CAAC"}
1
+ {"version":3,"file":"globals.d.ts","sourceRoot":"","sources":["../src/globals.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,2BAA2B,EAAE,MAAM,UAAU,CAAC;AAEvD,OAAO,CAAC,MAAM,CAAC;IACX,MAAM,CAAC,MAAM,oBAAoB,EAAE,mBAAmB,GAAG,SAAS,CAAC;IACnE,MAAM,CAAC,MAAM,6BAA6B,EAAE,2BAA2B,GAAG,SAAS,CAAC;IACpF,MAAM,CAAC,MAAM,kBAAkB,EAAE,MAAM,GAAG,SAAS,CAAC;CACvD;AAiBD,QAAA,MAAM,qBAAqB,KAMrB,CAAC;AAEP,QAAA,MAAM,mBAAmB,KAMnB,CAAC;AACP,QAAA,MAAM,8BAA8B,KAM9B,CAAC;AAEP,OAAO,EACH,qBAAqB,IAAI,oBAAoB,EAC7C,8BAA8B,IAAI,6BAA6B,EAC/D,mBAAmB,IAAI,kBAAkB,GAC5C,CAAC"}
package/dist/globals.js CHANGED
@@ -1,18 +1,33 @@
1
- /* eslint-disable @typescript-eslint/naming-convention */ function get(fetch) {
1
+ /* eslint-disable @typescript-eslint/naming-convention */ // eslint-disable-next-line spaced-comment
2
+ /// <reference types="vite/client" /> — provides types for import.meta.env
3
+ var _get, _get1, _get2;
4
+ /*
5
+ * Safely access a value that may not exist. Returns undefined instead of
6
+ * throwing a ReferenceError. Used below to try global constants first
7
+ * (set by webpack DefinePlugin), then fall back to import.meta.env
8
+ * (set by Vite's define config). One of these will always be defined
9
+ * depending on which bundler built the code.
10
+ */ function get(fetch) {
2
11
  try {
3
12
  return fetch();
4
13
  } catch (unused) {
5
14
  return undefined;
6
15
  }
7
16
  }
8
- const _EXPOSED_DEPENDENCIES = get(()=>{
17
+ const _EXPOSED_DEPENDENCIES = (_get = get(()=>{
9
18
  return EXPOSED_DEPENDENCIES;
19
+ })) !== null && _get !== void 0 ? _get : get(()=>{
20
+ return import.meta.env.EXPOSED_DEPENDENCIES;
10
21
  });
11
- const _WEB_COMPONENT_NAME = get(()=>{
22
+ const _WEB_COMPONENT_NAME = (_get1 = get(()=>{
12
23
  return WEB_COMPONENT_NAME;
24
+ })) !== null && _get1 !== void 0 ? _get1 : get(()=>{
25
+ return import.meta.env.WEB_COMPONENT_NAME;
13
26
  });
14
- const _EXPOSED_INSTANCE_DEPENDENCIES = get(()=>{
27
+ const _EXPOSED_INSTANCE_DEPENDENCIES = (_get2 = get(()=>{
15
28
  return EXPOSED_INSTANCE_DEPENDENCIES;
29
+ })) !== null && _get2 !== void 0 ? _get2 : get(()=>{
30
+ return import.meta.env.EXPOSED_INSTANCE_DEPENDENCIES;
16
31
  });
17
32
  export { _EXPOSED_DEPENDENCIES as EXPOSED_DEPENDENCIES, _EXPOSED_INSTANCE_DEPENDENCIES as EXPOSED_INSTANCE_DEPENDENCIES, _WEB_COMPONENT_NAME as WEB_COMPONENT_NAME };
18
33
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/globals.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention */\nimport { ExposedDependencies } from '@servicetitan/startup-utils';\nimport { ExposedInstanceDependencies } from './common';\n\ndeclare global {\n export const EXPOSED_DEPENDENCIES: ExposedDependencies | undefined;\n export const EXPOSED_INSTANCE_DEPENDENCIES: ExposedInstanceDependencies | undefined;\n export const WEB_COMPONENT_NAME: string | undefined;\n}\n\nfunction get<T>(fetch: () => T) {\n try {\n return fetch();\n } catch {\n return undefined;\n }\n}\n\nconst _EXPOSED_DEPENDENCIES = get(() => {\n return EXPOSED_DEPENDENCIES;\n});\n\nconst _WEB_COMPONENT_NAME = get(() => {\n return WEB_COMPONENT_NAME;\n});\n\nconst _EXPOSED_INSTANCE_DEPENDENCIES = get(() => {\n return EXPOSED_INSTANCE_DEPENDENCIES;\n});\n\nexport {\n _EXPOSED_DEPENDENCIES as EXPOSED_DEPENDENCIES,\n _EXPOSED_INSTANCE_DEPENDENCIES as EXPOSED_INSTANCE_DEPENDENCIES,\n _WEB_COMPONENT_NAME as WEB_COMPONENT_NAME,\n};\n"],"names":["get","fetch","undefined","_EXPOSED_DEPENDENCIES","EXPOSED_DEPENDENCIES","_WEB_COMPONENT_NAME","WEB_COMPONENT_NAME","_EXPOSED_INSTANCE_DEPENDENCIES","EXPOSED_INSTANCE_DEPENDENCIES"],"mappings":"AAAA,uDAAuD,GAUvD,SAASA,IAAOC,KAAc;IAC1B,IAAI;QACA,OAAOA;IACX,EAAE,eAAM;QACJ,OAAOC;IACX;AACJ;AAEA,MAAMC,wBAAwBH,IAAI;IAC9B,OAAOI;AACX;AAEA,MAAMC,sBAAsBL,IAAI;IAC5B,OAAOM;AACX;AAEA,MAAMC,iCAAiCP,IAAI;IACvC,OAAOQ;AACX;AAEA,SACIL,yBAAyBC,oBAAoB,EAC7CG,kCAAkCC,6BAA6B,EAC/DH,uBAAuBC,kBAAkB,GAC3C"}
1
+ {"version":3,"sources":["../src/globals.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention */\n// eslint-disable-next-line spaced-comment\n/// <reference types=\"vite/client\" /> — provides types for import.meta.env\nimport { ExposedDependencies } from '@servicetitan/startup-utils';\nimport { ExposedInstanceDependencies } from './common';\n\ndeclare global {\n export const EXPOSED_DEPENDENCIES: ExposedDependencies | undefined;\n export const EXPOSED_INSTANCE_DEPENDENCIES: ExposedInstanceDependencies | undefined;\n export const WEB_COMPONENT_NAME: string | undefined;\n}\n\n/*\n * Safely access a value that may not exist. Returns undefined instead of\n * throwing a ReferenceError. Used below to try global constants first\n * (set by webpack DefinePlugin), then fall back to import.meta.env\n * (set by Vite's define config). One of these will always be defined\n * depending on which bundler built the code.\n */\nfunction get<T>(fetch: () => T) {\n try {\n return fetch();\n } catch {\n return undefined;\n }\n}\n\nconst _EXPOSED_DEPENDENCIES =\n get(() => {\n return EXPOSED_DEPENDENCIES;\n }) ??\n get(() => {\n return import.meta.env.EXPOSED_DEPENDENCIES;\n });\n\nconst _WEB_COMPONENT_NAME =\n get(() => {\n return WEB_COMPONENT_NAME;\n }) ??\n get(() => {\n return import.meta.env.WEB_COMPONENT_NAME;\n });\nconst _EXPOSED_INSTANCE_DEPENDENCIES =\n get(() => {\n return EXPOSED_INSTANCE_DEPENDENCIES;\n }) ??\n get(() => {\n return import.meta.env.EXPOSED_INSTANCE_DEPENDENCIES;\n });\n\nexport {\n _EXPOSED_DEPENDENCIES as EXPOSED_DEPENDENCIES,\n _EXPOSED_INSTANCE_DEPENDENCIES as EXPOSED_INSTANCE_DEPENDENCIES,\n _WEB_COMPONENT_NAME as WEB_COMPONENT_NAME,\n};\n"],"names":["get","fetch","undefined","_EXPOSED_DEPENDENCIES","EXPOSED_DEPENDENCIES","env","_WEB_COMPONENT_NAME","WEB_COMPONENT_NAME","_EXPOSED_INSTANCE_DEPENDENCIES","EXPOSED_INSTANCE_DEPENDENCIES"],"mappings":"AAAA,uDAAuD,GACvD,0CAA0C;AAC1C,0EAA0E;IA0BtEA,MAQAA,OAOAA;AA/BJ;;;;;;CAMC,GACD,SAASA,IAAOC,KAAc;IAC1B,IAAI;QACA,OAAOA;IACX,EAAE,eAAM;QACJ,OAAOC;IACX;AACJ;AAEA,MAAMC,yBACFH,OAAAA,IAAI;IACA,OAAOI;AACX,gBAFAJ,kBAAAA,OAGAA,IAAI;IACA,OAAO,YAAYK,GAAG,CAACD,oBAAoB;AAC/C;AAEJ,MAAME,uBACFN,QAAAA,IAAI;IACA,OAAOO;AACX,gBAFAP,mBAAAA,QAGAA,IAAI;IACA,OAAO,YAAYK,GAAG,CAACE,kBAAkB;AAC7C;AACJ,MAAMC,kCACFR,QAAAA,IAAI;IACA,OAAOS;AACX,gBAFAT,mBAAAA,QAGAA,IAAI;IACA,OAAO,YAAYK,GAAG,CAACI,6BAA6B;AACxD;AAEJ,SACIN,yBAAyBC,oBAAoB,EAC7CI,kCAAkCC,6BAA6B,EAC/DH,uBAAuBC,kBAAkB,GAC3C"}
package/dist/index.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  export * from './common';
2
2
  export * from './contexts';
3
+ export * from './css-injector';
3
4
  export * from './event-bus';
4
5
  export * from './get-value-for-environment';
5
6
  export * from './headless-loader';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,6BAA6B,CAAC;AAC5C,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAE/B,YAAY,EAAE,IAAI,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,6BAA6B,CAAC;AAC5C,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAE/B,YAAY,EAAE,IAAI,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC"}
package/dist/index.js CHANGED
@@ -1,5 +1,6 @@
1
1
  export * from './common';
2
2
  export * from './contexts';
3
+ export * from './css-injector';
3
4
  export * from './event-bus';
4
5
  export * from './get-value-for-environment';
5
6
  export * from './headless-loader';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["export * from './common';\nexport * from './contexts';\nexport * from './event-bus';\nexport * from './get-value-for-environment';\nexport * from './headless-loader';\nexport * from './history-manager';\nexport * from './loader';\nexport * from './register';\nexport * from './register-headless';\nexport * from './use-prefetch';\n\nexport type { JSON, JSONPrimitive, Serializable } from './types';\n"],"names":[],"mappings":"AAAA,cAAc,WAAW;AACzB,cAAc,aAAa;AAC3B,cAAc,cAAc;AAC5B,cAAc,8BAA8B;AAC5C,cAAc,oBAAoB;AAClC,cAAc,oBAAoB;AAClC,cAAc,WAAW;AACzB,cAAc,aAAa;AAC3B,cAAc,sBAAsB;AACpC,cAAc,iBAAiB"}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["export * from './common';\nexport * from './contexts';\nexport * from './css-injector';\nexport * from './event-bus';\nexport * from './get-value-for-environment';\nexport * from './headless-loader';\nexport * from './history-manager';\nexport * from './loader';\nexport * from './register';\nexport * from './register-headless';\nexport * from './use-prefetch';\n\nexport type { JSON, JSONPrimitive, Serializable } from './types';\n"],"names":[],"mappings":"AAAA,cAAc,WAAW;AACzB,cAAc,aAAa;AAC3B,cAAc,iBAAiB;AAC/B,cAAc,cAAc;AAC5B,cAAc,8BAA8B;AAC5C,cAAc,oBAAoB;AAClC,cAAc,oBAAoB;AAClC,cAAc,WAAW;AACzB,cAAc,aAAa;AAC3B,cAAc,sBAAsB;AACpC,cAAc,iBAAiB"}
@@ -1 +1 @@
1
- {"version":3,"file":"register-headless.d.ts","sourceRoot":"","sources":["../src/register-headless.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAiB,MAAM,UAAU,CAAC;AACvD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,KAAK,oBAAoB,CAAC,QAAQ,EAAE,SAAS,SAAS,QAAQ,GAAG,QAAQ,IAAI,IAAI,CAC7E,OAAO,EACP,WAAW,GAAG,YAAY,CAC7B,GAAG;IACA,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,OAAO,CAAC,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAC;CACpC,CAAC;AACF,MAAM,MAAM,gBAAgB,CAAC,QAAQ,GAAG,GAAG,EAAE,SAAS,SAAS,QAAQ,GAAG,QAAQ,IAAI,CAClF,MAAM,EAAE,oBAAoB,CAAC,QAAQ,EAAE,SAAS,CAAC,KAChD,IAAI,CAAC;AAEV,wBAAgB,gBAAgB,CAC5B,iBAAiB,CAAC,EAAE,gBAAgB,EACpC,oBAAoB,CAAC,EAAE,gBAAgB,QAmE1C"}
1
+ {"version":3,"file":"register-headless.d.ts","sourceRoot":"","sources":["../src/register-headless.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAiB,MAAM,UAAU,CAAC;AACvD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,KAAK,oBAAoB,CAAC,QAAQ,EAAE,SAAS,SAAS,QAAQ,GAAG,QAAQ,IAAI,IAAI,CAC7E,OAAO,EACP,WAAW,GAAG,YAAY,CAC7B,GAAG;IACA,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,OAAO,CAAC,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAC;CACpC,CAAC;AACF,MAAM,MAAM,gBAAgB,CAAC,QAAQ,GAAG,GAAG,EAAE,SAAS,SAAS,QAAQ,GAAG,QAAQ,IAAI,CAClF,MAAM,EAAE,oBAAoB,CAAC,QAAQ,EAAE,SAAS,CAAC,KAChD,IAAI,CAAC;AAEV,wBAAgB,gBAAgB,CAC5B,iBAAiB,CAAC,EAAE,gBAAgB,EACpC,oBAAoB,CAAC,EAAE,gBAAgB,QAmE1C"}
@@ -11,6 +11,7 @@ function _define_property(obj, key, value) {
11
11
  }
12
12
  return obj;
13
13
  }
14
+ import { WEB_COMPONENT_NAME } from './globals';
14
15
  export function registerHeadless(connectedCallback, disconnectedCallback) {
15
16
  class Headless extends HTMLElement {
16
17
  async connectedCallback() {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/register-headless.ts"],"sourcesContent":["import type { LDService } from '@servicetitan/launchdarkly-service';\nimport type { Log } from '@servicetitan/log-service';\nimport type { Entries, IWebComponent } from './common';\nimport type { EventBus } from './event-bus';\nimport { Serializable } from './types';\n\ntype HeadlessCallbackArgs<TMfeData, TEventBus extends EventBus = EventBus> = Pick<\n Entries,\n 'ldService' | 'logService'\n> & {\n eventBus?: TEventBus;\n mfeData?: Serializable<TMfeData>;\n};\nexport type HeadlessCallback<TMfeData = any, TEventBus extends EventBus = EventBus> = (\n params: HeadlessCallbackArgs<TMfeData, TEventBus>\n) => void;\n\nexport function registerHeadless(\n connectedCallback?: HeadlessCallback,\n disconnectedCallback?: HeadlessCallback\n) {\n class Headless extends HTMLElement implements IWebComponent {\n private ldService?: LDService;\n private logService?: Log;\n private eventBus?: EventBus;\n private readonly readyPromise: Promise<void>;\n private resolveReadyPromise!: () => void;\n\n constructor() {\n super();\n this.readyPromise = new Promise(resolve => {\n this.resolveReadyPromise = resolve;\n });\n }\n\n provide = (entries: Entries) => {\n this.ldService = entries.ldService;\n this.logService = entries.logService;\n this.eventBus = entries.eventBus;\n this.resolveReadyPromise();\n };\n\n async connectedCallback() {\n await this.readyPromise;\n connectedCallback?.({\n ...this.services,\n mfeData: this.mfeData,\n });\n }\n\n async disconnectedCallback() {\n await this.readyPromise;\n disconnectedCallback?.({\n ...this.services,\n mfeData: this.mfeData,\n });\n }\n\n connectedMoveCallback() {\n /*\n * Defining connectedMoveCallback prevents connectedCallback or disconnectedCallback\n * from running when the element is moved in the DOM\n * https://developer.mozilla.org/en-US/docs/Web/API/Web_components/Using_custom_elements#custom_element_lifecycle_callbacks\n */\n }\n\n private get services() {\n return {\n ldService: this.ldService,\n logService: this.logService,\n eventBus: this.eventBus,\n };\n }\n\n private get mfeData() {\n return JSON.parse(this.dataset.mfeData ?? '{}');\n }\n }\n\n if (!WEB_COMPONENT_NAME) {\n // eslint-disable-next-line no-console\n console.error('\"WEB_COMPONENT_NAME\" is not defined!');\n return;\n }\n\n window.customElements.define(`headless-${WEB_COMPONENT_NAME}`, Headless);\n}\n"],"names":["registerHeadless","connectedCallback","disconnectedCallback","Headless","HTMLElement","readyPromise","services","mfeData","connectedMoveCallback","ldService","logService","eventBus","JSON","parse","dataset","resolveReadyPromise","provide","entries","Promise","resolve","WEB_COMPONENT_NAME","console","error","window","customElements","define"],"mappings":";;;;;;;;;;;;;AAiBA,OAAO,SAASA,iBACZC,iBAAoC,EACpCC,oBAAuC;IAEvC,MAAMC,iBAAiBC;QAqBnB,MAAMH,oBAAoB;YACtB,MAAM,IAAI,CAACI,YAAY;YACvBJ,8BAAAA,wCAAAA,kBAAoB;gBAChB,GAAG,IAAI,CAACK,QAAQ;gBAChBC,SAAS,IAAI,CAACA,OAAO;YACzB;QACJ;QAEA,MAAML,uBAAuB;YACzB,MAAM,IAAI,CAACG,YAAY;YACvBH,iCAAAA,2CAAAA,qBAAuB;gBACnB,GAAG,IAAI,CAACI,QAAQ;gBAChBC,SAAS,IAAI,CAACA,OAAO;YACzB;QACJ;QAEAC,wBAAwB;QACpB;;;;aAIC,GACL;QAEA,IAAYF,WAAW;YACnB,OAAO;gBACHG,WAAW,IAAI,CAACA,SAAS;gBACzBC,YAAY,IAAI,CAACA,UAAU;gBAC3BC,UAAU,IAAI,CAACA,QAAQ;YAC3B;QACJ;QAEA,IAAYJ,UAAU;gBACA;YAAlB,OAAOK,KAAKC,KAAK,EAAC,wBAAA,IAAI,CAACC,OAAO,CAACP,OAAO,cAApB,mCAAA,wBAAwB;QAC9C;QAhDA,aAAc;YACV,KAAK,IAPT,uBAAQE,aAAR,KAAA,IACA,uBAAQC,cAAR,KAAA,IACA,uBAAQC,YAAR,KAAA,IACA,uBAAiBN,gBAAjB,KAAA,IACA,uBAAQU,uBAAR,KAAA,IASAC,uBAAAA,WAAU,CAACC;gBACP,IAAI,CAACR,SAAS,GAAGQ,QAAQR,SAAS;gBAClC,IAAI,CAACC,UAAU,GAAGO,QAAQP,UAAU;gBACpC,IAAI,CAACC,QAAQ,GAAGM,QAAQN,QAAQ;gBAChC,IAAI,CAACI,mBAAmB;YAC5B;YAVI,IAAI,CAACV,YAAY,GAAG,IAAIa,QAAQC,CAAAA;gBAC5B,IAAI,CAACJ,mBAAmB,GAAGI;YAC/B;QACJ;IA4CJ;IAEA,IAAI,CAACC,oBAAoB;QACrB,sCAAsC;QACtCC,QAAQC,KAAK,CAAC;QACd;IACJ;IAEAC,OAAOC,cAAc,CAACC,MAAM,CAAC,CAAC,SAAS,EAAEL,oBAAoB,EAAEjB;AACnE"}
1
+ {"version":3,"sources":["../src/register-headless.ts"],"sourcesContent":["import type { LDService } from '@servicetitan/launchdarkly-service';\nimport type { Log } from '@servicetitan/log-service';\nimport type { Entries, IWebComponent } from './common';\nimport type { EventBus } from './event-bus';\nimport { WEB_COMPONENT_NAME } from './globals';\nimport { Serializable } from './types';\n\ntype HeadlessCallbackArgs<TMfeData, TEventBus extends EventBus = EventBus> = Pick<\n Entries,\n 'ldService' | 'logService'\n> & {\n eventBus?: TEventBus;\n mfeData?: Serializable<TMfeData>;\n};\nexport type HeadlessCallback<TMfeData = any, TEventBus extends EventBus = EventBus> = (\n params: HeadlessCallbackArgs<TMfeData, TEventBus>\n) => void;\n\nexport function registerHeadless(\n connectedCallback?: HeadlessCallback,\n disconnectedCallback?: HeadlessCallback\n) {\n class Headless extends HTMLElement implements IWebComponent {\n private ldService?: LDService;\n private logService?: Log;\n private eventBus?: EventBus;\n private readonly readyPromise: Promise<void>;\n private resolveReadyPromise!: () => void;\n\n constructor() {\n super();\n this.readyPromise = new Promise(resolve => {\n this.resolveReadyPromise = resolve;\n });\n }\n\n provide = (entries: Entries) => {\n this.ldService = entries.ldService;\n this.logService = entries.logService;\n this.eventBus = entries.eventBus;\n this.resolveReadyPromise();\n };\n\n async connectedCallback() {\n await this.readyPromise;\n connectedCallback?.({\n ...this.services,\n mfeData: this.mfeData,\n });\n }\n\n async disconnectedCallback() {\n await this.readyPromise;\n disconnectedCallback?.({\n ...this.services,\n mfeData: this.mfeData,\n });\n }\n\n connectedMoveCallback() {\n /*\n * Defining connectedMoveCallback prevents connectedCallback or disconnectedCallback\n * from running when the element is moved in the DOM\n * https://developer.mozilla.org/en-US/docs/Web/API/Web_components/Using_custom_elements#custom_element_lifecycle_callbacks\n */\n }\n\n private get services() {\n return {\n ldService: this.ldService,\n logService: this.logService,\n eventBus: this.eventBus,\n };\n }\n\n private get mfeData() {\n return JSON.parse(this.dataset.mfeData ?? '{}');\n }\n }\n\n if (!WEB_COMPONENT_NAME) {\n // eslint-disable-next-line no-console\n console.error('\"WEB_COMPONENT_NAME\" is not defined!');\n return;\n }\n\n window.customElements.define(`headless-${WEB_COMPONENT_NAME}`, Headless);\n}\n"],"names":["WEB_COMPONENT_NAME","registerHeadless","connectedCallback","disconnectedCallback","Headless","HTMLElement","readyPromise","services","mfeData","connectedMoveCallback","ldService","logService","eventBus","JSON","parse","dataset","resolveReadyPromise","provide","entries","Promise","resolve","console","error","window","customElements","define"],"mappings":";;;;;;;;;;;;;AAIA,SAASA,kBAAkB,QAAQ,YAAY;AAc/C,OAAO,SAASC,iBACZC,iBAAoC,EACpCC,oBAAuC;IAEvC,MAAMC,iBAAiBC;QAqBnB,MAAMH,oBAAoB;YACtB,MAAM,IAAI,CAACI,YAAY;YACvBJ,8BAAAA,wCAAAA,kBAAoB;gBAChB,GAAG,IAAI,CAACK,QAAQ;gBAChBC,SAAS,IAAI,CAACA,OAAO;YACzB;QACJ;QAEA,MAAML,uBAAuB;YACzB,MAAM,IAAI,CAACG,YAAY;YACvBH,iCAAAA,2CAAAA,qBAAuB;gBACnB,GAAG,IAAI,CAACI,QAAQ;gBAChBC,SAAS,IAAI,CAACA,OAAO;YACzB;QACJ;QAEAC,wBAAwB;QACpB;;;;aAIC,GACL;QAEA,IAAYF,WAAW;YACnB,OAAO;gBACHG,WAAW,IAAI,CAACA,SAAS;gBACzBC,YAAY,IAAI,CAACA,UAAU;gBAC3BC,UAAU,IAAI,CAACA,QAAQ;YAC3B;QACJ;QAEA,IAAYJ,UAAU;gBACA;YAAlB,OAAOK,KAAKC,KAAK,EAAC,wBAAA,IAAI,CAACC,OAAO,CAACP,OAAO,cAApB,mCAAA,wBAAwB;QAC9C;QAhDA,aAAc;YACV,KAAK,IAPT,uBAAQE,aAAR,KAAA,IACA,uBAAQC,cAAR,KAAA,IACA,uBAAQC,YAAR,KAAA,IACA,uBAAiBN,gBAAjB,KAAA,IACA,uBAAQU,uBAAR,KAAA,IASAC,uBAAAA,WAAU,CAACC;gBACP,IAAI,CAACR,SAAS,GAAGQ,QAAQR,SAAS;gBAClC,IAAI,CAACC,UAAU,GAAGO,QAAQP,UAAU;gBACpC,IAAI,CAACC,QAAQ,GAAGM,QAAQN,QAAQ;gBAChC,IAAI,CAACI,mBAAmB;YAC5B;YAVI,IAAI,CAACV,YAAY,GAAG,IAAIa,QAAQC,CAAAA;gBAC5B,IAAI,CAACJ,mBAAmB,GAAGI;YAC/B;QACJ;IA4CJ;IAEA,IAAI,CAACpB,oBAAoB;QACrB,sCAAsC;QACtCqB,QAAQC,KAAK,CAAC;QACd;IACJ;IAEAC,OAAOC,cAAc,CAACC,MAAM,CAAC,CAAC,SAAS,EAAEzB,oBAAoB,EAAEI;AACnE"}
@@ -1 +1 @@
1
- {"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../src/register.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,aAAa,EAA+B,MAAM,OAAO,CAAC;AAiCnE,MAAM,WAAW,eAAe;IAC5B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,uBAAuB,CAAC,EAAE,MAAM,EAAE,CAAC;CACtC;AAED,wBAAgB,QAAQ,CAAC,SAAS,EAAE,aAAa,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,eAAe,QAkP3F"}
1
+ {"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../src/register.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,aAAa,EAA+B,MAAM,OAAO,CAAC;AAqCnE,MAAM,WAAW,eAAe;IAC5B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,uBAAuB,CAAC,EAAE,MAAM,EAAE,CAAC;CACtC;AAED,wBAAgB,QAAQ,CAAC,SAAS,EAAE,aAAa,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,eAAe,QAmN3F"}
package/dist/register.js CHANGED
@@ -15,10 +15,14 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
15
15
  import { Log } from '@servicetitan/log-service';
16
16
  import { Provider } from '@servicetitan/react-ioc';
17
17
  import { useEffect } from 'react';
18
+ import { Anvil1Providers } from './anvil1-providers';
19
+ import { Anvil2Providers } from './anvil2-providers';
18
20
  import { BASENAME_TOKEN, EXPOSED_DEPENDENCIES_TOKEN, EXPOSED_INSTANCE_DEPENDENCIES_TOKEN, IS_WEB_COMPONENT_TOKEN, RENDER_ROOT_TOKEN } from './common';
19
21
  import { MFEDataContext } from './contexts/mfe-data-context';
20
22
  import { MFEMetadataContext } from './contexts/mfe-metadata-context';
23
+ import { withCssInjector } from './css-injector';
21
24
  import { EVENT_BUS_TOKEN } from './event-bus';
25
+ import { getStyleUrls } from './get-style-urls';
22
26
  import { WEB_COMPONENT_NAME } from './globals';
23
27
  import { HistoryManager } from './history-manager';
24
28
  import { render } from './render';
@@ -38,6 +42,7 @@ const Placeholder = ()=>/*#__PURE__*/ _jsx("div", {
38
42
  }
39
43
  });
40
44
  export function register(Component, light, options) {
45
+ const WrappedComponent = withCssInjector(Component);
41
46
  class WebComponent extends HTMLElement {
42
47
  connectedCallback() {
43
48
  var _ref, _this_shadowRoot;
@@ -103,42 +108,15 @@ export function register(Component, light, options) {
103
108
  attributeChangedCallback() {
104
109
  this.render();
105
110
  }
106
- withAnvil1Providers(children) {
107
- try {
108
- /**
109
- * Note, the webpack.IgnorePlugin must be configured to ignore this dependency.
110
- * @see {@link file://./../../startup/src/webpack/configs/plugins/ignore-plugin/ignore-plugin.ts}
111
- */ const { DefaultPortalContext, TablePopupPropsContext } = require('@servicetitan/design-system');
112
- return /*#__PURE__*/ _jsx(DefaultPortalContext.Provider, {
113
- value: this.portal,
114
- children: /*#__PURE__*/ _jsx(TablePopupPropsContext.Provider, {
115
- value: (props)=>({
116
- ...props,
117
- appendTo: this.root
118
- }),
119
- children: children
120
- })
121
- });
122
- } catch (unused) {
123
- return children;
124
- }
125
- }
126
- withAnvil2Providers(children) {
127
- try {
128
- /**
129
- * Note, the webpack.IgnorePlugin must be configured to ignore this dependency.
130
- * @see {@link file://./../../startup/src/webpack/configs/plugins/ignore-plugin/ignore-plugin.ts}
131
- */ const { PortalProvider } = require('@servicetitan/anvil2');
132
- return /*#__PURE__*/ _jsx(PortalProvider, {
133
- root: this.portalAnvilContainer,
134
- children: children
135
- });
136
- } catch (unused) {
137
- return children;
138
- }
139
- }
140
111
  withProviders(children) {
141
- return this.withAnvil2Providers(this.withAnvil1Providers(children));
112
+ return /*#__PURE__*/ _jsx(Anvil2Providers, {
113
+ portalAnvilContainer: this.portalAnvilContainer,
114
+ children: /*#__PURE__*/ _jsx(Anvil1Providers, {
115
+ root: this.root,
116
+ portal: this.portal,
117
+ children: children
118
+ })
119
+ });
142
120
  }
143
121
  constructor(...args){
144
122
  super(...args), _define_property(this, "root", void 0), _define_property(this, "portal", void 0), _define_property(this, "portalAnvilContainer", void 0), _define_property(this, "styles", {
@@ -234,7 +212,7 @@ export function register(Component, light, options) {
234
212
  children: /*#__PURE__*/ _jsxs(MFEMetadataContext.Provider, {
235
213
  value: metadata,
236
214
  children: [
237
- this.withProviders(/*#__PURE__*/ _jsx(Component, {
215
+ this.withProviders(/*#__PURE__*/ _jsx(WrappedComponent, {
238
216
  ...mfeData
239
217
  })),
240
218
  this.onReady && /*#__PURE__*/ _jsx(RenderCallback, {
@@ -256,25 +234,6 @@ export function register(Component, light, options) {
256
234
  }
257
235
  window.customElements.define(WEB_COMPONENT_NAME, WebComponent);
258
236
  }
259
- function getStyleUrls(light, sharedDependenciesNames, el) {
260
- function getCssUrl(dependencyName, cssFileRegEx) {
261
- if (light && sharedDependenciesNames.includes(dependencyName)) {
262
- var _Array_from_find;
263
- return (_Array_from_find = Array.from(document.getElementsByTagName('link')).find(({ href })=>href && cssFileRegEx.test(href))) === null || _Array_from_find === void 0 ? void 0 : _Array_from_find.href;
264
- }
265
- }
266
- const designSystemUrl = getCssUrl('@servicetitan/design-system', /design-system(\..+)?\.bundle\.css/);
267
- const anvil2CssUrl = getCssUrl('@servicetitan/anvil2', /anvil2(\..+)?\.bundle\.css/);
268
- return [
269
- ...designSystemUrl ? [
270
- designSystemUrl
271
- ] : [],
272
- ...anvil2CssUrl ? [
273
- anvil2CssUrl
274
- ] : [],
275
- ...el.hasAttribute('style-urls') ? JSON.parse(decodeURIComponent(el.getAttribute('style-urls'))) : []
276
- ];
277
- }
278
237
  function RenderCallback({ callback }) {
279
238
  // eslint-disable-next-line react-hooks/exhaustive-deps
280
239
  useEffect(()=>callback(), []);