@servicetitan/web-components 36.1.0 → 36.1.1-beta.1

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 (46) hide show
  1. package/dist/globals.d.ts +3 -3
  2. package/dist/globals.d.ts.map +1 -1
  3. package/dist/globals.js +19 -4
  4. package/dist/globals.js.map +1 -1
  5. package/dist/index.d.ts +1 -0
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +1 -0
  8. package/dist/index.js.map +1 -1
  9. package/dist/register-headless.d.ts.map +1 -1
  10. package/dist/register-headless.js +1 -0
  11. package/dist/register-headless.js.map +1 -1
  12. package/dist/register.d.ts.map +1 -1
  13. package/dist/register.js +38 -36
  14. package/dist/register.js.map +1 -1
  15. package/dist/render.d.ts.map +1 -1
  16. package/dist/render.js +3 -11
  17. package/dist/render.js.map +1 -1
  18. package/dist/utils/get-bundle-info.d.ts.map +1 -1
  19. package/dist/utils/get-bundle-info.js +10 -4
  20. package/dist/utils/get-bundle-info.js.map +1 -1
  21. package/dist/utils/get-entry-points.d.ts +1 -0
  22. package/dist/utils/get-entry-points.d.ts.map +1 -1
  23. package/dist/utils/get-entry-points.js.map +1 -1
  24. package/dist/utils/get-ld-service-token.d.ts +2 -3
  25. package/dist/utils/get-ld-service-token.d.ts.map +1 -1
  26. package/dist/utils/get-ld-service-token.js +2 -7
  27. package/dist/utils/get-ld-service-token.js.map +1 -1
  28. package/dist/with-css-injector.d.ts +3 -0
  29. package/dist/with-css-injector.d.ts.map +1 -0
  30. package/dist/with-css-injector.js +52 -0
  31. package/dist/with-css-injector.js.map +1 -0
  32. package/package.json +20 -11
  33. package/src/__mocks__/register-anvil2-harness.tsx +49 -0
  34. package/src/__mocks__/test-component.tsx +9 -2
  35. package/src/__tests__/register-anvil2-optional.test.tsx +32 -0
  36. package/src/__tests__/register-anvil2.test.tsx +11 -64
  37. package/src/__tests__/with-css-injector.test.tsx +152 -0
  38. package/src/globals.ts +30 -10
  39. package/src/index.ts +1 -0
  40. package/src/register-headless.ts +1 -0
  41. package/src/register.tsx +48 -42
  42. package/src/render.ts +3 -14
  43. package/src/utils/get-bundle-info.ts +11 -5
  44. package/src/utils/get-entry-points.ts +1 -0
  45. package/src/utils/get-ld-service-token.ts +2 -10
  46. package/src/with-css-injector.tsx +45 -0
@@ -78,14 +78,13 @@ export async function getBundleInfo({
78
78
  resolvedBundleType = embed ? 'light' : 'full';
79
79
  }
80
80
 
81
- const withBaseUrl = (path: string) =>
82
- `${exactPackageUrl}/dist/bundle/${resolvedBundleType}/${path}`;
81
+ const bundleBaseUrl = `${exactPackageUrl}/dist/bundle/${resolvedBundleType}`;
83
82
 
84
83
  let entrypoints: EntryPoints;
85
84
  if (metadata.entrypoints?.[resolvedBundleType]) {
86
85
  entrypoints = metadata.entrypoints[resolvedBundleType];
87
86
  } else {
88
- entrypoints = await getEntrypoints(withBaseUrl('entrypoints.json'), requestCache);
87
+ entrypoints = await getEntrypoints(`${bundleBaseUrl}/entrypoints.json`, requestCache);
89
88
  }
90
89
 
91
90
  const disposer = () => {
@@ -97,9 +96,16 @@ export async function getBundleInfo({
97
96
  }
98
97
  };
99
98
 
99
+ let baseUrl = bundleBaseUrl;
100
+ if (entrypoints.port) {
101
+ const url = new URL(baseUrl);
102
+ url.port = String(entrypoints.port);
103
+ baseUrl = url.toString();
104
+ }
105
+
100
106
  const urls: EntryPoints = {
101
- css: entrypoints.css.map(withBaseUrl),
102
- js: entrypoints.js.map(withBaseUrl),
107
+ css: entrypoints.css.map(path => `${baseUrl}/${path}`),
108
+ js: entrypoints.js.map(path => `${baseUrl}/${path}`),
103
109
  };
104
110
 
105
111
  const elementName = resolvedBundleType === 'headless' ? `headless-${name}` : name;
@@ -4,6 +4,7 @@ export interface EntryPoints {
4
4
  css: string[];
5
5
  js: string[];
6
6
  module?: true;
7
+ port?: number;
7
8
  }
8
9
 
9
10
  export async function getEntrypoints(
@@ -1,13 +1,5 @@
1
- import { type LDService } from '@servicetitan/launchdarkly-service';
2
- import { SymbolToken } from '@servicetitan/react-ioc';
3
-
4
- let token: SymbolToken<LDService>;
5
- try {
6
- token = require('@servicetitan/launchdarkly-service').LD_SERVICE_TOKEN;
7
- } catch {
8
- // ignore
9
- }
1
+ import * as LDService from '@servicetitan/launchdarkly-service';
10
2
 
11
3
  export function getLDServiceToken() {
12
- return token;
4
+ return LDService.LD_SERVICE_TOKEN;
13
5
  }
@@ -0,0 +1,45 @@
1
+ import { ComponentType, useEffect } from 'react';
2
+ import { useMFEMetadataContext } from './contexts/mfe-metadata-context';
3
+ import { WEB_COMPONENT_NAME } from './globals';
4
+
5
+ export function withCssInjector<P extends object>(Component: ComponentType<P>): ComponentType<P> {
6
+ return function CssInjectorWrapper(props: P) {
7
+ const { shadowRoot, portalShadowRoot } = useMFEMetadataContext();
8
+
9
+ useEffect(() => {
10
+ window.__mfeStyles__ ??= {};
11
+ const mfeStyles = window.__mfeStyles__;
12
+ mfeStyles[WEB_COMPONENT_NAME] ??= Object.assign(new EventTarget(), {
13
+ sheets: new Map<string, CSSStyleSheet>(),
14
+ });
15
+ const emitter = mfeStyles[WEB_COMPONENT_NAME];
16
+ /*
17
+ * In self-hosted standalone dev mode (set by index.html), also adopt sheets
18
+ * into document so host-only CSS vars and fonts propagate to the page.
19
+ */
20
+ const roots = [
21
+ shadowRoot,
22
+ portalShadowRoot,
23
+ ...(window.__mfeSelfHosted__ ? [document] : []),
24
+ ];
25
+ function adoptSheet(sheet: CSSStyleSheet) {
26
+ for (const root of roots) {
27
+ root.adoptedStyleSheets = [...root.adoptedStyleSheets, sheet];
28
+ }
29
+ }
30
+
31
+ for (const sheet of emitter.sheets.values()) {
32
+ adoptSheet(sheet);
33
+ }
34
+
35
+ const handleNewSheet = ({ detail: sheetId }: CustomEvent<string>) => {
36
+ adoptSheet(emitter.sheets.get(sheetId)!);
37
+ };
38
+
39
+ emitter.addEventListener('new-sheet', handleNewSheet);
40
+ return () => emitter.removeEventListener('new-sheet', handleNewSheet);
41
+ }, [shadowRoot, portalShadowRoot]);
42
+
43
+ return <Component {...props} />;
44
+ };
45
+ }