@matter/nodejs-shell 0.16.0-alpha.0-20251211-0f80042cf → 0.16.0-alpha.0-20251213-e83db3732

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 (87) hide show
  1. package/dist/{cjs → esm}/MatterNode.js +24 -44
  2. package/dist/esm/MatterNode.js.map +6 -0
  3. package/dist/{cjs → esm}/app.js +44 -69
  4. package/dist/esm/app.js.map +6 -0
  5. package/dist/{cjs → esm}/package.json +1 -1
  6. package/dist/esm/shell/Shell.js +183 -0
  7. package/dist/esm/shell/Shell.js.map +6 -0
  8. package/dist/{cjs → esm}/shell/cmd_cert.js +5 -25
  9. package/dist/esm/shell/cmd_cert.js.map +6 -0
  10. package/dist/{cjs → esm}/shell/cmd_cluster-attributes.js +29 -50
  11. package/dist/esm/shell/cmd_cluster-attributes.js.map +6 -0
  12. package/dist/{cjs → esm}/shell/cmd_cluster-commands.js +16 -37
  13. package/dist/esm/shell/cmd_cluster-commands.js.map +6 -0
  14. package/dist/{cjs → esm}/shell/cmd_cluster-events.js +10 -31
  15. package/dist/esm/shell/cmd_cluster-events.js.map +6 -0
  16. package/dist/{cjs → esm}/shell/cmd_commission.js +20 -40
  17. package/dist/esm/shell/cmd_commission.js.map +6 -0
  18. package/dist/{cjs → esm}/shell/cmd_config.js +14 -34
  19. package/dist/esm/shell/cmd_config.js.map +6 -0
  20. package/dist/{cjs → esm}/shell/cmd_dcl.js +16 -36
  21. package/dist/esm/shell/cmd_dcl.js.map +6 -0
  22. package/dist/{cjs → esm}/shell/cmd_discover.js +10 -30
  23. package/dist/esm/shell/cmd_discover.js.map +6 -0
  24. package/dist/{cjs → esm}/shell/cmd_identify.js +5 -25
  25. package/dist/esm/shell/cmd_identify.js.map +6 -0
  26. package/dist/{cjs → esm}/shell/cmd_nodes.js +25 -45
  27. package/dist/esm/shell/cmd_nodes.js.map +6 -0
  28. package/dist/{cjs → esm}/shell/cmd_ota.js +37 -57
  29. package/dist/esm/shell/cmd_ota.js.map +6 -0
  30. package/dist/esm/shell/cmd_session.js +23 -0
  31. package/dist/esm/shell/cmd_session.js.map +6 -0
  32. package/dist/esm/shell/cmd_subscribe.js +39 -0
  33. package/dist/esm/shell/cmd_subscribe.js.map +6 -0
  34. package/dist/esm/shell/cmd_tlv.js +163 -0
  35. package/dist/esm/shell/cmd_tlv.js.map +6 -0
  36. package/dist/{cjs → esm}/shell/cmd_vendor.js +5 -25
  37. package/dist/esm/shell/cmd_vendor.js.map +6 -0
  38. package/dist/{cjs → esm}/util/CommandlineParser.js +3 -23
  39. package/dist/esm/util/CommandlineParser.js.map +6 -0
  40. package/dist/esm/util/Json.js +45 -0
  41. package/dist/esm/util/Json.js.map +6 -0
  42. package/dist/esm/util/String.js +12 -0
  43. package/dist/esm/util/String.js.map +6 -0
  44. package/dist/esm/web_plumbing.js +140 -0
  45. package/dist/esm/web_plumbing.js.map +6 -0
  46. package/package.json +11 -10
  47. package/src/app.ts +17 -12
  48. package/src/shell/Shell.ts +9 -6
  49. package/src/shell/cmd_cluster-attributes.ts +3 -4
  50. package/src/shell/cmd_cluster-commands.ts +3 -4
  51. package/src/shell/cmd_cluster-events.ts +2 -3
  52. package/src/shell/cmd_commission.ts +2 -2
  53. package/src/shell/cmd_config.ts +2 -2
  54. package/src/shell/cmd_discover.ts +1 -1
  55. package/src/shell/cmd_nodes.ts +1 -1
  56. package/src/shell/cmd_session.ts +1 -1
  57. package/src/util/Json.ts +1 -2
  58. package/src/web_plumbing.ts +1 -1
  59. package/dist/cjs/MatterNode.js.map +0 -6
  60. package/dist/cjs/app.js.map +0 -6
  61. package/dist/cjs/shell/Shell.js +0 -211
  62. package/dist/cjs/shell/Shell.js.map +0 -6
  63. package/dist/cjs/shell/cmd_cert.js.map +0 -6
  64. package/dist/cjs/shell/cmd_cluster-attributes.js.map +0 -6
  65. package/dist/cjs/shell/cmd_cluster-commands.js.map +0 -6
  66. package/dist/cjs/shell/cmd_cluster-events.js.map +0 -6
  67. package/dist/cjs/shell/cmd_commission.js.map +0 -6
  68. package/dist/cjs/shell/cmd_config.js.map +0 -6
  69. package/dist/cjs/shell/cmd_dcl.js.map +0 -6
  70. package/dist/cjs/shell/cmd_discover.js.map +0 -6
  71. package/dist/cjs/shell/cmd_identify.js.map +0 -6
  72. package/dist/cjs/shell/cmd_nodes.js.map +0 -6
  73. package/dist/cjs/shell/cmd_ota.js.map +0 -6
  74. package/dist/cjs/shell/cmd_session.js +0 -43
  75. package/dist/cjs/shell/cmd_session.js.map +0 -6
  76. package/dist/cjs/shell/cmd_subscribe.js +0 -59
  77. package/dist/cjs/shell/cmd_subscribe.js.map +0 -6
  78. package/dist/cjs/shell/cmd_tlv.js +0 -183
  79. package/dist/cjs/shell/cmd_tlv.js.map +0 -6
  80. package/dist/cjs/shell/cmd_vendor.js.map +0 -6
  81. package/dist/cjs/util/CommandlineParser.js.map +0 -6
  82. package/dist/cjs/util/Json.js +0 -66
  83. package/dist/cjs/util/Json.js.map +0 -6
  84. package/dist/cjs/util/String.js +0 -32
  85. package/dist/cjs/util/String.js.map +0 -6
  86. package/dist/cjs/web_plumbing.js +0 -170
  87. package/dist/cjs/web_plumbing.js.map +0 -6
