@servicetitan/web-components 35.3.0 → 36.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -22,7 +22,8 @@ function detectEnvironment(keys, defaultEnvironment, hostname) {
22
22
  function isLocalHost(hostname) {
23
23
  return [
24
24
  'localhost',
25
- '127.0.0.1'
25
+ '127.0.0.1',
26
+ 'app-web'
26
27
  ].some((host)=>hostname.indexOf(host) >= 0);
27
28
  }
28
29
  function isTestEnvironment() {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/get-value-for-environment.ts"],"sourcesContent":["// See https://github.com/microsoft/TypeScript/issues/29729 for why LiteralUnion\n// eslint-disable-next-line @typescript-eslint/naming-convention\ntype LiteralUnion<T extends U, U = string> = T | (U & { _?: never });\n\nexport type Environment = LiteralUnion<'dev' | 'go' | 'next' | 'qa' | 'stage' | 'test'>;\nexport type EnvironmentValues = Partial<Record<Environment, string>>;\n\nexport function getValueForEnvironment(\n values: EnvironmentValues,\n defaultEnvironment: Environment = 'qa',\n hostname: string = window.location.hostname\n) {\n const keys = Object.keys(values) as (keyof typeof values)[];\n const key = detectEnvironment(keys, defaultEnvironment, hostname);\n return values[key];\n}\n\nfunction detectEnvironment(\n keys: Environment[],\n defaultEnvironment: Environment,\n hostname: string\n): Environment {\n if (isTestEnvironment()) {\n return 'test';\n }\n\n if (isLocalHost(hostname)) {\n return 'dev';\n }\n\n for (const key of keys) {\n if (\n hostname.indexOf(`${key}.servicetitan.com`) >= 0 ||\n (key.endsWith('.st.dev') && hostname.indexOf(key) >= 0)\n ) {\n return key;\n }\n }\n\n return defaultEnvironment;\n}\n\nfunction isLocalHost(hostname: string) {\n return ['localhost', '127.0.0.1'].some(host => hostname.indexOf(host) >= 0);\n}\n\nfunction isTestEnvironment() {\n return process.env.NODE_ENV === 'test';\n}\n"],"names":["getValueForEnvironment","values","defaultEnvironment","hostname","window","location","keys","Object","key","detectEnvironment","isTestEnvironment","isLocalHost","indexOf","endsWith","some","host","process","env","NODE_ENV"],"mappings":"AAAA,gFAAgF;AAChF,gEAAgE;AAMhE,OAAO,SAASA,uBACZC,MAAyB,EACzBC,qBAAkC,IAAI,EACtCC,WAAmBC,OAAOC,QAAQ,CAACF,QAAQ;IAE3C,MAAMG,OAAOC,OAAOD,IAAI,CAACL;IACzB,MAAMO,MAAMC,kBAAkBH,MAAMJ,oBAAoBC;IACxD,OAAOF,MAAM,CAACO,IAAI;AACtB;AAEA,SAASC,kBACLH,IAAmB,EACnBJ,kBAA+B,EAC/BC,QAAgB;IAEhB,IAAIO,qBAAqB;QACrB,OAAO;IACX;IAEA,IAAIC,YAAYR,WAAW;QACvB,OAAO;IACX;IAEA,KAAK,MAAMK,OAAOF,KAAM;QACpB,IACIH,SAASS,OAAO,CAAC,GAAGJ,IAAI,iBAAiB,CAAC,KAAK,KAC9CA,IAAIK,QAAQ,CAAC,cAAcV,SAASS,OAAO,CAACJ,QAAQ,GACvD;YACE,OAAOA;QACX;IACJ;IAEA,OAAON;AACX;AAEA,SAASS,YAAYR,QAAgB;IACjC,OAAO;QAAC;QAAa;KAAY,CAACW,IAAI,CAACC,CAAAA,OAAQZ,SAASS,OAAO,CAACG,SAAS;AAC7E;AAEA,SAASL;IACL,OAAOM,QAAQC,GAAG,CAACC,QAAQ,KAAK;AACpC"}
1
+ {"version":3,"sources":["../src/get-value-for-environment.ts"],"sourcesContent":["// See https://github.com/microsoft/TypeScript/issues/29729 for why LiteralUnion\n// eslint-disable-next-line @typescript-eslint/naming-convention\ntype LiteralUnion<T extends U, U = string> = T | (U & { _?: never });\n\nexport type Environment = LiteralUnion<'dev' | 'go' | 'next' | 'qa' | 'stage' | 'test'>;\nexport type EnvironmentValues = Partial<Record<Environment, string>>;\n\nexport function getValueForEnvironment(\n values: EnvironmentValues,\n defaultEnvironment: Environment = 'qa',\n hostname: string = window.location.hostname\n) {\n const keys = Object.keys(values) as (keyof typeof values)[];\n const key = detectEnvironment(keys, defaultEnvironment, hostname);\n return values[key];\n}\n\nfunction detectEnvironment(\n keys: Environment[],\n defaultEnvironment: Environment,\n hostname: string\n): Environment {\n if (isTestEnvironment()) {\n return 'test';\n }\n\n if (isLocalHost(hostname)) {\n return 'dev';\n }\n\n for (const key of keys) {\n if (\n hostname.indexOf(`${key}.servicetitan.com`) >= 0 ||\n (key.endsWith('.st.dev') && hostname.indexOf(key) >= 0)\n ) {\n return key;\n }\n }\n\n return defaultEnvironment;\n}\n\nfunction isLocalHost(hostname: string) {\n return ['localhost', '127.0.0.1', 'app-web'].some(host => hostname.indexOf(host) >= 0);\n}\n\nfunction isTestEnvironment() {\n return process.env.NODE_ENV === 'test';\n}\n"],"names":["getValueForEnvironment","values","defaultEnvironment","hostname","window","location","keys","Object","key","detectEnvironment","isTestEnvironment","isLocalHost","indexOf","endsWith","some","host","process","env","NODE_ENV"],"mappings":"AAAA,gFAAgF;AAChF,gEAAgE;AAMhE,OAAO,SAASA,uBACZC,MAAyB,EACzBC,qBAAkC,IAAI,EACtCC,WAAmBC,OAAOC,QAAQ,CAACF,QAAQ;IAE3C,MAAMG,OAAOC,OAAOD,IAAI,CAACL;IACzB,MAAMO,MAAMC,kBAAkBH,MAAMJ,oBAAoBC;IACxD,OAAOF,MAAM,CAACO,IAAI;AACtB;AAEA,SAASC,kBACLH,IAAmB,EACnBJ,kBAA+B,EAC/BC,QAAgB;IAEhB,IAAIO,qBAAqB;QACrB,OAAO;IACX;IAEA,IAAIC,YAAYR,WAAW;QACvB,OAAO;IACX;IAEA,KAAK,MAAMK,OAAOF,KAAM;QACpB,IACIH,SAASS,OAAO,CAAC,GAAGJ,IAAI,iBAAiB,CAAC,KAAK,KAC9CA,IAAIK,QAAQ,CAAC,cAAcV,SAASS,OAAO,CAACJ,QAAQ,GACvD;YACE,OAAOA;QACX;IACJ;IAEA,OAAON;AACX;AAEA,SAASS,YAAYR,QAAgB;IACjC,OAAO;QAAC;QAAa;QAAa;KAAU,CAACW,IAAI,CAACC,CAAAA,OAAQZ,SAASS,OAAO,CAACG,SAAS;AACxF;AAEA,SAASL;IACL,OAAOM,QAAQC,GAAG,CAACC,QAAQ,KAAK;AACpC"}
package/dist/types.d.ts CHANGED
@@ -14,6 +14,7 @@ export interface Metadata {
14
14
  entrypoints?: Record<string, {
15
15
  css: string[];
16
16
  js: string[];
17
+ module?: true;
17
18
  }>;
18
19
  }
19
20
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC;AAEzE,MAAM,MAAM,IAAI,GAAG,aAAa,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG,IAAI,EAAE,CAAC;AAE7E,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI;KACzB,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,IAAI,GAC3B,CAAC,CAAC,CAAC,CAAC,GACJ,CAAC,CAAC,CAAC,CAAC,SAAS,QAAQ,GAAG,IAAI,GAAG,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,MAAM,GAC9D,KAAK,GACL,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,GACtB,YAAY,CAAC,CAAC,CAAC,EAAE,GACjB,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAC/B,CAAC;AAEF,MAAM,WAAW,QAAQ;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACjD,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3C,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,GAAG,EAAE,MAAM,EAAE,CAAC;QAAC,EAAE,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;CACjE"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC;AAEzE,MAAM,MAAM,IAAI,GAAG,aAAa,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG,IAAI,EAAE,CAAC;AAE7E,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI;KACzB,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,IAAI,GAC3B,CAAC,CAAC,CAAC,CAAC,GACJ,CAAC,CAAC,CAAC,CAAC,SAAS,QAAQ,GAAG,IAAI,GAAG,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,MAAM,GAC9D,KAAK,GACL,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,GACtB,YAAY,CAAC,CAAC,CAAC,EAAE,GACjB,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAC/B,CAAC;AAEF,MAAM,WAAW,QAAQ;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACjD,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3C,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,GAAG,EAAE,MAAM,EAAE,CAAC;QAAC,EAAE,EAAE,MAAM,EAAE,CAAC;QAAC,MAAM,CAAC,EAAE,IAAI,CAAA;KAAE,CAAC,CAAC;CAChF"}
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/types.ts"],"sourcesContent":["export type JSONPrimitive = string | number | boolean | null | undefined;\n\nexport type JSON = JSONPrimitive | { [key: string | number]: JSON } | JSON[];\n\nexport type Serializable<T> = {\n [P in keyof T]: T[P] extends JSON\n ? T[P]\n : T[P] extends Function | Date | Map<any, any> | Set<any> | symbol\n ? never\n : T[P] extends (infer U)[]\n ? Serializable<U>[]\n : Serializable<T[P]>;\n};\n\nexport interface Metadata {\n name: string;\n version?: string;\n bundledWith?: Record<string, string | undefined>;\n sharedDependencies: Record<string, string>;\n dependencies?: Record<string, string>;\n entrypoints?: Record<string, { css: string[]; js: string[] }>;\n}\n"],"names":[],"mappings":"AAcA,WAOC"}
1
+ {"version":3,"sources":["../src/types.ts"],"sourcesContent":["export type JSONPrimitive = string | number | boolean | null | undefined;\n\nexport type JSON = JSONPrimitive | { [key: string | number]: JSON } | JSON[];\n\nexport type Serializable<T> = {\n [P in keyof T]: T[P] extends JSON\n ? T[P]\n : T[P] extends Function | Date | Map<any, any> | Set<any> | symbol\n ? never\n : T[P] extends (infer U)[]\n ? Serializable<U>[]\n : Serializable<T[P]>;\n};\n\nexport interface Metadata {\n name: string;\n version?: string;\n bundledWith?: Record<string, string | undefined>;\n sharedDependencies: Record<string, string>;\n dependencies?: Record<string, string>;\n entrypoints?: Record<string, { css: string[]; js: string[]; module?: true }>;\n}\n"],"names":[],"mappings":"AAcA,WAOC"}
@@ -28,6 +28,7 @@ export declare function getBundleInfo({ cache, mainPackageUrl, fallbackPackageUr
28
28
  urls: EntryPoints;
29
29
  WebComponent: string;
30
30
  version: string | undefined;
31
+ module: true | undefined;
31
32
  }>;
32
33
  export {};
33
34
  //# sourceMappingURL=get-bundle-info.d.ts.map
@@ -1 +1 @@
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
+ {"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;;;;;;;;;;;;;;;;GAuFpB"}
@@ -58,10 +58,10 @@ export async function getBundleInfo({ cache, mainPackageUrl, fallbackPackageUrl,
58
58
  }
59
59
  }
60
60
  };
61
- const urls = Object.entries(entrypoints).reduce((result, [key, value])=>({
62
- ...result,
63
- [key]: value.map(withBaseUrl)
64
- }), {});
61
+ const urls = {
62
+ css: entrypoints.css.map(withBaseUrl),
63
+ js: entrypoints.js.map(withBaseUrl)
64
+ };
65
65
  const elementName = resolvedBundleType === 'headless' ? `headless-${name}` : name;
66
66
  return {
67
67
  bundledWith,
@@ -74,7 +74,8 @@ export async function getBundleInfo({ cache, mainPackageUrl, fallbackPackageUrl,
74
74
  resolvedBundleType,
75
75
  urls,
76
76
  WebComponent: elementName,
77
- version: metadata.version
77
+ version: metadata.version,
78
+ module: entrypoints.module
78
79
  };
79
80
  }
80
81
 
@@ -1 +1 @@
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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"}
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: EntryPoints = {\n css: entrypoints.css.map(withBaseUrl),\n js: entrypoints.js.map(withBaseUrl),\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 module: entrypoints.module,\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","css","map","js","elementName","mfeSupportsRerendering","mfeHasUniqueChunkNamespace","mfeHasCompatibleLaunchDarklyVersion","WebComponent","version","module"],"mappings":"AAAA,SAA8BA,oBAAoB,QAAQ,8BAA8B;AACxF,OAAOC,SAAS,aAAa;AAC7B,OAAOC,YAAY,SAAS;AAC5B,SAAsCC,OAAO,QAAsB,YAAY;AAE/E,SAASC,eAAe,QAAQ,sBAAsB;AACtD,SAASC,iBAAiB,QAAQ,wBAAwB;AAC1D,SAAsBC,cAAc,QAAQ,qBAAqB;AACjE,SAASC,sCAAsC,QAAQ,gDAAgD;AACvG,SAASC,6BAA6B,QAAQ,uCAAuC;AACrF,SAASC,yBAAyB,QAAQ,iCAAiC;AAgB3E,OAAO,eAAeC,cAAc,EAChCC,KAAK,EACLC,cAAc,EACdC,kBAAkB,EAClBC,sBAAsB,CAAC,CAAC,EACxBC,8BAA8B,CAAC,CAAC,EAChCC,UAAU,EACVC,MAAM,EACNC,OAAO,EACPC,cAAc,EACG;QAgDbC;IA/CJ,MAAM,EACFC,QAAQ,EACRC,MAAMF,QAAQ,EACdG,KAAKC,UAAU,EAClB,GAAG,MAAMnB,kBAAkB;QACxBM;QACAE;QACAD;QACAO;QACAD;QACAD;IACJ;IAEA,MAAM,EAAEQ,WAAW,EAAEC,IAAI,EAAEC,kBAAkB,EAAE,GAAGP;IAClD,MAAMQ,kBAAkBJ,WAAWK,OAAO,CAAC,uBAAuB;IAClE,MAAMC,eAAe1B,gBAAgBwB;IAErC,IAAIG;IACJ,IAAIX,SAASW,YAAY,EAAE;QACvBA,eAAeX,SAASW,YAAY;IACxC,OAAO;QACH,MAAM,EAAET,MAAMU,WAAW,EAAE,GAAG,MAAM7B,QAAQ,GAAGyB,gBAAgB,aAAa,CAAC,EAAE;YAC3EjB,OAAOmB;YACPZ;YACAD;QACJ;QAEAc,eAAeC,YAAYD,YAAY;IAC3C;IAEA,IAAIE;IACJ,IAAIC;IAEJ,IAAIlB,YAAY;QACZkB,qBAAqB;IACzB,OAAO;QACHD,WAAWjC,qBAAqBc,qBAAqBiB,cAAcJ;QACnE,MAAMQ,iBAAiBV,wBAAAA,kCAAAA,WAAa,CAAC,wBAAwB;QAC7D,MAAMW,sBAAsB,CAAC,CAACD,kBAAkBjC,OAAOmC,GAAG,CAACF,gBAAgB;QAC3E,MAAMG,QAAQ,CAACL,YAAYG;QAC3BF,qBAAqBI,QAAQ,UAAU;IAC3C;IAEA,MAAMC,cAAc,CAACC,OACjB,GAAGZ,gBAAgB,aAAa,EAAEM,mBAAmB,CAAC,EAAEM,MAAM;IAElE,IAAIC;IACJ,KAAIrB,wBAAAA,SAASqB,WAAW,cAApBrB,4CAAAA,qBAAsB,CAACc,mBAAmB,EAAE;QAC5CO,cAAcrB,SAASqB,WAAW,CAACP,mBAAmB;IAC1D,OAAO;QACHO,cAAc,MAAMnC,eAAeiC,YAAY,qBAAqBT;IACxE;IAEA,MAAMY,WAAW;QACb,IAAIR,uBAAuB,SAAS;YAChC,MAAMM,OAAOG,OAAOC,MAAM,CAASjB,oBAAoBkB,KAAK;YAC5D,IAAIL,MAAM;gBACNvC,IAAI6C,QAAQN,MAAMO,UAAU,GAAGC,KAAK,CAACtB;YACzC;QACJ;IACJ;IAEA,MAAMuB,OAAoB;QACtBC,KAAKT,YAAYS,GAAG,CAACC,GAAG,CAACZ;QACzBa,IAAIX,YAAYW,EAAE,CAACD,GAAG,CAACZ;IAC3B;IAEA,MAAMc,cAAcnB,uBAAuB,aAAa,CAAC,SAAS,EAAER,MAAM,GAAGA;IAE7E,OAAO;QACHD;QACAJ;QACAqB;QACAY,wBAAwB7C,0BAA0BgB,aAAaM;QAC/DwB,4BAA4B/C,8BAA8BiB;QAC1D+B,qCAAqCjD,uCACjCkB,aACAV;QAEJkB;QACAC;QACAe;QACAQ,cAAcJ;QACdK,SAAStC,SAASsC,OAAO;QACzBC,QAAQlB,YAAYkB,MAAM;IAC9B;AACJ"}
@@ -1,6 +1,7 @@
1
1
  export interface EntryPoints {
2
2
  css: string[];
3
3
  js: string[];
4
+ module?: true;
4
5
  }
5
6
  export declare function getEntrypoints(url: string, cache: 'no-store' | undefined, signal?: AbortSignal): Promise<EntryPoints>;
6
7
  //# sourceMappingURL=get-entry-points.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"get-entry-points.d.ts","sourceRoot":"","sources":["../../src/utils/get-entry-points.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,WAAW;IACxB,GAAG,EAAE,MAAM,EAAE,CAAC;IACd,EAAE,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,wBAAsB,cAAc,CAChC,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,UAAU,GAAG,SAAS,EAC7B,MAAM,CAAC,EAAE,WAAW,GACrB,OAAO,CAAC,WAAW,CAAC,CAWtB"}
1
+ {"version":3,"file":"get-entry-points.d.ts","sourceRoot":"","sources":["../../src/utils/get-entry-points.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,WAAW;IACxB,GAAG,EAAE,MAAM,EAAE,CAAC;IACd,EAAE,EAAE,MAAM,EAAE,CAAC;IACb,MAAM,CAAC,EAAE,IAAI,CAAC;CACjB;AAED,wBAAsB,cAAc,CAChC,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,UAAU,GAAG,SAAS,EAC7B,MAAM,CAAC,EAAE,WAAW,GACrB,OAAO,CAAC,WAAW,CAAC,CAWtB"}
@@ -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,eAAM;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 module?: true;\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;AAQpC,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,3 +1,3 @@
1
1
  import { BundleInfo } from './get-bundle-info';
2
- export declare function loadScripts({ urls, WebComponent }: BundleInfo): Promise<void[]>;
2
+ export declare function loadScripts({ urls, WebComponent, module }: BundleInfo): Promise<void[]>;
3
3
  //# sourceMappingURL=load-scripts.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"load-scripts.d.ts","sourceRoot":"","sources":["../../src/utils/load-scripts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,wBAAgB,WAAW,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,UAAU,mBAmC7D"}
1
+ {"version":3,"file":"load-scripts.d.ts","sourceRoot":"","sources":["../../src/utils/load-scripts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,wBAAgB,WAAW,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,EAAE,UAAU,mBAwCrE"}
@@ -1,16 +1,20 @@
1
- export function loadScripts({ urls, WebComponent }) {
1
+ export function loadScripts({ urls, WebComponent, module }) {
2
2
  return Promise.all(urls.js.map((url)=>{
3
3
  const script = Array.from(document.scripts).find(({ src })=>src === url);
4
4
  if (!script) {
5
5
  return new Promise((resolve)=>{
6
6
  const script = document.createElement('script');
7
+ if (module) {
8
+ script.type = 'module';
9
+ } else {
10
+ script.async = true;
11
+ }
7
12
  script.crossOrigin = 'anonymous';
8
13
  script.onload = ()=>{
9
14
  script.dataset.webComponent = WebComponent;
10
15
  script.onload = null;
11
16
  resolve();
12
17
  };
13
- script.async = true;
14
18
  script.src = url;
15
19
  document.body.append(script);
16
20
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/load-scripts.ts"],"sourcesContent":["import { BundleInfo } from './get-bundle-info';\n\nexport function loadScripts({ urls, WebComponent }: BundleInfo) {\n return Promise.all(\n urls.js.map(url => {\n const script = Array.from(document.scripts).find(({ src }) => src === url);\n if (!script) {\n return new Promise<void>(resolve => {\n const script = document.createElement('script');\n\n script.crossOrigin = 'anonymous';\n script.onload = () => {\n script.dataset.webComponent = WebComponent;\n script.onload = null;\n resolve();\n };\n script.async = true;\n script.src = url;\n\n document.body.append(script);\n });\n }\n\n if (!script.dataset.webComponent) {\n return new Promise<void>(resolve => {\n const originalOnload = script.onload;\n script.onload = (...args) => {\n originalOnload?.call(script, ...args);\n script.onload = null;\n resolve();\n };\n });\n }\n\n return Promise.resolve();\n })\n );\n}\n"],"names":["loadScripts","urls","WebComponent","Promise","all","js","map","url","script","Array","from","document","scripts","find","src","resolve","createElement","crossOrigin","onload","dataset","webComponent","async","body","append","originalOnload","args","call"],"mappings":"AAEA,OAAO,SAASA,YAAY,EAAEC,IAAI,EAAEC,YAAY,EAAc;IAC1D,OAAOC,QAAQC,GAAG,CACdH,KAAKI,EAAE,CAACC,GAAG,CAACC,CAAAA;QACR,MAAMC,SAASC,MAAMC,IAAI,CAACC,SAASC,OAAO,EAAEC,IAAI,CAAC,CAAC,EAAEC,GAAG,EAAE,GAAKA,QAAQP;QACtE,IAAI,CAACC,QAAQ;YACT,OAAO,IAAIL,QAAcY,CAAAA;gBACrB,MAAMP,SAASG,SAASK,aAAa,CAAC;gBAEtCR,OAAOS,WAAW,GAAG;gBACrBT,OAAOU,MAAM,GAAG;oBACZV,OAAOW,OAAO,CAACC,YAAY,GAAGlB;oBAC9BM,OAAOU,MAAM,GAAG;oBAChBH;gBACJ;gBACAP,OAAOa,KAAK,GAAG;gBACfb,OAAOM,GAAG,GAAGP;gBAEbI,SAASW,IAAI,CAACC,MAAM,CAACf;YACzB;QACJ;QAEA,IAAI,CAACA,OAAOW,OAAO,CAACC,YAAY,EAAE;YAC9B,OAAO,IAAIjB,QAAcY,CAAAA;gBACrB,MAAMS,iBAAiBhB,OAAOU,MAAM;gBACpCV,OAAOU,MAAM,GAAG,CAAC,GAAGO;oBAChBD,2BAAAA,qCAAAA,eAAgBE,IAAI,CAAClB,WAAWiB;oBAChCjB,OAAOU,MAAM,GAAG;oBAChBH;gBACJ;YACJ;QACJ;QAEA,OAAOZ,QAAQY,OAAO;IAC1B;AAER"}
1
+ {"version":3,"sources":["../../src/utils/load-scripts.ts"],"sourcesContent":["import { BundleInfo } from './get-bundle-info';\n\nexport function loadScripts({ urls, WebComponent, module }: BundleInfo) {\n return Promise.all(\n urls.js.map(url => {\n const script = Array.from(document.scripts).find(({ src }) => src === url);\n if (!script) {\n return new Promise<void>(resolve => {\n const script = document.createElement('script');\n\n if (module) {\n script.type = 'module';\n } else {\n script.async = true;\n }\n\n script.crossOrigin = 'anonymous';\n script.onload = () => {\n script.dataset.webComponent = WebComponent;\n script.onload = null;\n resolve();\n };\n script.src = url;\n\n document.body.append(script);\n });\n }\n\n if (!script.dataset.webComponent) {\n return new Promise<void>(resolve => {\n const originalOnload = script.onload;\n script.onload = (...args) => {\n originalOnload?.call(script, ...args);\n script.onload = null;\n resolve();\n };\n });\n }\n\n return Promise.resolve();\n })\n );\n}\n"],"names":["loadScripts","urls","WebComponent","module","Promise","all","js","map","url","script","Array","from","document","scripts","find","src","resolve","createElement","type","async","crossOrigin","onload","dataset","webComponent","body","append","originalOnload","args","call"],"mappings":"AAEA,OAAO,SAASA,YAAY,EAAEC,IAAI,EAAEC,YAAY,EAAEC,MAAM,EAAc;IAClE,OAAOC,QAAQC,GAAG,CACdJ,KAAKK,EAAE,CAACC,GAAG,CAACC,CAAAA;QACR,MAAMC,SAASC,MAAMC,IAAI,CAACC,SAASC,OAAO,EAAEC,IAAI,CAAC,CAAC,EAAEC,GAAG,EAAE,GAAKA,QAAQP;QACtE,IAAI,CAACC,QAAQ;YACT,OAAO,IAAIL,QAAcY,CAAAA;gBACrB,MAAMP,SAASG,SAASK,aAAa,CAAC;gBAEtC,IAAId,QAAQ;oBACRM,OAAOS,IAAI,GAAG;gBAClB,OAAO;oBACHT,OAAOU,KAAK,GAAG;gBACnB;gBAEAV,OAAOW,WAAW,GAAG;gBACrBX,OAAOY,MAAM,GAAG;oBACZZ,OAAOa,OAAO,CAACC,YAAY,GAAGrB;oBAC9BO,OAAOY,MAAM,GAAG;oBAChBL;gBACJ;gBACAP,OAAOM,GAAG,GAAGP;gBAEbI,SAASY,IAAI,CAACC,MAAM,CAAChB;YACzB;QACJ;QAEA,IAAI,CAACA,OAAOa,OAAO,CAACC,YAAY,EAAE;YAC9B,OAAO,IAAInB,QAAcY,CAAAA;gBACrB,MAAMU,iBAAiBjB,OAAOY,MAAM;gBACpCZ,OAAOY,MAAM,GAAG,CAAC,GAAGM;oBAChBD,2BAAAA,qCAAAA,eAAgBE,IAAI,CAACnB,WAAWkB;oBAChClB,OAAOY,MAAM,GAAG;oBAChBL;gBACJ;YACJ;QACJ;QAEA,OAAOZ,QAAQY,OAAO;IAC1B;AAER"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@servicetitan/web-components",
3
- "version": "35.3.0",
3
+ "version": "36.1.0",
4
4
  "description": "Framework to build, register, and load Microfrontends into host applications",
5
5
  "homepage": "https://docs.st.dev/docs/frontend/uikit/web-components",
6
6
  "repository": {
@@ -16,18 +16,18 @@
16
16
  "src"
17
17
  ],
18
18
  "dependencies": {
19
- "@servicetitan/error-boundary": "35.3.0",
20
- "@servicetitan/startup-utils": "35.3.0",
19
+ "@servicetitan/error-boundary": "36.1.0",
20
+ "@servicetitan/startup-utils": "36.1.0",
21
21
  "lodash.get": "~4.4.2",
22
22
  "mitt": "~3.0.1",
23
23
  "semver": "~7.7.4"
24
24
  },
25
25
  "devDependencies": {
26
- "@servicetitan/anvil2": "^2.6.1",
26
+ "@servicetitan/anvil2": "^2.8.0",
27
27
  "@servicetitan/design-system": "~14.5.3",
28
- "@servicetitan/launchdarkly-service": "35.3.0",
29
- "@servicetitan/log-service": "35.3.0",
30
- "@servicetitan/react-ioc": "35.3.0",
28
+ "@servicetitan/launchdarkly-service": "36.1.0",
29
+ "@servicetitan/log-service": "36.1.0",
30
+ "@servicetitan/react-ioc": "36.1.0",
31
31
  "@testing-library/dom": "^10.4.1",
32
32
  "@testing-library/jest-dom": "^6.9.1",
33
33
  "@testing-library/react": "^16.3.2",
@@ -45,9 +45,9 @@
45
45
  "peerDependencies": {
46
46
  "@servicetitan/anvil2": ">=1.5.0",
47
47
  "@servicetitan/design-system": ">=14.5.3",
48
- "@servicetitan/launchdarkly-service": "35.3.0",
49
- "@servicetitan/log-service": "35.3.0",
50
- "@servicetitan/react-ioc": "35.3.0",
48
+ "@servicetitan/launchdarkly-service": "36.1.0",
49
+ "@servicetitan/log-service": "36.1.0",
50
+ "@servicetitan/react-ioc": "36.1.0",
51
51
  "history": "~4.10.1",
52
52
  "react": ">=17.0.2",
53
53
  "react-dom": ">=17.0.2"
@@ -69,5 +69,5 @@
69
69
  "cli": {
70
70
  "webpack": false
71
71
  },
72
- "gitHead": "a978fa979eaba3487c32cd9f948391957974f7d1"
72
+ "gitHead": "b7b5cade33151c4d183faf498ddc1321694b7b2b"
73
73
  }
@@ -56,7 +56,7 @@ describe(`[web-components] ${getValueForEnvironment.name}`, () => {
56
56
  });
57
57
  });
58
58
 
59
- describe.each(['127.0.0.1', 'localhost'])('when hostname contains "%s"', host => {
59
+ describe.each(['127.0.0.1', 'localhost', 'app-web'])('when hostname contains "%s"', host => {
60
60
  beforeEach(() => (hostname = host));
61
61
 
62
62
  test('returns id for "dev" environment', () => {
@@ -403,6 +403,18 @@ describe('[web-components] Loader', () => {
403
403
  () => `${baseUrl}/dist/bundle/light/${metadata.entrypoints!.light.css[0]}`
404
404
  );
405
405
 
406
+ describe('when entrypoint has module: true', () => {
407
+ beforeEach(() => {
408
+ metadata.entrypoints!.light.module = true;
409
+ });
410
+
411
+ test('creates script with type="module"', async () => {
412
+ await scriptLoadedSetup();
413
+
414
+ expect(document.querySelector('script')).toHaveAttribute('type', 'module');
415
+ });
416
+ });
417
+
406
418
  describe('when the startup version is < 17.0.0', () => {
407
419
  beforeEach(() => {
408
420
  setStartupVersion('16.0.0');
@@ -41,7 +41,7 @@ function detectEnvironment(
41
41
  }
42
42
 
43
43
  function isLocalHost(hostname: string) {
44
- return ['localhost', '127.0.0.1'].some(host => hostname.indexOf(host) >= 0);
44
+ return ['localhost', '127.0.0.1', 'app-web'].some(host => hostname.indexOf(host) >= 0);
45
45
  }
46
46
 
47
47
  function isTestEnvironment() {
package/src/types.ts CHANGED
@@ -18,5 +18,5 @@ export interface Metadata {
18
18
  bundledWith?: Record<string, string | undefined>;
19
19
  sharedDependencies: Record<string, string>;
20
20
  dependencies?: Record<string, string>;
21
- entrypoints?: Record<string, { css: string[]; js: string[] }>;
21
+ entrypoints?: Record<string, { css: string[]; js: string[]; module?: true }>;
22
22
  }
@@ -97,10 +97,10 @@ export async function getBundleInfo({
97
97
  }
98
98
  };
99
99
 
100
- const urls = Object.entries(entrypoints).reduce(
101
- (result, [key, value]) => ({ ...result, [key]: value.map(withBaseUrl) }),
102
- {} as EntryPoints
103
- );
100
+ const urls: EntryPoints = {
101
+ css: entrypoints.css.map(withBaseUrl),
102
+ js: entrypoints.js.map(withBaseUrl),
103
+ };
104
104
 
105
105
  const elementName = resolvedBundleType === 'headless' ? `headless-${name}` : name;
106
106
 
@@ -119,5 +119,6 @@ export async function getBundleInfo({
119
119
  urls,
120
120
  WebComponent: elementName,
121
121
  version: metadata.version,
122
+ module: entrypoints.module,
122
123
  };
123
124
  }
@@ -3,6 +3,7 @@ import { getJson } from '../common';
3
3
  export interface EntryPoints {
4
4
  css: string[];
5
5
  js: string[];
6
+ module?: true;
6
7
  }
7
8
 
8
9
  export async function getEntrypoints(
@@ -1,6 +1,6 @@
1
1
  import { BundleInfo } from './get-bundle-info';
2
2
 
3
- export function loadScripts({ urls, WebComponent }: BundleInfo) {
3
+ export function loadScripts({ urls, WebComponent, module }: BundleInfo) {
4
4
  return Promise.all(
5
5
  urls.js.map(url => {
6
6
  const script = Array.from(document.scripts).find(({ src }) => src === url);
@@ -8,13 +8,18 @@ export function loadScripts({ urls, WebComponent }: BundleInfo) {
8
8
  return new Promise<void>(resolve => {
9
9
  const script = document.createElement('script');
10
10
 
11
+ if (module) {
12
+ script.type = 'module';
13
+ } else {
14
+ script.async = true;
15
+ }
16
+
11
17
  script.crossOrigin = 'anonymous';
12
18
  script.onload = () => {
13
19
  script.dataset.webComponent = WebComponent;
14
20
  script.onload = null;
15
21
  resolve();
16
22
  };
17
- script.async = true;
18
23
  script.src = url;
19
24
 
20
25
  document.body.append(script);