@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.
- package/dist/get-value-for-environment.js +2 -1
- package/dist/get-value-for-environment.js.map +1 -1
- package/dist/types.d.ts +1 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utils/get-bundle-info.d.ts +1 -0
- package/dist/utils/get-bundle-info.d.ts.map +1 -1
- package/dist/utils/get-bundle-info.js +6 -5
- package/dist/utils/get-bundle-info.js.map +1 -1
- package/dist/utils/get-entry-points.d.ts +1 -0
- package/dist/utils/get-entry-points.d.ts.map +1 -1
- package/dist/utils/get-entry-points.js.map +1 -1
- package/dist/utils/load-scripts.d.ts +1 -1
- package/dist/utils/load-scripts.d.ts.map +1 -1
- package/dist/utils/load-scripts.js +6 -2
- package/dist/utils/load-scripts.js.map +1 -1
- package/package.json +11 -11
- package/src/__tests__/get-value-for-environment.test.ts +1 -1
- package/src/__tests__/loader.test.tsx +12 -0
- package/src/get-value-for-environment.ts +1 -1
- package/src/types.ts +1 -1
- package/src/utils/get-bundle-info.ts +5 -4
- package/src/utils/get-entry-points.ts +1 -0
- package/src/utils/load-scripts.ts +7 -2
|
@@ -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;
|
|
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
package/dist/types.d.ts.map
CHANGED
|
@@ -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;
|
|
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"}
|
|
@@ -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
|
|
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 =
|
|
62
|
-
|
|
63
|
-
|
|
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 =
|
|
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 +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;
|
|
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;
|
|
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,
|
|
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.
|
|
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": "
|
|
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": "
|
|
20
|
-
"@servicetitan/startup-utils": "
|
|
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.
|
|
26
|
+
"@servicetitan/anvil2": "^2.8.0",
|
|
27
27
|
"@servicetitan/design-system": "~14.5.3",
|
|
28
|
-
"@servicetitan/launchdarkly-service": "
|
|
29
|
-
"@servicetitan/log-service": "
|
|
30
|
-
"@servicetitan/react-ioc": "
|
|
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": "
|
|
49
|
-
"@servicetitan/log-service": "
|
|
50
|
-
"@servicetitan/react-ioc": "
|
|
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": "
|
|
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 =
|
|
101
|
-
|
|
102
|
-
|
|
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
|
}
|
|
@@ -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);
|