@lwrjs/loader 0.22.8 → 0.22.10
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/build/assets/prod/lwr-error-shim.js +1 -1
- package/build/assets/prod/lwr-loader-shim-legacy.bundle.js +123 -13
- package/build/assets/prod/lwr-loader-shim-legacy.bundle.min.js +3 -3
- package/build/assets/prod/lwr-loader-shim-legacy.js +105 -9
- package/build/assets/prod/lwr-loader-shim.bundle.js +123 -12
- package/build/assets/prod/lwr-loader-shim.bundle.min.js +3 -3
- package/build/assets/prod/lwr-loader-shim.js +105 -8
- package/build/bundle/prod/lwr/esmLoader/esmLoader.js +1 -1
- package/build/cjs/modules/lwr/esmLoader/esmLoader.cjs +1 -1
- package/build/cjs/modules/lwr/loader/validateLoadSpecifier.cjs +4 -1
- package/build/modules/lwr/esmLoader/esmLoader.js +2 -2
- package/build/modules/lwr/loader/loader.js +18 -4
- package/build/modules/lwr/loader/validateLoadSpecifier.d.ts +2 -1
- package/build/modules/lwr/loader/validateLoadSpecifier.js +11 -2
- package/build/modules/lwr/loaderLegacy/loaderLegacy.js +18 -4
- package/build/shim/defineCacheResolver.d.ts +10 -0
- package/build/shim/defineCacheResolver.js +78 -0
- package/build/shim/loader.d.ts +5 -1
- package/build/shim/loader.js +14 -3
- package/build/shim/shim.js +3 -2
- package/build/shim-legacy/loaderLegacy.d.ts +7 -2
- package/build/shim-legacy/loaderLegacy.js +15 -4
- package/build/shim-legacy/shimLegacy.js +2 -2
- package/build/types.d.ts +18 -0
- package/package.json +10 -10
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* SPDX-License-Identifier: MIT
|
|
5
5
|
* For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
|
|
6
6
|
*/
|
|
7
|
-
/* LWR Module Loader v0.22.
|
|
7
|
+
/* LWR Module Loader v0.22.10 */
|
|
8
8
|
const templateRegex = /\{([0-9]+)\}/g;
|
|
9
9
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
10
10
|
function templateString(template, args) {
|
|
@@ -158,7 +158,7 @@ const NO_BLOB_IMPORT = Object.freeze({
|
|
|
158
158
|
level: 0,
|
|
159
159
|
message: 'Cannot import a blob URL',
|
|
160
160
|
});
|
|
161
|
-
Object.freeze({
|
|
161
|
+
const NO_IMPORT_TRANSPORT = Object.freeze({
|
|
162
162
|
code: 3025,
|
|
163
163
|
level: 0,
|
|
164
164
|
message: 'Cannot dynamically import "transport" with importer "{0}"',
|
|
@@ -1609,9 +1609,10 @@ function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else {
|
|
|
1609
1609
|
|
|
1610
1610
|
|
|
1611
1611
|
|
|
1612
|
+
|
|
1612
1613
|
/**
|
|
1613
1614
|
* Validates that the given module id is not one of the forbidden dynamic import specifiers.
|
|
1614
|
-
* Throws LoaderError for: lwc, the LWR loader, and blob URLs.
|
|
1615
|
+
* Throws LoaderError for: lwc, the LWR loader, transport/webruntime/transport, and blob URLs.
|
|
1615
1616
|
*
|
|
1616
1617
|
* @param id - Module identifier or URL
|
|
1617
1618
|
* @param importer - Versioned specifier of the module importer (for error reporting)
|
|
@@ -1624,7 +1625,7 @@ function validateLoadSpecifier(
|
|
|
1624
1625
|
loaderSpecifier,
|
|
1625
1626
|
errors,
|
|
1626
1627
|
) {
|
|
1627
|
-
const { LoaderError, NO_IMPORT_LWC, NO_IMPORT_LOADER, NO_BLOB_IMPORT } = errors;
|
|
1628
|
+
const { LoaderError, NO_IMPORT_LWC, NO_IMPORT_LOADER, NO_IMPORT_TRANSPORT, NO_BLOB_IMPORT } = errors;
|
|
1628
1629
|
|
|
1629
1630
|
// Throw an error if the specifier is "lwc" or a versioned lwc specifier
|
|
1630
1631
|
// Dynamic import of LWC APIs is not allowed
|
|
@@ -1640,6 +1641,18 @@ function validateLoadSpecifier(
|
|
|
1640
1641
|
throw new LoaderError(NO_IMPORT_LOADER, [_nullishCoalesce(importer, () => ( 'unknown'))]);
|
|
1641
1642
|
}
|
|
1642
1643
|
|
|
1644
|
+
// Throw an error if the specifier is "transport" or "webruntime/transport" (or versioned)
|
|
1645
|
+
// Dynamic import of transport exposes unsandboxed fetch, bypassing LWS
|
|
1646
|
+
// Reference: Hackforce report HF-3393
|
|
1647
|
+
if (
|
|
1648
|
+
id === 'transport' ||
|
|
1649
|
+
id.startsWith('transport/v/') ||
|
|
1650
|
+
id === 'webruntime/transport' ||
|
|
1651
|
+
id.startsWith('webruntime/transport/v/')
|
|
1652
|
+
) {
|
|
1653
|
+
throw new LoaderError(NO_IMPORT_TRANSPORT, [_nullishCoalesce(importer, () => ( 'unknown'))]);
|
|
1654
|
+
}
|
|
1655
|
+
|
|
1643
1656
|
// Throw an error if the specifier is a blob URL (case-insensitive check)
|
|
1644
1657
|
if (id.toLowerCase().startsWith('blob:')) {
|
|
1645
1658
|
throw new LoaderError(NO_BLOB_IMPORT);
|
|
@@ -1751,6 +1764,7 @@ class Loader {
|
|
|
1751
1764
|
LoaderError,
|
|
1752
1765
|
NO_IMPORT_LWC,
|
|
1753
1766
|
NO_IMPORT_LOADER,
|
|
1767
|
+
NO_IMPORT_TRANSPORT,
|
|
1754
1768
|
NO_BLOB_IMPORT,
|
|
1755
1769
|
});
|
|
1756
1770
|
return this.registry.load(id, importer);
|
|
@@ -8,11 +8,12 @@ export interface ValidateLoadSpecifierErrors {
|
|
|
8
8
|
LoaderError: new (errorInfo: LoadSpecifierErrorInfo, errorArgs?: string[]) => Error;
|
|
9
9
|
NO_IMPORT_LWC: LoadSpecifierErrorInfo;
|
|
10
10
|
NO_IMPORT_LOADER: LoadSpecifierErrorInfo;
|
|
11
|
+
NO_IMPORT_TRANSPORT: LoadSpecifierErrorInfo;
|
|
11
12
|
NO_BLOB_IMPORT: LoadSpecifierErrorInfo;
|
|
12
13
|
}
|
|
13
14
|
/**
|
|
14
15
|
* Validates that the given module id is not one of the forbidden dynamic import specifiers.
|
|
15
|
-
* Throws LoaderError for: lwc, the LWR loader, and blob URLs.
|
|
16
|
+
* Throws LoaderError for: lwc, the LWR loader, transport/webruntime/transport, and blob URLs.
|
|
16
17
|
*
|
|
17
18
|
* @param id - Module identifier or URL
|
|
18
19
|
* @param importer - Versioned specifier of the module importer (for error reporting)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Validates that the given module id is not one of the forbidden dynamic import specifiers.
|
|
3
|
-
* Throws LoaderError for: lwc, the LWR loader, and blob URLs.
|
|
3
|
+
* Throws LoaderError for: lwc, the LWR loader, transport/webruntime/transport, and blob URLs.
|
|
4
4
|
*
|
|
5
5
|
* @param id - Module identifier or URL
|
|
6
6
|
* @param importer - Versioned specifier of the module importer (for error reporting)
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* @param errors - Error class and message constants from the calling loader
|
|
9
9
|
*/
|
|
10
10
|
export function validateLoadSpecifier(id, importer, loaderSpecifier, errors) {
|
|
11
|
-
const { LoaderError, NO_IMPORT_LWC, NO_IMPORT_LOADER, NO_BLOB_IMPORT } = errors;
|
|
11
|
+
const { LoaderError, NO_IMPORT_LWC, NO_IMPORT_LOADER, NO_IMPORT_TRANSPORT, NO_BLOB_IMPORT } = errors;
|
|
12
12
|
// Throw an error if the specifier is "lwc" or a versioned lwc specifier
|
|
13
13
|
// Dynamic import of LWC APIs is not allowed
|
|
14
14
|
// Block both "lwc" and versioned forms like "lwc/v/8_20_1" to prevent bypass attempts
|
|
@@ -21,6 +21,15 @@ export function validateLoadSpecifier(id, importer, loaderSpecifier, errors) {
|
|
|
21
21
|
if (id === loaderSpecifier || id.startsWith(`${loaderSpecifier}/v/`)) {
|
|
22
22
|
throw new LoaderError(NO_IMPORT_LOADER, [importer ?? 'unknown']);
|
|
23
23
|
}
|
|
24
|
+
// Throw an error if the specifier is "transport" or "webruntime/transport" (or versioned)
|
|
25
|
+
// Dynamic import of transport exposes unsandboxed fetch, bypassing LWS
|
|
26
|
+
// Reference: Hackforce report HF-3393
|
|
27
|
+
if (id === 'transport' ||
|
|
28
|
+
id.startsWith('transport/v/') ||
|
|
29
|
+
id === 'webruntime/transport' ||
|
|
30
|
+
id.startsWith('webruntime/transport/v/')) {
|
|
31
|
+
throw new LoaderError(NO_IMPORT_TRANSPORT, [importer ?? 'unknown']);
|
|
32
|
+
}
|
|
24
33
|
// Throw an error if the specifier is a blob URL (case-insensitive check)
|
|
25
34
|
if (id.toLowerCase().startsWith('blob:')) {
|
|
26
35
|
throw new LoaderError(NO_BLOB_IMPORT);
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* SPDX-License-Identifier: MIT
|
|
5
5
|
* For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
|
|
6
6
|
*/
|
|
7
|
-
/* LWR Legacy Module Loader v0.22.
|
|
7
|
+
/* LWR Legacy Module Loader v0.22.10 */
|
|
8
8
|
const templateRegex = /\{([0-9]+)\}/g;
|
|
9
9
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
10
10
|
function templateString(template, args) {
|
|
@@ -143,7 +143,7 @@ const NO_IMPORT_LOADER = Object.freeze({
|
|
|
143
143
|
level: 0,
|
|
144
144
|
message: 'Cannot dynamically import the LWR loader with importer "{0}"',
|
|
145
145
|
});
|
|
146
|
-
Object.freeze({
|
|
146
|
+
const NO_IMPORT_TRANSPORT = Object.freeze({
|
|
147
147
|
code: 3025,
|
|
148
148
|
level: 0,
|
|
149
149
|
message: 'Cannot dynamically import "transport" with importer "{0}"',
|
|
@@ -1399,9 +1399,10 @@ function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else {
|
|
|
1399
1399
|
|
|
1400
1400
|
|
|
1401
1401
|
|
|
1402
|
+
|
|
1402
1403
|
/**
|
|
1403
1404
|
* Validates that the given module id is not one of the forbidden dynamic import specifiers.
|
|
1404
|
-
* Throws LoaderError for: lwc, the LWR loader, and blob URLs.
|
|
1405
|
+
* Throws LoaderError for: lwc, the LWR loader, transport/webruntime/transport, and blob URLs.
|
|
1405
1406
|
*
|
|
1406
1407
|
* @param id - Module identifier or URL
|
|
1407
1408
|
* @param importer - Versioned specifier of the module importer (for error reporting)
|
|
@@ -1414,7 +1415,7 @@ function validateLoadSpecifier(
|
|
|
1414
1415
|
loaderSpecifier,
|
|
1415
1416
|
errors,
|
|
1416
1417
|
) {
|
|
1417
|
-
const { LoaderError, NO_IMPORT_LWC, NO_IMPORT_LOADER, NO_BLOB_IMPORT } = errors;
|
|
1418
|
+
const { LoaderError, NO_IMPORT_LWC, NO_IMPORT_LOADER, NO_IMPORT_TRANSPORT, NO_BLOB_IMPORT } = errors;
|
|
1418
1419
|
|
|
1419
1420
|
// Throw an error if the specifier is "lwc" or a versioned lwc specifier
|
|
1420
1421
|
// Dynamic import of LWC APIs is not allowed
|
|
@@ -1430,6 +1431,18 @@ function validateLoadSpecifier(
|
|
|
1430
1431
|
throw new LoaderError(NO_IMPORT_LOADER, [_nullishCoalesce(importer, () => ( 'unknown'))]);
|
|
1431
1432
|
}
|
|
1432
1433
|
|
|
1434
|
+
// Throw an error if the specifier is "transport" or "webruntime/transport" (or versioned)
|
|
1435
|
+
// Dynamic import of transport exposes unsandboxed fetch, bypassing LWS
|
|
1436
|
+
// Reference: Hackforce report HF-3393
|
|
1437
|
+
if (
|
|
1438
|
+
id === 'transport' ||
|
|
1439
|
+
id.startsWith('transport/v/') ||
|
|
1440
|
+
id === 'webruntime/transport' ||
|
|
1441
|
+
id.startsWith('webruntime/transport/v/')
|
|
1442
|
+
) {
|
|
1443
|
+
throw new LoaderError(NO_IMPORT_TRANSPORT, [_nullishCoalesce(importer, () => ( 'unknown'))]);
|
|
1444
|
+
}
|
|
1445
|
+
|
|
1433
1446
|
// Throw an error if the specifier is a blob URL (case-insensitive check)
|
|
1434
1447
|
if (id.toLowerCase().startsWith('blob:')) {
|
|
1435
1448
|
throw new LoaderError(NO_BLOB_IMPORT);
|
|
@@ -1794,6 +1807,7 @@ class Loader {
|
|
|
1794
1807
|
LoaderError,
|
|
1795
1808
|
NO_IMPORT_LWC,
|
|
1796
1809
|
NO_IMPORT_LOADER,
|
|
1810
|
+
NO_IMPORT_TRANSPORT,
|
|
1797
1811
|
NO_BLOB_IMPORT,
|
|
1798
1812
|
});
|
|
1799
1813
|
return this.registry.load(id, importer);
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { DefineArguments, DefineArgsInput, ParseDefineResult, ResolvedLoader } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Parse AMD define args. Supports define(id, deps, factory).
|
|
4
|
+
*/
|
|
5
|
+
export declare function parseDefine(def: DefineArgsInput): ParseDefineResult;
|
|
6
|
+
/**
|
|
7
|
+
* Resolve the loader's dependencies from defineCache. Throws if definition is invalid or deps cannot be resolved.
|
|
8
|
+
*/
|
|
9
|
+
export declare function resolveLoaderDepsFromDefineCache(loaderSpecifier: string, definition: DefineArguments, defineCache: Record<string, DefineArguments>): ResolvedLoader;
|
|
10
|
+
//# sourceMappingURL=defineCacheResolver.d.ts.map
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parse AMD define args. Supports define(id, deps, factory).
|
|
3
|
+
*/
|
|
4
|
+
export function parseDefine(def) {
|
|
5
|
+
const [, depsOrFactory, factory] = def;
|
|
6
|
+
if (Array.isArray(depsOrFactory) && typeof factory === 'function') {
|
|
7
|
+
return { deps: depsOrFactory, factory };
|
|
8
|
+
}
|
|
9
|
+
if (typeof depsOrFactory === 'function') {
|
|
10
|
+
return { deps: [], factory: depsOrFactory };
|
|
11
|
+
}
|
|
12
|
+
throw new Error('Invalid module definition');
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Resolve a loader dependency: 'exports' returns the bag; otherwise look up in cache and instantiate.
|
|
16
|
+
* Loader deps are assumed to be leaf modules (no deps of their own)—no recursive resolution.
|
|
17
|
+
*/
|
|
18
|
+
function resolveDep(dep, exportsObj, cache) {
|
|
19
|
+
if (dep === 'exports')
|
|
20
|
+
return exportsObj;
|
|
21
|
+
const mod = cache[dep];
|
|
22
|
+
if (!mod) {
|
|
23
|
+
throw new Error(`Dependency "${dep}" not found in defineCache for loader`);
|
|
24
|
+
}
|
|
25
|
+
try {
|
|
26
|
+
return instantiateLeafModule(mod);
|
|
27
|
+
}
|
|
28
|
+
catch (e) {
|
|
29
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
30
|
+
throw new Error(`Loader dependency "${dep}" has invalid definition: ${msg}`);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Instantiate a leaf module (loader dep). Assumes the module has no dependencies of its own.
|
|
35
|
+
* Supports only deps: [] or ['exports']; any other dep list throws.
|
|
36
|
+
*/
|
|
37
|
+
function instantiateLeafModule(def) {
|
|
38
|
+
const { deps, factory } = parseDefine(def);
|
|
39
|
+
if (deps.length > 1 || (deps.length === 1 && deps[0] !== 'exports')) {
|
|
40
|
+
throw new Error(`Loader dependencies must have no deps or only ['exports']; got [${deps.join(', ')}]`);
|
|
41
|
+
}
|
|
42
|
+
const exports = {};
|
|
43
|
+
const out = factory(exports);
|
|
44
|
+
return out !== undefined ? out : exports;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Normalize loader definition to canonical (exports, ...deps). Injects 'exports' if missing.
|
|
48
|
+
*/
|
|
49
|
+
function normalizeLoaderDefinition(def) {
|
|
50
|
+
const { deps, factory } = parseDefine(def);
|
|
51
|
+
if (deps.includes('exports')) {
|
|
52
|
+
return { deps, factory };
|
|
53
|
+
}
|
|
54
|
+
const isEmptyDeps = deps.length === 0;
|
|
55
|
+
const normalizedFactory = (exports, ...rest) => {
|
|
56
|
+
const result = isEmptyDeps ? factory(exports) : factory(...rest);
|
|
57
|
+
if (result !== undefined && typeof result === 'object') {
|
|
58
|
+
Object.assign(exports, result);
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
return { deps: ['exports', ...deps], factory: normalizedFactory };
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Resolve the loader's dependencies from defineCache. Throws if definition is invalid or deps cannot be resolved.
|
|
65
|
+
*/
|
|
66
|
+
export function resolveLoaderDepsFromDefineCache(loaderSpecifier, definition, defineCache) {
|
|
67
|
+
try {
|
|
68
|
+
const { deps, factory } = normalizeLoaderDefinition(definition);
|
|
69
|
+
const exportsObj = {};
|
|
70
|
+
const args = deps.map((dep) => resolveDep(dep, exportsObj, defineCache));
|
|
71
|
+
return { factory: factory, args, exportsObj };
|
|
72
|
+
}
|
|
73
|
+
catch (e) {
|
|
74
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
75
|
+
throw new Error(`Expected loader with specifier "${loaderSpecifier}" to be a module. ${msg}`);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=defineCacheResolver.js.map
|
package/build/shim/loader.d.ts
CHANGED
|
@@ -1,3 +1,7 @@
|
|
|
1
1
|
import type { DefineArguments, FingerprintsLoaderAPI as LoaderAPI, FingerprintsLoaderConfig as LoaderConfig } from '../types.js';
|
|
2
|
-
|
|
2
|
+
/**
|
|
3
|
+
* Create a loader from a definition. Original API preserved.
|
|
4
|
+
* Optional defineCache for resolving loader deps (when loader has dependencies).
|
|
5
|
+
*/
|
|
6
|
+
export declare function createLoader(name: string, definition: DefineArguments, config: LoaderConfig, externalModules?: string[], defineCache?: Record<string, DefineArguments>): LoaderAPI;
|
|
3
7
|
//# sourceMappingURL=loader.d.ts.map
|
package/build/shim/loader.js
CHANGED
|
@@ -1,10 +1,21 @@
|
|
|
1
|
-
|
|
1
|
+
import { resolveLoaderDepsFromDefineCache } from './defineCacheResolver.js';
|
|
2
|
+
/**
|
|
3
|
+
* Create a loader from a definition. Original API preserved.
|
|
4
|
+
* Optional defineCache for resolving loader deps (when loader has dependencies).
|
|
5
|
+
*/
|
|
6
|
+
export function createLoader(name, definition, config, externalModules, defineCache) {
|
|
2
7
|
if (!definition || typeof definition[2] !== 'function') {
|
|
3
8
|
throw new Error(`Expected loader with specifier "${name}" to be a module`);
|
|
4
9
|
}
|
|
5
|
-
// Create a Loader instance
|
|
6
10
|
const exports = {};
|
|
7
|
-
|
|
11
|
+
if (defineCache) {
|
|
12
|
+
const { factory, args, exportsObj } = resolveLoaderDepsFromDefineCache(name, definition, defineCache);
|
|
13
|
+
factory(...args);
|
|
14
|
+
Object.assign(exports, exportsObj);
|
|
15
|
+
}
|
|
16
|
+
else {
|
|
17
|
+
definition[2].call(null, exports);
|
|
18
|
+
}
|
|
8
19
|
const { Loader } = exports;
|
|
9
20
|
if (!Loader) {
|
|
10
21
|
throw new Error('Expected Loader class to be defined');
|
package/build/shim/shim.js
CHANGED
|
@@ -112,7 +112,7 @@ export default class LoaderShim {
|
|
|
112
112
|
rootComponents: this.config.rootComponents,
|
|
113
113
|
},
|
|
114
114
|
};
|
|
115
|
-
const loader = createLoader(this.loaderSpecifier, this.defineCache[this.loaderSpecifier], loaderConfig, this.config.preloadModules);
|
|
115
|
+
const loader = createLoader(this.loaderSpecifier, this.defineCache[this.loaderSpecifier], loaderConfig, this.config.preloadModules, this.defineCache);
|
|
116
116
|
this.mountApp(loader);
|
|
117
117
|
if (loader &&
|
|
118
118
|
typeof loader.getModuleWarnings === 'function' &&
|
|
@@ -134,6 +134,7 @@ export default class LoaderShim {
|
|
|
134
134
|
resolve();
|
|
135
135
|
}
|
|
136
136
|
else {
|
|
137
|
+
/* istanbul ignore next */
|
|
137
138
|
const observer = new MutationObserver(() => {
|
|
138
139
|
// eslint-disable-next-line lwr/no-unguarded-apis
|
|
139
140
|
if (document.body) {
|
|
@@ -198,7 +199,7 @@ export default class LoaderShim {
|
|
|
198
199
|
])
|
|
199
200
|
.then(() => {
|
|
200
201
|
// eslint-disable-next-line lwr/no-unguarded-apis
|
|
201
|
-
if (typeof window === 'undefined' || typeof document === undefined) {
|
|
202
|
+
if (typeof window === 'undefined' || typeof document === 'undefined') {
|
|
202
203
|
return Promise.resolve();
|
|
203
204
|
}
|
|
204
205
|
if (initDeferDOM) {
|
|
@@ -1,3 +1,8 @@
|
|
|
1
|
-
import type { LoaderConfig, DefineArguments
|
|
2
|
-
|
|
1
|
+
import type { LoaderAPI, LoaderConfig, DefineArguments } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Create a loader from a definition. Original API preserved.
|
|
4
|
+
* Optional defineCache for resolving loader deps.
|
|
5
|
+
* definition[3] (signatures: ownHash, hashes) is passed to loader.define for cache invalidation.
|
|
6
|
+
*/
|
|
7
|
+
export declare function createLoader(name: string, definition: DefineArguments, config: LoaderConfig, externalModules?: string[], defineCache?: Record<string, DefineArguments>): LoaderAPI;
|
|
3
8
|
//# sourceMappingURL=loaderLegacy.d.ts.map
|
|
@@ -1,16 +1,27 @@
|
|
|
1
|
-
|
|
1
|
+
import { resolveLoaderDepsFromDefineCache } from '../shim/defineCacheResolver.js';
|
|
2
|
+
/**
|
|
3
|
+
* Create a loader from a definition. Original API preserved.
|
|
4
|
+
* Optional defineCache for resolving loader deps.
|
|
5
|
+
* definition[3] (signatures: ownHash, hashes) is passed to loader.define for cache invalidation.
|
|
6
|
+
*/
|
|
7
|
+
export function createLoader(name, definition, config, externalModules, defineCache) {
|
|
2
8
|
if (!definition || typeof definition[2] !== 'function') {
|
|
3
9
|
throw new Error(`Expected loader with specifier "${name}" to be a module`);
|
|
4
10
|
}
|
|
5
|
-
// Create a Loader instance
|
|
6
11
|
const exports = {};
|
|
7
|
-
|
|
12
|
+
if (defineCache) {
|
|
13
|
+
const { factory, args, exportsObj } = resolveLoaderDepsFromDefineCache(name, definition, defineCache);
|
|
14
|
+
factory(...args);
|
|
15
|
+
Object.assign(exports, exportsObj);
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
definition[2].call(null, exports);
|
|
19
|
+
}
|
|
8
20
|
const { Loader } = exports;
|
|
9
21
|
if (!Loader) {
|
|
10
22
|
throw new Error('Expected Loader class to be defined');
|
|
11
23
|
}
|
|
12
24
|
const loader = new Loader(config);
|
|
13
|
-
// register externally loaded modules
|
|
14
25
|
if (externalModules && externalModules.length) {
|
|
15
26
|
loader.registerExternalModules(externalModules);
|
|
16
27
|
}
|
|
@@ -99,7 +99,7 @@ export default class LoaderShim {
|
|
|
99
99
|
rootComponents: this.config.rootComponents,
|
|
100
100
|
},
|
|
101
101
|
};
|
|
102
|
-
const loader = createLoader(this.loaderModule, this.defineCache[this.loaderModule], loaderConfig, this.config.preloadModules);
|
|
102
|
+
const loader = createLoader(this.loaderModule, this.defineCache[this.loaderModule], loaderConfig, this.config.preloadModules, this.defineCache);
|
|
103
103
|
this.mountApp(loader);
|
|
104
104
|
if (loader &&
|
|
105
105
|
typeof loader.getModuleWarnings === 'function' &&
|
|
@@ -180,7 +180,7 @@ export default class LoaderShim {
|
|
|
180
180
|
.registerImportMappings(importMappings)
|
|
181
181
|
.then(() => {
|
|
182
182
|
// eslint-disable-next-line lwr/no-unguarded-apis
|
|
183
|
-
if (typeof window === 'undefined' || typeof document === undefined) {
|
|
183
|
+
if (typeof window === 'undefined' || typeof document === 'undefined') {
|
|
184
184
|
return Promise.resolve();
|
|
185
185
|
}
|
|
186
186
|
if (initDeferDOM) {
|
package/build/types.d.ts
CHANGED
|
@@ -8,7 +8,25 @@ export type GlobalThis = {
|
|
|
8
8
|
[key: string]: unknown;
|
|
9
9
|
};
|
|
10
10
|
export type LoaderDefine = (id: string, deps: string[], exporter: Function, hash?: object) => void;
|
|
11
|
+
/** define(id, deps, factory, hash?) - full form. Same shape as LoaderDefine args. (from main) */
|
|
11
12
|
export type DefineArguments = [string, string[], Function, object?];
|
|
13
|
+
/** Raw args from define() - at least [id, depsOrFactory]; may include factory, hash. Used for parsing. */
|
|
14
|
+
export type DefineArgsInput = readonly [id: string, depsOrFactory: unknown, factory?: unknown, hash?: object];
|
|
15
|
+
export interface ParseDefineResult {
|
|
16
|
+
deps: string[];
|
|
17
|
+
/** Same as DefineArguments[2] / LoaderDefine exporter */
|
|
18
|
+
factory: Function;
|
|
19
|
+
}
|
|
20
|
+
/** Normalized loader factory: receives (exports, ...resolvedDeps). Used after resolveLoaderDepsFromDefineCache. */
|
|
21
|
+
export type LoaderFactory = (exports: object, ...deps: unknown[]) => void;
|
|
22
|
+
/** Args passed to the loader factory: [exports, ...resolvedDeps]. First element is always the exports bag. */
|
|
23
|
+
export type LoaderFactoryArgs = [exports: object, ...deps: unknown[]];
|
|
24
|
+
/** Result of resolveLoaderDepsFromDefineCache. Typed for createLoader consumption. */
|
|
25
|
+
export interface ResolvedLoader {
|
|
26
|
+
factory: LoaderFactory;
|
|
27
|
+
args: LoaderFactoryArgs;
|
|
28
|
+
exportsObj: object;
|
|
29
|
+
}
|
|
12
30
|
export type LoaderClass = {
|
|
13
31
|
new (config?: LoaderConfig): LoaderAPI;
|
|
14
32
|
};
|
package/package.json
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
7
7
|
},
|
|
8
|
-
"version": "0.22.
|
|
8
|
+
"version": "0.22.10",
|
|
9
9
|
"homepage": "https://developer.salesforce.com/docs/platform/lwr/overview",
|
|
10
10
|
"repository": {
|
|
11
11
|
"type": "git",
|
|
@@ -44,10 +44,10 @@
|
|
|
44
44
|
"package.cjs"
|
|
45
45
|
],
|
|
46
46
|
"scripts": {
|
|
47
|
-
"test:browser": "rm tsconfig.tsbuildinfo; yarn build; JEST_PUPPETEER_CONFIG=jest-puppeteer.config.cjs jest --verbose --runInBand --config jest.browser.config.cjs",
|
|
48
|
-
"test:browser:ci": "rm tsconfig.tsbuildinfo; yarn build; JEST_PUPPETEER_CONFIG=jest-puppeteer.config.cjs jest --runInBand --no-cache --config jest.browser.config.cjs",
|
|
49
|
-
"test:browserLegacy": "rm tsconfig.tsbuildinfo; yarn build; JEST_PUPPETEER_CONFIG=jest-puppeteer-legacy.config.cjs jest --verbose --runInBand --config jest.browser-legacy.config.cjs",
|
|
50
|
-
"test:browserLegacy:ci": "rm tsconfig.tsbuildinfo; yarn build; JEST_PUPPETEER_CONFIG=jest-puppeteer-legacy.config.cjs jest --runInBand --no-cache --config jest.browser-legacy.config.cjs",
|
|
47
|
+
"test:browser": "shx rm -f tsconfig.tsbuildinfo; yarn build; cross-env JEST_PUPPETEER_CONFIG=jest-puppeteer.config.cjs jest --verbose --runInBand --config jest.browser.config.cjs",
|
|
48
|
+
"test:browser:ci": "shx rm -f tsconfig.tsbuildinfo; yarn build; cross-env JEST_PUPPETEER_CONFIG=jest-puppeteer.config.cjs jest --runInBand --no-cache --config jest.browser.config.cjs",
|
|
49
|
+
"test:browserLegacy": "shx rm -f tsconfig.tsbuildinfo; yarn build; cross-env JEST_PUPPETEER_CONFIG=jest-puppeteer-legacy.config.cjs jest --verbose --runInBand --config jest.browser-legacy.config.cjs",
|
|
50
|
+
"test:browserLegacy:ci": "shx rm -f tsconfig.tsbuildinfo; yarn build; cross-env JEST_PUPPETEER_CONFIG=jest-puppeteer-legacy.config.cjs jest --runInBand --no-cache --config jest.browser-legacy.config.cjs",
|
|
51
51
|
"start:testserver": "node build/__tests__/shim/browser/test_server.js",
|
|
52
52
|
"start:testserverLegacy": "node build/__tests__/shim-legacy/browser/test_server.js",
|
|
53
53
|
"build:platform": "yarn build:shim && yarn build:error-shim && node ./scripts/platform-versioning.js",
|
|
@@ -61,16 +61,16 @@
|
|
|
61
61
|
},
|
|
62
62
|
"devDependencies": {
|
|
63
63
|
"@locker/trusted-types": "0.26.4",
|
|
64
|
-
"@lwrjs/diagnostics": "0.22.
|
|
65
|
-
"@lwrjs/types": "0.22.
|
|
64
|
+
"@lwrjs/diagnostics": "0.22.10",
|
|
65
|
+
"@lwrjs/types": "0.22.10",
|
|
66
66
|
"@rollup/plugin-node-resolve": "^15.2.3",
|
|
67
67
|
"@rollup/plugin-sucrase": "^5.0.2",
|
|
68
68
|
"@rollup/plugin-terser": "^0.4.4",
|
|
69
69
|
"rollup": "^2.80.0"
|
|
70
70
|
},
|
|
71
71
|
"dependencies": {
|
|
72
|
-
"@lwrjs/client-modules": "0.22.
|
|
73
|
-
"@lwrjs/shared-utils": "0.22.
|
|
72
|
+
"@lwrjs/client-modules": "0.22.10",
|
|
73
|
+
"@lwrjs/shared-utils": "0.22.10"
|
|
74
74
|
},
|
|
75
75
|
"lwc": {
|
|
76
76
|
"modules": [
|
|
@@ -90,5 +90,5 @@
|
|
|
90
90
|
"volta": {
|
|
91
91
|
"extends": "../../../package.json"
|
|
92
92
|
},
|
|
93
|
-
"gitHead": "
|
|
93
|
+
"gitHead": "52b77087a10567ad62b48bde04607c627580105d"
|
|
94
94
|
}
|