@lwc/lwc-dev-server 10.2.0 → 10.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +0 -6
- package/dist/bin.js +31 -0
- package/dist/bin.js.map +1 -0
- package/dist/server/bundler/lexBundler.spec.d.ts +1 -0
- package/dist/server/bundler/lexBundler.spec.js +71 -0
- package/dist/server/bundler/lexBundler.spec.js.map +1 -0
- package/dist/server/connection/client.d.ts +2 -19
- package/dist/server/connection/client.js +3 -40
- package/dist/server/connection/client.js.map +1 -1
- package/dist/server/connection/client.spec.d.ts +1 -0
- package/dist/server/connection/client.spec.js +107 -0
- package/dist/server/connection/client.spec.js.map +1 -0
- package/dist/server/connection/connection.d.ts +1 -1
- package/dist/server/connection/connection.js +4 -12
- package/dist/server/connection/connection.js.map +1 -1
- package/dist/server/connection/connection.spec.d.ts +1 -0
- package/dist/server/connection/connection.spec.js +60 -0
- package/dist/server/connection/connection.spec.js.map +1 -0
- package/dist/server/connection/web-socket-server.d.ts +10 -8
- package/dist/server/connection/web-socket-server.js +80 -51
- package/dist/server/connection/web-socket-server.js.map +1 -1
- package/dist/server/connection/web-socket-server.spec.d.ts +1 -0
- package/dist/server/connection/web-socket-server.spec.js +174 -0
- package/dist/server/connection/web-socket-server.spec.js.map +1 -0
- package/dist/server/index.d.ts +6 -18
- package/dist/server/index.js +33 -111
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.spec.d.ts +1 -0
- package/dist/server/index.spec.js +98 -0
- package/dist/server/index.spec.js.map +1 -0
- package/dist/server/moduleGraph/index.js +19 -20
- package/dist/server/moduleGraph/index.js.map +1 -1
- package/dist/server/moduleGraph/index.spec.d.ts +1 -0
- package/dist/server/moduleGraph/index.spec.js +70 -0
- package/dist/server/moduleGraph/index.spec.js.map +1 -0
- package/dist/server/moduleGraph/workspaceScanner/__tests__/sfcli.spec.d.ts +1 -0
- package/dist/server/moduleGraph/workspaceScanner/__tests__/sfcli.spec.js +22 -0
- package/dist/server/moduleGraph/workspaceScanner/__tests__/sfcli.spec.js.map +1 -0
- package/dist/server/util/fileUtil.d.ts +0 -1
- package/dist/server/util/fileUtil.js +2 -10
- package/dist/server/util/fileUtil.js.map +1 -1
- package/dist/server/watcher/index.spec.d.ts +1 -0
- package/dist/server/watcher/index.spec.js +33 -0
- package/dist/server/watcher/index.spec.js.map +1 -0
- package/dist/types/devServer.d.ts +1 -2
- package/dist/types/devServer.js +1 -7
- package/dist/types/devServer.js.map +1 -1
- package/dist/utils/utils.test.d.ts +1 -0
- package/dist/utils/utils.test.js +49 -0
- package/dist/utils/utils.test.js.map +1 -0
- package/package.json +3 -7
- package/bin/dev-server.js +0 -2
- package/dist/cli/cli.js +0 -4
- package/dist/cli/cli.js.map +0 -1
- package/dist/cli/commands/devServer.d.ts +0 -2
- package/dist/cli/commands/devServer.js +0 -188
- package/dist/cli/commands/devServer.js.map +0 -1
- package/dist/cli/commands/index.d.ts +0 -2
- package/dist/cli/commands/index.js +0 -21
- package/dist/cli/commands/index.js.map +0 -1
- /package/dist/{cli/cli.d.ts → bin.d.ts} +0 -0
package/README.md
CHANGED
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
|
package/dist/bin.js.map
ADDED
|
@@ -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"}
|
|
@@ -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"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import * as Websocket from 'ws';
|
|
2
1
|
import { DevServerContext } from '../../types/devServer.js';
|
|
3
2
|
import { Connection } from './connection.js';
|
|
4
|
-
import type { HMR_Data
|
|
3
|
+
import type { HMR_Data } from '@lwc/lwc-dev-server-types';
|
|
5
4
|
import type { TransformOptions } from '@lwc/compiler';
|
|
6
5
|
/**
|
|
7
6
|
* Class representing a client that has connected to the dev server.
|
|
@@ -16,6 +15,7 @@ export declare class Client {
|
|
|
16
15
|
connection: Connection;
|
|
17
16
|
ctx: DevServerContext;
|
|
18
17
|
constructor(clientId: string, url: string, connection: Connection, ctx: DevServerContext);
|
|
18
|
+
onClose(callback: () => void): void;
|
|
19
19
|
addActivePaths(paths: {
|
|
20
20
|
modulePath: string;
|
|
21
21
|
compileOptions: TransformOptions;
|
|
@@ -26,20 +26,3 @@ export declare class Client {
|
|
|
26
26
|
messageCallback(data: HMR_Data): Promise<void>;
|
|
27
27
|
close(): void;
|
|
28
28
|
}
|
|
29
|
-
/**
|
|
30
|
-
* Class to manage all connected clients.
|
|
31
|
-
* This serves as a manager of clients with routines to broadcast updates, reset clients.
|
|
32
|
-
*/
|
|
33
|
-
export declare class ClientPool {
|
|
34
|
-
socketToClientMap: Map<Websocket.WebSocket, Client>;
|
|
35
|
-
clientToSocketMap: Map<Client, Websocket.WebSocket>;
|
|
36
|
-
addClient(ws: Websocket.WebSocket, client: Client): void;
|
|
37
|
-
removeClient(client: Client): void;
|
|
38
|
-
/**
|
|
39
|
-
* Broad case to all clients of an available module update.
|
|
40
|
-
* @param message
|
|
41
|
-
*/
|
|
42
|
-
sendModuleUpdateBroadcast(message: HMR_Data_Update): void;
|
|
43
|
-
reset(): void;
|
|
44
|
-
size(): number;
|
|
45
|
-
}
|
|
@@ -23,6 +23,9 @@ export class Client {
|
|
|
23
23
|
this.connection.receive(this.messageCallback.bind(this));
|
|
24
24
|
this.ctx = ctx;
|
|
25
25
|
}
|
|
26
|
+
onClose(callback) {
|
|
27
|
+
this.connection.onClose(callback);
|
|
28
|
+
}
|
|
26
29
|
addActivePaths(paths) {
|
|
27
30
|
paths.forEach(({ modulePath, compileOptions }) => {
|
|
28
31
|
const existing = this.activePaths.get(modulePath);
|
|
@@ -116,44 +119,4 @@ export class Client {
|
|
|
116
119
|
this.connection.close();
|
|
117
120
|
}
|
|
118
121
|
}
|
|
119
|
-
/**
|
|
120
|
-
* Class to manage all connected clients.
|
|
121
|
-
* This serves as a manager of clients with routines to broadcast updates, reset clients.
|
|
122
|
-
*/
|
|
123
|
-
export class ClientPool {
|
|
124
|
-
constructor() {
|
|
125
|
-
this.socketToClientMap = new Map();
|
|
126
|
-
this.clientToSocketMap = new Map();
|
|
127
|
-
}
|
|
128
|
-
addClient(ws, client) {
|
|
129
|
-
this.socketToClientMap.set(ws, client);
|
|
130
|
-
this.clientToSocketMap.set(client, ws);
|
|
131
|
-
}
|
|
132
|
-
removeClient(client) {
|
|
133
|
-
const socket = this.clientToSocketMap.get(client);
|
|
134
|
-
if (socket) {
|
|
135
|
-
this.socketToClientMap.delete(socket);
|
|
136
|
-
this.clientToSocketMap.delete(client);
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
/**
|
|
140
|
-
* Broad case to all clients of an available module update.
|
|
141
|
-
* @param message
|
|
142
|
-
*/
|
|
143
|
-
sendModuleUpdateBroadcast(message) {
|
|
144
|
-
for (const client of this.clientToSocketMap.keys()) {
|
|
145
|
-
client.send(message);
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
reset() {
|
|
149
|
-
for (const client of this.clientToSocketMap.keys()) {
|
|
150
|
-
client.close();
|
|
151
|
-
}
|
|
152
|
-
this.socketToClientMap.clear();
|
|
153
|
-
this.clientToSocketMap.clear();
|
|
154
|
-
}
|
|
155
|
-
size() {
|
|
156
|
-
return this.clientToSocketMap.size;
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
122
|
//# sourceMappingURL=client.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/server/connection/client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/server/connection/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -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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"}
|
|
@@ -10,7 +10,7 @@ export declare class Connection {
|
|
|
10
10
|
logger: Logger;
|
|
11
11
|
constructor(socket: Websocket.WebSocket, logger: Logger);
|
|
12
12
|
close(): void;
|
|
13
|
-
|
|
13
|
+
onClose(callback: () => void): void;
|
|
14
14
|
send(data: HMR_Data): void;
|
|
15
15
|
receive(callback: (data: HMR_Data) => void): void;
|
|
16
16
|
}
|
|
@@ -18,27 +18,19 @@ export class Connection {
|
|
|
18
18
|
close() {
|
|
19
19
|
this.socket.close();
|
|
20
20
|
}
|
|
21
|
-
|
|
22
|
-
|
|
21
|
+
onClose(callback) {
|
|
22
|
+
this.socket.on('close', callback);
|
|
23
23
|
}
|
|
24
24
|
send(data) {
|
|
25
|
-
|
|
26
|
-
this.socket.send(JSON.stringify(data));
|
|
27
|
-
}
|
|
25
|
+
this.socket.send(JSON.stringify(data));
|
|
28
26
|
}
|
|
29
27
|
receive(callback) {
|
|
30
|
-
if (!this.isReady()) {
|
|
31
|
-
this.logger.log(LogLevel.debug, 'Connection not ready to receive data from server.');
|
|
32
|
-
return;
|
|
33
|
-
}
|
|
34
28
|
this.socket.addEventListener('message', ({ data }) => {
|
|
35
29
|
if (typeof data === 'string') {
|
|
36
|
-
|
|
37
|
-
callback(payload);
|
|
30
|
+
callback(JSON.parse(data));
|
|
38
31
|
}
|
|
39
32
|
else {
|
|
40
33
|
this.logger.log(LogLevel.error, UNRECOGNIZED_MESSAGE_TYPE);
|
|
41
|
-
this.socket.close();
|
|
42
34
|
}
|
|
43
35
|
});
|
|
44
36
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connection.js","sourceRoot":"","sources":["../../../src/server/connection/connection.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,QAAQ,EAAe,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AAG5D;;;GAGG;AACH,MAAM,OAAO,UAAU;IAGnB,YAAY,MAA2B,EAAE,MAAc;QACnD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACzB,CAAC;IAED,KAAK;QACD,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;IAED,OAAO;
|
|
1
|
+
{"version":3,"file":"connection.js","sourceRoot":"","sources":["../../../src/server/connection/connection.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,QAAQ,EAAe,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AAG5D;;;GAGG;AACH,MAAM,OAAO,UAAU;IAGnB,YAAY,MAA2B,EAAE,MAAc;QACnD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACzB,CAAC;IAED,KAAK;QACD,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;IAED,OAAO,CAAC,QAAoB;QACxB,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACtC,CAAC;IAED,IAAI,CAAC,IAAc;QACf,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IAC3C,CAAC;IAED,OAAO,CAAC,QAAkC;QACtC,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,EAAE,IAAI,EAA0B,EAAE,EAAE;YACzE,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC3B,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YAC/B,CAAC;iBAAM,CAAC;gBACJ,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,yBAAyB,CAAC,CAAC;YAC/D,CAAC;QACL,CAAC,CAAC,CAAC;IACP,CAAC;CACJ"}
|
|
@@ -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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"}
|
|
@@ -1,11 +1,13 @@
|
|
|
1
|
-
import { WebSocketServer } from 'ws';
|
|
2
1
|
import { Logger, ServerConfig } from '../../types/index.js';
|
|
2
|
+
import { Connection } from './connection.js';
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* Note: Based on examples in the ws git repo: https://github.com/websockets/ws/blob/master/examples/express-session-parse/index.js
|
|
7
|
-
* @param param0
|
|
8
|
-
* @param logger
|
|
9
|
-
* @returns
|
|
4
|
+
* Wrapper over WebSocketServer that does authentication and produces `Connection`s
|
|
10
5
|
*/
|
|
11
|
-
export declare
|
|
6
|
+
export declare class AuthenticatedWebSocketServer {
|
|
7
|
+
private logger;
|
|
8
|
+
private wss;
|
|
9
|
+
identityToken: string | undefined;
|
|
10
|
+
constructor({ port, https: httpsConfig, identityToken }: ServerConfig, logger: Logger);
|
|
11
|
+
close(): void;
|
|
12
|
+
onNewConnection(callback: (connection: Connection, url: string) => void): void;
|
|
13
|
+
}
|