@lwc/lwc-dev-server 10.7.0 → 10.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/dist/server/bundler/lexBundler.d.ts +3 -3
  2. package/dist/server/bundler/lexBundler.js +13 -15
  3. package/dist/server/bundler/lexBundler.js.map +1 -1
  4. package/dist/server/bundler/lexBundler.spec.js +90 -48
  5. package/dist/server/bundler/lexBundler.spec.js.map +1 -1
  6. package/dist/server/connection/client.d.ts +5 -7
  7. package/dist/server/connection/client.js +23 -39
  8. package/dist/server/connection/client.js.map +1 -1
  9. package/dist/server/connection/client.spec.js +96 -58
  10. package/dist/server/connection/client.spec.js.map +1 -1
  11. package/dist/server/connection/connection.d.ts +3 -3
  12. package/dist/server/connection/connection.js +8 -1
  13. package/dist/server/connection/connection.js.map +1 -1
  14. package/dist/server/connection/connection.spec.js +3 -3
  15. package/dist/server/connection/connection.spec.js.map +1 -1
  16. package/dist/server/index.d.ts +2 -2
  17. package/dist/server/index.js +3 -4
  18. package/dist/server/index.js.map +1 -1
  19. package/dist/server/index.spec.js +40 -26
  20. package/dist/server/index.spec.js.map +1 -1
  21. package/dist/server/moduleGraph/index.d.ts +16 -41
  22. package/dist/server/moduleGraph/index.js +68 -114
  23. package/dist/server/moduleGraph/index.js.map +1 -1
  24. package/dist/server/moduleGraph/index.spec.js +106 -49
  25. package/dist/server/moduleGraph/index.spec.js.map +1 -1
  26. package/dist/server/moduleGraph/module.d.ts +78 -0
  27. package/dist/server/moduleGraph/module.js +126 -0
  28. package/dist/server/moduleGraph/module.js.map +1 -0
  29. package/dist/server/moduleGraph/module.spec.d.ts +1 -0
  30. package/dist/server/moduleGraph/module.spec.js +70 -0
  31. package/dist/server/moduleGraph/module.spec.js.map +1 -0
  32. package/dist/server/moduleGraph/workspaceScanner/__tests__/fileReader.spec.js +3 -3
  33. package/dist/server/moduleGraph/workspaceScanner/__tests__/fileReader.spec.js.map +1 -1
  34. package/dist/server/moduleGraph/workspaceScanner/__tests__/internal.spec.js +6 -2
  35. package/dist/server/moduleGraph/workspaceScanner/__tests__/internal.spec.js.map +1 -1
  36. package/dist/server/moduleGraph/workspaceScanner/fileReader.d.ts +8 -2
  37. package/dist/server/moduleGraph/workspaceScanner/fileReader.js +16 -17
  38. package/dist/server/moduleGraph/workspaceScanner/fileReader.js.map +1 -1
  39. package/dist/server/moduleGraph/workspaceScanner/scanner.d.ts +6 -33
  40. package/dist/server/moduleGraph/workspaceScanner/scanner.js +9 -18
  41. package/dist/server/moduleGraph/workspaceScanner/scanner.js.map +1 -1
  42. package/dist/server/util/module-util.d.ts +10 -0
  43. package/dist/server/util/module-util.js +10 -0
  44. package/dist/server/util/module-util.js.map +1 -0
  45. package/dist/server/watcher/index.js +1 -2
  46. package/dist/server/watcher/index.js.map +1 -1
  47. package/dist/server/watcher/index.spec.js +1 -1
  48. package/dist/server/watcher/index.spec.js.map +1 -1
  49. package/package.json +3 -3
@@ -1,7 +1,7 @@
1
1
  import { type DevServerContext } from '../../types/index.js';
2
+ import { ModulePart } from '../moduleGraph/module.js';
2
3
  import type { TransformOptions } from '@lwc/compiler';
