@lwc/lwc-dev-server 9.5.0 → 10.0.0-canary.9d570

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 (52) hide show
  1. package/dist/bin.d.ts +1 -0
  2. package/dist/bin.js +31 -0
  3. package/dist/bin.js.map +1 -0
  4. package/dist/server/bundler/lexBundler.js +1 -1
  5. package/dist/server/bundler/lexBundler.js.map +1 -1
  6. package/dist/server/bundler/lexBundler.spec.d.ts +1 -0
  7. package/dist/server/bundler/lexBundler.spec.js +71 -0
  8. package/dist/server/bundler/lexBundler.spec.js.map +1 -0
  9. package/dist/server/connection/client.spec.d.ts +1 -0
  10. package/dist/server/connection/client.spec.js +107 -0
  11. package/dist/server/connection/client.spec.js.map +1 -0
  12. package/dist/server/connection/connection.spec.d.ts +1 -0
  13. package/dist/server/connection/connection.spec.js +60 -0
  14. package/dist/server/connection/connection.spec.js.map +1 -0
  15. package/dist/server/connection/web-socket-server.spec.d.ts +1 -0
  16. package/dist/server/connection/web-socket-server.spec.js +174 -0
  17. package/dist/server/connection/web-socket-server.spec.js.map +1 -0
  18. package/dist/server/index.spec.d.ts +1 -0
  19. package/dist/server/index.spec.js +98 -0
  20. package/dist/server/index.spec.js.map +1 -0
  21. package/dist/server/moduleGraph/index.spec.d.ts +1 -0
  22. package/dist/server/moduleGraph/index.spec.js +70 -0
  23. package/dist/server/moduleGraph/index.spec.js.map +1 -0
  24. package/dist/server/moduleGraph/workspaceScanner/__tests__/fileReader.spec.d.ts +1 -0
  25. package/dist/server/moduleGraph/workspaceScanner/__tests__/fileReader.spec.js +22 -0
  26. package/dist/server/moduleGraph/workspaceScanner/__tests__/fileReader.spec.js.map +1 -0
  27. package/dist/server/moduleGraph/workspaceScanner/__tests__/internal.spec.d.ts +1 -0
  28. package/dist/server/moduleGraph/workspaceScanner/__tests__/internal.spec.js +45 -0
  29. package/dist/server/moduleGraph/workspaceScanner/__tests__/internal.spec.js.map +1 -0
  30. package/dist/server/moduleGraph/workspaceScanner/__tests__/mrt.spec.d.ts +1 -0
  31. package/dist/server/moduleGraph/workspaceScanner/__tests__/mrt.spec.js +22 -0
  32. package/dist/server/moduleGraph/workspaceScanner/__tests__/mrt.spec.js.map +1 -0
  33. package/dist/server/moduleGraph/workspaceScanner/__tests__/sfcli.spec.d.ts +1 -0
  34. package/dist/server/moduleGraph/workspaceScanner/__tests__/sfcli.spec.js +22 -0
  35. package/dist/server/moduleGraph/workspaceScanner/__tests__/sfcli.spec.js.map +1 -0
  36. package/dist/server/moduleGraph/workspaceScanner/internal.js +5 -13
  37. package/dist/server/moduleGraph/workspaceScanner/internal.js.map +1 -1
  38. package/dist/server/util/__tests__/aes.spec.d.ts +1 -0
  39. package/dist/server/util/__tests__/aes.spec.js +11 -0
  40. package/dist/server/util/__tests__/aes.spec.js.map +1 -0
  41. package/dist/server/util/fileUtil.js +11 -5
  42. package/dist/server/util/fileUtil.js.map +1 -1
  43. package/dist/server/util/telemetry.d.ts +2 -0
  44. package/dist/server/util/telemetry.js +14 -0
  45. package/dist/server/util/telemetry.js.map +1 -0
  46. package/dist/server/watcher/index.spec.d.ts +1 -0
  47. package/dist/server/watcher/index.spec.js +33 -0
  48. package/dist/server/watcher/index.spec.js.map +1 -0
  49. package/dist/utils/utils.test.d.ts +1 -0
  50. package/dist/utils/utils.test.js +49 -0
  51. package/dist/utils/utils.test.js.map +1 -0
  52. package/package.json +6 -4
package/dist/bin.d.ts ADDED
@@ -0,0 +1 @@
1
+ export {};
package/dist/bin.js ADDED
@@ -0,0 +1,31 @@
1
+ import path from 'path';
2
+ import { parseArgs } from 'node:util';
3
+ import { startLwcDevServer } from './server/index.js';
4
+ import { LogLevel, Workspace } from './types/index.js';
5
+ const { values: { 'root-dir': rootDir, paths, port }, } = parseArgs({
6
+ args: process.argv.slice(2),
7
+ options: {
8
+ port: {
9
+ type: 'string',
10
+ },
11
+ [`root-dir`]: {
12
+ type: 'string',
13
+ },
14
+ paths: {
15
+ type: 'string',
16
+ multiple: true,
17
+ },
18
+ },
19
+ });
20
+ if (!rootDir)
21
+ throw new Error(`root-dir is required`);
22
+ if (!paths)
23
+ throw new Error(`paths is required`);
24
+ startLwcDevServer({
25
+ rootDir,
26
+ logLevel: LogLevel.debug,
27
+ paths: paths.map((p) => path.join(rootDir, p)),
28
+ port: +(port || 50182),
29
+ workspace: Workspace.Internal,
30
+ });
31
+ //# sourceMappingURL=bin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAEvD,MAAM,EACF,MAAM,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAC/C,GAAG,SAAS,CAAC;IACV,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAC3B,OAAO,EAAE;QACL,IAAI,EAAE;YACF,IAAI,EAAE,QAAQ;SACjB;QACD,CAAC,UAAU,CAAC,EAAE;YACV,IAAI,EAAE,QAAQ;SACjB;QACD,KAAK,EAAE;YACH,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE,IAAI;SACjB;KACJ;CACJ,CAAC,CAAC;AACH,IAAI,CAAC,OAAO;IAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;AACtD,IAAI,CAAC,KAAK;IAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;AACjD,iBAAiB,CAAC;IACd,OAAO;IACP,QAAQ,EAAE,QAAQ,CAAC,KAAK;IACxB,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAC9C,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,KAAK,CAAC;IACtB,SAAS,EAAE,SAAS,CAAC,QAAQ;CAChC,CAAC,CAAC"}
@@ -31,7 +31,7 @@ function transformOptionsToPlatformCompileConfig(ctx, transformOptions, modulePa
31
31
  };
32
32
  const compilerConfigs = [
33
33
  {
34
- outputConfig: { compat: false, minify: false, sourcemap: !!outputConfig?.sourcemap },
34
+ outputConfig: { minify: false, sourcemap: !!outputConfig?.sourcemap },
35
35
  experimentalDynamicComponent: experimentalDynamicComponent,
36
36
  },
37
37
  ];