@@ -0,0 +1,6 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/util/String.ts"],
4
+ "mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAMO,SAAS,SAAS,KAAa;AAClC,SAAO,IAAI,OAAO,CAAC,EAAE,YAAY,IAAI,IAAI,MAAM,CAAC;AACpD;",
5
+ "names": []
6
+ }
@@ -0,0 +1,140 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2022-2025 Matter.js Authors
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { Logger, NotImplementedError } from "@matter/general";
7
+ import { Readable, Writable } from "node:stream";
8
+ import WebSocket, { WebSocketServer } from "ws";
9
+ import { Shell } from "./shell/Shell.js";
10
+ import fs from "fs";
11
+ import http from "node:http";
12
+ import path from "path";
13
+ let client;
14
+ let server;
15
+ let wss;
16
+ const socketLogger = "websocket";
17
+ function initializeWebPlumbing(theNode, nodeNum, webSocketPort, webServer) {
18
+ if (webServer) {
19
+ const root = path.resolve(__dirname) ?? "./";
20
+ server = http.createServer((req, res) => {
21
+ const url = req.url ?? "/";
22
+ const safePath = path.normalize(
23
+ path.join(root, decodeURIComponent(url === "/" ? "/index.html" : url))
24
+ );
25
+ if (!safePath.startsWith(root)) {
26
+ res.writeHead(403).end("Forbidden");
27
+ return;
28
+ }
29
+ fs.readFile(safePath, (err, data) => {
30
+ if (err) return res.writeHead(404).end("Not Found");
31
+ res.writeHead(200).end(data);
32
+ });
33
+ }).listen(webSocketPort);
34
+ wss = new WebSocketServer({ server });
35
+ } else wss = new WebSocketServer({ port: webSocketPort });
36
+ console.info(`WebSocket server running on ws://localhost:${webSocketPort}`);
37
+ console.log = // console.debug = // too much traffic - kills the websocket
38
+ console.info = console.warn = console.error = (...args) => {
39
+ if (client && client.readyState === WebSocket.OPEN) {
40
+ client.send(args.map((arg) => typeof arg === "object" ? JSON.stringify(arg) : arg).join(" "));
41
+ } else
42
+ process.stdout.write(
43
+ args.map((arg) => typeof arg === "object" ? JSON.stringify(arg) : arg).join(" ") + "\n"
44
+ );
45
+ };
46
+ wss.on("connection", (ws) => {
47
+ if (client && client.readyState === WebSocket.OPEN) {
48
+ ws.send("ERROR: Shell in use by another client");
49
+ ws.close();
50
+ return;
51
+ }
52
+ client = ws;
53
+ createWebSocketLogger(ws).then((logger) => {
54
+ Logger.removeLogger("Shell");
55
+ Logger.addLogger(socketLogger, logger);
56
+ }).catch((err) => {
57
+ if (!(err instanceof NotImplementedError)) {
58
+ console.error("Failed to add WebSocket logger: " + err);
59
+ }
60
+ });
61
+ const shell = new Shell(theNode, nodeNum, "", createReadableStream(ws), createWritableStream(ws));
62
+ shell.start(theNode.storageLocation);
63
+ ws.on("close", () => {
64
+ process.stdout.write("Client disconnected\n");
65
+ try {
66
+ if (Logger.getLoggerForIdentifier(socketLogger) !== void 0) {
67
+ Logger.removeLogger(socketLogger);
68
+ }
69
+ } catch (err) {
70
+ }
71
+ client = ws;
72
+ });
73
+ ws.on("error", (err) => {
74
+ process.stderr.write(`WebSocket error: ${err.message}
75
+ `);
76
+ try {
77
+ if (Logger.getLoggerForIdentifier(socketLogger) !== void 0) {
78
+ Logger.removeLogger(socketLogger);
79
+ }
80
+ } catch (err2) {
81
+ }
82
+ });
83
+ });
84
+ async function createWebSocketLogger(socket) {
85
+ if (socket.readyState === WebSocket.CONNECTING) {
86
+ await new Promise((resolve, reject) => {
87
+ socket.onopen = () => resolve();
88
+ socket.onerror = (err) => reject(new Error(`WebSocket error: ${err.type}`));
89
+ });
90
+ }
91
+ return (__level, formattedLog) => {
92
+ if (socket.readyState === WebSocket.OPEN) {
93
+ socket.send(formattedLog);
94
+ } else {
95
+ process.stderr.write(`WebSocket logger not open, log dropped: ${formattedLog}
96
+ `);
97
+ }
98
+ };
99
+ }
100
+ }
101
+ function createReadableStream(ws) {
102
+ const readable = new Readable({ read() {
103
+ } });
104
+ ws.on("message", (data) => {
105
+ const chunk = Buffer.isBuffer(data) ? data : Buffer.from(data.toString());
106
+ readable.push(chunk);
107
+ });
108
+ ws.on("close", () => {
109
+ readable.push(null);
110
+ });
111
+ ws.on("error", (err) => {
112
+ readable.emit("error", err);
113
+ readable.push(null);
114
+ });
115
+ return readable;
116
+ }
117
+ function createWritableStream(ws) {
118
+ const writable = new Writable({
119
+ write(chunk, _encoding, callback) {
120
+ if (ws.readyState === WebSocket.OPEN) {
121
+ ws.send(chunk, callback);
122
+ } else {
123
+ if (chunk.length > 0) process.stderr.write(`ERROR: WebSocket is not open. Failed to send "${chunk}"
124
+ `);
125
+ }
126
+ },
127
+ final(callback) {
128
+ if (ws.readyState === WebSocket.OPEN) {
129
+ ws.close();
130
+ }
131
+ callback();
132
+ }
133
+ });
134
+ ws.on("error", (err) => writable.emit("WebSocket Write Error: ", err));
135
+ return writable;
136
+ }
137
+ export {
138
+ initializeWebPlumbing
139
+ };
140
+ //# sourceMappingURL=web_plumbing.js.map
@@ -0,0 +1,6 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/web_plumbing.ts"],
4
+ "mappings": "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",
5
+ "names": ["err"]
6
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@matter/nodejs-shell",
3
- "version": "0.16.0-alpha.0-20251211-0f80042cf",
3
+ "version": "0.16.0-alpha.0-20251213-e83db3732",
4
4
  "description": "Shell app for Matter controller",