3
- import type { Lifecycle, Logger } from '@salesforce/core';
4
- export declare function compile(ctx: DevServerContext, modulePath: string, options: TransformOptions, logger: Logger, lifecycle?: Lifecycle): Promise<{
4
+ export declare function compile(ctx: DevServerContext, { module, part }: ModulePart, compileOptions: TransformOptions): Promise<{
5
5
  code: string | undefined;
6
- warnings: string[];
6
+ warnings: import("@lwc/errors").CompilerDiagnostic[];
7
7
  }>;
@@ -1,7 +1,7 @@
1
1
  import { compile as platformCompile } from '@lwc/sfdc-lwc-compiler';
2
2
  import { Workspace } from '../../types/index.js';
3
3
  import { measureOperationTime } from '../util/telemetry.js';
4
- function transformOptionsToPlatformCompileConfig(ctx, transformOptions, modulePath) {
4
+ function transformOptionsToPlatformCompileConfig(ctx, transformOptions, files) {
5
5
  const { enableDynamicComponents, enableLightningWebSecurityTransforms, experimentalComplexExpressions, apiVersion, name, namespace, experimentalDynamicComponent, outputConfig, } = transformOptions;
6
6
  const options = {
7
7
  // variable options
@@ -17,17 +17,14 @@ function transformOptionsToPlatformCompileConfig(ctx, transformOptions, modulePa
17
17
  // Enable HMR always in dev server
18
18
  enableHmr: true,
19
19
  };
20
- const getBundleType = () => {
21
- if (ctx.config.workspace === Workspace.Internal || ctx.config.workspace === Workspace.Mrt) {
22
- return 'internal';
23
- }
24
- return 'platform';
25
- };
20
+ const bundleType = ctx.config.workspace === Workspace.Internal || ctx.config.workspace === Workspace.Mrt
21
+ ? 'internal'
22
+ : 'platform';
26
23
  const bundle = {
27
- type: getBundleType(),
24
+ type: bundleType,
28
25
  name: name,
29
26
  namespace: namespace ?? 'c',
30
- files: ctx.moduleGraph.getModuleFiles(name, namespace ?? '', modulePath),
27
+ files,
31
28
  options,
32
29
  };
33
30
  const compilerConfigs = [
@@ -41,16 +38,17 @@ function transformOptionsToPlatformCompileConfig(ctx, transformOptions, modulePa
41
38
  compilerConfigs,
42
39
  };
43
40
  }
44
- export async function compile(ctx, modulePath, options, logger, lifecycle) {
45
- const compileConfig = transformOptionsToPlatformCompileConfig(ctx, options, modulePath);
46
- const result = await measureOperationTime('compile-time', () => platformCompile(compileConfig), lifecycle);
41
+ export async function compile(ctx, { module, part }, compileOptions) {
42
+ const sources = await module.getSources(part);
43
+ const compileConfig = transformOptionsToPlatformCompileConfig(ctx, compileOptions, sources);
44
+ const result = await measureOperationTime('compile-time', () => platformCompile(compileConfig), ctx.config.lifecycle);
47
45
  if (!result.success) {
48
- logger.error(`Failed to compile ${modulePath}. \n\tDiagnostics: ${JSON.stringify(result.diagnostics)}`);
49
- return { code: undefined, warnings: [result.diagnostics.toString()] };
46
+ ctx.logger.error(`Failed to compile ${part}. \n\tDiagnostics: ${JSON.stringify(result.diagnostics)}`);
47
+ return { code: undefined, warnings: result.diagnostics };
50
48
  }
51
49
  return {
52
50
  code: result.results?.[0].code,
53
- warnings: result.diagnostics.length ? [result.diagnostics.toString()] : [],
51
+ warnings: result.diagnostics,
54
52
  };
55
53
  }
56
54
  //# sourceMappingURL=lexBundler.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"lexBundler.js","sourceRoot":"","sources":["../../../src/server/bundler/lexBundler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACpE,OAAO,EAAE,SAAS,EAAyB,MAAM,sBAAsB,CAAC;AACxE,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAW5D,SAAS,uCAAuC,CAC5C,GAAqB,EACrB,gBAAkC,EAClC,UAAkB;IAElB,MAAM,EACF,uBAAuB,EACvB,oCAAoC,EACpC,8BAA8B,EAC9B,UAAU,EACV,IAAI,EACJ,SAAS,EACT,4BAA4B,EAC5B,YAAY,GACf,GAAG,gBAAgB,CAAC;IACrB,MAAM,OAAO,GAAkB;QAC3B,mBAAmB;QACnB,sBAAsB,EAAE,uBAAuB;QAC/C,oCAAoC,EAAE,oCAAoC;QAC1E,yBAAyB,EAAE,8BAA8B;QACzD,UAAU,EAAE,UAAU;QACtB,mBAAmB;QACnB,qBAAqB,EAAE,IAAI;QAC3B,aAAa,EAAE,SAAS;QACxB,iBAAiB,EAAE,IAAI;QACvB,wBAAwB,EAAE,IAAI;QAC9B,kCAAkC;QAClC,SAAS,EAAE,IAAI;KAClB,CAAC;IAEF,MAAM,aAAa,GAAG,GAAe,EAAE;QACnC,IAAI,GAAG,CAAC,MAAM,CAAC,SAAS,KAAK,SAAS,CAAC,QAAQ,IAAI,GAAG,CAAC,MAAM,CAAC,SAAS,KAAK,SAAS,CAAC,GAAG,EAAE,CAAC;YACxF,OAAO,UAAU,CAAC;QACtB,CAAC;QACD,OAAO,UAAU,CAAC;IACtB,CAAC,CAAC;IAEF,MAAM,MAAM,GAAiB;QACzB,IAAI,EAAE,aAAa,EAAE;QACrB,IAAI,EAAE,IAAK;QACX,SAAS,EAAE,SAAS,IAAI,GAAG;QAC3B,KAAK,EAAE,GAAG,CAAC,WAAW,CAAC,cAAc,CAAC,IAAK,EAAE,SAAS,IAAI,EAAE,EAAE,UAAU,CAAC;QACzE,OAAO;KACV,CAAC;IACF,MAAM,eAAe,GAAqB;QACtC;YACI,YAAY,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,YAAY,EAAE,SAAS,EAAE;YACrE,4BAA4B,EAAE,4BAA4B;SAC7D;KACJ,CAAC;IACF,OAAO;QACH,MAAM;QACN,eAAe;KAClB,CAAC;AACN,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CACzB,GAAqB,EACrB,UAAkB,EAClB,OAAyB,EACzB,MAAc,EACd,SAAqB;IAErB,MAAM,aAAa,GAAG,uCAAuC,CAAC,GAAG,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;IACxF,MAAM,MAAM,GAAG,MAAM,oBAAoB,CACrC,cAAc,EACd,GAAG,EAAE,CAAC,eAAe,CAAC,aAAa,CAAC,EACpC,SAAS,CACZ,CAAC;IAEF,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QAClB,MAAM,CAAC,KAAK,CACR,qBAAqB,UAAU,sBAAsB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAC5F,CAAC;QACF,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC;IAC1E,CAAC;IAED,OAAO;QACH,IAAI,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI;QAC9B,QAAQ,EAAE,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE;KAC7E,CAAC;AACN,CAAC"}
1
+ {"version":3,"file":"lexBundler.js","sourceRoot":"","sources":["../../../src/server/bundler/lexBundler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACpE,OAAO,EAAE,SAAS,EAAyB,MAAM,sBAAsB,CAAC;AACxE,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAW5D,SAAS,uCAAuC,CAC5C,GAAqB,EACrB,gBAAkC,EAClC,KAAkB;IAElB,MAAM,EACF,uBAAuB,EACvB,oCAAoC,EACpC,8BAA8B,EAC9B,UAAU,EACV,IAAI,EACJ,SAAS,EACT,4BAA4B,EAC5B,YAAY,GACf,GAAG,gBAAgB,CAAC;IACrB,MAAM,OAAO,GAAkB;QAC3B,mBAAmB;QACnB,sBAAsB,EAAE,uBAAuB;QAC/C,oCAAoC,EAAE,oCAAoC;QAC1E,yBAAyB,EAAE,8BAA8B;QACzD,UAAU,EAAE,UAAU;QACtB,mBAAmB;QACnB,qBAAqB,EAAE,IAAI;QAC3B,aAAa,EAAE,SAAS;QACxB,iBAAiB,EAAE,IAAI;QACvB,wBAAwB,EAAE,IAAI;QAC9B,kCAAkC;QAClC,SAAS,EAAE,IAAI;KAClB,CAAC;IACF,MAAM,UAAU,GACZ,GAAG,CAAC,MAAM,CAAC,SAAS,KAAK,SAAS,CAAC,QAAQ,IAAI,GAAG,CAAC,MAAM,CAAC,SAAS,KAAK,SAAS,CAAC,GAAG;QACjF,CAAC,CAAC,UAAU;QACZ,CAAC,CAAC,UAAU,CAAC;IAErB,MAAM,MAAM,GAAiB;QACzB,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,IAAK;QACX,SAAS,EAAE,SAAS,IAAI,GAAG;QAC3B,KAAK;QACL,OAAO;KACV,CAAC;IACF,MAAM,eAAe,GAAqB;QACtC;YACI,YAAY,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,YAAY,EAAE,SAAS,EAAE;YACrE,4BAA4B,EAAE,4BAA4B;SAC7D;KACJ,CAAC;IACF,OAAO;QACH,MAAM;QACN,eAAe;KAClB,CAAC;AACN,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CACzB,GAAqB,EACrB,EAAE,MAAM,EAAE,IAAI,EAAc,EAC5B,cAAgC;IAEhC,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAC9C,MAAM,aAAa,GAAG,uCAAuC,CAAC,GAAG,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC;IAC5F,MAAM,MAAM,GAAG,MAAM,oBAAoB,CACrC,cAAc,EACd,GAAG,EAAE,CAAC,eAAe,CAAC,aAAa,CAAC,EACpC,GAAG,CAAC,MAAM,CAAC,SAAS,CACvB,CAAC;IAEF,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QAClB,GAAG,CAAC,MAAM,CAAC,KAAK,CACZ,qBAAqB,IAAI,sBAAsB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CACtF,CAAC;QACF,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC;IAC7D,CAAC;IAED,OAAO;QACH,IAAI,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI;QAC9B,QAAQ,EAAE,MAAM,CAAC,WAAW;KAC/B,CAAC;AACN,CAAC"}
@@ -1,71 +1,113 @@
1
1
  import { compile as platformCompile } from '@lwc/sfdc-lwc-compiler';
2
- import { Workspace } from '../../types/index';
2
+ import { Workspace } from '../../types/index.js';
3
3
  import { compile } from './lexBundler';
4
- vi.mock('@lwc/sfdc-lwc-compiler');
4
+ // Mock dependencies
5
+ vi.mock('@lwc/sfdc-lwc-compiler', () => ({
6
+ compile: vi.fn(),
7
+ }));
8
+ vi.mock('../util/telemetry.js', () => ({
9
+ measureOperationTime: vi.fn((name, fn) => fn()),
10
+ }));
11
+ const mockCompileOptions = {
12
+ enableDynamicComponents: true,
13
+ enableLightningWebSecurityTransforms: true,
14
+ experimentalComplexExpressions: true,
15
+ apiVersion: 50,
16
+ name: 'testModule',
17
+ namespace: 'c',
18
+ outputConfig: { sourcemap: true },
19
+ };
5
20
  describe('compile', () => {
6
- let mockCtx;
7
- let mockLogger;
8
- const mockModulePath = 'src/modules/myModule';
9
- const mockTransformOptions = {
10
- enableDynamicComponents: true,
11
- enableLightningWebSecurityTransforms: true,
12
- experimentalComplexExpressions: true,
13
- apiVersion: 50,
14
- name: 'myModule',
15
- namespace: 'c',
16
- };
17
- beforeEach(() => {
18
- mockLogger = {
19
- error: vi.fn(),
20
- };
21
- mockCtx = {
21
+ it('should compile successfully', async () => {
22
+ const ctx = {
22
23
  config: {
23
24
  workspace: Workspace.Internal,
24
25
  },
25
- moduleGraph: {
26
- getModuleFiles: vi.fn().mockReturnValue(['file1', 'file2']),
26
+ logger: {
27
+ error: vi.fn(),
27
28
  },
29
+ moduleGraph: {},
28
30
  };
29
- vi.clearAllMocks();
30
- });
31
- it('should compile successfully and return code and warnings', async () => {
32
- const mockResult = {
31
+ const module = {
32
+ getSources: vi.fn().mockResolvedValue({ 'test.js': 'console.log("test");' }),
33
+ };
34
+ const part = 'testPart';
35
+ vi.mocked(platformCompile).mockResolvedValue({
33
36
  success: true,
34
- results: [
37
+ results: [{ code: 'compiled code' }],
38
+ diagnostics: [],
39
+ version: '1.0.0',
40
+ timings: {},
41
+ });
42
+ const result = await compile(ctx, { module, part }, mockCompileOptions);
43
+ expect(platformCompile).toHaveBeenCalledWith({
44
+ bundle: {
45
+ files: {
46
+ 'test.js': 'console.log("test");',
47
+ },
48
+ name: 'testModule',
49
+ namespace: 'c',
50
+ options: {
51
+ allowDynamicComponents: true,
52
+ apiVersion: 50,
53
+ disableProcessNodeEnv: true,
54
+ dynamicImport: 'allowed',
55
+ enableHmr: true,
56
+ enableLightningWebSecurityTransforms: true,
57
+ enableTemplateExpressions: true,
58
+ forceNamedExports: true,
59
+ strictCSSTokenCollection: true,
60
+ },
61
+ type: 'internal',
62
+ },
63
+ compilerConfigs: [
35
64
  {
36
- code: 'compiled code',
37
- map: '',
38
- imports: [],
39
- diagnostics: [],
40
65
  outputConfig: {
41
66
  minify: false,
42
- sourcemap: false,
43
- lockerConfig: {},
44
- env: { NODE_ENV: 'dev' },
67
+ sourcemap: true,
45
68
  },
46
- timings: {},
47
69
  },
48
70
  ],
49
- diagnostics: [],
50
- timings: {},
51
- version: '1',
52
- };
53
- vi.mocked(platformCompile).mockResolvedValue(mockResult);
54
- const result = await compile(mockCtx, mockModulePath, mockTransformOptions, mockLogger);
55
- expect(platformCompile).toHaveBeenCalledWith(expect.any(Object));
56
- expect(result.code).toBe('compiled code');
57
- expect(result.warnings).toEqual([]);
71
+ });
72
+ expect(result).toEqual({
73
+ code: 'compiled code',
74
+ warnings: [],
75
+ });
76
+ expect(ctx.logger.error).not.toHaveBeenCalledWith(expect.any(String));
58
77
  });
59
- it('should return undefined code and warnings when compilation fails', async () => {
78
+ it('should handle compile errors', async () => {
79
+ const ctx = {
80
+ config: {
81
+ workspace: Workspace.Internal,
82
+ },
83
+ logger: {
84
+ error: vi.fn(),
85
+ },
86
+ moduleGraph: {},
87
+ };
88
+ const module = {
89
+ getSources: vi.fn().mockResolvedValue({ 'test.js': 'console.log("test");' }),
90
+ };
91
+ const part = 'testPart';
60
92
  vi.mocked(platformCompile).mockResolvedValue({
93
+ version: '1.0.0',
94
+ timings: {},
61
95
  success: false,
62
96
  results: [],
63
- diagnostics: [],
64
- version: '1',
65
- timings: {},
97
+ diagnostics: [{ code: 1010, level: 1, message: 'Error message' }],
98
+ });
99
+ const result = await compile(ctx, { module, part }, mockCompileOptions);
100
+ expect(result).toEqual({
101
+ code: undefined,
102
+ warnings: [
103
+ {
104
+ code: 1010,
105
+ level: 1,
106
+ message: 'Error message',
107
+ },
108
+ ],
66
109
  });
67
- const result = await compile(mockCtx, mockModulePath, mockTransformOptions, mockLogger);
68
- expect(result.code).toBeUndefined();
110
+ expect(ctx.logger.error).toHaveBeenCalledWith(`Failed to compile ${part}. \n\tDiagnostics: [{"code":1010,"level":1,"message":"Error message"}]`);
69
111
  });
70
112
  });
71
113
  //# sourceMappingURL=lexBundler.spec.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"lexBundler.spec.js","sourceRoot":"","sources":["../../../src/server/bundler/lexBundler.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEpE,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAIvC,EAAE,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;AAElC,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE;IACrB,IAAI,OAAyB,CAAC;IAC9B,IAAI,UAAkB,CAAC;IACvB,MAAM,cAAc,GAAG,sBAAsB,CAAC;IAC9C,MAAM,oBAAoB,GAAqB;QAC3C,uBAAuB,EAAE,IAAI;QAC7B,oCAAoC,EAAE,IAAI;QAC1C,8BAA8B,EAAE,IAAI;QACpC,UAAU,EAAE,EAAE;QACd,IAAI,EAAE,UAAU;QAChB,SAAS,EAAE,GAAG;KACjB,CAAC;IAEF,UAAU,CAAC,GAAG,EAAE;QACZ,UAAU,GAAG;YACT,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE;SACI,CAAC;QAEvB,OAAO,GAAG;YACN,MAAM,EAAE;gBACJ,SAAS,EAAE,SAAS,CAAC,QAAQ;aAChC;YACD,WAAW,EAAE;gBACT,cAAc,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;aAC9D;SAC2B,CAAC;QAEjC,EAAE,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QACtE,MAAM,UAAU,GAAG;YACf,OAAO,EAAE,IAAI;YACb,OAAO,EAAE;gBACL;oBACI,IAAI,EAAE,eAAe;oBACrB,GAAG,EAAE,EAAE;oBACP,OAAO,EAAE,EAAE;oBACX,WAAW,EAAE,EAAE;oBACf,YAAY,EAAE;wBACV,MAAM,EAAE,KAAK;wBACb,SAAS,EAAE,KAAK;wBAChB,YAAY,EAAE,EAAE;wBAChB,GAAG,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE;qBAC3B;oBACD,OAAO,EAAE,EAAE;iBACd;aACJ;YACD,WAAW,EAAE,EAAE;YACf,OAAO,EAAE,EAAE;YACX,OAAO,EAAE,GAAG;SACf,CAAC;QACF,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;QAEzD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,UAAU,CAAC,CAAC;QAExF,MAAM,CAAC,eAAe,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;QACjE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC1C,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kEAAkE,EAAE,KAAK,IAAI,EAAE;QAC9E,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,iBAAiB,CAAC;YACzC,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,EAAE;YACX,WAAW,EAAE,EAAE;YACf,OAAO,EAAE,GAAG;YACZ,OAAO,EAAE,EAAE;SACd,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,UAAU,CAAC,CAAC;QAExF,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,CAAC;IACxC,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"lexBundler.spec.js","sourceRoot":"","sources":["../../../src/server/bundler/lexBundler.spec.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
+ import { HMR_Data_Outbound, HMR_Data_Inbound } from '@lwc/lwc-dev-server-types';
2
+ import { TransformOptions } from '@lwc/compiler';
1
3
  import { DevServerContext } from '../../types/devServer.js';
2
4
  import { Connection } from './connection.js';
3
- import type { HMR_Data } from '@lwc/lwc-dev-server-types';
4
- import type { TransformOptions } from '@lwc/compiler';
5
5
  /**
6
6
  * Class representing a client that has connected to the dev server.
7
7
  * This class represents a client that is connected and ready to receive hot module updates.
@@ -11,14 +11,12 @@ import type { TransformOptions } from '@lwc/compiler';
11
11
  export declare class Client {
12
12
  clientId: string;
13
13
  url: string;
14
- activePaths: Map<string, TransformOptions>;
15
14
  connection: Connection;
16
15
  ctx: DevServerContext;
16
+ compileOptions: Map<string, TransformOptions>;
17
17
  constructor(clientId: string, url: string, connection: Connection, ctx: DevServerContext);
18
18
  onClose(callback: () => void): void;
19
- removeStalePaths(paths: string[]): void;
20
- getCompileOptions(path: string): TransformOptions | undefined;
21
- send(data: HMR_Data): void;
22
- messageCallback(data: HMR_Data): Promise<void>;
19
+ send(data: HMR_Data_Outbound): void;
20
+ messageCallback(data: HMR_Data_Inbound): Promise<void>;
23
21
  close(): void;
24
22
  }
@@ -1,12 +1,5 @@
1
1
  import { compile } from '../bundler/lexBundler.js';
2
- const ALLOWED_OUTBOUND_DATA_TYPES = new Set([
3
- 'update',
4
- 'module-update',
5
- 'module-delete',
6
- 'error',
7
- 'auth-response',
8
- ]);
9
- const ALLOWED_INBOUND_DATA_TYPES = new Set(['fetch', 'register']);
2
+ import { decodeModulePath } from '../util/module-util.js';
10
3
  /**
11
4
  * Class representing a client that has connected to the dev server.
12
5
  * This class represents a client that is connected and ready to receive hot module updates.
@@ -15,41 +8,27 @@ const ALLOWED_INBOUND_DATA_TYPES = new Set(['fetch', 'register']);
15
8
  */
16
9
  export class Client {
17
10
  constructor(clientId, url, connection, ctx) {
18
- this.activePaths = new Map();
19
11
  this.clientId = clientId;
20
12
  this.url = url;
21
13
  this.connection = connection;
22
14
  this.connection.receive(this.messageCallback.bind(this));
23
15
  this.ctx = ctx;
16
+ this.compileOptions = new Map();
24
17
  }
25
18
  onClose(callback) {
26
19
  this.connection.onClose(callback);
27
20
  }
28
- removeStalePaths(paths) {
29
- paths.forEach((p) => this.activePaths.delete(p));
30
- }
31
- getCompileOptions(path) {
32
- return this.activePaths.get(path);
33
- }
34
21
  send(data) {
35
- if (!ALLOWED_OUTBOUND_DATA_TYPES.has(data.type)) {
36
- this.ctx.logger.debug(`[LWC Dev Server] Blocking unexpected type of data being sent from server to hmr-client '${data.type}'`);
37
- return;
38
- }
39
22
  this.connection.send(data);
40
23
  }
41
24
  async messageCallback(data) {
42
- if (!ALLOWED_INBOUND_DATA_TYPES.has(data.type)) {
43
- this.ctx.logger.debug(`[LWC Dev Server] Blocking unexpected type of data received from hmr-client '${data.type}'`);
44
- return;
45
- }
46
25
  const { ctx: { logger, moduleGraph, config: { lifecycle }, }, } = this;
47
26
  switch (data.type) {
48
27
  // In coming hot module
49
28
  case 'fetch': {
50
29
  const { data: { modulePath }, } = data;
51
- const moduleFilePath = moduleGraph.getFileByModulePath(modulePath);
52
- if (!moduleFilePath) {
30
+ const modulePart = this.ctx.moduleGraph.getModulePart(modulePath);
31
+ if (!modulePart) {
53
32
  const error = {
54
33
  type: 'error',
55
34
  data: {
@@ -57,16 +36,17 @@ export class Client {
57
36
  },
58
37
  };
59
38
  this.connection.send(error);
60
- }
61
- const compileOptions = this.getCompileOptions(modulePath);
62
- if (!compileOptions) {
63
- logger.debug(`Found no compile option for module path: ${modulePath}, check the __lwc_hmr_hot.register() call.`);
64
39
  break;
65
40
  }
66
41
  logger.debug(`[LWC Dev Server] Compiling ${modulePath}`);
67
- const result = await compile(this.ctx, modulePath, compileOptions, logger);
42
+ const compileOptions = this.compileOptions.get(modulePart.module.id());
43
+ if (!compileOptions) {
44
+ logger.error(`Found no compile option for module path: ${modulePart.module.id()}, check the __lwc_hmr_hot.register() call.`);
45
+ throw new Error(`No Compile Options for module path: ${modulePart.module.id()}`);
46
+ }
47
+ const result = await compile(this.ctx, modulePart, compileOptions);
68
48
  if (!result.code) {
69
- logger.error(`Compiling ${moduleFilePath} failed and there are compiler warnings: ${JSON.stringify(result.warnings)}`);
49
+ logger.error(`Compiling ${modulePath} failed and there are compiler warnings: ${JSON.stringify(result.warnings)}`);
70
50
  break;
71
51
  }
72
52
  logger.debug(`[LWC Dev Server] Sending an updated ${modulePath}`);
@@ -81,17 +61,21 @@ export class Client {
81
61
  break;
82
62
  }
83
63
  case 'register': {
84
- const modules = data.data.modules;
85
- for (const { modulePath, compileOptions } of modules) {
86
- this.activePaths.set(modulePath, compileOptions);
64
+ const moduleParts = [];
65
+ for (const { modulePath, hash, compileOptions } of data.data.modules) {
66
+ const { id, part } = decodeModulePath(modulePath);
67
+ moduleParts.push({ id, part, hash });
68
+ this.compileOptions.set(id, compileOptions);
87
69
  }
88
70
  // Inform the hmr-client of available updates, this ensures that any local changes
89
71
  // that haven't been deployed to the remote app are updated upon client registration.
90
- const staleModules = moduleGraph.getStaleModules(modules);
91
- this.send({
92
- type: 'update',
93
- data: Array.from(staleModules).map((modulePath) => ({ modulePath })),
94
- });
72
+ const staleModules = moduleGraph.getStaleModules(moduleParts);
73
+ if (staleModules.size > 0) {
74
+ this.send({
75
+ type: 'update',
76
+ data: Array.from(staleModules).map((modulePath) => ({ modulePath })),
77
+ });
78
+ }
95
79
  break;
96
80
  }
97
81
  }
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/server/connection/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/server/connection/client.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAG1D;;;;;GAKG;AACH,MAAM,OAAO,MAAM;IAMf,YAAY,QAAgB,EAAE,GAAW,EAAE,UAAsB,EAAE,GAAqB;QACpF,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACzD,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,cAAc,GAAG,IAAI,GAAG,EAAE,CAAC;IACpC,CAAC;IAED,OAAO,CAAC,QAAoB;QACxB,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACtC,CAAC;IAED,IAAI,CAAC,IAAuB;QACxB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,IAAsB;QACxC,MAAM,EACF,GAAG,EAAE,EACD,MAAM,EACN,WAAW,EACX,MAAM,EAAE,EAAE,SAAS,EAAE,GACxB,GACJ,GAAG,IAAI,CAAC;QACT,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;YAChB,uBAAuB;YACvB,KAAK,OAAO,CAAC,CAAC,CAAC;gBACX,MAAM,EACF,IAAI,EAAE,EAAE,UAAU,EAAE,GACvB,GAAG,IAAI,CAAC;gBACT,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;gBAClE,IAAI,CAAC,UAAU,EAAE,CAAC;oBACd,MAAM,KAAK,GAAG;wBACV,IAAI,EAAE,OAAO;wBACb,IAAI,EAAE;4BACF,OAAO,EAAE,YAAY,UAAU,sDAAsD;yBACxF;qBACK,CAAC;oBACX,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBAC5B,MAAM;gBACV,CAAC;gBACD,MAAM,CAAC,KAAK,CAAC,8BAA8B,UAAU,EAAE,CAAC,CAAC;gBAEzD,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;gBACvE,IAAI,CAAC,cAAc,EAAE,CAAC;oBAClB,MAAM,CAAC,KAAK,CACR,4CAA4C,UAAU,CAAC,MAAM,CAAC,EAAE,EAAE,4CAA4C,CACjH,CAAC;oBACF,MAAM,IAAI,KAAK,CACX,uCAAuC,UAAU,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAClE,CAAC;gBACN,CAAC;gBACD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,EAAE,cAAc,CAAC,CAAC;gBACnE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;oBACf,MAAM,CAAC,KAAK,CACR,aAAa,UAAU,4CAA4C,IAAI,CAAC,SAAS,CAC7E,MAAM,CAAC,QAAQ,CAClB,EAAE,CACN,CAAC;oBACF,MAAM;gBACV,CAAC;gBACD,MAAM,CAAC,KAAK,CAAC,uCAAuC,UAAU,EAAE,CAAC,CAAC;gBAClE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;oBACjB,IAAI,EAAE,eAAe;oBACrB,IAAI,EAAE,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;iBAC3C,CAAC,CAAC;gBAEH,SAAS,EAAE,aAAa,CAAC;oBACrB,SAAS,EAAE,iBAAiB;oBAC5B,MAAM,EAAE,UAAU;iBACrB,CAAC,CAAC;gBACH,MAAM;YACV,CAAC;YACD,KAAK,UAAU,CAAC,CAAC,CAAC;gBACd,MAAM,WAAW,GAAiD,EAAE,CAAC;gBACrE,KAAK,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;oBACnE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;oBAClD,WAAW,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;oBACrC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,EAAE,cAAc,CAAC,CAAC;gBAChD,CAAC;gBAED,kFAAkF;gBAClF,qFAAqF;gBACrF,MAAM,YAAY,GAAG,WAAW,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;gBAC9D,IAAI,YAAY,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;oBACxB,IAAI,CAAC,IAAI,CAAC;wBACN,IAAI,EAAE,QAAQ;wBACd,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC;qBACvE,CAAC,CAAC;gBACP,CAAC;gBACD,MAAM;YACV,CAAC;QACL,CAAC;IACL,CAAC;IAED,KAAK;QACD,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;IAC5B,CAAC;CACJ"}
@@ -1,87 +1,125 @@
1
- import { describe, it, expect, vi, beforeEach } from 'vitest';
2
- import { Workspace } from '../../types/serverConfig';
3
1
  import { compile } from '../bundler/lexBundler.js';
4
- import { Client } from './client';
5
- vi.mock('../bundler/lexBundler.js');
2
+ import { Module } from '../moduleGraph/module.js';
3
+ import { Client } from './client.js';
4
+ // Mock dependencies
5
+ vi.mock('../bundler/lexBundler.js', () => ({
6
+ compile: vi.fn(),
7
+ }));
6
8
  describe('Client', () => {
9
+ let clientId;
10
+ let url;
11
+ let connection;
12
+ let ctx;
7
13
  let client;
8
- let mockConnection;
9
- let mockCtx;
10
- let mockConfig;
11
- const mockClientId = 'client-id';
12
- const mockUrl = 'http://localhost';
13
- const mockModuleGraph = {
14
- getFileByModulePath: vi.fn(),
15
- registerActivePaths: vi.fn(),
16
- getModuleBoundary: vi.fn(),
17
- getStaleModules: vi.fn().mockReturnValue(['stale-module']),
18
- };
19
- const mockLogger = {
20
- debug: vi.fn(),
21
- };
22
14
  beforeEach(() => {
23
- mockConnection = {
24
- send: vi.fn(),
15
+ clientId = 'test-client-id';
16
+ url = 'http://localhost';
17
+ connection = {
25
18
  receive: vi.fn(),
19
+ send: vi.fn(),
26
20
  onClose: vi.fn(),
27
21
  close: vi.fn(),
28
22
  };
29
- mockConfig = {
30
- paths: [],
31
- port: 50182,
32
- rootDir: '',
33
- workspace: Workspace.Internal,
23
+ ctx = {
24
+ logger: {
25
+ debug: vi.fn(),
26
+ },
27
+ moduleGraph: {
28
+ getModulePart: vi.fn(),
29
+ getStaleModules: vi.fn(),
30
+ },
31
+ config: {
32
+ lifecycle: {
33
+ emitTelemetry: vi.fn(),
34
+ },
35
+ },
34
36
  };
35
- mockCtx = {
36
- config: mockConfig,
37
- logger: mockLogger,
38
- moduleGraph: mockModuleGraph,
39
- };
40
- vi.mocked(compile).mockResolvedValue({ code: 'code', warnings: [] });
41
- client = new Client(mockClientId, mockUrl, mockConnection, mockCtx);
37
+ client = new Client(clientId, url, connection, ctx);
38
+ });
39
+ it('should initialize with correct properties', () => {
40
+ expect(client.clientId).toBe(clientId);
41
+ expect(client.url).toBe(url);
42
+ expect(client.connection).toBe(connection);
43
+ expect(client.ctx).toBe(ctx);
44
+ expect(connection.receive).toHaveBeenCalledWith(expect.any(Function));
42
45
  });
43
- it('should initialize correctly', () => {
44
- expect(client.clientId).toBe(mockClientId);
45
- expect(client.url).toBe(mockUrl);
46
- expect(client.connection).toBe(mockConnection);
47
- expect(client.ctx).toBe(mockCtx);
48
- expect(mockConnection.receive).toHaveBeenCalled();
46
+ it('should handle onClose callback', () => {
47
+ const callback = vi.fn();
48
+ client.onClose(callback);
49
+ expect(connection.onClose).toHaveBeenCalledWith(callback);
49
50
  });
50
- it('should send data when allowed', () => {
51
+ it('should send data', () => {
51
52
  const data = { type: 'update', data: [] };
52
53
  client.send(data);
53
- expect(mockConnection.send).toHaveBeenCalledWith(data);
54
+ expect(connection.send).toHaveBeenCalledWith(data);
54
55
  });
55
- it('should not send data when type is not allowed', () => {
56
- const data = { type: 'not-allowed', data: [] };
57
- client.send(data);
58
- expect(mockCtx.logger.debug).toHaveBeenCalledWith(`[LWC Dev Server] Blocking unexpected type of data being sent from server to hmr-client 'not-allowed'`);
59
- expect(mockConnection.send).not.toHaveBeenCalled();
56
+ it('should handle fetch message callbacks', async () => {
57
+ vi.mocked(ctx.moduleGraph.getStaleModules).mockReturnValue(new Set());
58
+ await client.messageCallback({
59
+ type: 'register',
60
+ data: {
61
+ modules: [{ compileOptions: {}, hash: 'hash1', modulePath: 'ns/name/cmp.js' }],
62
+ },
63
+ });
64
+ const data = {
65
+ type: 'fetch',
66
+ data: { modulePath: 'ns/name/cmp.js' },
67
+ };
68
+ const modulePart = { module: new Module('', 'ns', 'name', {}), part: 'cmp.js' };
69
+ vi.mocked(ctx.moduleGraph.getModulePart).mockReturnValue(modulePart);
70
+ vi.mocked(compile).mockResolvedValue({ code: 'compiled code', warnings: [] });
71
+ await client.messageCallback(data);
72
+ expect(ctx.logger.debug).toHaveBeenCalledWith(`[LWC Dev Server] Compiling ns/name/cmp.js`);
73
+ expect(compile).toHaveBeenCalledWith(ctx, modulePart, {});
74
+ expect(ctx.logger.debug).toHaveBeenCalledWith(`[LWC Dev Server] Sending an updated ns/name/cmp.js`);
75
+ expect(connection.send).toHaveBeenCalledWith({
76
+ type: 'module-update',
77
+ data: [{ modulePath: 'ns/name/cmp.js', src: 'compiled code' }],
78
+ });
79
+ expect(ctx.config.lifecycle.emitTelemetry).toHaveBeenCalledWith({
80
+ eventName: 'compile-success',
81
+ module: 'ns/name/cmp.js',
82
+ });
60
83
  });
61
- it('should handle fetch message correctly', async () => {
62
- const data = { type: 'fetch', data: { modulePath: 'path1' } };
63
- mockModuleGraph.getFileByModulePath.mockReturnValue('file1');
64
- client.getCompileOptions = vi.fn().mockReturnValue({});
84
+ it('should handle fetch message callback with error', async () => {
85
+ const data = {
86
+ type: 'fetch',
87
+ data: { modulePath: 'src/ns/name/cmp.js' },
88
+ };
89
+ vi.mocked(ctx.moduleGraph.getModulePart).mockReturnValue(undefined);
65
90
  await client.messageCallback(data);
66
- expect(mockCtx.logger.debug).toHaveBeenCalledWith(`[LWC Dev Server] Compiling path1`);
67
- expect(mockConnection.send).toHaveBeenCalled();
91
+ expect(connection.send).toHaveBeenCalledWith({
92
+ type: 'error',
93
+ data: {
94
+ message: `Fetch of src/ns/name/cmp.js failed as it does not exist in dev server workspace`,
95
+ },
96
+ });
68
97
  });
69
- it('should handle register message correctly', async () => {
98
+ it('should handle register message callback', async () => {
70
99
  const data = {
71
100
  type: 'register',
72
- data: { modules: [{ modulePath: 'path1', compileOptions: {}, hash: '0' }] },
101
+ data: {
102
+ modules: [{ modulePath: 'ns/name/cmp.js', hash: 'hash1', compileOptions: {} }],
103
+ },
73
104
  };
74
- mockModuleGraph.registerActivePaths.mockReturnValue(['path1']);
105
+ const staleModules = new Set(['ns/name/cmp.js']);
106
+ vi.mocked(ctx.moduleGraph.getStaleModules).mockReturnValue(staleModules);
75
107
  await client.messageCallback(data);
76
- expect(client.activePaths.get('path1')).toEqual({});
77
- expect(mockConnection.send).toHaveBeenCalledWith({
108
+ expect(ctx.moduleGraph.getStaleModules).toHaveBeenCalledWith([
109
+ {
110
+ hash: 'hash1',
111
+ id: 'ns/name',
112
+ part: 'cmp.js',
113
+ },
114
+ ]);
115
+ expect(connection.send).toHaveBeenCalledWith({
78
116
  type: 'update',
79
- data: [{ modulePath: 'stale-module' }],
117
+ data: Array.from(staleModules).map((modulePath) => ({ modulePath })),
80
118
  });
81
119
  });
82
120
  it('should close the connection', () => {
83
121
  client.close();
84
- expect(mockConnection.close).toHaveBeenCalled();
122
+ expect(connection.close).toHaveBeenCalled();
85
123
  });
86
124
  });
87
125
  //# sourceMappingURL=client.spec.js.map