@@ -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,QAAQ,EAAU,MAAM,sBAAsB,CAAC;AAU1F,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,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,YAAY,EAAE,SAAS,EAAE;YACpF,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;IAEd,MAAM,aAAa,GAAG,uCAAuC,CAAC,GAAG,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;IACxF,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,aAAa,CAAC,CAAC;IAEpD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QAClB,MAAM,CAAC,GAAG,CACN,QAAQ,CAAC,KAAK,EACd,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,QAAQ,EAAU,MAAM,sBAAsB,CAAC;AAU1F,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;IAEd,MAAM,aAAa,GAAG,uCAAuC,CAAC,GAAG,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;IACxF,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,aAAa,CAAC,CAAC;IAEpD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QAClB,MAAM,CAAC,GAAG,CACN,QAAQ,CAAC,KAAK,EACd,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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,71 @@
1
+ import { compile as platformCompile } from '@lwc/sfdc-lwc-compiler';
2
+ import { Workspace } from '../../types/index';
3
+ import { compile } from './lexBundler';
4
+ vi.mock('@lwc/sfdc-lwc-compiler');
5
+ 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
+ log: vi.fn(),
20
+ };
21
+ mockCtx = {
22
+ config: {
23
+ workspace: Workspace.Internal,
24
+ },
25
+ moduleGraph: {
26
+ getModuleFiles: vi.fn().mockReturnValue(['file1', 'file2']),
27
+ },
28
+ };
29
+ vi.clearAllMocks();
30
+ });
31
+ it('should compile successfully and return code and warnings', async () => {
32
+ const mockResult = {
33
+ success: true,
34
+ results: [
35
+ {
36
+ code: 'compiled code',
37
+ map: '',
38
+ imports: [],
39
+ diagnostics: [],
40
+ outputConfig: {
41
+ minify: false,
42
+ sourcemap: false,
43
+ lockerConfig: {},
44
+ env: { NODE_ENV: 'dev' },
45
+ },
46
+ timings: {},
47
+ },
48
+ ],
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([]);
58
+ });
59
+ it('should return undefined code and warnings when compilation fails', async () => {
60
+ vi.mocked(platformCompile).mockResolvedValue({
61
+ success: false,
62
+ results: [],
63
+ diagnostics: [],
64
+ version: '1',
65
+ timings: {},
66
+ });
67
+ const result = await compile(mockCtx, mockModulePath, mockTransformOptions, mockLogger);
68
+ expect(result.code).toBeUndefined();
69
+ });
70
+ });
71
+ //# sourceMappingURL=lexBundler.spec.js.map
@@ -0,0 +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;AACpE,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,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE;SACM,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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,107 @@
1
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
2
+ import { LogLevel, Workspace } from '../../types/serverConfig';
3
+ import { compile } from '../bundler/lexBundler.js';
4
+ import { Client } from './client';
5
+ vi.mock('../bundler/lexBundler.js');
6
+ describe('Client', () => {
7
+ 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
+ };
18
+ const mockLogger = {
19
+ log: vi.fn(),
20
+ };
21
+ beforeEach(() => {
22
+ mockConnection = {
23
+ send: vi.fn(),
24
+ receive: vi.fn(),
25
+ onClose: vi.fn(),
26
+ close: vi.fn(),
27
+ };
28
+ mockConfig = {
29
+ logLevel: LogLevel.debug,
30
+ paths: [],
31
+ port: 50182,
32
+ rootDir: '',
33
+ workspace: Workspace.Internal,
34
+ };
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);
42
+ });
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();
49
+ });
50
+ it('should add active paths', () => {
51
+ const paths = [{ modulePath: 'path1', compileOptions: {} }];
52
+ client.addActivePaths(paths);
53
+ expect(client.activePaths.get('path1')).toEqual(paths[0].compileOptions);
54
+ });
55
+ it('should not override existing active paths', () => {
56
+ const initialPath = 'path1';
57
+ const paths = [{ modulePath: initialPath, compileOptions: {} }];
58
+ client.addActivePaths(paths);
59
+ const newPaths = [{ modulePath: initialPath, compileOptions: {} }];
60
+ client.addActivePaths(newPaths);
61
+ expect(client.activePaths.get(initialPath)).toEqual(paths[0].compileOptions);
62
+ });
63
+ it('should remove stale paths', () => {
64
+ const paths = [{ modulePath: 'path1', compileOptions: {} }];
65
+ client.addActivePaths(paths);
66
+ client.removeStalePaths(['path1']);
67
+ expect(client.activePaths.has('path1')).toBe(false);
68
+ });
69
+ it('should send data when allowed', () => {
70
+ const data = { type: 'update', data: [] };
71
+ client.send(data);
72
+ expect(mockConnection.send).toHaveBeenCalledWith(data);
73
+ });
74
+ it('should not send data when type is not allowed', () => {
75
+ const data = { type: 'not-allowed', data: [] };
76
+ client.send(data);
77
+ expect(mockCtx.logger.log).toHaveBeenCalledWith(LogLevel.debug, `[LWC Dev Server] Blocking unexpected type of data being sent from server to hmr-client 'not-allowed'`);
78
+ expect(mockConnection.send).not.toHaveBeenCalled();
79
+ });
80
+ it('should handle fetch message correctly', async () => {
81
+ const data = { type: 'fetch', data: { modulePath: 'path1' } };
82
+ mockModuleGraph.getFileByModulePath.mockReturnValue('file1');
83
+ client.getCompileOptions = vi.fn().mockReturnValue({});
84
+ await client.messageCallback(data);
85
+ expect(mockCtx.logger.log).toHaveBeenCalledWith(LogLevel.debug, `[LWC Dev Server] Compiling path1`);
86
+ expect(mockConnection.send).toHaveBeenCalled();
87
+ });
88
+ it('should handle register message correctly', async () => {
89
+ const data = {
90
+ type: 'register',
91
+ data: { modules: [{ modulePath: 'path1', compileOptions: {}, hash: '0' }] },
92
+ };
93
+ mockModuleGraph.registerActivePaths.mockReturnValue(['path1']);
94
+ mockModuleGraph.getModuleBoundary.mockReturnValue('boundary1');
95
+ await client.messageCallback(data);
96
+ expect(client.activePaths.get('path1')).toEqual({});
97
+ expect(mockConnection.send).toHaveBeenCalledWith({
98
+ type: 'update',
99
+ data: [{ modulePath: 'boundary1' }],
100
+ });
101
+ });
102
+ it('should close the connection', () => {
103
+ client.close();
104
+ expect(mockConnection.close).toHaveBeenCalled();
105
+ });
106
+ });
107
+ //# sourceMappingURL=client.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.spec.js","sourceRoot":"","sources":["../../../src/server/connection/client.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,60 @@
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
2
+ import { LogLevel } from '../../types/index.js';
3
+ import { UNRECOGNIZED_MESSAGE_TYPE } from '../../labels.js';
4
+ import { Connection } from './connection.js';
5
+ describe('Connection', () => {
6
+ let mockSocket;
7
+ let mockLogger;
8
+ let connection;
9
+ beforeEach(() => {
10
+ mockSocket = {
11
+ close: vi.fn(),
12
+ on: vi.fn(),
13
+ send: vi.fn(),
14
+ addEventListener: vi.fn(),
15
+ };
16
+ mockLogger = {
17
+ log: vi.fn(),
18
+ };
19
+ connection = new Connection(mockSocket, mockLogger);
20
+ });
21
+ afterEach(() => {
22
+ vi.clearAllMocks();
23
+ });
24
+ it('should close the WebSocket connection', () => {
25
+ connection.close();
26
+ expect(mockSocket.close).toHaveBeenCalled();
27
+ });
28
+ it('should register a close event listener', () => {
29
+ const closeCallback = vi.fn();
30
+ connection.onClose(closeCallback);
31
+ expect(mockSocket.on).toHaveBeenCalledWith('close', closeCallback);
32
+ });
33
+ it('should send data over the WebSocket connection', () => {
34
+ const mockData = { type: 'register', data: { modules: [] } };
35
+ connection.send(mockData);
36
+ expect(mockSocket.send).toHaveBeenCalledWith(JSON.stringify(mockData));
37
+ });
38
+ it('should receive data from the WebSocket connection', () => {
39
+ const mockMessageEvent = {
40
+ data: JSON.stringify({ type: 'mockType', data: {} }),
41
+ };
42
+ const receiveCallback = vi.fn();
43
+ connection.receive(receiveCallback);
44
+ const addEventListenerCall = vi.mocked(mockSocket).addEventListener.mock.calls[0];
45
+ const eventListener = addEventListenerCall[1];
46
+ eventListener(mockMessageEvent);
47
+ expect(receiveCallback).toHaveBeenCalledWith({ type: 'mockType', data: {} });
48
+ });
49
+ it('should log an error for unrecognized message types', () => {
50
+ const mockMessageEvent = {
51
+ data: new ArrayBuffer(8), // Non-string data to simulate unrecognized message type
52
+ };
53
+ connection.receive(vi.fn());
54
+ const addEventListenerCall = vi.mocked(mockSocket).addEventListener.mock.calls[0];
55
+ const eventListener = addEventListenerCall[1];
56
+ eventListener(mockMessageEvent);
57
+ expect(mockLogger.log).toHaveBeenCalledWith(LogLevel.error, UNRECOGNIZED_MESSAGE_TYPE);
58
+ });
59
+ });
60
+ //# sourceMappingURL=connection.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection.spec.js","sourceRoot":"","sources":["../../../src/server/connection/connection.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,174 @@
1
+ import * as http from 'http';
2
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
3
+ import { WebSocketServer } from 'ws';
4
+ import { LogLevel, Workspace } from '../../types';
5
+ import * as aes from '../util/aes';
6
+ import { AuthenticatedWebSocketServer } from './web-socket-server.js';
7
+ import { Connection } from './connection';
8
+ // Mock dependencies
9
+ vi.mock('ws');
10
+ vi.mock('http');
11
+ vi.mock('https');
12
+ vi.mock('../util/aes');
13
+ vi.mock('./connection');
14
+ describe('AuthenticatedWebSocketServer', () => {
15
+ let logger;
16
+ let serverConfig;
17
+ let wsServerMock;
18
+ let httpServerMock;
19
+ beforeEach(() => {
20
+ logger = {
21
+ log: vi.fn(),
22
+ };
23
+ serverConfig = {
24
+ port: 3000,
25
+ identityToken: 'mock-identity-token',
26
+ rootDir: '',
27
+ logLevel: LogLevel.debug,
28
+ paths: [],
29
+ workspace: Workspace.Internal,
30
+ };
31
+ wsServerMock = {
32
+ on: vi.fn(),
33
+ handleUpgrade: vi.fn(),
34
+ emit: vi.fn(),
35
+ close: vi.fn(),
36
+ };
37
+ httpServerMock = {
38
+ on: vi.fn(),
39
+ listen: vi.fn(),
40
+ close: vi.fn(),
41
+ };
42
+ vi.mocked(WebSocketServer).mockImplementation(() => wsServerMock);
43
+ vi.mocked(http.createServer).mockReturnValue(httpServerMock);
44
+ });
45
+ afterEach(() => {
46
+ vi.restoreAllMocks();
47
+ });
48
+ it('should create an instance of AuthenticatedWebSocketServer and start the HTTP server', () => {
49
+ new AuthenticatedWebSocketServer(serverConfig, logger);
50
+ expect(http.createServer).toHaveBeenCalled();
51
+ expect(httpServerMock.on).toHaveBeenCalledWith('request', expect.any(Function));
52
+ expect(httpServerMock.on).toHaveBeenCalledWith('upgrade', expect.any(Function));
53
+ expect(httpServerMock.listen).toHaveBeenCalledWith(serverConfig.port, expect.any(Function));
54
+ });
55
+ it('should handle WebSocket upgrade requests from trusted origins', () => {
56
+ const socketMock = {
57
+ write: vi.fn(),
58
+ destroy: vi.fn(),
59
+ };
60
+ new AuthenticatedWebSocketServer(serverConfig, logger);
61
+ const upgradeHandler = vi
62
+ .mocked(httpServerMock)
63
+ .on.mock.calls.find((call) => call[0] === 'upgrade')[1];
64
+ const requestMock = {
65
+ headers: {
66
+ 'sec-websocket-protocol': 'lightning-dev-preview',
67
+ origin: 'https://mock-origin.lightning.force.com',
68
+ },
69
+ url: '/',
70
+ };
71
+ const headMock = Buffer.alloc(0);
72
+ // @ts-expect-error can't mock the entire socket
73
+ upgradeHandler(requestMock, socketMock, headMock);
74
+ expect(wsServerMock.handleUpgrade).toHaveBeenCalledWith(requestMock, socketMock, headMock, expect.any(Function));
75
+ });
76
+ it('should reject WebSocket upgrade requests from untrusted origins', () => {
77
+ const httpServerMock = {
78
+ on: vi.fn(),
79
+ listen: vi.fn(),
80
+ close: vi.fn(),
81
+ };
82
+ vi.mocked(http.createServer).mockReturnValue(httpServerMock);
83
+ const socketMock = {
84
+ write: vi.fn(),
85
+ destroy: vi.fn(),
86
+ };
87
+ new AuthenticatedWebSocketServer(serverConfig, logger);
88
+ const upgradeHandler = vi
89
+ .mocked(httpServerMock)
90
+ .on.mock.calls.find((call) => call[0] === 'upgrade')[1];
91
+ const requestMock = {
92
+ headers: {
93
+ 'sec-websocket-protocol': 'unknown-protocol',
94
+ origin: 'https://untrusted-origin.com',
95
+ },
96
+ url: '/',
97
+ };
98
+ const headMock = Buffer.alloc(0);
99
+ // @ts-expect-error can't mock the entire socket
100
+ upgradeHandler(requestMock, socketMock, headMock);
101
+ expect(socketMock.write).toHaveBeenCalledWith('HTTP/1.1 401 Unauthorized\r\n\r\n');
102
+ expect(socketMock.destroy).toHaveBeenCalled();
103
+ });
104
+ it('should close the WebSocketServer when close() is called', () => {
105
+ const authenticatedWSS = new AuthenticatedWebSocketServer(serverConfig, logger);
106
+ authenticatedWSS.close();
107
+ expect(wsServerMock.close).toHaveBeenCalled();
108
+ });
109
+ it('should handle a new WebSocket connection and send an auth-response if identityToken is provided', () => {
110
+ const connectionMock = {
111
+ send: vi.fn(),
112
+ };
113
+ vi.mocked(Connection).mockReturnValue(connectionMock);
114
+ const wsMock = {};
115
+ const requestMock = {
116
+ url: '/?sessionTokenCipher=mock-cipher&referer=https://mock-referer.com',
117
+ };
118
+ const decryptSpy = vi.spyOn(aes, 'decrypt').mockReturnValue('decrypted-token');
119
+ const authenticatedWSS = new AuthenticatedWebSocketServer(serverConfig, logger);
120
+ const callback = vi.fn();
121
+ authenticatedWSS.onNewConnection(callback);
122
+ vi.mocked(wsServerMock)
123
+ .on.mock.calls.find((call) => call[0] === 'connection')[1]
124
+ .call(wsServerMock, wsMock, requestMock);
125
+ expect(Connection).toHaveBeenCalledWith(wsMock, logger);
126
+ expect(decryptSpy).toHaveBeenCalledWith('mock-cipher', serverConfig.identityToken);
127
+ expect(connectionMock.send).toHaveBeenCalledWith({
128
+ type: 'auth-response',
129
+ data: { sessionToken: 'decrypted-token' },
130
+ });
131
+ expect(callback).toHaveBeenCalledWith(connectionMock, 'https://mock-referer.com');
132
+ });
133
+ it('should close WebSocket connection if sessionTokenCipher is missing', () => {
134
+ const connectionMock = {
135
+ send: vi.fn(),
136
+ };
137
+ vi.mocked(Connection).mockReturnValue(connectionMock);
138
+ const wsMock = {
139
+ close: vi.fn(),
140
+ };
141
+ const requestMock = {
142
+ url: '/',
143
+ headers: {
144
+ referer: 'https://mock-referer.com',
145
+ },
146
+ };
147
+ const authenticatedWSS = new AuthenticatedWebSocketServer(serverConfig, logger);
148
+ const callback = vi.fn();
149
+ authenticatedWSS.onNewConnection(callback);
150
+ vi.mocked(wsServerMock)
151
+ .on.mock.calls.find((call) => call[0] === 'connection')[1]
152
+ .call(wsServerMock, wsMock, requestMock);
153
+ expect(wsMock.close).toHaveBeenCalled();
154
+ expect(callback).not.toHaveBeenCalled();
155
+ });
156
+ it('should close WebSocket connection if referer header is missing', () => {
157
+ const wsMock = {
158
+ close: vi.fn(),
159
+ };
160
+ const requestMock = {
161
+ url: '/?sessionTokenCipher=mock-cipher',
162
+ headers: {},
163
+ };
164
+ const authenticatedWSS = new AuthenticatedWebSocketServer(serverConfig, logger);
165
+ const callback = vi.fn();
166
+ authenticatedWSS.onNewConnection(callback);
167
+ vi.mocked(wsServerMock)
168
+ .on.mock.calls.find((call) => call[0] === 'connection')[1]
169
+ .call(wsServerMock, wsMock, requestMock);
170
+ expect(wsMock.close).toHaveBeenCalled();
171
+ expect(callback).not.toHaveBeenCalled();
172
+ });
173
+ });
174
+ //# sourceMappingURL=web-socket-server.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-socket-server.spec.js","sourceRoot":"","sources":["../../../src/server/connection/web-socket-server.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,98 @@
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
2
+ import { FSWatcher } from 'chokidar';
3
+ import { LogLevel } from '../types/index.js';
4
+ import { LWCServer } from './index.js';
5
+ import { startWatch } from './watcher/index.js';
6
+ import { AuthenticatedWebSocketServer } from './connection/web-socket-server.js';
7
+ import { ModuleGraph } from './moduleGraph/index.js';
8
+ import ConsoleLogger from './consoleLogger.js';
9
+ import { Client } from './connection/client.js';
10
+ import { Connection } from './connection/connection.js';
11
+ vi.mock('chokidar', () => ({ FSWatcher: vi.fn(() => ({ on: vi.fn(), close: vi.fn() })) }));
12
+ vi.mock('./watcher/index.js', () => ({ startWatch: vi.fn(() => new FSWatcher()) }));
13
+ vi.mock('./connection/web-socket-server.js', () => ({
14
+ AuthenticatedWebSocketServer: vi.fn(() => ({
15
+ onNewConnection: vi.fn(),
16
+ close: vi.fn(),
17
+ })),
18
+ }));
19
+ vi.mock('./moduleGraph/index.js', () => ({ ModuleGraph: vi.fn() }));
20
+ vi.mock('./consoleLogger.js');
21
+ vi.mock('./connection/client.js', () => ({
22
+ Client: vi.fn(() => ({ onClose: vi.fn(), send: vi.fn() })),
23
+ }));
24
+ vi.mock('./connection/connection.js');
25
+ describe('LWCServer', () => {
26
+ let config;
27
+ let logger;
28
+ let wss;
29
+ let lwcServer;
30
+ beforeEach(() => {
31
+ config = {
32
+ paths: ['/some/path'],
33
+ logLevel: LogLevel.info,
34
+ identityToken: 'test-token',
35
+ maxClientCount: 2,
36
+ };
37
+ logger = new ConsoleLogger(config.logLevel);
38
+ wss = new AuthenticatedWebSocketServer(config, logger);
39
+ lwcServer = new LWCServer(config, wss, logger);
40
+ });
41
+ afterEach(() => {
42
+ vi.clearAllMocks();
43
+ });
44
+ it('should initialize the server with correct components', () => {
45
+ expect(startWatch).toHaveBeenCalledWith(config.paths);
46
+ expect(ModuleGraph).toHaveBeenCalledWith(config, logger, lwcServer.watcher, {
47
+ moduleUpdateHandler: lwcServer.moduleUpdateHandler,
48
+ });
49
+ });
50
+ it('should handle new connections and enforce max client limit', () => {
51
+ const mockUrl = 'ws://localhost';
52
+ const onNewConnection = vi.mocked(wss.onNewConnection).mock.calls[0][0];
53
+ // @ts-expect-error
54
+ const connection = new Connection();
55
+ onNewConnection(connection, mockUrl);
56
+ expect(Client).toHaveBeenCalledTimes(1);
57
+ expect(lwcServer.clients.size).toBe(1);
58
+ onNewConnection(connection, mockUrl);
59
+ onNewConnection(connection, mockUrl); // This should exceed max client count
60
+ expect(Client).toHaveBeenCalledTimes(2); // Only two clients allowed
61
+ expect(connection.close).toHaveBeenCalledTimes(1); // Third connection should be closed
62
+ expect(lwcServer.clients.size).toBe(2);
63
+ });
64
+ it('should handle file watcher errors and stop the server', () => {
65
+ const mockErrorEvent = { message: 'File watcher error' };
66
+ const onError = vi
67
+ .mocked(lwcServer.watcher)
68
+ .on.mock.calls.find(([eventName]) => eventName === 'error')[1];
69
+ onError(mockErrorEvent);
70
+ expect(logger.log).toHaveBeenCalledWith(LogLevel.error, '[LWC Dev Server] Encountered error while watching files');
71
+ expect(logger.log).toHaveBeenCalledWith(LogLevel.debug, `[LWC Dev Server] File watcher error: ${mockErrorEvent.message}`);
72
+ expect(wss.close).toHaveBeenCalled();
73
+ });
74
+ it('should stop the server and release resources', () => {
75
+ lwcServer.stopServer();
76
+ expect(logger.log).toHaveBeenCalledWith(LogLevel.info, '[LWC Dev Server] Stopping the dev server');
77
+ expect(lwcServer.watcher.close).toHaveBeenCalled();
78
+ expect(lwcServer.wss.close).toHaveBeenCalled();
79
+ expect(logger.log).toHaveBeenCalledWith(LogLevel.info, '[LWC Dev Server] Succesfully stopped dev server');
80
+ });
81
+ it('should send update messages to all connected clients', () => {
82
+ const mockClient1 = new Client('client1', 'ws://localhost', {}, lwcServer.context);
83
+ const mockClient2 = new Client('client2', 'ws://localhost', {}, lwcServer.context);
84
+ lwcServer.clients.add(mockClient1);
85
+ lwcServer.clients.add(mockClient2);
86
+ const modulePath = '/some/module/path';
87
+ lwcServer.moduleUpdateHandler(modulePath);
88
+ expect(mockClient1.send).toHaveBeenCalledWith({
89
+ type: 'update',
90
+ data: [{ modulePath }],
91
+ });
92
+ expect(mockClient2.send).toHaveBeenCalledWith({
93
+ type: 'update',
94
+ data: [{ modulePath }],
95
+ });
96
+ });
97
+ });
98
+ //# sourceMappingURL=index.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.spec.js","sourceRoot":"","sources":["../../src/server/index.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,70 @@
1
+ import path from 'path';
2
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
3
+ import { watch } from 'chokidar';
4
+ import { LogLevel, Workspace } from '../../types/index.js';
5
+ import { getModuleHash } from '../util/fileUtil.js';
6
+ import { ModuleGraph } from './index.js';
7
+ const modulesPath = path.resolve(__dirname, 'workspaceScanner/__tests__/data/mrt/some-path');
8
+ vi.spyOn(path, 'resolve');
9
+ vi.mock('path', async (importOriginal) => {
10
+ return {
11
+ ...(await importOriginal()),
12
+ resolve: vi.fn(),
13
+ };
14
+ });
15
+ vi.mock('chokidar', () => ({
16
+ watch: vi.fn().mockReturnValue({
17
+ on: vi.fn(),
18
+ close: vi.fn(),
19
+ }),
20
+ }));
21
+ vi.mock('../util/fileUtil.js', async (importOriginal) => {
22
+ return {
23
+ ...(await importOriginal()),
24
+ getModuleHash: vi.fn(),
25
+ };
26
+ });
27
+ describe('ModuleGraph', () => {
28
+ let moduleGraph;
29
+ const mockLogger = {
30
+ log: vi.fn(),
31
+ };
32
+ //@ts-expect-error mocked
33
+ const mockWatcher = watch();
34
+ const mockCallbacks = {
35
+ moduleUpdateHandler: vi.fn(),
36
+ };
37
+ beforeEach(() => {
38
+ moduleGraph = new ModuleGraph({
39
+ logLevel: LogLevel.debug,
40
+ paths: [modulesPath],
41
+ port: 50182,
42
+ rootDir: __dirname,
43
+ workspace: Workspace.Mrt,
44
+ }, mockLogger, mockWatcher, mockCallbacks);
45
+ });
46
+ afterEach(() => {
47
+ vi.clearAllMocks();
48
+ });
49
+ it('should return the correct module path by file path', () => {
50
+ const result = moduleGraph.getModulePathByFile(path.resolve(modulesPath, 'ns/comp/comp.html'));
51
+ expect(result).toBe('ns/comp/comp.html');
52
+ });
53
+ it('should handle file changes correctly', () => {
54
+ const mockFilePath = path.resolve(modulesPath, 'ns/comp/comp.js');
55
+ vi.mocked(getModuleHash).mockReturnValueOnce('changed hash');
56
+ vi.mocked(mockWatcher).on.mock.calls[0][1](mockFilePath);
57
+ expect(mockCallbacks.moduleUpdateHandler).toHaveBeenCalled();
58
+ });
59
+ it('should throw an error for unrecognized file types in getModuleBoundary', () => {
60
+ expect(() => {
61
+ moduleGraph.getModuleBoundary('/path/to/file.txt');
62
+ }).toThrowError('[LWC Dev Server] Unrecognized file type or file not part of LWC module: /path/to/file.txt');
63
+ });
64
+ it('should return the correct module boundary for .js files', () => {
65
+ const modulePath = 'ns/comp/x.js';
66
+ const result = moduleGraph.getModuleBoundary(modulePath);
67
+ expect(result).toBe('ns/comp/comp.js');
68
+ });
69
+ });
70
+ //# sourceMappingURL=index.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.spec.js","sourceRoot":"","sources":["../../../src/server/moduleGraph/index.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import path from 'node:path';
2
+ import { getComponentParts } from '../fileReader';
3
+ function formatPaths(input) {
4
+ return Object.fromEntries(Object.keys(input).map((k) => {
5
+ return [k, input[k].moduleFilePath.replace(__dirname, '<stripped-path>')];
6
+ }));
7
+ }
8
+ describe('internal workspace type', () => {
9
+ it('gets modules parts of an internal component', () => {
10
+ const moduleParts = getComponentParts(path.join(__dirname, './data/internal/ui-force-components/modules/ns/sample'), 'ns', 'ns/owner');
11
+ expect(moduleParts).not.toBeUndefined();
12
+ expect(formatPaths(moduleParts)).toMatchSnapshot();
13
+ });
14
+ });
15
+ describe('salesforce cli workspace type', () => {
16
+ it('gets modules parts of an external component', () => {
17
+ const moduleParts = getComponentParts(path.join(__dirname, './data/sfdx/force-app/main/default/lwc/myComponent'), 'ns', 'ns/owner');
18
+ expect(moduleParts).not.toBeUndefined();
19
+ expect(formatPaths(moduleParts)).toMatchSnapshot();
20
+ });
21
+ });
22
+ //# sourceMappingURL=fileReader.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fileReader.spec.js","sourceRoot":"","sources":["../../../../../src/server/moduleGraph/workspaceScanner/__tests__/fileReader.spec.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAGlD,SAAS,WAAW,CAAC,KAAoC;IACrD,OAAO,MAAM,CAAC,WAAW,CACrB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACzB,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC,CAAC;IAC9E,CAAC,CAAC,CACL,CAAC;AACN,CAAC;AAED,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IACrC,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACnD,MAAM,WAAW,GAAG,iBAAiB,CACjC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,uDAAuD,CAAC,EAC7E,IAAI,EACJ,UAAU,CACb,CAAC;QACF,MAAM,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QACxC,MAAM,CAAC,WAAW,CAAC,WAAY,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC;IACxD,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;IAC3C,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACnD,MAAM,WAAW,GAAG,iBAAiB,CACjC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,oDAAoD,CAAC,EAC1E,IAAI,EACJ,UAAU,CACb,CAAC;QACF,MAAM,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QACxC,MAAM,CAAC,WAAW,CAAC,WAAY,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC;IACxD,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
@@ -0,0 +1,45 @@
1
+ import path from 'node:path';
2
+ import { Workspace } from '../../../../types/serverConfig.js';
3
+ import InternalWorkspaceScanner from '../internal.js';
4
+ class MockLogger {
5
+ log(_level, _message) {
6
+ // do nothing;
7
+ }
8
+ }
9
+ describe('Internal Workspace Scanner', () => {
10
+ it('should add all modules to module map when no exclude paths are provided', () => {
11
+ const workspaceScanner = new InternalWorkspaceScanner(Workspace.Internal, [
12
+ path.resolve(__dirname, './data/internal/ui-force-components'),
13
+ path.resolve(__dirname, './data/internal/ui'),
14
+ ], new MockLogger());
15
+ const dirs = workspaceScanner.findModuleDirs();
16
+ expect(dirs).toEqual([
17
+ path.resolve(__dirname, 'data/internal/ui-force-components/modules/ns/sample'),
18
+ path.resolve(__dirname, 'data/internal/ui-force-components/modules/ns/exclude'),
19
+ path.resolve(__dirname, 'data/internal/ui/components/modules/uins/sample'),
20
+ path.resolve(__dirname, 'data/internal/ui/components/modules/uins/exclude'),
21
+ ]);
22
+ expect([...workspaceScanner.getModulesMap().keys()]).toEqual([
23
+ 'ns/sample',
24
+ 'ns/exclude',
25
+ 'uins/sample',
26
+ 'uins/exclude',
27
+ ]);
28
+ });
29
+ it('should not add excluded modules to module map', () => {
30
+ const workspaceScanner = new InternalWorkspaceScanner(Workspace.Internal, [
31
+ path.resolve(__dirname, './data/internal/ui-force-components'),
32
+ path.resolve(__dirname, './data/internal/ui'),
33
+ ], new MockLogger(), [
34
+ path.resolve(__dirname, './data/internal/ui-force-components/modules/ns/exclude'),
35
+ path.resolve(__dirname, './data/internal/ui/components/modules/uins/exclude'),
36
+ ]);
37
+ const dirs = workspaceScanner.findModuleDirs();
38
+ expect(dirs).toEqual([
39
+ path.resolve(__dirname, 'data/internal/ui-force-components/modules/ns/sample'),
40
+ path.resolve(__dirname, 'data/internal/ui/components/modules/uins/sample'),
41
+ ]);
42
+ expect([...workspaceScanner.getModulesMap().keys()]).toEqual(['ns/sample', 'uins/sample']);
43
+ });
44
+ });
45
+ //# sourceMappingURL=internal.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"internal.spec.js","sourceRoot":"","sources":["../../../../../src/server/moduleGraph/workspaceScanner/__tests__/internal.spec.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAY,SAAS,EAAE,MAAM,mCAAmC,CAAC;AACxE,OAAO,wBAAwB,MAAM,gBAAgB,CAAC;AAGtD,MAAM,UAAU;IACZ,GAAG,CAAC,MAAgB,EAAE,QAAgB;QAClC,cAAc;IAClB,CAAC;CACJ;AAED,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;IACxC,EAAE,CAAC,yEAAyE,EAAE,GAAG,EAAE;QAC/E,MAAM,gBAAgB,GAAG,IAAI,wBAAwB,CACjD,SAAS,CAAC,QAAQ,EAClB;YACI,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,qCAAqC,CAAC;YAC9D,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,oBAAoB,CAAC;SAChD,EACD,IAAI,UAAU,EAAE,CACnB,CAAC;QACF,MAAM,IAAI,GAAG,gBAAgB,CAAC,cAAc,EAAE,CAAC;QAE/C,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC;YACjB,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,qDAAqD,CAAC;YAC9E,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,sDAAsD,CAAC;YAC/E,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,iDAAiD,CAAC;YAC1E,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,kDAAkD,CAAC;SAC9E,CAAC,CAAC;QACH,MAAM,CAAC,CAAC,GAAG,gBAAgB,CAAC,aAAa,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;YACzD,WAAW;YACX,YAAY;YACZ,aAAa;YACb,cAAc;SACjB,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACrD,MAAM,gBAAgB,GAAG,IAAI,wBAAwB,CACjD,SAAS,CAAC,QAAQ,EAClB;YACI,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,qCAAqC,CAAC;YAC9D,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,oBAAoB,CAAC;SAChD,EACD,IAAI,UAAU,EAAE,EAChB;YACI,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,wDAAwD,CAAC;YACjF,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,oDAAoD,CAAC;SAChF,CACJ,CAAC;QACF,MAAM,IAAI,GAAG,gBAAgB,CAAC,cAAc,EAAE,CAAC;QAC/C,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC;YACjB,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,qDAAqD,CAAC;YAC9E,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,iDAAiD,CAAC;SAC7E,CAAC,CAAC;QAEH,MAAM,CAAC,CAAC,GAAG,gBAAgB,CAAC,aAAa,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC,CAAC;IAC/F,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
@@ -0,0 +1,22 @@
1
+ import path from 'node:path';
2
+ import { Workspace } from '../../../../types/serverConfig';
3
+ import MrtWorkspaceScanner from '../mrt';
4
+ class MockLogger {
5
+ log(_level, _message) {
6
+ // do nothing;
7
+ }
8
+ }
9
+ describe('MRT Workspace Scanner', () => {
10
+ let workspaceScanner;
11
+ beforeAll(() => {
12
+ workspaceScanner = new MrtWorkspaceScanner(Workspace.Mrt, [path.resolve(__dirname, './data/mrt/some-path')], new MockLogger());
13
+ });
14
+ it('should return correct namespace', () => {
15
+ const dirs = workspaceScanner.findModuleDirs();
16
+ expect(dirs.length).toBe(1);
17
+ dirs.forEach((dir) => {
18
+ expect(workspaceScanner.getNamespace(dir)).toEqual('ns');
19
+ });
20
+ });
21
+ });
22
+ //# sourceMappingURL=mrt.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mrt.spec.js","sourceRoot":"","sources":["../../../../../src/server/moduleGraph/workspaceScanner/__tests__/mrt.spec.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAY,SAAS,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,mBAAmB,MAAM,QAAQ,CAAC;AAGzC,MAAM,UAAU;IACZ,GAAG,CAAC,MAAgB,EAAE,QAAgB;QAClC,cAAc;IAClB,CAAC;CACJ;AAED,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACnC,IAAI,gBAAqC,CAAC;IAC1C,SAAS,CAAC,GAAG,EAAE;QACX,gBAAgB,GAAG,IAAI,mBAAmB,CACtC,SAAS,CAAC,GAAG,EACb,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,sBAAsB,CAAC,CAAC,EACjD,IAAI,UAAU,EAAE,CACnB,CAAC;IACN,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACvC,MAAM,IAAI,GAAG,gBAAgB,CAAC,cAAc,EAAE,CAAC;QAE/C,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC5B,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YACjB,MAAM,CAAC,gBAAgB,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC7D,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
@@ -0,0 +1,22 @@
1
+ import path from 'node:path';
2
+ import { Workspace } from '../../../../types/serverConfig';
3
+ import SalesforceCliWorkspaceScanner from '../salesforceCli';
4
+ class MockLogger {
5
+ log(_level, _message) {
6
+ // do nothing;
7
+ }
8
+ }
9
+ describe('SF Cli Workspace Scanner', () => {
10
+ let workspaceScanner;
11
+ beforeAll(() => {
12
+ workspaceScanner = new SalesforceCliWorkspaceScanner(Workspace.SfCli, [path.resolve(__dirname, 'data/sfdx/force-app/main/default')], new MockLogger());
13
+ });
14
+ it('should return correct namespace', () => {
15
+ const dirs = workspaceScanner.findModuleDirs();
16
+ expect(dirs.length).toBe(1);
17
+ dirs.forEach((dir) => {
18
+ expect(workspaceScanner.getNamespace(dir)).toEqual('c');
19
+ });
20
+ });
21
+ });
22
+ //# sourceMappingURL=sfcli.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sfcli.spec.js","sourceRoot":"","sources":["../../../../../src/server/moduleGraph/workspaceScanner/__tests__/sfcli.spec.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAY,SAAS,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,6BAA6B,MAAM,kBAAkB,CAAC;AAG7D,MAAM,UAAU;IACZ,GAAG,CAAC,MAAgB,EAAE,QAAgB;QAClC,cAAc;IAClB,CAAC;CACJ;AAED,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACtC,IAAI,gBAA+C,CAAC;IACpD,SAAS,CAAC,GAAG,EAAE;QACX,gBAAgB,GAAG,IAAI,6BAA6B,CAChD,SAAS,CAAC,KAAK,EACf,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,kCAAkC,CAAC,CAAC,EAC7D,IAAI,UAAU,EAAE,CACnB,CAAC;IACN,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACvC,MAAM,IAAI,GAAG,gBAAgB,CAAC,cAAc,EAAE,CAAC;QAE/C,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC5B,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YACjB,MAAM,CAAC,gBAAgB,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC5D,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
@@ -1,23 +1,15 @@
1
1
  import path from 'node:path';