5
5
  "keywords": [
6
6
  "iot",
@@ -22,6 +22,7 @@
22
22
  "type": "git",
23
23
  "url": "git+https://github.com/matter-js/matter.js.git"
24
24
  },
25
+ "type": "module",
25
26
  "scripts": {
26
27
  "clean": "matter-build clean",
27
28
  "build": "matter-build",
@@ -42,15 +43,15 @@
42
43
  "#types": "@matter/types"
43
44
  },
44
45
  "dependencies": {
45
- "@matter/general": "0.16.0-alpha.0-20251211-0f80042cf",
46
- "@matter/model": "0.16.0-alpha.0-20251211-0f80042cf",
47
- "@matter/node": "0.16.0-alpha.0-20251211-0f80042cf",
48
- "@matter/nodejs": "0.16.0-alpha.0-20251211-0f80042cf",
49
- "@matter/nodejs-ble": "0.16.0-alpha.0-20251211-0f80042cf",
50
- "@matter/protocol": "0.16.0-alpha.0-20251211-0f80042cf",
51
- "@matter/tools": "0.16.0-alpha.0-20251211-0f80042cf",
52
- "@matter/types": "0.16.0-alpha.0-20251211-0f80042cf",
53
- "@project-chip/matter.js": "0.16.0-alpha.0-20251211-0f80042cf",
46
+ "@matter/general": "0.16.0-alpha.0-20251213-e83db3732",
47
+ "@matter/model": "0.16.0-alpha.0-20251213-e83db3732",
48
+ "@matter/node": "0.16.0-alpha.0-20251213-e83db3732",
49
+ "@matter/nodejs": "0.16.0-alpha.0-20251213-e83db3732",
50
+ "@matter/nodejs-ble": "0.16.0-alpha.0-20251213-e83db3732",
51
+ "@matter/protocol": "0.16.0-alpha.0-20251213-e83db3732",
52
+ "@matter/tools": "0.16.0-alpha.0-20251213-e83db3732",
53
+ "@matter/types": "0.16.0-alpha.0-20251213-e83db3732",
54
+ "@project-chip/matter.js": "0.16.0-alpha.0-20251213-e83db3732",
54
55
  "ws": "^8.18.3",
55
56
  "yargs": "^18.0.0"
56
57
  },
