@matter/create 0.11.0 → 0.11.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (27) hide show
  1. package/dist/esm/build.config.d.ts.map +1 -1
  2. package/dist/esm/build.config.ts.js +25 -5
  3. package/dist/esm/build.config.ts.js.map +1 -1
  4. package/dist/esm/config.d.ts +3 -1
  5. package/dist/esm/config.d.ts.map +1 -1
  6. package/dist/esm/config.js +7 -1
  7. package/dist/esm/config.js.map +1 -1
  8. package/dist/esm/new-project.d.ts.map +1 -1
  9. package/dist/esm/new-project.js +42 -7
  10. package/dist/esm/new-project.js.map +1 -1
  11. package/dist/templates/index.json +65 -28
  12. package/package.json +2 -2
  13. package/src/build.config.ts +35 -8
  14. package/src/config.ts +10 -2
  15. package/src/new-project.ts +49 -6
  16. /package/dist/templates/{controller-cli → controller}/ControllerNode.ts +0 -0
  17. /package/dist/templates/{device-onoff-bridge-cli → device-bridge-onoff}/BridgedDevicesNode.ts +0 -0
  18. /package/dist/templates/{device-onoff-composed-cli → device-composed-onoff}/ComposedDeviceNode.ts +0 -0
  19. /package/dist/templates/{device-window-covering-light-composed → device-composed-wc-light}/IlluminatedRollerShade.ts +0 -0
  20. /package/dist/templates/{device-socket-with-measurement → device-measuring-socket}/MeasuredSocketDevice.ts +0 -0
  21. /package/dist/templates/{device-onoff-multiple-devices-cli → device-multiple-onoff}/MultiDeviceNode.ts +0 -0
  22. /package/dist/templates/{device-onoff-cli → device-onoff}/DeviceNode.ts +0 -0
  23. /package/dist/templates/{device-onoff-advanced-cli → device-onoff-advanced}/DeviceNodeFull.ts +0 -0
  24. /package/dist/templates/{device-onoff-advanced-cli → device-onoff-advanced}/cluster/DummyThreadNetworkCommissioningServer.ts +0 -0
  25. /package/dist/templates/{device-onoff-advanced-cli → device-onoff-advanced}/cluster/DummyWifiNetworkCommissioningServer.ts +0 -0
  26. /package/dist/templates/{device-onoff-advanced-cli → device-onoff-advanced}/cluster/MyFancyOwnFunctionality.ts +0 -0
  27. /package/dist/templates/{device-temperature-humidity-sensor-cli → device-sensor}/SensorDeviceNode.ts +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"build.config.d.ts","sourceRoot":"","sources":["../../src/build.config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAKxC;;GAEG;AACH,wBAAsB,MAAM,CAAC,EAAE,OAAO,EAAE,EAAE,OAAO,CAAC,OAAO,iBAkDxD"}