2
- import { getChildDirPaths } from '../../util/fileUtil.js';
2
+ import { globSync } from 'glob';
3
3
  import { BaseWorkspaceScanner } from './scanner.js';
4
4
  /**
5
5
  * This scanner will accept paths and builds a list of module ids to component paths.
6
6
  */
7
7
  export default class InternalWorkspaceScanner extends BaseWorkspaceScanner {
8
8
  findModuleDirs() {
9
- const lwcDirs = [];
10
- this.modulesPaths.forEach((uimodule) => {
11
- const modulesDir = path.join(uimodule, 'modules');
12
- const namespaces = getChildDirPaths(modulesDir);
13
- namespaces.forEach((namespace) => {
14
- let componentDirPaths = getChildDirPaths(namespace);
15
- if (this.excludePaths) {
16
- componentDirPaths = componentDirPaths.filter((componentDirPath) => !this.excludePaths.includes(componentDirPath));
17
- }
18
- lwcDirs.push(...componentDirPaths);
19
- });
20
- });
9
+ let lwcDirs = this.modulesPaths.flatMap((uimodule) => globSync(`${uimodule}/**/modules/*/*/`));
10
+ if (this.excludePaths) {
11
+ lwcDirs = lwcDirs.filter((dir) => !this.excludePaths.includes(dir));
12
+ }
21
13
  return lwcDirs;
22
14
  }
23
15
  getNamespace(moduleDir) {
@@ -1 +1 @@
1
- {"version":3,"file":"internal.js","sourceRoot":"","sources":["../../../../src/server/moduleGraph/workspaceScanner/internal.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAEpD;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,wBAAyB,SAAQ,oBAAoB;IACtE,cAAc;QACV,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;YACnC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;YAClD,MAAM,UAAU,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;YAChD,UAAU,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE;gBAC7B,IAAI,iBAAiB,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;gBACpD,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;oBACpB,iBAAiB,GAAG,iBAAiB,CAAC,MAAM,CACxC,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,YAAa,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CACvE,CAAC;gBACN,CAAC;gBACD,OAAO,CAAC,IAAI,CAAC,GAAG,iBAAiB,CAAC,CAAC;YACvC,CAAC,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;QACH,OAAO,OAAO,CAAC;IACnB,CAAC;IAED,YAAY,CAAC,SAAiB;QAC1B,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;IAClD,CAAC;CACJ"}
1
+ {"version":3,"file":"internal.js","sourceRoot":"","sources":["../../../../src/server/moduleGraph/workspaceScanner/internal.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAChC,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAEpD;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,wBAAyB,SAAQ,oBAAoB;IACtE,cAAc;QACV,IAAI,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CACjD,QAAQ,CAAC,GAAG,QAAQ,kBAAkB,CAAC,CAC1C,CAAC;QACF,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACpB,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,YAAa,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;QACzE,CAAC;QACD,OAAO,OAAO,CAAC;IACnB,CAAC;IAED,YAAY,CAAC,SAAiB;QAC1B,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;IAClD,CAAC;CACJ"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,11 @@
1
+ import { decrypt } from '../aes';
2
+ describe('aes', () => {
3
+ it('decrypts successfully', () => {
4
+ const key = 'Jr5r6N4O6BHasT5cgbt8rTa1dFVqHX8hUhsrCyXkAwk=';
5
+ const plainText = '6MLdkoVsTvFuMC6mah7P9NrCaUkhEcfHrNbTBgeh2PU=';
6
+ const plainTextEncrypted = 'iEEP86KXeds+JKrppfP803mNRlaMqqesFBoNH88qIEOJaL4ScRk8WZxJJTtGImeo/N6rBT2dOnr1jePs';
7
+ const decrypted = decrypt(plainTextEncrypted, key);
8
+ expect(decrypted).toBe(plainText);
9
+ });
10
+ });
11
+ //# sourceMappingURL=aes.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aes.spec.js","sourceRoot":"","sources":["../../../../src/server/util/__tests__/aes.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAEjC,QAAQ,CAAC,KAAK,EAAE,GAAG,EAAE;IACjB,EAAE,CAAC,uBAAuB,EAAE,GAAG,EAAE;QAC7B,MAAM,GAAG,GAAG,8CAA8C,CAAC;QAC3D,MAAM,SAAS,GAAG,8CAA8C,CAAC;QACjE,MAAM,kBAAkB,GACpB,kFAAkF,CAAC;QAEvF,MAAM,SAAS,GAAG,OAAO,CAAC,kBAAkB,EAAE,GAAG,CAAC,CAAC;QACnD,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
@@ -7,12 +7,18 @@ import { createHash } from 'node:crypto';
7
7
  * @returns
8
8
  */
9
9
  export function getChildDirPaths(entryDir) {
10
- if (!existsSync(entryDir)) {
11
- return [];
10
+ try {
11
+ return readdirSync(entryDir, { withFileTypes: true })
12
+ .filter((dirent) => dirent.isDirectory())
13
+ .map((dirent) => path.resolve(entryDir, dirent.name));
14
+ }
15
+ catch (error) {
16
+ if (error instanceof Error && 'code' in error) {
17
+ if (error.code === 'ENOENT')
18
+ return [];
19
+ }
20
+ throw error;
12
21
  }
13
- return readdirSync(entryDir, { withFileTypes: true })
14
- .filter((dirent) => dirent.isDirectory())
15
- .map((dirent) => path.resolve(entryDir, dirent.name));
16
22
  }
17
23
  /**
18
24
  * TODO: move this to a util that @lwc/dev-server-plugin-lex can reuse
@@ -1 +1 @@
1
- {"version":3,"file":"fileUtil.js","sourceRoot":"","sources":["../../../src/server/util/fileUtil.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,QAAgB;IAC7C,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACxB,OAAO,EAAE,CAAC;IACd,CAAC;IACD,OAAO,WAAW,CAAC,QAAQ,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;SAChD,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;SACxC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;AAC9D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,cAAsB;IAChD,MAAM,OAAO,GAAG,UAAU,CAAC,cAAc,CAAC,CAAC;IAC3C,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,CAAC;IACxB,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,cAAsB;IAC7C,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;QAC9B,OAAO;IACX,CAAC;IACD,OAAO,YAAY,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;AAChD,CAAC"}
1
+ {"version":3,"file":"fileUtil.js","sourceRoot":"","sources":["../../../src/server/util/fileUtil.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,QAAgB;IAC7C,IAAI,CAAC;QACD,OAAO,WAAW,CAAC,QAAQ,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;aAChD,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;aACxC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IAC9D,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACtB,IAAI,KAAK,YAAY,KAAK,IAAI,MAAM,IAAI,KAAK,EAAE,CAAC;YAC5C,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;gBAAE,OAAO,EAAE,CAAC;QAC3C,CAAC;QACD,MAAM,KAAK,CAAC;IAChB,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,cAAsB;IAChD,MAAM,OAAO,GAAG,UAAU,CAAC,cAAc,CAAC,CAAC;IAC3C,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,CAAC;IACxB,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,cAAsB;IAC7C,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;QAC9B,OAAO;IACX,CAAC;IACD,OAAO,YAAY,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;AAChD,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { Lifecycle } from '@salesforce/core';
2
+ export declare const measureOperationTime: <T>(eventName: string, operation: () => Promise<T>, lifecycle?: Lifecycle) => Promise<T>;
@@ -0,0 +1,14 @@
1
+ export const measureOperationTime = async (eventName, operation, lifecycle) => {
2
+ const start = performance.now();
3
+ const result = await operation();
4
+ if (lifecycle) {
5
+ const end = performance.now();
6
+ const duration = (end - start).toFixed(2);
7
+ lifecycle.emitTelemetry({
8
+ eventName,
9
+ value: duration,
10
+ });
11
+ }
12
+ return result;
13
+ };
14
+ //# sourceMappingURL=telemetry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../../../src/server/util/telemetry.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,EACrC,SAAiB,EACjB,SAA2B,EAC3B,SAAqB,EACX,EAAE;IACZ,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IAChC,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC;IAEjC,IAAI,SAAS,EAAE,CAAC;QACZ,MAAM,GAAG,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QAC9B,MAAM,QAAQ,GAAG,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC1C,SAAS,CAAC,aAAa,CAAC;YACpB,SAAS;YACT,KAAK,EAAE,QAAQ;SAClB,CAAC,CAAC;IACP,CAAC;IAED,OAAO,MAAM,CAAC;AAClB,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,33 @@
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
2
+ import { watch } from 'chokidar';
3
+ import { startWatch, stopWatch } from './index.js'; // Adjust the path accordingly
4
+ vi.mock('chokidar', () => ({
5
+ watch: vi.fn().mockReturnValue({
6
+ close: vi.fn(),
7
+ }),
8
+ }));
9
+ describe('File Watcher Module', () => {
10
+ let mockWatcher;
11
+ beforeEach(() => {
12
+ //@ts-expect-error mocked
13
+ mockWatcher = watch();
14
+ });
15
+ afterEach(() => {
16
+ vi.clearAllMocks();
17
+ });
18
+ it('should start watching directories with correct glob patterns', () => {
19
+ const dirPaths = ['/path/to/dir1', '/path/to/dir2/'];
20
+ const result = startWatch(dirPaths);
21
+ expect(watch).toHaveBeenCalledWith(['/path/to/dir1/**/*.{html,css,js,ts}', '/path/to/dir2/**/*.{html,css,js,ts}'], {});
22
+ expect(result).toBe(mockWatcher);
23
+ });
24
+ it('should stop watching when stopWatch is called', () => {
25
+ startWatch(['/path/to/dir']);
26
+ stopWatch();
27
+ expect(mockWatcher.close).toHaveBeenCalled();
28
+ });
29
+ it('should not throw if stopWatch is called before startWatch', () => {
30
+ expect(() => stopWatch()).not.toThrow();
31
+ });
32
+ });
33
+ //# sourceMappingURL=index.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.spec.js","sourceRoot":"","sources":["../../../src/server/watcher/index.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,EAAE,KAAK,EAAa,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC,CAAC,8BAA8B;AAElF,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;IACvB,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC;QAC3B,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE;KACjB,CAAC;CACL,CAAC,CAAC,CAAC;AAEJ,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACjC,IAAI,WAAsB,CAAC;IAE3B,UAAU,CAAC,GAAG,EAAE;QACZ,yBAAyB;QACzB,WAAW,GAAG,KAAK,EAAE,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACX,EAAE,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;QACpE,MAAM,QAAQ,GAAG,CAAC,eAAe,EAAE,gBAAgB,CAAC,CAAC;QAErD,MAAM,MAAM,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;QAEpC,MAAM,CAAC,KAAK,CAAC,CAAC,oBAAoB,CAC9B,CAAC,qCAAqC,EAAE,qCAAqC,CAAC,EAC9E,EAAE,CACL,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACrD,UAAU,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC;QAC7B,SAAS,EAAE,CAAC;QAEZ,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,gBAAgB,EAAE,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACjE,MAAM,CAAC,GAAG,EAAE,CAAC,SAAS,EAAE,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IAC5C,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,49 @@
1
+ import { templateString } from './utils';
2
+ describe('templateString', () => {
3
+ it('should replace placeholders with corresponding arguments', () => {
4
+ const template = 'Hello, {0}!';
5
+ const args = ['world'];
6
+ expect(templateString(template, args)).toBe('Hello, world!');
7
+ });
8
+ it('should replace multiple placeholders with corresponding arguments', () => {
9
+ const template = 'Hello, {0} {1}!';
10
+ const args = ['John', 'Doe'];
11
+ expect(templateString(template, args)).toBe('Hello, John Doe!');
12
+ });
13
+ it('should handle placeholders in any order', () => {
14
+ const template = '{1}, {0}';
15
+ const args = ['first', 'second'];
16
+ expect(templateString(template, args)).toBe('second, first');
17
+ });
18
+ it('should handle placeholders appearing more than once', () => {
19
+ const template = '{0} and {0} again';
20
+ const args = ['repeat'];
21
+ expect(templateString(template, args)).toBe('repeat and repeat again');
22
+ });
23
+ it('should return the original string if no placeholders are present', () => {
24
+ const template = 'Hello, world!';
25
+ const args = [];
26
+ expect(templateString(template, args)).toBe('Hello, world!');
27
+ });
28
+ it('should handle missing arguments by replacing with undefined', () => {
29
+ const template = 'Hello, {0} {1}!';
30
+ const args = ['John'];
31
+ expect(templateString(template, args)).toBe('Hello, John undefined!');
32
+ });
33
+ it('should handle non-numeric placeholders as literals', () => {
34
+ const template = 'This is not a placeholder: {foo}';
35
+ const args = [];
36
+ expect(templateString(template, args)).toBe('This is not a placeholder: {foo}');
37
+ });
38
+ it('should ignore extra arguments that do not have placeholders', () => {
39
+ const template = 'Hello, {0}!';
40
+ const args = ['world', 'extra'];
41
+ expect(templateString(template, args)).toBe('Hello, world!');
42
+ });
43
+ it('should handle a large number of placeholders', () => {
44
+ const template = '{0} {1} {2} {3} {4}';
45
+ const args = ['a', 'b', 'c', 'd', 'e'];
46
+ expect(templateString(template, args)).toBe('a b c d e');
47
+ });
48
+ });
49
+ //# sourceMappingURL=utils.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.test.js","sourceRoot":"","sources":["../../src/utils/utils.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAEzC,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC5B,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAChE,MAAM,QAAQ,GAAG,aAAa,CAAC;QAC/B,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC;QACvB,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mEAAmE,EAAE,GAAG,EAAE;QACzE,MAAM,QAAQ,GAAG,iBAAiB,CAAC;QACnC,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAC7B,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QAC/C,MAAM,QAAQ,GAAG,UAAU,CAAC;QAC5B,MAAM,IAAI,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACjC,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC3D,MAAM,QAAQ,GAAG,mBAAmB,CAAC;QACrC,MAAM,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC;QACxB,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;IAC3E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kEAAkE,EAAE,GAAG,EAAE;QACxE,MAAM,QAAQ,GAAG,eAAe,CAAC;QACjC,MAAM,IAAI,GAAU,EAAE,CAAC;QACvB,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACnE,MAAM,QAAQ,GAAG,iBAAiB,CAAC;QACnC,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;QACtB,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC1D,MAAM,QAAQ,GAAG,kCAAkC,CAAC;QACpD,MAAM,IAAI,GAAU,EAAE,CAAC;QACvB,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;IACpF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACnE,MAAM,QAAQ,GAAG,aAAa,CAAC;QAC/B,MAAM,IAAI,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAChC,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACpD,MAAM,QAAQ,GAAG,qBAAqB,CAAC;QACvC,MAAM,IAAI,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QACvC,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@lwc/lwc-dev-server",
3
3
  "description": "A development server to get quick feedback on your LWC component development.",
4
- "version": "9.5.0",
4
+ "version": "10.0.0-canary.9d570",
5
5
  "keywords": [
6
6
  "lwc dev server"
7
7
  ],
@@ -23,14 +23,15 @@
23
23
  "start": "node ./bin/dev-server.js start"
24
24
  },
25
25
  "dependencies": {
26
- "@lwc/sfdc-lwc-compiler": "9.5.0",
26
+ "@lwc/sfdc-lwc-compiler": "10.0.0-canary.9d570",
27
27
  "chalk": "~5.3.0",
28
28
  "chokidar": "~3.6.0",
29
29
  "commander": "~10.0.0",
30
+ "glob": "^11.0.0",
30
31
  "ws": "^8.18.0"
31
32
  },
32
33
  "devDependencies": {
33
- "@lwc/lwc-dev-server-types": "9.5.0",
34
+ "@lwc/lwc-dev-server-types": "10.0.0-canary.9d570",
34
35
  "@types/ws": "^8.5.10"
35
36
  },
36
37
  "peerDependencies": {
@@ -38,5 +39,6 @@
38
39
  },
39
40
  "engines": {
40
41
  "node": ">=16"
41
- }
42
+ },
43
+ "gitHead": "13df46dd4cdda16cf832962cbe9d1342b48ae561"
42
44
  }