package/src/app.ts CHANGED
@@ -8,9 +8,10 @@
8
8
  import { Environment, LogDestination, LogFormat, Logger, LogLevel } from "#general";
9
9
  import { createFileLogger } from "#nodejs";
10
10
  import "@matter/nodejs-ble";
11
- import yargs from "yargs/yargs";
11
+ import yargs from "yargs";
12
+ import { hideBin } from "yargs/helpers";
12
13
  import { MatterNode } from "./MatterNode.js";
13
- import { Shell } from "./shell/Shell";
14
+ import { Shell } from "./shell/Shell.js";
14
15
  import { initializeWebPlumbing } from "./web_plumbing.js";
15
16
 
16
17
  const PROMPT = "matter> ";
@@ -45,7 +46,7 @@ export function setLogLevel(identifier: string, level: string): void {
45
46
  * @file Top level application for Matter Node.
46
47
  */
47
48
  async function main() {
48
- const yargsInstance = yargs(process.argv.slice(2))
49
+ const yargsInstance = yargs()
49
50
  .command(
50
51
  "* [node-num] [node-type]",
51
52
  "Matter Node Shell",
@@ -63,9 +64,11 @@ async function main() {
63
64
  type: "string",
64
65
  })
65
66
  .options({
66
- ble: {
67
+ "ble-enable": {
67
68
  description: "Enable BLE support.",
68
69
  type: "boolean",
70
+ default: false,
71
+ alias: "b",
69
72
  },
70
73
  bleHciId: {
71
74
  description:
@@ -107,11 +110,13 @@ async function main() {
107
110
  });
108
111
  },
109
112
  async argv => {
110
- if (argv.help) return;
113
+ if (argv.help) {
114
+ return;
115
+ }
111
116
 
112
117
  const {
113
118
  nodeNum,
114
- ble,
119
+ bleEnable,
115
120
  bleHciId,
116
121
  nodeType,
117
122
  factoryReset,
@@ -147,15 +152,15 @@ async function main() {
147
152
  theShell = new Shell(theNode, nodeNum, PROMPT, process.stdin, process.stdout);
148
153
  }
149
154
 
150
- if (bleHciId !== undefined) {
151
- Environment.default.vars.set("ble.hci.id", bleHciId);
155
+ if (bleEnable) {
156
+ Environment.default.vars.set("ble.enable", true);
152
157
  }
153
158
 
154
- if (ble) {
155
- Environment.default.vars.set("ble.enable", true);
159
+ if (bleHciId !== undefined) {
160
+ Environment.default.vars.set("ble.hci.id", bleHciId);
156
161
  }
157
162
 
158
- console.log(`Started Node #${nodeNum} (Type: ${nodeType}) ${ble ? "with" : "without"} BLE`);
163
+ console.log(`Started Node #${nodeNum} (Type: ${nodeType}) ${bleEnable ? "with" : "without"} BLE`);
159
164
  if (!webSocketInterface) {
160
165
  theShell.start(theNode.storageLocation);
161
166
  }
@@ -164,7 +169,7 @@ async function main() {
164
169
  .version(false)
165
170
  .scriptName("shell")
166
171
  .strict();
167
- await yargsInstance.wrap(yargsInstance.terminalWidth()).parseAsync();
172
+ await yargsInstance.wrap(yargsInstance.terminalWidth()).parse(hideBin(process.argv));
168
173
  }
169
174
 
170
175
  process.on("message", function (message) {
@@ -4,19 +4,19 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
- import { MatterError } from "#general";
7
+ import { Logger, MatterError } from "#general";
8
8
  import { createWriteStream, readFileSync } from "node:fs";
9
9
  import readline from "node:readline";
10
10
  import { Readable, Writable } from "node:stream";
11
11
  import { inspect } from "node:util";
12
12
  import yargs from "yargs/yargs";
13
13
  import { MatterNode } from "../MatterNode.js";
14
- import { exit } from "../app";
14
+ import { exit } from "../app.js";
15
15
  import { commandlineParser } from "../util/CommandlineParser.js";
16
16
  import cmdCert from "./cmd_cert.js";
17
- import cmdAttributes from "./cmd_cluster-attributes";
18
- import cmdCommands from "./cmd_cluster-commands";
19
- import cmdEvents from "./cmd_cluster-events";
17
+ import cmdAttributes from "./cmd_cluster-attributes.js";
18
+ import cmdCommands from "./cmd_cluster-commands.js";
19
+ import cmdEvents from "./cmd_cluster-events.js";
20
20
  import cmdCommission from "./cmd_commission.js";
21
21
  import cmdConfig from "./cmd_config.js";
22
22
  import cmdDcl from "./cmd_dcl.js";
@@ -26,9 +26,11 @@ import cmdNodes from "./cmd_nodes.js";
26
26
  import cmdOta from "./cmd_ota.js";
27
27
  import cmdSession from "./cmd_session.js";
28
28
  import cmdSubscribe from "./cmd_subscribe.js";
29
- import cmdTlv from "./cmd_tlv";
29
+ import cmdTlv from "./cmd_tlv.js";
30
30
  import cmdVendor from "./cmd_vendor.js";
31
31
 
32
+ const logger = Logger.get("Shell");
33
+
32
34
  const MAX_HISTORY_SIZE = 1000;
33
35
 
34
36
  function exitCommand() {
@@ -183,6 +185,7 @@ export class Shell {
183
185
  console.log("Done.");
184
186
  }
185
187
  } catch (error) {
188
+ logger.error(`Error during command execution:`, error);
186
189
  process.stderr.write(`Error happened during command: ${error}\n`);
187
190
  if (error instanceof Error && error.stack) {
188
191
  const errorText = inspect(error, { depth: 10 });
@@ -4,14 +4,13 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
- import { Diagnostic } from "#general";
7
+ import { camelize, Diagnostic } from "#general";
8
8
  import { AttributeModel, ClusterModel, MatterModel } from "#model";
9
9
  import { SupportedAttributeClient } from "#protocol";
10
10
  import { AttributeId, ClusterId, EndpointNumber, ValidationError } from "#types";
11
11
  import type { Argv } from "yargs";
12
- import { MatterNode } from "../MatterNode";
13
- import { convertJsonDataWithModel } from "../util/Json";
14
- import { camelize } from "../util/String";
12
+ import { MatterNode } from "../MatterNode.js";
13
+ import { convertJsonDataWithModel } from "../util/Json.js";
15
14
 
16
15
  function generateAllAttributeHandlersForCluster(yargs: Argv, theNode: MatterNode) {
17
16
  MatterModel.standard.clusters.forEach(cluster => {
@@ -4,13 +4,12 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
- import { Diagnostic } from "#general";
7
+ import { camelize, Diagnostic } from "#general";
8
8
  import { ClusterModel, CommandModel, MatterModel } from "#model";
9
9
  import { ClusterId, ValidationError } from "#types";
10
10
  import type { Argv } from "yargs";
11
- import { MatterNode } from "../MatterNode";
12
- import { convertJsonDataWithModel } from "../util/Json";
13
- import { camelize } from "../util/String";
11
+ import { MatterNode } from "../MatterNode.js";
12
+ import { convertJsonDataWithModel } from "../util/Json.js";
14
13
 
15
14
  function generateAllCommandHandlersForCluster(yargs: Argv, theNode: MatterNode) {
16
15
  MatterModel.standard.clusters.forEach(cluster => {
@@ -4,12 +4,11 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
- import { Diagnostic } from "#general";
7
+ import { camelize, Diagnostic } from "#general";
8
8
  import { ClusterModel, EventModel, MatterModel } from "#model";
9
9
  import { ClusterId } from "#types";
10
10
  import type { Argv } from "yargs";
11
- import { MatterNode } from "../MatterNode";
12
- import { camelize } from "../util/String";
11
+ import { MatterNode } from "../MatterNode.js";
13
12
 
14
13
  function generateAllEventHandlersForCluster(yargs: Argv, theNode: MatterNode) {
15
14
  MatterModel.standard.clusters.forEach(cluster => {
@@ -9,8 +9,8 @@ import { DiscoveryCapabilitiesSchema, ManualPairingCodeCodec, NodeId, QrCode, Qr
9
9
  import { BasicInformationCluster, DescriptorCluster, GeneralCommissioning } from "@matter/types/clusters";
10
10
  import { NodeCommissioningOptions } from "@project-chip/matter.js";
11
11
  import type { Argv } from "yargs";
12
- import { MatterNode } from "../MatterNode";
13
- import { createDiagnosticCallbacks } from "./cmd_nodes";
12
+ import { MatterNode } from "../MatterNode.js";
13
+ import { createDiagnosticCallbacks } from "./cmd_nodes.js";
14
14
 
15
15
  export default function commands(theNode: MatterNode) {
16
16
  return {
@@ -7,8 +7,8 @@
7
7
  import { Logger } from "#general";
8
8
  import { DclCertificateService } from "@matter/protocol";
9
9
  import { Argv } from "yargs";
10
- import { MatterNode } from "../MatterNode";
11
- import { setLogLevel } from "../app";
10
+ import { MatterNode } from "../MatterNode.js";
11
+ import { setLogLevel } from "../app.js";
12
12
 
13
13
  export default function commands(theNode: MatterNode) {
14
14
  return {
@@ -8,7 +8,7 @@ import { Diagnostic, Seconds } from "#general";
8
8
  import { CommissionableDeviceIdentifiers } from "#protocol";
9
9
  import { ManualPairingCodeCodec, VendorId } from "#types";
10
10
  import type { Argv } from "yargs";
11
- import { MatterNode } from "../MatterNode";
11
+ import { MatterNode } from "../MatterNode.js";
12
12
 
13
13
  export default function commands(theNode: MatterNode) {
14
14
  return {
@@ -8,7 +8,7 @@ import { capitalize, decamelize, Diagnostic } from "#general";
8
8
  import { NodeId, VendorId } from "#types";
9
9
  import { CommissioningControllerNodeOptions, NodeStateInformation } from "@project-chip/matter.js/device";
10
10
  import type { Argv } from "yargs";
11
- import { MatterNode } from "../MatterNode";
11
+ import { MatterNode } from "../MatterNode.js";
12
12
 
13
13
  export function createDiagnosticCallbacks(): Partial<CommissioningControllerNodeOptions> {
14
14
  return {
@@ -4,7 +4,7 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
- import { MatterNode } from "../MatterNode";
7
+ import { MatterNode } from "../MatterNode.js";
8
8
 
9
9
  export default function commands(theNode: MatterNode) {
10
10
  return {
package/src/util/Json.ts CHANGED
@@ -4,10 +4,9 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
- import { Bytes } from "#general";
7
+ import { Bytes, camelize } from "#general";
8
8
  import { ValueModel } from "#model";
9
9
  import { ValidationDatatypeMismatchError } from "#types";
10
- import { camelize } from "./String";
11
10
 
12
11
  export function convertJsonDataWithModel(model: ValueModel, data: any): any {
13
12
  const definingModel = model.definingModel ?? model;
@@ -8,7 +8,7 @@ import { Logger, LogLevel, NotImplementedError } from "@matter/general";
8
8
  import { Readable, Writable } from "node:stream";
9
9
  import WebSocket, { Data, WebSocketServer } from "ws";
10
10
  import { MatterNode } from "./MatterNode.js";
11
- import { Shell } from "./shell/Shell";
11
+ import { Shell } from "./shell/Shell.js";
12
12
 
13
13
  import fs from "fs";
14
14
  import http, { Server } from "node:http";
@@ -1,6 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/MatterNode.ts"],
4
- "mappings": "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",
5
- "names": []
6
- }
@@ -1,6 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/app.ts"],
4
- "mappings": "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",
5
- "names": ["yargs"]
6
- }