1
+ {"version":3,"file":"build.config.d.ts","sourceRoot":"","sources":["../../src/build.config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAKxC;;GAEG;AACH,wBAAsB,MAAM,CAAC,EAAE,OAAO,EAAE,EAAE,OAAO,CAAC,OAAO,iBA6ExD"}
@@ -3,12 +3,13 @@
3
3
  * Copyright 2022-2024 Matter.js Authors
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
- import { cp, mkdir, readFile, writeFile } from "fs/promises";
6
+ import { mkdir, readFile, writeFile } from "fs/promises";
7
7
  import { basename, dirname } from "path";
8
8
  async function before({ project }) {
9
9
  const examplesPkg = project.pkg.findPackage("@matter/examples");
10
10
  const createPkg = project.pkg.findPackage("@matter/create");
11
11
  await mkdir(createPkg.resolve("dist/templates"), { recursive: true });
12
+ const matterJsVersion = `~${await readFile(project.pkg.workspace.resolve("version.txt"), "utf-8")}`;
12
13
  const readmes = await examplesPkg.glob("src/*/README.md");
13
14
  const templates = Array();
14
15
  for (const readme of readmes) {
@@ -17,6 +18,7 @@ async function before({ project }) {
17
18
  if (!match) {
18
19
  continue;
19
20
  }
21
+ const dependencies = {};
20
22
  const baseLength = examplesPkg.resolve(`src/${name}`).length + 1;
21
23
  const sources = await examplesPkg.glob(`src/${name}/**/*.ts`);
22
24
  let entrypoint;
@@ -25,22 +27,40 @@ async function before({ project }) {
25
27
  if (!entrypoint && filename.indexOf("/") === -1) {
26
28
  entrypoint = filename;
27
29
  }
28
- await cp(file, createPkg.resolve("dist/templates/", name, filename));
30
+ const source = await readFile(file, "utf-8");
31
+ for (const [, pkgName] of source.matchAll(/import .* from "(@[^/"]+\/[^/"]+|[^/"]+)[^"]*";/g)) {
32
+ if (dependencies[pkgName]) {
33
+ continue;
34
+ }
35
+ if (pkgName.startsWith("@matter/") || pkgName.startsWith("@project-chip/")) {
36
+ dependencies[pkgName] = matterJsVersion;
37
+ continue;
38
+ }
39
+ const version = examplesPkg.json.dependencies[pkgName];
40
+ if (version !== void 0) {
41
+ dependencies[pkgName] = version;
42
+ }
43
+ }
44
+ const outFilename = createPkg.resolve("dist/templates", name, filename);
45
+ await mkdir(dirname(outFilename), { recursive: true });
46
+ await writeFile(outFilename, source);
29
47
  }
30
48
  if (!entrypoint) {
31
49
  continue;
32
50
  }
33
51
  templates.push({
34
52
  name,
53
+ dependencies,
35
54
  description: match[1],
36
55
  entrypoint
37
56
  });
38
57
  }
39
- const matterJsVersion = `~${await readFile(project.pkg.workspace.resolve("version.txt"), "utf-8")}`;
40
- const typescriptVersion = project.pkg.findPackage("@matter/tools").json.dependencies.typescript;
58
+ const tools = project.pkg.findPackage("@matter/tools").json;
59
+ const typescriptVersion = tools.dependencies.typescript;
60
+ const nodeTypesVersion = tools.devDependencies["@types/node"];
41
61
  const config = {
42
- matterJsVersion,
43
62
  typescriptVersion,
63
+ nodeTypesVersion,
44
64
  templates
45
65
  };
46
66
  await writeFile(createPkg.resolve("dist/templates/index.json"), JSON.stringify(config, void 0, 4));
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/build.config.ts"],
4
- "mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAOA,SAAS,IAAI,OAAO,UAAU,iBAAiB;AAC/C,SAAS,UAAU,eAAe;AAMlC,eAAsB,OAAO,EAAE,QAAQ,GAAoB;AACvD,QAAM,cAAc,QAAQ,IAAI,YAAY,kBAAkB;AAC9D,QAAM,YAAY,QAAQ,IAAI,YAAY,gBAAgB;AAE1D,QAAM,MAAM,UAAU,QAAQ,gBAAgB,GAAG,EAAE,WAAW,KAAK,CAAC;AAEpE,QAAM,UAAU,MAAM,YAAY,KAAK,iBAAiB;AACxD,QAAM,YAAY,MAAgB;AAClC,aAAW,UAAU,SAAS;AAC1B,UAAM,OAAO,SAAS,QAAQ,MAAM,CAAC;AACrC,UAAM,SAAS,MAAM,SAAS,QAAQ,OAAO,GAAG,MAAM,SAAS;AAC/D,QAAI,CAAC,OAAO;AACR;AAAA,IACJ;AAEA,UAAM,aAAa,YAAY,QAAQ,OAAO,IAAI,EAAE,EAAE,SAAS;AAC/D,UAAM,UAAU,MAAM,YAAY,KAAK,OAAO,IAAI,UAAU;AAC5D,QAAI;AACJ,eAAW,QAAQ,SAAS;AACxB,YAAM,WAAW,KAAK,MAAM,UAAU;AACtC,UAAI,CAAC,cAAc,SAAS,QAAQ,GAAG,MAAM,IAAI;AAC7C,qBAAa;AAAA,MACjB;AACA,YAAM,GAAG,MAAM,UAAU,QAAQ,mBAAmB,MAAM,QAAQ,CAAC;AAAA,IACvE;AAEA,QAAI,CAAC,YAAY;AACb;AAAA,IACJ;AAEA,cAAU,KAAK;AAAA,MACX;AAAA,MACA,aAAa,MAAM,CAAC;AAAA,MACpB;AAAA,IACJ,CAAC;AAAA,EACL;AAIA,QAAM,kBAAkB,IAAI,MAAM,SAAS,QAAQ,IAAI,UAAU,QAAQ,aAAa,GAAG,OAAO,CAAC;AAEjG,QAAM,oBAAoB,QAAQ,IAAI,YAAY,eAAe,EAAE,KAAK,aAAa;AAErF,QAAM,SAAiB;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AAEA,QAAM,UAAU,UAAU,QAAQ,2BAA2B,GAAG,KAAK,UAAU,QAAQ,QAAW,CAAC,CAAC;AACxG;",
4
+ "mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAOA,SAAS,OAAO,UAAU,iBAAiB;AAC3C,SAAS,UAAU,eAAe;AAMlC,eAAsB,OAAO,EAAE,QAAQ,GAAoB;AACvD,QAAM,cAAc,QAAQ,IAAI,YAAY,kBAAkB;AAC9D,QAAM,YAAY,QAAQ,IAAI,YAAY,gBAAgB;AAE1D,QAAM,MAAM,UAAU,QAAQ,gBAAgB,GAAG,EAAE,WAAW,KAAK,CAAC;AAIpE,QAAM,kBAAkB,IAAI,MAAM,SAAS,QAAQ,IAAI,UAAU,QAAQ,aAAa,GAAG,OAAO,CAAC;AAEjG,QAAM,UAAU,MAAM,YAAY,KAAK,iBAAiB;AACxD,QAAM,YAAY,MAAgB;AAClC,aAAW,UAAU,SAAS;AAC1B,UAAM,OAAO,SAAS,QAAQ,MAAM,CAAC;AACrC,UAAM,SAAS,MAAM,SAAS,QAAQ,OAAO,GAAG,MAAM,SAAS;AAC/D,QAAI,CAAC,OAAO;AACR;AAAA,IACJ;AAEA,UAAM,eAAe,CAAC;AAEtB,UAAM,aAAa,YAAY,QAAQ,OAAO,IAAI,EAAE,EAAE,SAAS;AAC/D,UAAM,UAAU,MAAM,YAAY,KAAK,OAAO,IAAI,UAAU;AAC5D,QAAI;AACJ,eAAW,QAAQ,SAAS;AACxB,YAAM,WAAW,KAAK,MAAM,UAAU;AACtC,UAAI,CAAC,cAAc,SAAS,QAAQ,GAAG,MAAM,IAAI;AAC7C,qBAAa;AAAA,MACjB;AACA,YAAM,SAAS,MAAM,SAAS,MAAM,OAAO;AAI3C,iBAAW,CAAC,EAAE,OAAO,KAAK,OAAO,SAAS,kDAAkD,GAAG;AAC3F,YAAI,aAAa,OAAO,GAAG;AACvB;AAAA,QACJ;AAEA,YAAI,QAAQ,WAAW,UAAU,KAAK,QAAQ,WAAW,gBAAgB,GAAG;AACxE,uBAAa,OAAO,IAAI;AACxB;AAAA,QACJ;AAEA,cAAM,UAAU,YAAY,KAAK,aAAa,OAAO;AACrD,YAAI,YAAY,QAAW;AACvB,uBAAa,OAAO,IAAI;AAAA,QAC5B;AAAA,MACJ;AAEA,YAAM,cAAc,UAAU,QAAQ,kBAAkB,MAAM,QAAQ;AACtE,YAAM,MAAM,QAAQ,WAAW,GAAG,EAAE,WAAW,KAAK,CAAC;AACrD,YAAM,UAAU,aAAa,MAAM;AAAA,IACvC;AAEA,QAAI,CAAC,YAAY;AACb;AAAA,IACJ;AAEA,cAAU,KAAK;AAAA,MACX;AAAA,MACA;AAAA,MACA,aAAa,MAAM,CAAC;AAAA,MACpB;AAAA,IACJ,CAAC;AAAA,EACL;AAEA,QAAM,QAAQ,QAAQ,IAAI,YAAY,eAAe,EAAE;AACvD,QAAM,oBAAoB,MAAM,aAAa;AAC7C,QAAM,mBAAmB,MAAM,gBAAgB,aAAa;AAE5D,QAAM,SAAiB;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AAEA,QAAM,UAAU,UAAU,QAAQ,2BAA2B,GAAG,KAAK,UAAU,QAAQ,QAAW,CAAC,CAAC;AACxG;",
5
5
  "names": []
6
6
  }
@@ -6,12 +6,14 @@
6
6
  export declare const TEMPLATE_DIR: string;
7
7
  export interface Template {
8
8
  name: string;
9
+ dependencies: Record<string, string>;
9
10
  description: string;
10
11
  entrypoint: string;
12
+ matterJsPackages?: string[];
11
13
  }
12
14
  export interface Config {
13
- matterJsVersion: string;
14
15
  typescriptVersion: string;
16
+ nodeTypesVersion: string;
15
17
  templates: Template[];
16
18
  }
17
19
  export declare function Config(): Promise<Config>;
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,eAAO,MAAM,YAAY,QAAwC,CAAC;AAElE,MAAM,WAAW,QAAQ;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,MAAM;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE,QAAQ,EAAE,CAAC;CACzB;AAID,wBAAsB,MAAM,oBAW3B"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,eAAO,MAAM,YAAY,QAAwC,CAAC;AAElE,MAAM,WAAW,QAAQ;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC/B;AAED,MAAM,WAAW,MAAM;IACnB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,QAAQ,EAAE,CAAC;CACzB;AAID,wBAAsB,MAAM,oBAiB3B"}
@@ -14,7 +14,13 @@ async function Config() {
14
14
  }
