@lwrjs/module-registry 0.7.0-alpha.1 → 0.7.0-alpha.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.
@@ -74,7 +74,7 @@ var LwrModuleRegistry = class {
74
74
  const {bundle, format} = runtimeEnvironment;
75
75
  if (bundle) {
76
76
  return new Promise((resolve, reject) => {
77
- (0, import_signature.getBundleSignature)(moduleId, this).then((bundleSignature) => resolve((0, import_esm_strategy.default)(moduleId, runtimeEnvironment, runtimeParams, bundleSignature))).catch(reject);
77
+ (0, import_signature.getBundleSignature)(moduleId, this, this.globalConfig?.bundleConfig?.exclude).then((bundleSignature) => resolve((0, import_esm_strategy.default)(moduleId, runtimeEnvironment, runtimeParams, bundleSignature))).catch(reject);
78
78
  });
79
79
  } else {
80
80
  return new Promise((resolve, reject) => {
@@ -163,7 +163,12 @@ var LwrModuleRegistry = class {
163
163
  return moduleLinked;
164
164
  }
165
165
  async createLinkedModuleDefinition(moduleDef, runtimeEnvironment, runtimeParams) {
166
- const {format, minify, debug} = runtimeEnvironment;
166
+ const {
167
+ format,
168
+ minify,
169
+ debug,
170
+ env: {NODE_ENV: envMode}
171
+ } = runtimeEnvironment;
167
172
  const minified = !!minify && !debug;
168
173
  const {amdLoader, esmLoader} = this.globalConfig;
169
174
  if (format === "amd") {
@@ -182,6 +187,11 @@ var LwrModuleRegistry = class {
182
187
  if (minified) {
183
188
  const {code: minifiedCode} = await this.context.compiler.minifyJavascript(amdSource);
184
189
  linkedAmdSource = minifiedCode;
190
+ } else {
191
+ const {code: minifiedCode} = await this.context.compiler.parseJavascript(amdSource, {
192
+ envMode
193
+ });
194
+ linkedAmdSource = minifiedCode;
185
195
  }
186
196
  linkedModuleRecord.dynamicImports = linkedModuleRecord.dynamicImports?.filter((imp) => imp.moduleNameType !== import_shared_utils.ModuleNameType.unresolved);
187
197
  return {
@@ -206,6 +216,11 @@ var LwrModuleRegistry = class {
206
216
  if (minified) {
207
217
  const {code: minifiedEsm} = await this.context.compiler.minifyJavascript(transformedEsmCode);
208
218
  transformedEsmCode = minifiedEsm;
219
+ } else {
220
+ const {code: parsedEsm} = await this.context.compiler.parseJavascript(transformedEsmCode, {
221
+ envMode
222
+ });
223
+ transformedEsmCode = parsedEsm;
209
224
  }
210
225
  linkedModuleRecord.dynamicImports = linkedModuleRecord.dynamicImports?.filter((imp) => imp.moduleNameType !== import_shared_utils.ModuleNameType.unresolved);
211
226
  return {
@@ -61,7 +61,7 @@ async function link(moduleRegistry, moduleDef, versionStrategy, uriStrategy, run
61
61
  }
62
62
  let signature;
63
63
  if (runtimeEnvironment.bundle && runtimeEnvironment.format === "esm" && exclude?.includes(importRef.specifier)) {
64
- signature = await (0, import_signature.getBundleSignature)(importRef, moduleRegistry);
64
+ signature = await (0, import_signature.getBundleSignature)(importRef, moduleRegistry, exclude);
65
65
  }
66
66
  const {locations, sourceSpecifier} = importRef;
67
67
  const link2 = strategy(importRef, runtimeEnvironment, runtimeParams, signature);
@@ -83,7 +83,7 @@ async function link(moduleRegistry, moduleDef, versionStrategy, uriStrategy, run
83
83
  let signature;
84
84
  const isStringLiteral = importRef.moduleNameType === import_shared_utils2.ModuleNameType.string;
85
85
  if (isStringLiteral && runtimeEnvironment.bundle && runtimeEnvironment.format === "esm") {
86
- signature = await (0, import_signature.getBundleSignature)(importRef, moduleRegistry);
86
+ signature = await (0, import_signature.getBundleSignature)(importRef, moduleRegistry, exclude);
87
87
  }
88
88
  const link2 = isStringLiteral ? versionStrategy(importRef, runtimeEnvironment, runtimeParams, signature) : importRef.specifier;
89
89
  const linkedLocations = locations.map(({location, importLocation}) => {
@@ -120,7 +120,7 @@ async function link(moduleRegistry, moduleDef, versionStrategy, uriStrategy, run
120
120
  const {namespace, name} = (0, import_shared_utils2.explodeSpecifier)(specifier2);
121
121
  let signature;
122
122
  if (esmLoaderModule && runtimeEnvironment.bundle) {
123
- signature = await (0, import_signature.getBundleSignature)({version: version2, specifier: specifier2}, moduleRegistry);
123
+ signature = await (0, import_signature.getBundleSignature)({version: version2, specifier: specifier2}, moduleRegistry, exclude);
124
124
  }
125
125
  const loaderLink = strategy({specifier: specifier2, version: version2}, runtimeEnvironment, runtimeParams, signature);
126
126
  codeStringBuilder.prepend(`import { load } from "${loaderLink}";
@@ -34,32 +34,29 @@ var import_shared_utils = __toModule(require("@lwrjs/shared-utils"));
34
34
  var LWC_VERSION = getLWCVersion();
35
35
  var ENABLED_FINGERPRINTS = !(0, import_shared_utils.getFeatureFlags)().LEGACY_LOADER;
36
36
  var ENV_KEY = `LWC:${LWC_VERSION},FINGERPRINTS:${ENABLED_FINGERPRINTS}`;
37
- async function getRecursiveModuleHash(definitions, registry, hash, visitedDefinitions = new Set()) {
38
- if (!definitions.length) {
37
+ async function getRecursiveModuleHash(modules, registry, hash, visitedDefinitions = new Set()) {
38
+ if (!modules.length) {
39
39
  return;
40
40
  }
41
- const imports = [];
41
+ const definitions = await Promise.all(modules.map((module2) => registry.getModule(module2)));
42
+ const imports = new Map();
42
43
  for (const definition of definitions) {
43
- if (visitedDefinitions.has(definition.id)) {
44
- continue;
45
- }
46
44
  const {ownHash, moduleRecord} = definition;
47
45
  hash.update(ownHash);
48
- if (moduleRecord.imports) {
49
- imports.push(...moduleRecord.imports);
50
- }
51
- visitedDefinitions.add(definition.id);
46
+ visitedDefinitions.add((0, import_shared_utils.getSpecifier)(definition));
47
+ moduleRecord.imports?.forEach((importReference) => {
48
+ imports.set((0, import_shared_utils.getSpecifier)(importReference), importReference);
49
+ });
52
50
  }
53
- if (imports.length) {
54
- const dependencies = await Promise.all(imports.map(async (dependency) => registry.getModule(dependency)));
51
+ const dependencies = Array.from(imports, ([_, dependency]) => dependency).filter((dependency) => !visitedDefinitions.has(dependency.specifier) && !visitedDefinitions.has((0, import_shared_utils.getSpecifier)(dependency)));
52
+ if (dependencies.length) {
55
53
  return getRecursiveModuleHash(dependencies, registry, hash, visitedDefinitions);
56
54
  }
57
55
  }
58
- async function getBundleSignature(moduleId, registry) {
59
- const root = await registry.getModule(moduleId);
56
+ async function getBundleSignature(moduleId, registry, exclude) {
60
57
  const hash = import_crypto.default.createHash("sha1");
61
58
  hash.update(ENV_KEY);
62
- await getRecursiveModuleHash([root], registry, hash);
59
+ await getRecursiveModuleHash([moduleId], registry, hash, new Set(exclude));
63
60
  return hash.digest("hex");
64
61
  }
65
62
  function getLWCVersion() {
package/build/es/index.js CHANGED
@@ -49,7 +49,7 @@ export class LwrModuleRegistry {
49
49
  const { bundle, format } = runtimeEnvironment;
50
50
  if (bundle) {
51
51
  return new Promise((resolve, reject) => {
52
- getBundleSignature(moduleId, this)
52
+ getBundleSignature(moduleId, this, this.globalConfig?.bundleConfig?.exclude)
53
53
  .then((bundleSignature) => resolve(esmLinkingStrategy(moduleId, runtimeEnvironment, runtimeParams, bundleSignature)))
54
54
  .catch(reject);
55
55
  });
@@ -152,7 +152,7 @@ export class LwrModuleRegistry {
152
152
  return moduleLinked;
153
153
  }
154
154
  async createLinkedModuleDefinition(moduleDef, runtimeEnvironment, runtimeParams) {
155
- const { format, minify, debug } = runtimeEnvironment;
155
+ const { format, minify, debug, env: { NODE_ENV: envMode }, } = runtimeEnvironment;
156
156
  const minified = !!minify && !debug;
157
157
  const { amdLoader, esmLoader } = this.globalConfig;
158
158
  // TODO: compat transformation based on runtimeEnvironment.compat
@@ -172,6 +172,12 @@ export class LwrModuleRegistry {
172
172
  const { code: minifiedCode } = await this.context.compiler.minifyJavascript(amdSource);
173
173
  linkedAmdSource = minifiedCode;
174
174
  }
175
+ else {
176
+ const { code: minifiedCode } = await this.context.compiler.parseJavascript(amdSource, {
177
+ envMode,
178
+ });
179
+ linkedAmdSource = minifiedCode;
180
+ }
175
181
  // Filter out variable dynamic imports
176
182
  linkedModuleRecord.dynamicImports = linkedModuleRecord.dynamicImports?.filter((imp) => imp.moduleNameType !== ModuleNameType.unresolved);
177
183
  return {
@@ -201,6 +207,12 @@ export class LwrModuleRegistry {
201
207
  const { code: minifiedEsm } = await this.context.compiler.minifyJavascript(transformedEsmCode);
202
208
  transformedEsmCode = minifiedEsm;
203
209
  }
210
+ else {
211
+ const { code: parsedEsm } = await this.context.compiler.parseJavascript(transformedEsmCode, {
212
+ envMode,
213
+ });
214
+ transformedEsmCode = parsedEsm;
215
+ }
204
216
  // Filter out variable dynamic imports
205
217
  linkedModuleRecord.dynamicImports = linkedModuleRecord.dynamicImports?.filter((imp) => imp.moduleNameType !== ModuleNameType.unresolved);
206
218
  return {
@@ -44,7 +44,7 @@ export async function link(moduleRegistry, moduleDef, versionStrategy, uriStrate
44
44
  if (runtimeEnvironment.bundle &&
45
45
  runtimeEnvironment.format === 'esm' &&
46
46
  exclude?.includes(importRef.specifier)) {
47
- signature = await getBundleSignature(importRef, moduleRegistry);
47
+ signature = await getBundleSignature(importRef, moduleRegistry, exclude);
48
48
  }
49
49
  const { locations, sourceSpecifier } = importRef;
50
50
  const link = strategy(importRef, runtimeEnvironment, runtimeParams, signature);
@@ -69,7 +69,7 @@ export async function link(moduleRegistry, moduleDef, versionStrategy, uriStrate
69
69
  const isStringLiteral = importRef.moduleNameType === ModuleNameType.string;
70
70
  // get signature for dynamic imports when bundling esm
71
71
  if (isStringLiteral && runtimeEnvironment.bundle && runtimeEnvironment.format === 'esm') {
72
- signature = await getBundleSignature(importRef, moduleRegistry);
72
+ signature = await getBundleSignature(importRef, moduleRegistry, exclude);
73
73
  }
74
74
  // always link [literal] dynamic imports as versioned specifiers (AMD strategy)
75
75
  // linking them as URIs (ESM strategy) causes caching issues since they can contain stale signatures
@@ -119,7 +119,7 @@ export async function link(moduleRegistry, moduleDef, versionStrategy, uriStrate
119
119
  let signature;
120
120
  if (esmLoaderModule && runtimeEnvironment.bundle) {
121
121
  // Ensure the ESM loader is signed, or there may be a clash between this import and an existing one
122
- signature = await getBundleSignature({ version, specifier }, moduleRegistry);
122
+ signature = await getBundleSignature({ version, specifier }, moduleRegistry, exclude);
123
123
  }
124
124
  const loaderLink = strategy({ specifier, version }, runtimeEnvironment, runtimeParams, signature);
125
125
  // import {load} from 'loader/loader'
@@ -1,3 +1,16 @@
1
1
  import { ModuleRegistry, ModuleId } from '@lwrjs/types';
2
- export declare function getBundleSignature(moduleId: Required<Pick<ModuleId, 'specifier' | 'version'>>, registry: ModuleRegistry): Promise<string>;
2
+ /**
3
+ * Generate a bundle signature
4
+ *
5
+ * Traverses the module graph from the specified root module to generate a
6
+ * signature. Modules that are marked for exclusion will be skipped. The
7
+ * bundle signature will be generated based on the environment
8
+ * keys(i.e. LWC version) and the ownHash of each module in the graph.
9
+ *
10
+ * @param moduleId - root module id
11
+ * @param registry - module registry
12
+ * @param exclude - bundle config exclusions
13
+ * @returns a bungle signature
14
+ */
15
+ export declare function getBundleSignature(moduleId: Required<Pick<ModuleId, 'specifier' | 'version'>>, registry: ModuleRegistry, exclude?: string[]): Promise<string>;
3
16
  //# sourceMappingURL=signature.d.ts.map
@@ -2,36 +2,58 @@ import crypto from 'crypto';
2
2
  import path from 'path';
3
3
  import { cwd } from 'process';
4
4
  import { createRequire } from 'module';
5
- import { getFeatureFlags } from '@lwrjs/shared-utils';
5
+ import { getFeatureFlags, getSpecifier } from '@lwrjs/shared-utils';
6
6
  const LWC_VERSION = getLWCVersion();
7
7
  const ENABLED_FINGERPRINTS = !getFeatureFlags().LEGACY_LOADER;
8
8
  const ENV_KEY = `LWC:${LWC_VERSION},FINGERPRINTS:${ENABLED_FINGERPRINTS}`;
9
- async function getRecursiveModuleHash(definitions, registry, hash, visitedDefinitions = new Set()) {
10
- if (!definitions.length) {
9
+ async function getRecursiveModuleHash(modules, registry, hash, visitedDefinitions = new Set()) {
10
+ if (!modules.length) {
11
11
  return;
12
12
  }
13
- const imports = [];
13
+ const definitions = await Promise.all(modules.map((module) => registry.getModule(module)));
14
+ const imports = new Map();
14
15
  for (const definition of definitions) {
15
- if (visitedDefinitions.has(definition.id)) {
16
- continue;
17
- }
18
16
  const { ownHash, moduleRecord } = definition;
17
+ // include module in the bundle signature
19
18
  hash.update(ownHash);
20
- if (moduleRecord.imports) {
21
- imports.push(...moduleRecord.imports);
22
- }
23
- visitedDefinitions.add(definition.id);
19
+ // track the module to ensure it is only processed once
20
+ visitedDefinitions.add(getSpecifier(definition));
21
+ // map imports to prevent processing duplicates
22
+ moduleRecord.imports?.forEach((importReference) => {
23
+ imports.set(getSpecifier(importReference), importReference);
24
+ });
24
25
  }
25
- if (imports.length) {
26
- const dependencies = await Promise.all(imports.map(async (dependency) => registry.getModule(dependency)));
26
+ // filter out bundle config exclusions and already visited dependencies
27
+ const dependencies = Array.from(imports, ([_, dependency]) => dependency).filter((dependency) =>
28
+ // exclusions are not versioned
29
+ !visitedDefinitions.has(dependency.specifier) &&
30
+ // already visited dependencies will be versioned
31
+ !visitedDefinitions.has(getSpecifier(dependency)));
32
+ if (dependencies.length) {
27
33
  return getRecursiveModuleHash(dependencies, registry, hash, visitedDefinitions);
28
34
  }
29
35
  }
30
- export async function getBundleSignature(moduleId, registry) {
31
- const root = await registry.getModule(moduleId);
36
+ /**
37
+ * Generate a bundle signature
38
+ *
39
+ * Traverses the module graph from the specified root module to generate a
40
+ * signature. Modules that are marked for exclusion will be skipped. The
41
+ * bundle signature will be generated based on the environment
42
+ * keys(i.e. LWC version) and the ownHash of each module in the graph.
43
+ *
44
+ * @param moduleId - root module id
45
+ * @param registry - module registry
46
+ * @param exclude - bundle config exclusions
47
+ * @returns a bungle signature
48
+ */
49
+ export async function getBundleSignature(moduleId, registry, exclude) {
32
50
  const hash = crypto.createHash('sha1');
33
51
  hash.update(ENV_KEY);
34
- await getRecursiveModuleHash([root], registry, hash);
52
+ // add bundle config exclusions to visited definitions to prevent including
53
+ // them in the bundle signature
54
+ // Note: if the root module is an excluded module, it will be included in
55
+ // the signature
56
+ await getRecursiveModuleHash([moduleId], registry, hash, new Set(exclude));
35
57
  return hash.digest('hex');
36
58
  }
37
59
  /**
package/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
7
- "version": "0.7.0-alpha.1",
7
+ "version": "0.7.0-alpha.10",
8
8
  "homepage": "https://developer.salesforce.com/docs/platform/lwr/overview",
9
9
  "repository": {
10
10
  "type": "git",
@@ -30,18 +30,18 @@
30
30
  "build/**/*.d.ts"
31
31
  ],
32
32
  "dependencies": {
33
- "@lwrjs/diagnostics": "0.7.0-alpha.1",
34
- "@lwrjs/shared-utils": "0.7.0-alpha.1",
33
+ "@lwrjs/diagnostics": "0.7.0-alpha.10",
34
+ "@lwrjs/shared-utils": "0.7.0-alpha.10",
35
35
  "es-module-lexer": "^0.3.18",
36
36
  "ws": "^7.2.5"
37
37
  },
38
38
  "devDependencies": {
39
- "@lwrjs/types": "0.7.0-alpha.1",
39
+ "@lwrjs/types": "0.7.0-alpha.10",
40
40
  "@types/es-module-lexer": "^0.3.0",
41
41
  "@types/ws": "^7.2.4"
42
42
  },
43
43
  "engines": {
44
44
  "node": ">=14.15.4 <17"
45
45
  },
46
- "gitHead": "24245670d6908d37e465f2316f92385df63d22aa"
46
+ "gitHead": "83c1e65e2169094cb55ac2c37e5aef16d3a9aa4a"
47
47
  }