15
15
  const packageJson = JSON.parse(await readFile(resolve(CREATE_DIR, "package.json"), "utf-8"));
16
16
  if (packageJson.version !== "0.0.0-git") {
17
- config.matterJsVersion = `^${packageJson.version}`;
17
+ for (const template of config.templates) {
18
+ for (const name in template.dependencies) {
19
+ if (name.startsWith("@matter/") || name.startsWith("@project-chip/")) {
20
+ template.dependencies[name] = packageJson.version;
21
+ }
22
+ }
23
+ }
18
24
  }
19
25
  return config;
20
26
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/config.ts"],
4
- "mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,SAAS,gBAAgB;AACzB,SAAS,eAAe;AAExB,MAAM,aAAa,QAAQ,YAAY,SAAS,OAAO;AAChD,MAAM,eAAe,QAAQ,YAAY,gBAAgB;AAchE,IAAI;AAEJ,eAAsB,SAAS;AAC3B,MAAI,CAAC,QAAQ;AACT,aAAS,KAAK,MAAM,MAAM,SAAS,QAAQ,cAAc,YAAY,GAAG,OAAO,CAAC;AAAA,EACpF;AAEA,QAAM,cAAc,KAAK,MAAM,MAAM,SAAS,QAAQ,YAAY,cAAc,GAAG,OAAO,CAAC;AAC3F,MAAI,YAAY,YAAY,aAAa;AACrC,WAAO,kBAAkB,IAAI,YAAY,OAAO;AAAA,EACpD;AAEA,SAAO;AACX;",
4
+ "mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,SAAS,gBAAgB;AACzB,SAAS,eAAe;AAExB,MAAM,aAAa,QAAQ,YAAY,SAAS,OAAO;AAChD,MAAM,eAAe,QAAQ,YAAY,gBAAgB;AAgBhE,IAAI;AAEJ,eAAsB,SAAS;AAC3B,MAAI,CAAC,QAAQ;AACT,aAAS,KAAK,MAAM,MAAM,SAAS,QAAQ,cAAc,YAAY,GAAG,OAAO,CAAC;AAAA,EACpF;AAEA,QAAM,cAAc,KAAK,MAAM,MAAM,SAAS,QAAQ,YAAY,cAAc,GAAG,OAAO,CAAC;AAC3F,MAAI,YAAY,YAAY,aAAa;AACrC,eAAW,YAAY,OAAO,WAAW;AACrC,iBAAW,QAAQ,SAAS,cAAc;AACtC,YAAI,KAAK,WAAW,UAAU,KAAK,KAAK,WAAW,gBAAgB,GAAG;AAClE,mBAAS,aAAa,IAAI,IAAI,YAAY;AAAA,QAC9C;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAEA,SAAO;AACX;",
5
5
  "names": []
6
6
  }
@@ -1 +1 @@
1
- {"version":3,"file":"new-project.d.ts","sourceRoot":"","sources":["../../src/new-project.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,EAAU,QAAQ,EAAgB,MAAM,aAAa,CAAC;AAmC7D,qBAAa,qBAAsB,SAAQ,KAAK;CAAG;AAEnD,MAAM,WAAW,UAAU;IACvB,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IAEb,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACxB,KAAK,IAAI,IAAI,CAAC;CACjB;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAchF;AAED,qBAAa,YAAa,SAAQ,KAAK;CAAG;AAE1C,wBAAsB,MAAM,CAAC,IAAI,EAAE,UAAU,iBAiB5C"}
1
+ {"version":3,"file":"new-project.d.ts","sourceRoot":"","sources":["../../src/new-project.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,EAAU,QAAQ,EAAgB,MAAM,aAAa,CAAC;AA6D7D,qBAAa,qBAAsB,SAAQ,KAAK;CAAG;AAEnD,MAAM,WAAW,UAAU;IACvB,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IAEb,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACxB,KAAK,IAAI,IAAI,CAAC;CACjB;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAchF;AAED,qBAAa,YAAa,SAAQ,KAAK;CAAG;AAE1C,wBAAsB,MAAM,CAAC,IAAI,EAAE,UAAU,iBAmB5C"}
@@ -8,11 +8,10 @@ import { cp, mkdir, readdir, writeFile } from "fs/promises";
8
8
  import { basename, resolve } from "path";
9
9
  import { Config, TEMPLATE_DIR } from "./config.js";
10
10
  const PACKAGE_JSON = {
11
- dependencies: {
12
- "@matter/main": "*"
13
- },
11
+ dependencies: {},
14
12
  devDependencies: {
15
- typescript: "*"
13
+ typescript: "*",
14
+ "@types/node": "*"
16
15
  },
17
16
  name: "matter-app",
18
17
  version: "0.1.0",
@@ -38,6 +37,28 @@ const TSCONFIG = {
38
37
  },
39
38
  include: ["./src/**/*.ts"]
40
39
  };
40
+ const VS_CODE_LAUNCH = {
41
+ version: "0.2.0",
42
+ configurations: [
43
+ {
44
+ type: "node",
45
+ request: "launch",
46
+ name: "Launch Program",
47
+ skipFiles: ["<node_internals>/**"],
48
+ program: "",
49
+ // Never gotten it to work without this
50
+ console: "integratedTerminal",
51
+ // Doesn't seem to work
52
+ //sourceMaps: true,
53
+ env: {
54
+ NODE_OPTIONS: "--enable-source-maps"
55
+ },
56
+ preLaunchTask: "tsc: build - tsconfig.json",
57
+ outFiles: ["${workspaceFolder}/dist/**/*.js"]
58
+ }
59
+ ]
60
+ };
61
+ const GITIGNORE = "node_modules/\ndist/\n";
41
62
  class TemplateNotFoundError extends Error {
42
63
  }
43
64
  async function NewProject(name, dest) {
@@ -69,15 +90,20 @@ async function create() {
69
90
  }
70
91
  await createPackageJson(this);
71
92
  await createTsconfig(this);
93
+ await createGitignore(this);
94
+ await createVsCodeProject(this);
72
95
  await installSources(this);
73
96
  }
97
+ function entrypointFor(project) {
98
+ return "dist/" + project.template.entrypoint.replace(/\.ts$/, ".js");
99
+ }
74
100
  async function createPackageJson(project) {
75
101
  const pkg = PACKAGE_JSON;
76
102
  const config = await Config();
77
- const entrypoint = `dist/${project.template.entrypoint.replace(/\.ts$/, ".js")}`;
78
- pkg.scripts.app = `node --enable-source-maps ${entrypoint}`;
79
- pkg.dependencies["@matter/main"] = config.matterJsVersion;
103
+ pkg.scripts.app = `node --enable-source-maps ${entrypointFor(project)}`;
104
+ pkg.dependencies = project.template.dependencies;
80
105
  pkg.devDependencies["typescript"] = config.typescriptVersion;
106
+ pkg.devDependencies["@types/node"] = config.nodeTypesVersion;
81
107
  pkg.description = project.template.description;
82
108
  let author, authorEmail;
83
109
  try {
@@ -105,6 +131,15 @@ async function createPackageJson(project) {
105
131
  async function createTsconfig(project) {
106
132
  await writeFile(resolve(project.dest, "tsconfig.json"), JSON.stringify(TSCONFIG, void 0, 4));
107
133
  }
134
+ async function createGitignore(project) {
135
+ await writeFile(resolve(project.dest, ".gitignore"), GITIGNORE);
136
+ }
137
+ async function createVsCodeProject(project) {
138
+ const root = resolve(project.dest, ".vscode");
139
+ await mkdir(root);
140
+ VS_CODE_LAUNCH.configurations[0].program = `\${workspaceFolder}/${entrypointFor(project)}`;
141
+ await writeFile(resolve(root, "launch.json"), JSON.stringify(VS_CODE_LAUNCH, void 0, 4));
142
+ }
108
143
  async function installSources(project) {
109
144
  await cp(project.source, resolve(project.dest, "src"), {
110
145
  recursive: true,
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/new-project.ts"],
4
- "mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,SAAS,gBAAgB;AACzB,SAAS,IAAI,OAAO,SAAS,iBAAiB;AAC9C,SAAS,UAAU,eAAe;AAClC,SAAS,QAAkB,oBAAoB;AAE/C,MAAM,eAAe;AAAA,EACjB,cAAc;AAAA,IACV,gBAAgB;AAAA,EACpB;AAAA,EACA,iBAAiB;AAAA,IACb,YAAY;AAAA,EAChB;AAAA,EACA,MAAM;AAAA,EACN,SAAS;AAAA,EACT,MAAM;AAAA,EACN,SAAS;AAAA,IACL,SAAS;AAAA,IACT,OAAO;AAAA,IACP,KAAK;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,EACX;AACJ;AAEA,MAAM,WAAW;AAAA,EACb,iBAAiB;AAAA,IACb,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,kBAAkB;AAAA,IAClB,eAAe;AAAA,IACf,oBAAoB;AAAA,IACpB,QAAQ;AAAA,IACR,cAAc;AAAA,EAClB;AAAA,EACA,SAAS,CAAC,eAAe;AAC7B;AAEO,MAAM,8BAA8B,MAAM;AAAC;AAWlD,eAAsB,WAAW,MAAc,MAAmC;AAC9E,QAAM,YAAY,MAAM,OAAO,GAAG,UAAU,KAAK,CAAAA,cAAYA,UAAS,SAAS,IAAI;AAEnF,MAAI,aAAa,QAAW;AACxB,UAAM,IAAI,sBAAsB,IAAI,IAAI,gCAAgC;AAAA,EAC5E;AAEA,SAAO;AAAA,IACH;AAAA,IACA,QAAQ,QAAQ,cAAc,SAAS,IAAI;AAAA,IAC3C;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AACJ;AAEO,MAAM,qBAAqB,MAAM;AAAC;AAEzC,eAAsB,SAAyB;AAC3C,MAAI;AACA,UAAM,MAAM,KAAK,MAAM,EAAE,WAAW,KAAK,CAAC;AAAA,EAC9C,SAAS,GAAG;AACR,UAAM,IAAI,aAAa,qBAAqB,KAAK,IAAI,MAAM,CAAC,EAAE;AAAA,EAClE;AAEA,QAAM,gBAAgB,MAAM,QAAQ,KAAK,IAAI;AAC7C,MAAI,cAAc,QAAQ;AACtB,UAAM,IAAI;AAAA,MACN,mBAAmB,KAAK,IAAI;AAAA,IAChC;AAAA,EACJ;AAEA,QAAM,kBAAkB,IAAI;AAC5B,QAAM,eAAe,IAAI;AACzB,QAAM,eAAe,IAAI;AAC7B;AAEA,eAAe,kBAAkB,SAAqB;AAClD,QAAM,MAAM;AAEZ,QAAM,SAAS,MAAM,OAAO;AAE5B,QAAM,aAAa,QAAQ,QAAQ,SAAS,WAAW,QAAQ,SAAS,KAAK,CAAC;AAC9E,MAAI,QAAQ,MAAM,6BAA6B,UAAU;AAEzD,MAAI,aAAa,cAAc,IAAI,OAAO;AAC1C,MAAI,gBAAgB,YAAY,IAAI,OAAO;AAE3C,EAAC,IAAY,cAAc,QAAQ,SAAS;AAE5C,MAAI,QAAQ;AACZ,MAAI;AACA,eAAW,QAAQ,SAAS,qBAAqB,EAAE,UAAU,QAAQ,CAAC,EAAE,MAAM,IAAI,GAAG;AACjF,UAAI,KAAK,WAAW,YAAY,GAAG;AAC/B,iBAAS,KAAK,QAAQ,UAAU,EAAE;AAAA,MACtC,WAAW,KAAK,WAAW,aAAa,GAAG;AACvC,sBAAc,KAAK,QAAQ,UAAU,EAAE;AAAA,MAC3C;AAAA,IACJ;AAAA,EACJ,SAAS,GAAG;AAAA,EAEZ;AAEA,MAAI,aAAa;AACb,QAAI,QAAQ;AACR,eAAS,GAAG,MAAM,KAAK,WAAW;AAAA,IACtC,OAAO;AACH,eAAS,IAAI,WAAW;AAAA,IAC5B;AAAA,EACJ;AAEA,MAAI,QAAQ;AACR,IAAC,IAAY,SAAS;AAAA,EAC1B;AAEA,QAAM,UAAU,QAAQ,QAAQ,MAAM,cAAc,GAAG,KAAK,UAAU,KAAK,QAAW,CAAC,CAAC;AAC5F;AAEA,eAAe,eAAe,SAAqB;AAC/C,QAAM,UAAU,QAAQ,QAAQ,MAAM,eAAe,GAAG,KAAK,UAAU,UAAU,QAAW,CAAC,CAAC;AAClG;AAEA,eAAe,eAAe,SAAqB;AAC/C,QAAM,GAAG,QAAQ,QAAQ,QAAQ,QAAQ,MAAM,KAAK,GAAG;AAAA,IACnD,WAAW;AAAA,IACX,QAAQ,YAAU,SAAS,MAAM,EAAE,QAAQ,GAAG,MAAM,MAAM,OAAO,SAAS,KAAK;AAAA,EACnF,CAAC;AACL;AAEA,SAAS,QAAwB;AAC7B,WAAS,wBAAwB,EAAE,OAAO,WAAW,KAAK,KAAK,KAAK,CAAC;AACzE;",
4
+ "mappings": "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",
5
5
  "names": ["template"]
6
6
  }
@@ -1,61 +1,98 @@
1
1
  {
2
- "matterJsVersion": "~0.11.0",
3
2
  "typescriptVersion": "~5.6.2",
3
+ "nodeTypesVersion": "^22.8.1",
4
4
  "templates": [
5
5
  {
6
- "name": "controller-cli",
6
+ "name": "controller",
7
+ "dependencies": {
8
+ "@matter/main": "~0.11.1",
9
+ "@matter/nodejs-ble": "~0.11.1",
10
+ "@project-chip/matter.js": "~0.11.1"
11
+ },
7
12
  "description": "Controller example to commission and connect devices",
8
13
  "entrypoint": "ControllerNode.ts"
9
14
  },
10
15
  {
11
- "name": "device-onoff-advanced-cli",
12
- "description": "OnOff light/socket device with BLE support and advanced API usage",
13
- "entrypoint": "DeviceNodeFull.ts"
14
- },
15
- {
16
- "name": "device-onoff-bridge-cli",
16
+ "name": "device-bridge-onoff",
17
+ "dependencies": {
18
+ "@matter/main": "~0.11.1"
19
+ },
17
20
  "description": "Bridge for multiple OnOff light/sockets with a CLI command execution interface",
18
21
  "entrypoint": "BridgedDevicesNode.ts"
19
22
  },
20
23
  {
21
- "name": "device-onoff-cli",
22
- "description": "OnOff light/socket device with a CLI command execution interface",
23
- "entrypoint": "DeviceNode.ts"
24
- },
25
- {
26
- "name": "device-onoff-composed-cli",
24
+ "name": "device-composed-onoff",
25
+ "dependencies": {
26
+ "@matter/main": "~0.11.1"
27
+ },
27
28
  "description": "Composed device for multiple OnOff light/sockets with a CLI command execution interface",
28
29
  "entrypoint": "ComposedDeviceNode.ts"
29
30
  },
30
31
  {
31
- "name": "device-onoff-light",
32
- "description": "OnOff light example which logs the state changes to the console",
33
- "entrypoint": "LightDevice.ts"
32
+ "name": "device-composed-wc-light",
33
+ "dependencies": {
34
+ "@matter/main": "~0.11.1"
35
+ },
36
+ "description": "Composed device with Window covering and a light endpoint that logs changes",
37
+ "entrypoint": "IlluminatedRollerShade.ts"
34
38
  },
35
39
  {
36
- "name": "device-onoff-multiple-devices-cli",
40
+ "name": "device-measuring-socket",
41
+ "dependencies": {
42
+ "@matter/main": "~0.11.1"
43
+ },
44
+ "description": "Socket device that reports random Energy and Power measurements",
45
+ "entrypoint": "MeasuredSocketDevice.ts"
46
+ },
47
+ {
48
+ "name": "device-multiple-onoff",
49
+ "dependencies": {
50
+ "@matter/main": "~0.11.1"
51
+ },
37
52
  "description": "Multiple OnOff light/socket nodes in one process with a CLI command execution interface",
38
53
  "entrypoint": "MultiDeviceNode.ts"
39
54
  },
40
55
  {
41
- "name": "device-simple",
42
- "description": "A simple on/off device",
43
- "entrypoint": "main.ts"
56
+ "name": "device-onoff",
57
+ "dependencies": {
58
+ "@matter/main": "~0.11.1"
59
+ },
60
+ "description": "OnOff light/socket device with a CLI command execution interface",
61
+ "entrypoint": "DeviceNode.ts"
44
62
  },
45
63
  {
46
- "name": "device-socket-with-measurement",
47
- "description": "Socket device that reports random Energy and Power measurements",
48
- "entrypoint": "MeasuredSocketDevice.ts"
64
+ "name": "device-onoff-advanced",
65
+ "dependencies": {
66
+ "@matter/main": "~0.11.1",
67
+ "@matter/nodejs": "~0.11.1",
68
+ "@matter/nodejs-ble": "~0.11.1"
69
+ },
70
+ "description": "OnOff light/socket device with BLE support and advanced API usage",
71
+ "entrypoint": "DeviceNodeFull.ts"
72
+ },
73
+ {
74
+ "name": "device-onoff-light",
75
+ "dependencies": {
76
+ "@matter/main": "~0.11.1"
77
+ },
78
+ "description": "OnOff light example which logs the state changes to the console",
79
+ "entrypoint": "LightDevice.ts"
49
80
  },
50
81
  {
51
- "name": "device-temperature-humidity-sensor-cli",
82
+ "name": "device-sensor",
83
+ "dependencies": {
84
+ "@matter/main": "~0.11.1"
85
+ },
52
86
  "description": "Temperature/Humidity sensor with a CLI command interface to get the value",
53
87
  "entrypoint": "SensorDeviceNode.ts"
54
88
  },
55
89
  {
56
- "name": "device-window-covering-light-composed",
57
- "description": "Composed device with Window covering and a light endpoint that logs changes",
58
- "entrypoint": "IlluminatedRollerShade.ts"
90
+ "name": "device-simple",
91
+ "dependencies": {
92
+ "@matter/main": "~0.11.1"
93
+ },
94
+ "description": "A simple on/off device",
95
+ "entrypoint": "main.ts"
59
96
  }
60
97
  ]
61
98
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@matter/create",
3
- "version": "0.11.0",
3
+ "version": "0.11.1",
4
4
  "description": "Matter.js skeleton project generator",
5
5
  "type": "module",
6
6
  "scripts": {
@@ -32,7 +32,7 @@
32
32
  },
33
33
  "homepage": "https://github.com/project-chip/matter.js#readme",
34
34
  "devDependencies": {
35
- "@matter/tools": "0.11.0",
35
+ "@matter/tools": "0.11.1",
36
36
  "@types/node": "^22.8.1",
37
37
  "@types/tar-stream": "^3.1.3"
38
38
  },
@@ -5,7 +5,7 @@
5
5
  */
6
6
 
7
7
  import { Project } from "@matter/tools";
8
- import { cp, mkdir, readFile, writeFile } from "fs/promises";
8
+ import { mkdir, readFile, writeFile } from "fs/promises";
9
9
  import { basename, dirname } from "path";
10
10
  import { Config, Template } from "./config.js";
11
11
 
@@ -18,6 +18,10 @@ export async function before({ project }: Project.Context) {
18
18
 
19
19
  await mkdir(createPkg.resolve("dist/templates"), { recursive: true });
20
20
 
21
+ // We set the version after build so we don't know actual version here. This placeholder is just used in dev. We
22
+ // then replace with the "create" package version on init if it's not a git build
23
+ const matterJsVersion = `~${await readFile(project.pkg.workspace.resolve("version.txt"), "utf-8")}`;
24
+
21
25
  const readmes = await examplesPkg.glob("src/*/README.md");
22
26
  const templates = Array<Template>();
23
27
  for (const readme of readmes) {
@@ -27,6 +31,8 @@ export async function before({ project }: Project.Context) {
27
31
  continue;
28
32
  }
29
33
 
34
+ const dependencies = {} as Record<string, string>;
35
+
30
36
  const baseLength = examplesPkg.resolve(`src/${name}`).length + 1;
31
37
  const sources = await examplesPkg.glob(`src/${name}/**/*.ts`);
32
38
  let entrypoint;
@@ -35,7 +41,29 @@ export async function before({ project }: Project.Context) {
35
41
  if (!entrypoint && filename.indexOf("/") === -1) {
36
42
  entrypoint = filename;
37
43
  }
38
- await cp(file, createPkg.resolve("dist/templates/", name, filename));
44
+ const source = await readFile(file, "utf-8");
45
+
46
+ // Quick hack to pull out imports, assumes modules formatted by prettier. More than sufficient for current
47
+ // needs
48
+ for (const [, pkgName] of source.matchAll(/import .* from "(@[^/"]+\/[^/"]+|[^/"]+)[^"]*";/g)) {
49
+ if (dependencies[pkgName]) {
50
+ continue;
51
+ }
52
+
53
+ if (pkgName.startsWith("@matter/") || pkgName.startsWith("@project-chip/")) {
54
+ dependencies[pkgName] = matterJsVersion;
55
+ continue;
56
+ }
57
+
58
+ const version = examplesPkg.json.dependencies[pkgName];
59
+ if (version !== undefined) {
60
+ dependencies[pkgName] = version;
61
+ }
62
+ }
63
+
64
+ const outFilename = createPkg.resolve("dist/templates", name, filename);
65
+ await mkdir(dirname(outFilename), { recursive: true });
66
+ await writeFile(outFilename, source);
39
67
  }
40
68
 
41
69
  if (!entrypoint) {
@@ -44,20 +72,19 @@ export async function before({ project }: Project.Context) {
44
72
 
45
73
  templates.push({
46
74
  name,
75
+ dependencies,
47
76
  description: match[1],
48
77
  entrypoint,
49
78
  });
50
79
  }
51
80
 
52
- // We set the version after build so we don't know actual version here. This placeholder is just used in dev. We
53
- // then replace with the "create" package version on init if it's not a git build
54
- const matterJsVersion = `~${await readFile(project.pkg.workspace.resolve("version.txt"), "utf-8")}`;
55
-
56
- const typescriptVersion = project.pkg.findPackage("@matter/tools").json.dependencies.typescript;
81
+ const tools = project.pkg.findPackage("@matter/tools").json;
82
+ const typescriptVersion = tools.dependencies.typescript;
83
+ const nodeTypesVersion = tools.devDependencies["@types/node"];
57
84
 
58
85
  const config: Config = {
59
- matterJsVersion,
60
86
  typescriptVersion,
87
+ nodeTypesVersion,
61
88
  templates,
62
89
  };
63
90
 
package/src/config.ts CHANGED
@@ -12,13 +12,15 @@ export const TEMPLATE_DIR = resolve(CREATE_DIR, "dist/templates");
12
12
 
13
13
  export interface Template {
14
14
  name: string;
15
+ dependencies: Record<string, string>;
15
16
  description: string;
16
17
  entrypoint: string;
18
+ matterJsPackages?: string[];
17
19
  }
18
20
 
19
21
  export interface Config {
20
- matterJsVersion: string;
21
22
  typescriptVersion: string;
23
+ nodeTypesVersion: string;
22
24
  templates: Template[];
23
25
  }
24
26
 
@@ -31,7 +33,13 @@ export async function Config() {
31
33
 
32
34
  const packageJson = JSON.parse(await readFile(resolve(CREATE_DIR, "package.json"), "utf-8")) as { version: string };
33
35
  if (packageJson.version !== "0.0.0-git") {
34
- config.matterJsVersion = `^${packageJson.version}`;
36
+ for (const template of config.templates) {
37
+ for (const name in template.dependencies) {
38
+ if (name.startsWith("@matter/") || name.startsWith("@project-chip/")) {
39
+ template.dependencies[name] = packageJson.version;
40
+ }
41
+ }
42
+ }
35
43
  }
36
44
 
37
45
  return config;
@@ -10,11 +10,10 @@ import { basename, resolve } from "path";
10
10
  import { Config, Template, TEMPLATE_DIR } from "./config.js";
11
11
 
12
12
  const PACKAGE_JSON = {
13
- dependencies: {
14
- "@matter/main": "*",
15
- },
13
+ dependencies: {} as Record<string, string>,
16
14
  devDependencies: {
17
15
  typescript: "*",
16
+ "@types/node": "*",
18
17
  },
19
18
  name: "matter-app",
20
19
  version: "0.1.0",
@@ -42,6 +41,33 @@ const TSCONFIG = {
42
41
  include: ["./src/**/*.ts"],
43
42
  };
44
43
 
44
+ const VS_CODE_LAUNCH = {
45
+ version: "0.2.0",
46
+ configurations: [
47
+ {
48
+ type: "node",
49
+ request: "launch",
50
+ name: "Launch Program",
51
+ skipFiles: ["<node_internals>/**"],
52
+ program: "",
53
+
54
+ // Never gotten it to work without this
55
+ console: "integratedTerminal",
56
+
57
+ // Doesn't seem to work
58
+ //sourceMaps: true,
59
+
60
+ env: {
61
+ NODE_OPTIONS: "--enable-source-maps",
62
+ },
63
+ preLaunchTask: "tsc: build - tsconfig.json",
64
+ outFiles: ["${workspaceFolder}/dist/**/*.js"],
65
+ },
66
+ ],
67
+ };
68
+
69
+ const GITIGNORE = "node_modules/\ndist/\n";
70
+
45
71
  export class TemplateNotFoundError extends Error {}
46
72
 
47
73
  export interface NewProject {
@@ -87,19 +113,25 @@ export async function create(this: NewProject) {
87
113
 
88
114
  await createPackageJson(this);
89
115
  await createTsconfig(this);
116
+ await createGitignore(this);
117
+ await createVsCodeProject(this);
90
118
  await installSources(this);
91
119
  }
92
120
 
121
+ function entrypointFor(project: NewProject) {
122
+ return "dist/" + project.template.entrypoint.replace(/\.ts$/, ".js");
123
+ }
124
+
93
125
  async function createPackageJson(project: NewProject) {
94
126
  const pkg = PACKAGE_JSON;
95
127
 
96
128
  const config = await Config();
97
129
 
98
- const entrypoint = `dist/${project.template.entrypoint.replace(/\.ts$/, ".js")}`;
99
- pkg.scripts.app = `node --enable-source-maps ${entrypoint}`;
130
+ pkg.scripts.app = `node --enable-source-maps ${entrypointFor(project)}`;
100
131
 
101
- pkg.dependencies["@matter/main"] = config.matterJsVersion;
132
+ pkg.dependencies = project.template.dependencies;
102
133
  pkg.devDependencies["typescript"] = config.typescriptVersion;
134
+ pkg.devDependencies["@types/node"] = config.nodeTypesVersion;
103
135
 
104
136
  (pkg as any).description = project.template.description;
105
137
 
@@ -135,6 +167,17 @@ async function createTsconfig(project: NewProject) {
135
167
  await writeFile(resolve(project.dest, "tsconfig.json"), JSON.stringify(TSCONFIG, undefined, 4));
136
168
  }
137
169
 
170
+ async function createGitignore(project: NewProject) {
171
+ await writeFile(resolve(project.dest, ".gitignore"), GITIGNORE);
172
+ }
173
+
174
+ async function createVsCodeProject(project: NewProject) {
175
+ const root = resolve(project.dest, ".vscode");
176
+ await mkdir(root);
177
+ VS_CODE_LAUNCH.configurations[0].program = `\${workspaceFolder}/${entrypointFor(project)}`;
178
+ await writeFile(resolve(root, "launch.json"), JSON.stringify(VS_CODE_LAUNCH, undefined, 4));
179
+ }
180
+
138
181
  async function installSources(project: NewProject) {
139
182
  await cp(project.source, resolve(project.dest, "src"), {
140
183
  recursive: true,