@nanoforge-dev/schematics 1.2.0 → 1.2.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 (23) hide show
  1. package/dist/libs/application/application.factory.d.ts +5 -0
  2. package/dist/libs/application/application.factory.js +24 -7
  3. package/dist/libs/application/application.factory.js.map +1 -1
  4. package/dist/libs/application/files/js/{__package__.json → package.json.template} +17 -11
  5. package/dist/libs/application/files/ts/{__package__.json → package.json.template} +19 -13
  6. package/dist/libs/application/schema.json +5 -0
  7. package/dist/libs/configuration/configuration.factory.d.ts +5 -0
  8. package/dist/libs/configuration/configuration.factory.js +10 -23
  9. package/dist/libs/configuration/configuration.factory.js.map +1 -1
  10. package/dist/libs/configuration/schema.json +6 -0
  11. package/dist/libs/docker/docker.factory.js +2 -2
  12. package/dist/libs/docker/docker.factory.js.map +1 -1
  13. package/dist/libs/part-base/files/js/__nanoforgeFolder__/client.save.json +11 -4
  14. package/dist/libs/part-base/files/js/__nanoforgeFolder__/server.save.json +11 -4
  15. package/dist/libs/part-base/files/js/__part__/components/example.component.js +1 -1
  16. package/dist/libs/part-base/files/js/__part__/systems/example.system.js +2 -2
  17. package/dist/libs/part-base/files/ts/__nanoforgeFolder__/client.save.json +8 -1
  18. package/dist/libs/part-base/files/ts/__nanoforgeFolder__/server.save.json +8 -1
  19. package/dist/libs/part-base/part-base.factory.js +2 -2
  20. package/dist/libs/part-base/part-base.factory.js.map +1 -1
  21. package/dist/libs/part-main/part-main.factory.js +2 -2
  22. package/dist/libs/part-main/part-main.factory.js.map +1 -1
  23. package/package.json +15 -13
@@ -36,6 +36,11 @@ interface ApplicationSchema {
36
36
  */
37
37
  strict?: boolean;
38
38
 
39
+ /**
40
+ * Generate lint files
41
+ */
42
+ lint?: boolean;
43
+
39
44
  /**
40
45
  * The used package manager
41
46
  */
@@ -2,14 +2,15 @@ var __defProp = Object.defineProperty;
2
2
  var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
3
 
4
4
  // src/libs/application/application.factory.ts
5
- import { join, strings } from "@angular-devkit/core";
5
+ import { join, normalize, strings } from "@angular-devkit/core";
6
6
  import {
7
7
  apply,
8
+ applyTemplates,
8
9
  mergeWith,
9
10
  move,
10
- template,
11
11
  url
12
12
  } from "@angular-devkit/schematics";
13
+ import { firstValueFrom } from "rxjs";
13
14
 
14
15
  // src/utils/formatting.ts
15
16
  var toKebabCase = /* @__PURE__ */ __name((str) => {
@@ -47,23 +48,39 @@ var transform = /* @__PURE__ */ __name((schema) => {
47
48
  description: schema.description ?? DEFAULT_DESCRIPTION,
48
49
  language: schema.language ?? DEFAULT_LANGUAGE,
49
50
  strict: schema.strict ?? true,
51
+ lint: schema.lint ?? true,
50
52
  packageManager: schema.packageManager ?? DEFAULT_PACKAGE_MANAGER,
51
53
  server: schema.server ?? false
52
54
  };
53
55
  }, "transform");
54
56
  var generate = /* @__PURE__ */ __name((options, path) => {
55
57
  return apply(url(join("./files", options.language)), [
56
- template({
58
+ applyTemplates({
57
59
  ...strings,
58
- ...options,
59
- package: "package"
60
+ ...options
60
61
  }),
61
- move(path)
62
+ move(normalize(path))
62
63
  ]);
63
64
  }, "generate");
64
65
  var main = /* @__PURE__ */ __name((schema) => {
65
66
  const options = transform(schema);
66
- return mergeWith(generate(options, schema.directory ?? options.name));
67
+ const path = schema.directory ?? options.name;
68
+ return async (baseTree, context) => {
69
+ let tree = await mergeWith(generate(options, path))(baseTree, context);
70
+ if (!tree) return tree;
71
+ if (!("delete" in tree)) {
72
+ if (typeof tree === "function") return tree;
73
+ tree = await firstValueFrom(tree);
74
+ }
75
+ if (!options.lint) {
76
+ const basePath = join("/", path);
77
+ tree.delete(join(basePath, "eslint.config.js"));
78
+ tree.delete(join(basePath, "prettier.config.js"));
79
+ tree.delete(join(basePath, ".prettierignore"));
80
+ if (options.language === "js") tree.delete(join(basePath, "jsconfig.json"));
81
+ }
82
+ return tree;
83
+ };
67
84
  }, "main");
68
85
  export {
69
86
  main
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/libs/application/application.factory.ts","../../../src/utils/formatting.ts","../../../src/utils/name.ts","../../../src/defaults.ts"],"sourcesContent":["import { type Path, join, strings } from \"@angular-devkit/core\";\nimport {\n type Rule,\n type Source,\n apply,\n mergeWith,\n move,\n template,\n url,\n} from \"@angular-devkit/schematics\";\n\nimport { toKebabCase } from \"@utils/formatting\";\nimport { resolvePackageName } from \"@utils/name\";\n\nimport {\n DEFAULT_APP_NAME,\n DEFAULT_AUTHOR,\n DEFAULT_DESCRIPTION,\n DEFAULT_LANGUAGE,\n DEFAULT_PACKAGE_MANAGER,\n DEFAULT_VERSION,\n} from \"~/defaults\";\n\nimport { type ApplicationOptions } from \"./application.options\";\nimport { type ApplicationSchema } from \"./application.schema\";\n\nconst transform = (schema: ApplicationSchema): ApplicationOptions => {\n const name = resolvePackageName(toKebabCase(schema.name?.toString() ?? DEFAULT_APP_NAME));\n\n return {\n name,\n version: schema.version ?? DEFAULT_VERSION,\n author: schema.author ?? DEFAULT_AUTHOR,\n description: schema.description ?? DEFAULT_DESCRIPTION,\n language: schema.language ?? DEFAULT_LANGUAGE,\n strict: schema.strict ?? true,\n packageManager: schema.packageManager ?? DEFAULT_PACKAGE_MANAGER,\n server: schema.server ?? false,\n };\n};\n\nconst generate = (options: ApplicationOptions, path: string): Source => {\n return apply(url(join(\"./files\" as Path, options.language)), [\n template({\n ...strings,\n ...options,\n package: \"package\",\n }),\n move(path),\n ]);\n};\n\nexport const main = (schema: ApplicationSchema): Rule => {\n const options = transform(schema);\n\n return mergeWith(generate(options, schema.directory ?? options.name));\n};\n","export const toKebabCase = (str: string): string => {\n return str\n .replace(/([a-z0-9]|(?=[A-Z]))([A-Z])/g, \"$1-$2\")\n .replace(/[\\s_]+/g, \"-\")\n .toLowerCase();\n};\n","import { basename, parse } from \"path\";\n\nexport const resolvePackageName = (path: string): string => {\n const { base: baseFilename, dir: dirname } = parse(path);\n if (baseFilename === \".\") {\n return basename(process.cwd());\n }\n if (dirname.match(/^@[^\\s]/)) {\n return `${dirname}/${baseFilename}`;\n }\n return baseFilename;\n};\n","export const DEFAULT_APP_NAME = \"nanoforge-app\";\nexport const DEFAULT_VERSION = \"0.0.0\";\nexport const DEFAULT_AUTHOR = \"\";\nexport const DEFAULT_DESCRIPTION = \"\";\nexport const DEFAULT_LANGUAGE = \"ts\";\nexport const DEFAULT_PACKAGE_MANAGER = \"npm\";\nexport const DEFAULT_CONFIG = {\n client: {\n build: {\n entryFile: \"client/main.ts\",\n outDir: \".nanoforge/client\",\n },\n runtime: {\n dir: \".nanoforge/client\",\n },\n },\n};\nexport const DEFAULT_SERVER_CONFIG = {\n server: {\n enable: true,\n build: {\n entryFile: \"server/main.ts\",\n outDir: \".nanoforge/server\",\n },\n runtime: {\n dir: \".nanoforge/server\",\n },\n },\n};\n"],"mappings":";;;;AAAA,SAAoB,MAAM,eAAe;AACzC;AAAA,EAGE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;;;ACTA,IAAM,cAAc,wBAAC,QAAwB;AAClD,SAAO,IACJ,QAAQ,gCAAgC,OAAO,EAC/C,QAAQ,WAAW,GAAG,EACtB,YAAY;AACjB,GAL2B;;;ACA3B,SAAS,UAAU,aAAa;AAEzB,IAAM,qBAAqB,wBAAC,SAAyB;AAC1D,QAAM,EAAE,MAAM,cAAc,KAAK,QAAQ,IAAI,MAAM,IAAI;AACvD,MAAI,iBAAiB,KAAK;AACxB,WAAO,SAAS,QAAQ,IAAI,CAAC;AAAA,EAC/B;AACA,MAAI,QAAQ,MAAM,SAAS,GAAG;AAC5B,WAAO,GAAG,OAAO,IAAI,YAAY;AAAA,EACnC;AACA,SAAO;AACT,GATkC;;;ACF3B,IAAM,mBAAmB;AACzB,IAAM,kBAAkB;AACxB,IAAM,iBAAiB;AACvB,IAAM,sBAAsB;AAC5B,IAAM,mBAAmB;AACzB,IAAM,0BAA0B;;;AHqBvC,IAAM,YAAY,wBAAC,WAAkD;AACnE,QAAM,OAAO,mBAAmB,YAAY,OAAO,MAAM,SAAS,KAAK,gBAAgB,CAAC;AAExF,SAAO;AAAA,IACL;AAAA,IACA,SAAS,OAAO,WAAW;AAAA,IAC3B,QAAQ,OAAO,UAAU;AAAA,IACzB,aAAa,OAAO,eAAe;AAAA,IACnC,UAAU,OAAO,YAAY;AAAA,IAC7B,QAAQ,OAAO,UAAU;AAAA,IACzB,gBAAgB,OAAO,kBAAkB;AAAA,IACzC,QAAQ,OAAO,UAAU;AAAA,EAC3B;AACF,GAbkB;AAelB,IAAM,WAAW,wBAAC,SAA6B,SAAyB;AACtE,SAAO,MAAM,IAAI,KAAK,WAAmB,QAAQ,QAAQ,CAAC,GAAG;AAAA,IAC3D,SAAS;AAAA,MACP,GAAG;AAAA,MACH,GAAG;AAAA,MACH,SAAS;AAAA,IACX,CAAC;AAAA,IACD,KAAK,IAAI;AAAA,EACX,CAAC;AACH,GATiB;AAWV,IAAM,OAAO,wBAAC,WAAoC;AACvD,QAAM,UAAU,UAAU,MAAM;AAEhC,SAAO,UAAU,SAAS,SAAS,OAAO,aAAa,QAAQ,IAAI,CAAC;AACtE,GAJoB;","names":[]}
1
+ {"version":3,"sources":["../../../src/libs/application/application.factory.ts","../../../src/utils/formatting.ts","../../../src/utils/name.ts","../../../src/defaults.ts"],"sourcesContent":["import { type Path, join, normalize, strings } from \"@angular-devkit/core\";\nimport {\n type Rule,\n type SchematicContext,\n type Source,\n type Tree,\n apply,\n applyTemplates,\n mergeWith,\n move,\n url,\n} from \"@angular-devkit/schematics\";\nimport { firstValueFrom } from \"rxjs\";\n\nimport { toKebabCase } from \"@utils/formatting\";\nimport { resolvePackageName } from \"@utils/name\";\n\nimport {\n DEFAULT_APP_NAME,\n DEFAULT_AUTHOR,\n DEFAULT_DESCRIPTION,\n DEFAULT_LANGUAGE,\n DEFAULT_PACKAGE_MANAGER,\n DEFAULT_VERSION,\n} from \"~/defaults\";\n\nimport { type ApplicationOptions } from \"./application.options\";\nimport { type ApplicationSchema } from \"./application.schema\";\n\nconst transform = (schema: ApplicationSchema): ApplicationOptions => {\n const name = resolvePackageName(toKebabCase(schema.name?.toString() ?? DEFAULT_APP_NAME));\n\n return {\n name,\n version: schema.version ?? DEFAULT_VERSION,\n author: schema.author ?? DEFAULT_AUTHOR,\n description: schema.description ?? DEFAULT_DESCRIPTION,\n language: schema.language ?? DEFAULT_LANGUAGE,\n strict: schema.strict ?? true,\n lint: schema.lint ?? true,\n packageManager: schema.packageManager ?? DEFAULT_PACKAGE_MANAGER,\n server: schema.server ?? false,\n };\n};\n\nconst generate = (options: ApplicationOptions, path: string): Source => {\n return apply(url(join(\"./files\" as Path, options.language)), [\n applyTemplates({\n ...strings,\n ...options,\n }),\n move(normalize(path)),\n ]);\n};\n\nexport const main = (schema: ApplicationSchema): Rule => {\n const options = transform(schema);\n const path = schema.directory ?? options.name;\n\n return async (baseTree: Tree, context: SchematicContext) => {\n let tree = await mergeWith(generate(options, path))(baseTree, context);\n if (!tree) return tree;\n if (!(\"delete\" in tree)) {\n if (typeof tree === \"function\") return tree;\n tree = await firstValueFrom(tree);\n }\n\n if (!options.lint) {\n const basePath = join(\"/\" as Path, path);\n tree.delete(join(basePath, \"eslint.config.js\"));\n tree.delete(join(basePath, \"prettier.config.js\"));\n tree.delete(join(basePath, \".prettierignore\"));\n if (options.language === \"js\") tree.delete(join(basePath, \"jsconfig.json\"));\n }\n\n return tree;\n };\n};\n","export const toKebabCase = (str: string): string => {\n return str\n .replace(/([a-z0-9]|(?=[A-Z]))([A-Z])/g, \"$1-$2\")\n .replace(/[\\s_]+/g, \"-\")\n .toLowerCase();\n};\n","import { basename, parse } from \"path\";\n\nexport const resolvePackageName = (path: string): string => {\n const { base: baseFilename, dir: dirname } = parse(path);\n if (baseFilename === \".\") {\n return basename(process.cwd());\n }\n if (dirname.match(/^@[^\\s]/)) {\n return `${dirname}/${baseFilename}`;\n }\n return baseFilename;\n};\n","export const DEFAULT_APP_NAME = \"nanoforge-app\";\nexport const DEFAULT_VERSION = \"0.0.0\";\nexport const DEFAULT_AUTHOR = \"\";\nexport const DEFAULT_DESCRIPTION = \"\";\nexport const DEFAULT_LANGUAGE = \"ts\";\nexport const DEFAULT_PACKAGE_MANAGER = \"npm\";\nexport const DEFAULT_CONFIG = {\n client: {\n build: {\n entryFile: \"client/main.ts\",\n outDir: \".nanoforge/client\",\n },\n runtime: {\n dir: \".nanoforge/client\",\n },\n },\n};\nexport const DEFAULT_SERVER_CONFIG = {\n server: {\n enable: true,\n build: {\n entryFile: \"server/main.ts\",\n outDir: \".nanoforge/server\",\n },\n runtime: {\n dir: \".nanoforge/server\",\n },\n },\n};\n"],"mappings":";;;;AAAA,SAAoB,MAAM,WAAW,eAAe;AACpD;AAAA,EAKE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,sBAAsB;;;ACZxB,IAAM,cAAc,wBAAC,QAAwB;AAClD,SAAO,IACJ,QAAQ,gCAAgC,OAAO,EAC/C,QAAQ,WAAW,GAAG,EACtB,YAAY;AACjB,GAL2B;;;ACA3B,SAAS,UAAU,aAAa;AAEzB,IAAM,qBAAqB,wBAAC,SAAyB;AAC1D,QAAM,EAAE,MAAM,cAAc,KAAK,QAAQ,IAAI,MAAM,IAAI;AACvD,MAAI,iBAAiB,KAAK;AACxB,WAAO,SAAS,QAAQ,IAAI,CAAC;AAAA,EAC/B;AACA,MAAI,QAAQ,MAAM,SAAS,GAAG;AAC5B,WAAO,GAAG,OAAO,IAAI,YAAY;AAAA,EACnC;AACA,SAAO;AACT,GATkC;;;ACF3B,IAAM,mBAAmB;AACzB,IAAM,kBAAkB;AACxB,IAAM,iBAAiB;AACvB,IAAM,sBAAsB;AAC5B,IAAM,mBAAmB;AACzB,IAAM,0BAA0B;;;AHwBvC,IAAM,YAAY,wBAAC,WAAkD;AACnE,QAAM,OAAO,mBAAmB,YAAY,OAAO,MAAM,SAAS,KAAK,gBAAgB,CAAC;AAExF,SAAO;AAAA,IACL;AAAA,IACA,SAAS,OAAO,WAAW;AAAA,IAC3B,QAAQ,OAAO,UAAU;AAAA,IACzB,aAAa,OAAO,eAAe;AAAA,IACnC,UAAU,OAAO,YAAY;AAAA,IAC7B,QAAQ,OAAO,UAAU;AAAA,IACzB,MAAM,OAAO,QAAQ;AAAA,IACrB,gBAAgB,OAAO,kBAAkB;AAAA,IACzC,QAAQ,OAAO,UAAU;AAAA,EAC3B;AACF,GAdkB;AAgBlB,IAAM,WAAW,wBAAC,SAA6B,SAAyB;AACtE,SAAO,MAAM,IAAI,KAAK,WAAmB,QAAQ,QAAQ,CAAC,GAAG;AAAA,IAC3D,eAAe;AAAA,MACb,GAAG;AAAA,MACH,GAAG;AAAA,IACL,CAAC;AAAA,IACD,KAAK,UAAU,IAAI,CAAC;AAAA,EACtB,CAAC;AACH,GARiB;AAUV,IAAM,OAAO,wBAAC,WAAoC;AACvD,QAAM,UAAU,UAAU,MAAM;AAChC,QAAM,OAAO,OAAO,aAAa,QAAQ;AAEzC,SAAO,OAAO,UAAgB,YAA8B;AAC1D,QAAI,OAAO,MAAM,UAAU,SAAS,SAAS,IAAI,CAAC,EAAE,UAAU,OAAO;AACrE,QAAI,CAAC,KAAM,QAAO;AAClB,QAAI,EAAE,YAAY,OAAO;AACvB,UAAI,OAAO,SAAS,WAAY,QAAO;AACvC,aAAO,MAAM,eAAe,IAAI;AAAA,IAClC;AAEA,QAAI,CAAC,QAAQ,MAAM;AACjB,YAAM,WAAW,KAAK,KAAa,IAAI;AACvC,WAAK,OAAO,KAAK,UAAU,kBAAkB,CAAC;AAC9C,WAAK,OAAO,KAAK,UAAU,oBAAoB,CAAC;AAChD,WAAK,OAAO,KAAK,UAAU,iBAAiB,CAAC;AAC7C,UAAI,QAAQ,aAAa,KAAM,MAAK,OAAO,KAAK,UAAU,eAAe,CAAC;AAAA,IAC5E;AAEA,WAAO;AAAA,EACT;AACF,GAtBoB;","names":[]}
@@ -5,30 +5,32 @@
5
5
  "author": "<%= author %>",
6
6
  "scripts": {
7
7
  "build": "nf build",
8
- "start": "nf start",
8
+ "start": "nf start"<% if (lint) { %>,
9
9
  "lint": "prettier --check . && eslint --format=pretty \"{client,server}/**/*.js\"",
10
- "format": "prettier --write . && eslint --fix --format=pretty \"{client,server}/**/*.js\""
10
+ "format": "prettier --write . && eslint --fix --format=pretty \"{client,server}/**/*.js\""<% } %>
11
11
  },
12
- "devDependencies": {
13
- "@eslint/js": "^9.39.0",
12
+ "devDependencies": {<% if (lint) { %>
13
+ "@eslint/js": "^9.39.0",<% } %>
14
14
  "@nanoforge-dev/asset-manager": "^1",
15
15
  "@nanoforge-dev/cli": "latest",
16
16
  "@nanoforge-dev/common": "^1",
17
17
  "@nanoforge-dev/config": "^1",
18
18
  "@nanoforge-dev/core": "^1",
19
- "@nanoforge-dev/ecs-client": "^1",<%= !!server ? "\n \"@nanoforge-dev/ecs-server\": \"^1\"," : "" %>
19
+ "@nanoforge-dev/ecs-client": "^1",<% if (server) { %>
20
+ "@nanoforge-dev/ecs-server": "^1",<% } %>
20
21
  "@nanoforge-dev/graphics-2d": "^1",
21
22
  "@nanoforge-dev/input": "^1",
22
- "@nanoforge-dev/music": "^1",<%= !!server ? "\n \"@nanoforge-dev/network-client\": \"^1\"," : "" %><%= !!server ? "\n \"@nanoforge-dev/network-server\": \"^1\"," : "" %>
23
- "@nanoforge-dev/sound": "^1",
23
+ "@nanoforge-dev/music": "^1",<% if (server) { %>
24
+ "@nanoforge-dev/network-client": "^1",
25
+ "@nanoforge-dev/network-server": "^1",<% } %>
26
+ "@nanoforge-dev/sound": "^1"<% if (lint) { %>,
24
27
  "eslint": "^9.39.0",
25
28
  "eslint-config-prettier": "^10.1.8",
26
29
  "eslint-plugin-prettier": "^5.5.4",
27
30
  "globals": "^16.5.0",
28
31
  "lint-staged": "^16.2.6",
29
- "prettier": "^3.6.2"
30
- },
31
- "private": true,
32
+ "prettier": "^3.6.2"<% } %>
33
+ },<% if (lint) { %>
32
34
  "lint-staged": {
33
35
  "**/*.js": [
34
36
  "prettier --write"
@@ -36,5 +38,9 @@
36
38
  "{client,server}/**/*.js": [
37
39
  "eslint --fix"
38
40
  ]
39
- }
41
+ },<% } %><% if (packageManager === "pnpm") { %>
42
+ "pnpm": {
43
+ "neverBuiltDependencies": []
44
+ },<% } %>
45
+ "private": true
40
46
  }
@@ -5,22 +5,25 @@
5
5
  "author": "<%= author %>",
6
6
  "scripts": {
7
7
  "build": "nf build",
8
- "start": "nf start",
8
+ "start": "nf start"<% if (lint) { %>,
9
9
  "lint": "prettier --check . && eslint --format=pretty \"{client,server}/**/*.ts\"",
10
- "format": "prettier --write . && eslint --fix --format=pretty \"{client,server}/**/*.ts\""
10
+ "format": "prettier --write . && eslint --fix --format=pretty \"{client,server}/**/*.ts\""<% } %>
11
11
  },
12
- "devDependencies": {
13
- "@eslint/js": "^9.39.0",
12
+ "devDependencies": {<% if (lint) { %>
13
+ "@eslint/js": "^9.39.0",<% } %>
14
14
  "@nanoforge-dev/asset-manager": "^1",
15
15
  "@nanoforge-dev/cli": "latest",
16
16
  "@nanoforge-dev/common": "^1",
17
17
  "@nanoforge-dev/config": "^1",
18
18
  "@nanoforge-dev/core": "^1",
19
- "@nanoforge-dev/ecs-client": "^1",<%= !!server ? "\n \"@nanoforge-dev/ecs-server\": \"^1\"," : "" %>
19
+ "@nanoforge-dev/ecs-client": "^1",<% if (server) { %>
20
+ "@nanoforge-dev/ecs-server": "^1",<% } %>
20
21
  "@nanoforge-dev/graphics-2d": "^1",
21
22
  "@nanoforge-dev/input": "^1",
22
- "@nanoforge-dev/music": "^1",<%= !!server ? "\n \"@nanoforge-dev/network-client\": \"^1\"," : "" %><%= !!server ? "\n \"@nanoforge-dev/network-server\": \"^1\"," : "" %>
23
- "@nanoforge-dev/sound": "^1",
23
+ "@nanoforge-dev/music": "^1",<% if (server) { %>
24
+ "@nanoforge-dev/network-client": "^1",
25
+ "@nanoforge-dev/network-server": "^1",<% } %>
26
+ "@nanoforge-dev/sound": "^1",<% if (lint) { %>
24
27
  "@typescript-eslint/eslint-plugin": "^8.46.2",
25
28
  "@typescript-eslint/parser": "^8.46.2",
26
29
  "eslint": "^9.39.0",
@@ -28,11 +31,10 @@
28
31
  "eslint-plugin-prettier": "^5.5.4",
29
32
  "globals": "^16.5.0",
30
33
  "lint-staged": "^16.2.6",
31
- "prettier": "^3.6.2",
32
- "typescript": "^5.9.3",
33
- "typescript-eslint": "^8.46.2"
34
- },
35
- "private": true,
34
+ "prettier": "^3.6.2",<% } %>
35
+ "typescript": "^5.9.3"<% if (lint) { %>,
36
+ "typescript-eslint": "^8.46.2"<% } %>
37
+ },<% if (lint) { %>
36
38
  "lint-staged": {
37
39
  "**/*.ts": [
38
40
  "prettier --write"
@@ -40,5 +42,9 @@
40
42
  "{client,server}/**/*.ts": [
41
43
  "eslint --fix"
42
44
  ]
43
- }
45
+ },<% } %><% if (packageManager === "pnpm") { %>
46
+ "pnpm": {
47
+ "neverBuiltDependencies": []
48
+ },<% } %>
49
+ "private": true
44
50
  }
@@ -43,6 +43,11 @@
43
43
  "description": "With strict mode (TypeScript or JavaScript but only on compatible editor)",
44
44
  "default": true
45
45
  },
46
+ "lint": {
47
+ "type": "boolean",
48
+ "description": "Generate lint files",
49
+ "default": true
50
+ },
46
51
  "packageManager": {
47
52
  "type": "string",
48
53
  "enum": ["npm", "yarn", "pnpm", "bun"],
@@ -15,6 +15,11 @@ interface ConfigurationSchema {
15
15
  * Configure a server for the application
16
16
  */
17
17
  server?: boolean;
18
+
19
+ /**
20
+ * NanoForge Application language
21
+ */
22
+ language?: "js" | "ts";
18
23
  }
19
24
 
20
25
  declare const main: (schema: ConfigurationSchema) => Rule;
@@ -2,7 +2,7 @@ var __defProp = Object.defineProperty;
2
2
  var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
3
 
4
4
  // src/libs/configuration/configuration.factory.ts
5
- import { join as join2, strings } from "@angular-devkit/core";
5
+ import { join as join2, normalize, strings } from "@angular-devkit/core";
6
6
  import {
7
7
  apply,
8
8
  branchAndMerge,
@@ -34,7 +34,6 @@ var deepMerge = /* @__PURE__ */ __name((target, ...sources) => {
34
34
  }, "deepMerge");
35
35
 
36
36
  // src/defaults.ts
37
- var DEFAULT_APP_NAME = "nanoforge-app";
38
37
  var DEFAULT_CONFIG = {
39
38
  client: {
40
39
  build: {
@@ -110,31 +109,19 @@ var ConfigFinder = class {
110
109
  }
111
110
  };
112
111
 
113
- // src/utils/formatting.ts
114
- var toKebabCase = /* @__PURE__ */ __name((str) => {
115
- return str.replace(/([a-z0-9]|(?=[A-Z]))([A-Z])/g, "$1-$2").replace(/[\s_]+/g, "-").toLowerCase();
116
- }, "toKebabCase");
117
-
118
- // src/utils/name.ts
119
- import { basename, parse } from "path";
120
- var resolvePackageName = /* @__PURE__ */ __name((path) => {
121
- const { base: baseFilename, dir: dirname } = parse(path);
122
- if (baseFilename === ".") {
123
- return basename(process.cwd());
124
- }
125
- if (dirname.match(/^@[^\s]/)) {
126
- return `${dirname}/${baseFilename}`;
127
- }
128
- return baseFilename;
129
- }, "resolvePackageName");
130
-
131
112
  // src/libs/configuration/configuration.factory.ts
132
113
  var transform = /* @__PURE__ */ __name((schema) => {
133
- return {
114
+ const res = {
134
115
  server: {
135
116
  enable: schema.server ?? false
136
117
  }
137
118
  };
119
+ if (schema.language === "js") {
120
+ res["client"] = { build: { entryFile: "client/main.js" } };
121
+ if (schema.server && "server" in res && res.server)
122
+ res.server["build"] = { entryFile: "server/main.js" };
123
+ }
124
+ return res;
138
125
  }, "transform");
139
126
  var generate = /* @__PURE__ */ __name((options, path) => {
140
127
  return apply(url(join2("./files")), [
@@ -142,7 +129,7 @@ var generate = /* @__PURE__ */ __name((options, path) => {
142
129
  ...strings,
143
130
  ...options
144
131
  }),
145
- move(path)
132
+ move(normalize(path))
146
133
  ]);
147
134
  }, "generate");
148
135
  var addConfiguration = /* @__PURE__ */ __name((options, path) => {
@@ -158,7 +145,7 @@ var addConfiguration = /* @__PURE__ */ __name((options, path) => {
158
145
  }, "addConfiguration");
159
146
  var main = /* @__PURE__ */ __name((schema) => {
160
147
  const options = transform(schema);
161
- const directory = schema.directory ?? resolvePackageName(toKebabCase(schema.name?.toString() ?? DEFAULT_APP_NAME));
148
+ const directory = schema.directory ?? schema.name;
162
149
  return branchAndMerge(
163
150
  chain([mergeWith(generate(options, directory)), addConfiguration(options, directory)])
164
151
  );
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/libs/configuration/configuration.factory.ts","../../../src/utils/object.ts","../../../src/defaults.ts","../../../src/utils/config/config.declarator.ts","../../../src/utils/config/config.finder.ts","../../../src/utils/formatting.ts","../../../src/utils/name.ts"],"sourcesContent":["import { type Path, join, strings } from \"@angular-devkit/core\";\nimport {\n type Rule,\n type Source,\n type Tree,\n apply,\n branchAndMerge,\n chain,\n mergeWith,\n move,\n template,\n url,\n} from \"@angular-devkit/schematics\";\n\nimport { ConfigDeclarator } from \"@utils/config/config.declarator\";\nimport { ConfigFinder } from \"@utils/config/config.finder\";\nimport { toKebabCase } from \"@utils/formatting\";\nimport { resolvePackageName } from \"@utils/name\";\n\nimport { DEFAULT_APP_NAME } from \"~/defaults\";\n\nimport { type ConfigurationOptions } from \"./configuration.options\";\nimport { type ConfigurationSchema } from \"./configuration.schema\";\n\nconst transform = (schema: ConfigurationSchema): ConfigurationOptions => {\n return {\n server: {\n enable: schema.server ?? false,\n },\n };\n};\n\nconst generate = (options: ConfigurationOptions, path: string): Source => {\n return apply(url(join(\"./files\" as Path)), [\n template({\n ...strings,\n ...options,\n }),\n move(path),\n ]);\n};\n\nconst addConfiguration = (options: ConfigurationOptions, path: Path) => {\n return (tree: Tree) => {\n const config = new ConfigFinder(tree).find(path);\n if (!config) return tree;\n\n const content = tree.read(config)?.toString();\n const declarator = new ConfigDeclarator();\n\n if (!content) return tree;\n\n tree.overwrite(config, declarator.declare(content, options));\n return tree;\n };\n};\n\nexport const main = (schema: ConfigurationSchema): Rule => {\n const options = transform(schema);\n const directory =\n schema.directory ??\n resolvePackageName(toKebabCase(schema.name?.toString() ?? DEFAULT_APP_NAME));\n\n return branchAndMerge(\n chain([mergeWith(generate(options, directory)), addConfiguration(options, directory as Path)]),\n );\n};\n","export const isObject = (item: any) => {\n return item && typeof item === \"object\" && !Array.isArray(item);\n};\n\nexport const deepMerge = (target: any, ...sources: [any, ...any[]]): any => {\n if (!sources.length) return target;\n const source = sources.shift();\n\n if (isObject(target) && isObject(source)) {\n for (const key in source) {\n if (isObject(source[key])) {\n if (!target[key]) Object.assign(target, { [key]: {} });\n deepMerge(target[key], source[key]);\n } else {\n Object.assign(target, { [key]: source[key] });\n }\n }\n }\n\n return deepMerge(target, ...sources);\n};\n","export const DEFAULT_APP_NAME = \"nanoforge-app\";\nexport const DEFAULT_VERSION = \"0.0.0\";\nexport const DEFAULT_AUTHOR = \"\";\nexport const DEFAULT_DESCRIPTION = \"\";\nexport const DEFAULT_LANGUAGE = \"ts\";\nexport const DEFAULT_PACKAGE_MANAGER = \"npm\";\nexport const DEFAULT_CONFIG = {\n client: {\n build: {\n entryFile: \"client/main.ts\",\n outDir: \".nanoforge/client\",\n },\n runtime: {\n dir: \".nanoforge/client\",\n },\n },\n};\nexport const DEFAULT_SERVER_CONFIG = {\n server: {\n enable: true,\n build: {\n entryFile: \"server/main.ts\",\n outDir: \".nanoforge/server\",\n },\n runtime: {\n dir: \".nanoforge/server\",\n },\n },\n};\n","import { type Config } from \"@utils/config/config.type\";\nimport { deepMerge } from \"@utils/object\";\nimport { type DeepPartial } from \"@utils/types\";\n\nimport { DEFAULT_CONFIG, DEFAULT_SERVER_CONFIG } from \"~/defaults\";\n\nexport class ConfigDeclarator {\n public declare(baseContent: string, options: DeepPartial<Config>): string {\n const content = JSON.parse(baseContent);\n const hasServer = content.server?.enable ?? options.server?.enable ?? false;\n return JSON.stringify(\n deepMerge(\n DEFAULT_CONFIG,\n hasServer ? DEFAULT_SERVER_CONFIG : undefined,\n baseContent,\n options,\n ),\n null,\n 2,\n );\n }\n}\n","import { type Path, join } from \"@angular-devkit/core\";\nimport { type DirEntry, type Tree } from \"@angular-devkit/schematics\";\n\nexport interface FindOptions {\n path: Path;\n}\n\nexport class ConfigFinder {\n constructor(private tree: Tree) {}\n\n public find(path: Path): Path | null {\n const dir = this.tree.getDir(path);\n return this.findIn(dir);\n }\n\n /**\n * Recursively searches for the module file in the given directory.\n *\n * @param directory - The directory to search in.\n * @returns The path to the module file, or null if not found.\n */\n private findIn(directory: DirEntry | null): Path | null {\n if (!directory) {\n return null;\n }\n const moduleFilename = directory.subfiles.find((filename) =>\n /^nanoforge.config.json$/.test(filename),\n );\n return moduleFilename !== undefined\n ? join(directory.path, moduleFilename.valueOf())\n : this.findIn(directory.parent);\n }\n}\n","export const toKebabCase = (str: string): string => {\n return str\n .replace(/([a-z0-9]|(?=[A-Z]))([A-Z])/g, \"$1-$2\")\n .replace(/[\\s_]+/g, \"-\")\n .toLowerCase();\n};\n","import { basename, parse } from \"path\";\n\nexport const resolvePackageName = (path: string): string => {\n const { base: baseFilename, dir: dirname } = parse(path);\n if (baseFilename === \".\") {\n return basename(process.cwd());\n }\n if (dirname.match(/^@[^\\s]/)) {\n return `${dirname}/${baseFilename}`;\n }\n return baseFilename;\n};\n"],"mappings":"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","names":["join","join"]}
1
+ {"version":3,"sources":["../../../src/libs/configuration/configuration.factory.ts","../../../src/utils/object.ts","../../../src/defaults.ts","../../../src/utils/config/config.declarator.ts","../../../src/utils/config/config.finder.ts"],"sourcesContent":["import { type Path, join, normalize, strings } from \"@angular-devkit/core\";\nimport {\n type Rule,\n type Source,\n type Tree,\n apply,\n branchAndMerge,\n chain,\n mergeWith,\n move,\n template,\n url,\n} from \"@angular-devkit/schematics\";\n\nimport { ConfigDeclarator } from \"@utils/config/config.declarator\";\nimport { ConfigFinder } from \"@utils/config/config.finder\";\n\nimport { type ConfigurationOptions } from \"./configuration.options\";\nimport { type ConfigurationSchema } from \"./configuration.schema\";\n\nconst transform = (schema: ConfigurationSchema): ConfigurationOptions => {\n const res: ConfigurationOptions = {\n server: {\n enable: schema.server ?? false,\n },\n };\n\n if (schema.language === \"js\") {\n res[\"client\"] = { build: { entryFile: \"client/main.js\" } };\n if (schema.server && \"server\" in res && res.server)\n res.server[\"build\"] = { entryFile: \"server/main.js\" };\n }\n\n return res;\n};\n\nconst generate = (options: ConfigurationOptions, path: string): Source => {\n return apply(url(join(\"./files\" as Path)), [\n template({\n ...strings,\n ...options,\n }),\n move(normalize(path)),\n ]);\n};\n\nconst addConfiguration = (options: ConfigurationOptions, path: Path) => {\n return (tree: Tree) => {\n const config = new ConfigFinder(tree).find(path);\n if (!config) return tree;\n\n const content = tree.read(config)?.toString();\n const declarator = new ConfigDeclarator();\n\n if (!content) return tree;\n\n tree.overwrite(config, declarator.declare(content, options));\n return tree;\n };\n};\n\nexport const main = (schema: ConfigurationSchema): Rule => {\n const options = transform(schema);\n const directory = schema.directory ?? schema.name;\n\n return branchAndMerge(\n chain([mergeWith(generate(options, directory)), addConfiguration(options, directory as Path)]),\n );\n};\n","export const isObject = (item: any) => {\n return item && typeof item === \"object\" && !Array.isArray(item);\n};\n\nexport const deepMerge = (target: any, ...sources: [any, ...any[]]): any => {\n if (!sources.length) return target;\n const source = sources.shift();\n\n if (isObject(target) && isObject(source)) {\n for (const key in source) {\n if (isObject(source[key])) {\n if (!target[key]) Object.assign(target, { [key]: {} });\n deepMerge(target[key], source[key]);\n } else {\n Object.assign(target, { [key]: source[key] });\n }\n }\n }\n\n return deepMerge(target, ...sources);\n};\n","export const DEFAULT_APP_NAME = \"nanoforge-app\";\nexport const DEFAULT_VERSION = \"0.0.0\";\nexport const DEFAULT_AUTHOR = \"\";\nexport const DEFAULT_DESCRIPTION = \"\";\nexport const DEFAULT_LANGUAGE = \"ts\";\nexport const DEFAULT_PACKAGE_MANAGER = \"npm\";\nexport const DEFAULT_CONFIG = {\n client: {\n build: {\n entryFile: \"client/main.ts\",\n outDir: \".nanoforge/client\",\n },\n runtime: {\n dir: \".nanoforge/client\",\n },\n },\n};\nexport const DEFAULT_SERVER_CONFIG = {\n server: {\n enable: true,\n build: {\n entryFile: \"server/main.ts\",\n outDir: \".nanoforge/server\",\n },\n runtime: {\n dir: \".nanoforge/server\",\n },\n },\n};\n","import { type Config } from \"@utils/config/config.type\";\nimport { deepMerge } from \"@utils/object\";\nimport { type DeepPartial } from \"@utils/types\";\n\nimport { DEFAULT_CONFIG, DEFAULT_SERVER_CONFIG } from \"~/defaults\";\n\nexport class ConfigDeclarator {\n public declare(baseContent: string, options: DeepPartial<Config>): string {\n const content = JSON.parse(baseContent);\n const hasServer = content.server?.enable ?? options.server?.enable ?? false;\n return JSON.stringify(\n deepMerge(\n DEFAULT_CONFIG,\n hasServer ? DEFAULT_SERVER_CONFIG : undefined,\n baseContent,\n options,\n ),\n null,\n 2,\n );\n }\n}\n","import { type Path, join } from \"@angular-devkit/core\";\nimport { type DirEntry, type Tree } from \"@angular-devkit/schematics\";\n\nexport interface FindOptions {\n path: Path;\n}\n\nexport class ConfigFinder {\n constructor(private tree: Tree) {}\n\n public find(path: Path): Path | null {\n const dir = this.tree.getDir(path);\n return this.findIn(dir);\n }\n\n /**\n * Recursively searches for the module file in the given directory.\n *\n * @param directory - The directory to search in.\n * @returns The path to the module file, or null if not found.\n */\n private findIn(directory: DirEntry | null): Path | null {\n if (!directory) {\n return null;\n }\n const moduleFilename = directory.subfiles.find((filename) =>\n /^nanoforge.config.json$/.test(filename),\n );\n return moduleFilename !== undefined\n ? join(directory.path, moduleFilename.valueOf())\n : this.findIn(directory.parent);\n }\n}\n"],"mappings":"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","names":["join","join"]}
@@ -21,6 +21,12 @@
21
21
  "type": "boolean",
22
22
  "description": "Server configuration",
23
23
  "default": false
24
+ },
25
+ "language": {
26
+ "type": "string",
27
+ "enum": ["ts", "js"],
28
+ "description": "NanoForge application language",
29
+ "default": "ts"
24
30
  }
25
31
  },
26
32
  "required": ["name"]
@@ -2,7 +2,7 @@ var __defProp = Object.defineProperty;
2
2
  var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
3
 
4
4
  // src/libs/docker/docker.factory.ts
5
- import { strings } from "@angular-devkit/core";
5
+ import { normalize, strings } from "@angular-devkit/core";
6
6
  import {
7
7
  apply,
8
8
  mergeWith,
@@ -48,7 +48,7 @@ var generate = /* @__PURE__ */ __name((options, path) => {
48
48
  ...strings,
49
49
  ...options
50
50
  }),
51
- move(path)
51
+ move(normalize(path))
52
52
  ]);
53
53
  }, "generate");
54
54
  var main = /* @__PURE__ */ __name((schema) => {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/libs/docker/docker.factory.ts","../../../src/utils/formatting.ts","../../../src/utils/name.ts","../../../src/defaults.ts"],"sourcesContent":["import { type Path, strings } from \"@angular-devkit/core\";\nimport {\n type Rule,\n type Source,\n apply,\n mergeWith,\n move,\n template,\n url,\n} from \"@angular-devkit/schematics\";\n\nimport { toKebabCase } from \"@utils/formatting\";\nimport { resolvePackageName } from \"@utils/name\";\n\nimport { DEFAULT_APP_NAME, DEFAULT_PACKAGE_MANAGER } from \"~/defaults\";\n\nimport { type DockerOptions } from \"./docker.options\";\nimport { type DockerSchema } from \"./docker.schema\";\n\nconst transform = (schema: DockerSchema): DockerOptions => {\n const name = resolvePackageName(toKebabCase(schema.name?.toString() ?? DEFAULT_APP_NAME));\n\n return {\n name,\n packageManager: schema.packageManager ?? DEFAULT_PACKAGE_MANAGER,\n directory: schema.directory,\n };\n};\n\nconst generate = (options: DockerOptions, path: string): Source => {\n return apply(url(\"./files\" as Path), [\n template({\n ...strings,\n ...options,\n }),\n move(path),\n ]);\n};\n\nexport const main = (schema: DockerSchema): Rule => {\n const options = transform(schema);\n return mergeWith(generate(options, schema.directory ?? options.name));\n};\n","export const toKebabCase = (str: string): string => {\n return str\n .replace(/([a-z0-9]|(?=[A-Z]))([A-Z])/g, \"$1-$2\")\n .replace(/[\\s_]+/g, \"-\")\n .toLowerCase();\n};\n","import { basename, parse } from \"path\";\n\nexport const resolvePackageName = (path: string): string => {\n const { base: baseFilename, dir: dirname } = parse(path);\n if (baseFilename === \".\") {\n return basename(process.cwd());\n }\n if (dirname.match(/^@[^\\s]/)) {\n return `${dirname}/${baseFilename}`;\n }\n return baseFilename;\n};\n","export const DEFAULT_APP_NAME = \"nanoforge-app\";\nexport const DEFAULT_VERSION = \"0.0.0\";\nexport const DEFAULT_AUTHOR = \"\";\nexport const DEFAULT_DESCRIPTION = \"\";\nexport const DEFAULT_LANGUAGE = \"ts\";\nexport const DEFAULT_PACKAGE_MANAGER = \"npm\";\nexport const DEFAULT_CONFIG = {\n client: {\n build: {\n entryFile: \"client/main.ts\",\n outDir: \".nanoforge/client\",\n },\n runtime: {\n dir: \".nanoforge/client\",\n },\n },\n};\nexport const DEFAULT_SERVER_CONFIG = {\n server: {\n enable: true,\n build: {\n entryFile: \"server/main.ts\",\n outDir: \".nanoforge/server\",\n },\n runtime: {\n dir: \".nanoforge/server\",\n },\n },\n};\n"],"mappings":";;;;AAAA,SAAoB,eAAe;AACnC;AAAA,EAGE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;;;ACTA,IAAM,cAAc,wBAAC,QAAwB;AAClD,SAAO,IACJ,QAAQ,gCAAgC,OAAO,EAC/C,QAAQ,WAAW,GAAG,EACtB,YAAY;AACjB,GAL2B;;;ACA3B,SAAS,UAAU,aAAa;AAEzB,IAAM,qBAAqB,wBAAC,SAAyB;AAC1D,QAAM,EAAE,MAAM,cAAc,KAAK,QAAQ,IAAI,MAAM,IAAI;AACvD,MAAI,iBAAiB,KAAK;AACxB,WAAO,SAAS,QAAQ,IAAI,CAAC;AAAA,EAC/B;AACA,MAAI,QAAQ,MAAM,SAAS,GAAG;AAC5B,WAAO,GAAG,OAAO,IAAI,YAAY;AAAA,EACnC;AACA,SAAO;AACT,GATkC;;;ACF3B,IAAM,mBAAmB;AAKzB,IAAM,0BAA0B;;;AHcvC,IAAM,YAAY,wBAAC,WAAwC;AACzD,QAAM,OAAO,mBAAmB,YAAY,OAAO,MAAM,SAAS,KAAK,gBAAgB,CAAC;AAExF,SAAO;AAAA,IACL;AAAA,IACA,gBAAgB,OAAO,kBAAkB;AAAA,IACzC,WAAW,OAAO;AAAA,EACpB;AACF,GARkB;AAUlB,IAAM,WAAW,wBAAC,SAAwB,SAAyB;AACjE,SAAO,MAAM,IAAI,SAAiB,GAAG;AAAA,IACnC,SAAS;AAAA,MACP,GAAG;AAAA,MACH,GAAG;AAAA,IACL,CAAC;AAAA,IACD,KAAK,IAAI;AAAA,EACX,CAAC;AACH,GARiB;AAUV,IAAM,OAAO,wBAAC,WAA+B;AAClD,QAAM,UAAU,UAAU,MAAM;AAChC,SAAO,UAAU,SAAS,SAAS,OAAO,aAAa,QAAQ,IAAI,CAAC;AACtE,GAHoB;","names":[]}
1
+ {"version":3,"sources":["../../../src/libs/docker/docker.factory.ts","../../../src/utils/formatting.ts","../../../src/utils/name.ts","../../../src/defaults.ts"],"sourcesContent":["import { type Path, normalize, strings } from \"@angular-devkit/core\";\nimport {\n type Rule,\n type Source,\n apply,\n mergeWith,\n move,\n template,\n url,\n} from \"@angular-devkit/schematics\";\n\nimport { toKebabCase } from \"@utils/formatting\";\nimport { resolvePackageName } from \"@utils/name\";\n\nimport { DEFAULT_APP_NAME, DEFAULT_PACKAGE_MANAGER } from \"~/defaults\";\n\nimport { type DockerOptions } from \"./docker.options\";\nimport { type DockerSchema } from \"./docker.schema\";\n\nconst transform = (schema: DockerSchema): DockerOptions => {\n const name = resolvePackageName(toKebabCase(schema.name?.toString() ?? DEFAULT_APP_NAME));\n\n return {\n name,\n packageManager: schema.packageManager ?? DEFAULT_PACKAGE_MANAGER,\n directory: schema.directory,\n };\n};\n\nconst generate = (options: DockerOptions, path: string): Source => {\n return apply(url(\"./files\" as Path), [\n template({\n ...strings,\n ...options,\n }),\n move(normalize(path)),\n ]);\n};\n\nexport const main = (schema: DockerSchema): Rule => {\n const options = transform(schema);\n return mergeWith(generate(options, schema.directory ?? options.name));\n};\n","export const toKebabCase = (str: string): string => {\n return str\n .replace(/([a-z0-9]|(?=[A-Z]))([A-Z])/g, \"$1-$2\")\n .replace(/[\\s_]+/g, \"-\")\n .toLowerCase();\n};\n","import { basename, parse } from \"path\";\n\nexport const resolvePackageName = (path: string): string => {\n const { base: baseFilename, dir: dirname } = parse(path);\n if (baseFilename === \".\") {\n return basename(process.cwd());\n }\n if (dirname.match(/^@[^\\s]/)) {\n return `${dirname}/${baseFilename}`;\n }\n return baseFilename;\n};\n","export const DEFAULT_APP_NAME = \"nanoforge-app\";\nexport const DEFAULT_VERSION = \"0.0.0\";\nexport const DEFAULT_AUTHOR = \"\";\nexport const DEFAULT_DESCRIPTION = \"\";\nexport const DEFAULT_LANGUAGE = \"ts\";\nexport const DEFAULT_PACKAGE_MANAGER = \"npm\";\nexport const DEFAULT_CONFIG = {\n client: {\n build: {\n entryFile: \"client/main.ts\",\n outDir: \".nanoforge/client\",\n },\n runtime: {\n dir: \".nanoforge/client\",\n },\n },\n};\nexport const DEFAULT_SERVER_CONFIG = {\n server: {\n enable: true,\n build: {\n entryFile: \"server/main.ts\",\n outDir: \".nanoforge/server\",\n },\n runtime: {\n dir: \".nanoforge/server\",\n },\n },\n};\n"],"mappings":";;;;AAAA,SAAoB,WAAW,eAAe;AAC9C;AAAA,EAGE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;;;ACTA,IAAM,cAAc,wBAAC,QAAwB;AAClD,SAAO,IACJ,QAAQ,gCAAgC,OAAO,EAC/C,QAAQ,WAAW,GAAG,EACtB,YAAY;AACjB,GAL2B;;;ACA3B,SAAS,UAAU,aAAa;AAEzB,IAAM,qBAAqB,wBAAC,SAAyB;AAC1D,QAAM,EAAE,MAAM,cAAc,KAAK,QAAQ,IAAI,MAAM,IAAI;AACvD,MAAI,iBAAiB,KAAK;AACxB,WAAO,SAAS,QAAQ,IAAI,CAAC;AAAA,EAC/B;AACA,MAAI,QAAQ,MAAM,SAAS,GAAG;AAC5B,WAAO,GAAG,OAAO,IAAI,YAAY;AAAA,EACnC;AACA,SAAO;AACT,GATkC;;;ACF3B,IAAM,mBAAmB;AAKzB,IAAM,0BAA0B;;;AHcvC,IAAM,YAAY,wBAAC,WAAwC;AACzD,QAAM,OAAO,mBAAmB,YAAY,OAAO,MAAM,SAAS,KAAK,gBAAgB,CAAC;AAExF,SAAO;AAAA,IACL;AAAA,IACA,gBAAgB,OAAO,kBAAkB;AAAA,IACzC,WAAW,OAAO;AAAA,EACpB;AACF,GARkB;AAUlB,IAAM,WAAW,wBAAC,SAAwB,SAAyB;AACjE,SAAO,MAAM,IAAI,SAAiB,GAAG;AAAA,IACnC,SAAS;AAAA,MACP,GAAG;AAAA,MACH,GAAG;AAAA,IACL,CAAC;AAAA,IACD,KAAK,UAAU,IAAI,CAAC;AAAA,EACtB,CAAC;AACH,GARiB;AAUV,IAAM,OAAO,wBAAC,WAA+B;AAClD,QAAM,UAAU,UAAU,MAAM;AAChC,SAAO,UAAU,SAAS,SAAS,OAAO,aAAa,QAAQ,IAAI,CAAC;AACtE,GAHoB;","names":[]}
@@ -10,9 +10,9 @@
10
10
  {
11
11
  "id": "ecsLibrary",
12
12
  "type": "component-system",
13
- "name": "ECSLibrary",
14
- "path": "@nanoforge-dev/ecs",
15
- "params": ["\"client\""]
13
+ "name": "ECSClientLibrary",
14
+ "path": "@nanoforge-dev/ecs-client",
15
+ "params": []
16
16
  },
17
17
  {
18
18
  "id": "graphicsLibrary",
@@ -34,7 +34,14 @@
34
34
  "name": "MusicLibrary",
35
35
  "path": "@nanoforge-dev/music",
36
36
  "params": []
37
- },<%= !server ? "" : "\n {\n \"id\": \"networkLibrary\",\n \"type\": \"network\",\n \"name\": \"NetworkClientLibrary\",\n \"path\": \"@nanoforge-dev/network-client\",\n \"params\": []\n }," %>
37
+ },<% if (server) { %>
38
+ {
39
+ "id": "networkLibrary",
40
+ "type": "network",
41
+ "name": "NetworkClientLibrary",
42
+ "path": "@nanoforge-dev/network-client",
43
+ "params": []
44
+ },<% } %>
38
45
  {
39
46
  "id": "soundLibrary",
40
47
  "type": "sound",
@@ -10,10 +10,17 @@
10
10
  {
11
11
  "id": "ecsLibrary",
12
12
  "type": "component-system",
13
- "name": "ECSLibrary",
14
- "path": "@nanoforge-dev/ecs",
15
- "params": ["\"server\""]
16
- }<%= !server ? "" : ",\n {\n \"id\": \"networkLibrary\",\n \"type\": \"network\",\n \"name\": \"NetworkServerLibrary\",\n \"path\": \"@nanoforge-dev/network-server\",\n \"params\": []\n }" %>
13
+ "name": "ECSServerLibrary",
14
+ "path": "@nanoforge-dev/ecs-server",
15
+ "params": []
16
+ }<% if (server) { %>,
17
+ {
18
+ "id": "networkLibrary",
19
+ "type": "network",
20
+ "name": "NetworkServerLibrary",
21
+ "path": "@nanoforge-dev/network-server",
22
+ "params": []
23
+ }<% } %>
17
24
  ],
18
25
  "components": [
19
26
  {
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @typedef {import("@nanoforge-dev/ecs").EditorComponentManifest} EditorComponentManifest
2
+ * @typedef {import("@nanoforge-dev/ecs-<%= part %>").EditorComponentManifest} EditorComponentManifest
3
3
  */
4
4
 
5
5
  export class ExampleComponent {
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * @typedef {import("@nanoforge-dev/common").Context} Context
3
- * @typedef {import("@nanoforge-dev/ecs").EditorSystemManifest} EditorSystemManifest
4
- * @typedef {import("@nanoforge-dev/ecs").Registry} Registry
3
+ * @typedef {import("@nanoforge-dev/ecs-<%= part %>").EditorSystemManifest} EditorSystemManifest
4
+ * @typedef {import("@nanoforge-dev/ecs-<%= part %>").Registry} Registry
5
5
  */
6
6
 
7
7
  import { ExampleComponent } from "../components/example.component";
@@ -34,7 +34,14 @@
34
34
  "name": "MusicLibrary",
35
35
  "path": "@nanoforge-dev/music",
36
36
  "params": []
37
- },<%= !server ? "" : "\n {\n \"id\": \"networkLibrary\",\n \"type\": \"network\",\n \"name\": \"NetworkClientLibrary\",\n \"path\": \"@nanoforge-dev/network-client\",\n \"params\": []\n }," %>
37
+ },<% if (server) { %>
38
+ {
39
+ "id": "networkLibrary",
40
+ "type": "network",
41
+ "name": "NetworkClientLibrary",
42
+ "path": "@nanoforge-dev/network-client",
43
+ "params": []
44
+ },<% } %>
38
45
  {
39
46
  "id": "soundLibrary",
40
47
  "type": "sound",
@@ -13,7 +13,14 @@
13
13
  "name": "ECSServerLibrary",
14
14
  "path": "@nanoforge-dev/ecs-server",
15
15
  "params": []
16
- }<%= !server ? "" : ",\n {\n \"id\": \"networkLibrary\",\n \"type\": \"network\",\n \"name\": \"NetworkServerLibrary\",\n \"path\": \"@nanoforge-dev/network-server\",\n \"params\": []\n }" %>
16
+ }<% if (server) { %>,
17
+ {
18
+ "id": "networkLibrary",
19
+ "type": "network",
20
+ "name": "NetworkServerLibrary",
21
+ "path": "@nanoforge-dev/network-server",
22
+ "params": []
23
+ }<% } %>
17
24
  ],
18
25
  "components": [
19
26
  {
@@ -2,7 +2,7 @@ var __defProp = Object.defineProperty;
2
2
  var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
3
 
4
4
  // src/libs/part-base/part-base.factory.ts
5
- import { join, strings } from "@angular-devkit/core";
5
+ import { join, normalize, strings } from "@angular-devkit/core";
6
6
  import {
7
7
  apply,
8
8
  filter,
@@ -53,7 +53,7 @@ var generate = /* @__PURE__ */ __name((options, path) => {
53
53
  ...options,
54
54
  nanoforgeFolder: ".nanoforge"
55
55
  }),
56
- move(path),
56
+ move(normalize(path)),
57
57
  filter((path2) => {
58
58
  const splited = path2.split("/");
59
59
  return splited.at(-2) !== ".nanoforge" || splited.at(-1) === `${options.part}.save.json`;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/libs/part-base/part-base.factory.ts","../../../src/utils/formatting.ts","../../../src/utils/name.ts","../../../src/defaults.ts"],"sourcesContent":["import { type Path, join, strings } from \"@angular-devkit/core\";\nimport {\n type Rule,\n type Source,\n apply,\n filter,\n mergeWith,\n move,\n template,\n url,\n} from \"@angular-devkit/schematics\";\n\nimport { toKebabCase } from \"@utils/formatting\";\nimport { resolvePackageName } from \"@utils/name\";\n\nimport { DEFAULT_APP_NAME, DEFAULT_LANGUAGE } from \"~/defaults\";\n\nimport { type PartBaseOptions } from \"./part-base.options\";\nimport { type PartBaseSchema } from \"./part-base.schema\";\n\nconst transform = (schema: PartBaseSchema): PartBaseOptions => {\n const name = resolvePackageName(toKebabCase(schema.name?.toString() ?? DEFAULT_APP_NAME));\n\n return {\n name,\n part: schema.part,\n server: schema.server,\n appClass: schema.part === \"client\" ? \"NanoforgeClient\" : \"NanoforgeServer\",\n language: schema.language ?? DEFAULT_LANGUAGE,\n initFunctions: schema.initFunctions ?? false,\n };\n};\n\nconst generate = (options: PartBaseOptions, path: string): Source => {\n const rules = [\n template({\n ...strings,\n ...options,\n nanoforgeFolder: \".nanoforge\",\n }),\n move(path),\n filter((path) => {\n const splited = path.split(\"/\");\n return splited.at(-2) !== \".nanoforge\" || splited.at(-1) === `${options.part}.save.json`;\n }),\n ];\n if (!options.initFunctions) rules.push(filter((path) => path.split(\"/\").at(-2) !== \"init\"));\n\n return apply(url(join(\"./files\" as Path, options.language)), rules);\n};\n\nexport const main = (schema: PartBaseSchema): Rule => {\n const options = transform(schema);\n\n return mergeWith(generate(options, schema.directory ?? options.name));\n};\n","export const toKebabCase = (str: string): string => {\n return str\n .replace(/([a-z0-9]|(?=[A-Z]))([A-Z])/g, \"$1-$2\")\n .replace(/[\\s_]+/g, \"-\")\n .toLowerCase();\n};\n","import { basename, parse } from \"path\";\n\nexport const resolvePackageName = (path: string): string => {\n const { base: baseFilename, dir: dirname } = parse(path);\n if (baseFilename === \".\") {\n return basename(process.cwd());\n }\n if (dirname.match(/^@[^\\s]/)) {\n return `${dirname}/${baseFilename}`;\n }\n return baseFilename;\n};\n","export const DEFAULT_APP_NAME = \"nanoforge-app\";\nexport const DEFAULT_VERSION = \"0.0.0\";\nexport const DEFAULT_AUTHOR = \"\";\nexport const DEFAULT_DESCRIPTION = \"\";\nexport const DEFAULT_LANGUAGE = \"ts\";\nexport const DEFAULT_PACKAGE_MANAGER = \"npm\";\nexport const DEFAULT_CONFIG = {\n client: {\n build: {\n entryFile: \"client/main.ts\",\n outDir: \".nanoforge/client\",\n },\n runtime: {\n dir: \".nanoforge/client\",\n },\n },\n};\nexport const DEFAULT_SERVER_CONFIG = {\n server: {\n enable: true,\n build: {\n entryFile: \"server/main.ts\",\n outDir: \".nanoforge/server\",\n },\n runtime: {\n dir: \".nanoforge/server\",\n },\n },\n};\n"],"mappings":";;;;AAAA,SAAoB,MAAM,eAAe;AACzC;AAAA,EAGE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;;;ACVA,IAAM,cAAc,wBAAC,QAAwB;AAClD,SAAO,IACJ,QAAQ,gCAAgC,OAAO,EAC/C,QAAQ,WAAW,GAAG,EACtB,YAAY;AACjB,GAL2B;;;ACA3B,SAAS,UAAU,aAAa;AAEzB,IAAM,qBAAqB,wBAAC,SAAyB;AAC1D,QAAM,EAAE,MAAM,cAAc,KAAK,QAAQ,IAAI,MAAM,IAAI;AACvD,MAAI,iBAAiB,KAAK;AACxB,WAAO,SAAS,QAAQ,IAAI,CAAC;AAAA,EAC/B;AACA,MAAI,QAAQ,MAAM,SAAS,GAAG;AAC5B,WAAO,GAAG,OAAO,IAAI,YAAY;AAAA,EACnC;AACA,SAAO;AACT,GATkC;;;ACF3B,IAAM,mBAAmB;AAIzB,IAAM,mBAAmB;;;AHgBhC,IAAM,YAAY,wBAAC,WAA4C;AAC7D,QAAM,OAAO,mBAAmB,YAAY,OAAO,MAAM,SAAS,KAAK,gBAAgB,CAAC;AAExF,SAAO;AAAA,IACL;AAAA,IACA,MAAM,OAAO;AAAA,IACb,QAAQ,OAAO;AAAA,IACf,UAAU,OAAO,SAAS,WAAW,oBAAoB;AAAA,IACzD,UAAU,OAAO,YAAY;AAAA,IAC7B,eAAe,OAAO,iBAAiB;AAAA,EACzC;AACF,GAXkB;AAalB,IAAM,WAAW,wBAAC,SAA0B,SAAyB;AACnE,QAAM,QAAQ;AAAA,IACZ,SAAS;AAAA,MACP,GAAG;AAAA,MACH,GAAG;AAAA,MACH,iBAAiB;AAAA,IACnB,CAAC;AAAA,IACD,KAAK,IAAI;AAAA,IACT,OAAO,CAACA,UAAS;AACf,YAAM,UAAUA,MAAK,MAAM,GAAG;AAC9B,aAAO,QAAQ,GAAG,EAAE,MAAM,gBAAgB,QAAQ,GAAG,EAAE,MAAM,GAAG,QAAQ,IAAI;AAAA,IAC9E,CAAC;AAAA,EACH;AACA,MAAI,CAAC,QAAQ,cAAe,OAAM,KAAK,OAAO,CAACA,UAASA,MAAK,MAAM,GAAG,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AAE1F,SAAO,MAAM,IAAI,KAAK,WAAmB,QAAQ,QAAQ,CAAC,GAAG,KAAK;AACpE,GAhBiB;AAkBV,IAAM,OAAO,wBAAC,WAAiC;AACpD,QAAM,UAAU,UAAU,MAAM;AAEhC,SAAO,UAAU,SAAS,SAAS,OAAO,aAAa,QAAQ,IAAI,CAAC;AACtE,GAJoB;","names":["path"]}
1
+ {"version":3,"sources":["../../../src/libs/part-base/part-base.factory.ts","../../../src/utils/formatting.ts","../../../src/utils/name.ts","../../../src/defaults.ts"],"sourcesContent":["import { type Path, join, normalize, strings } from \"@angular-devkit/core\";\nimport {\n type Rule,\n type Source,\n apply,\n filter,\n mergeWith,\n move,\n template,\n url,\n} from \"@angular-devkit/schematics\";\n\nimport { toKebabCase } from \"@utils/formatting\";\nimport { resolvePackageName } from \"@utils/name\";\n\nimport { DEFAULT_APP_NAME, DEFAULT_LANGUAGE } from \"~/defaults\";\n\nimport { type PartBaseOptions } from \"./part-base.options\";\nimport { type PartBaseSchema } from \"./part-base.schema\";\n\nconst transform = (schema: PartBaseSchema): PartBaseOptions => {\n const name = resolvePackageName(toKebabCase(schema.name?.toString() ?? DEFAULT_APP_NAME));\n\n return {\n name,\n part: schema.part,\n server: schema.server,\n appClass: schema.part === \"client\" ? \"NanoforgeClient\" : \"NanoforgeServer\",\n language: schema.language ?? DEFAULT_LANGUAGE,\n initFunctions: schema.initFunctions ?? false,\n };\n};\n\nconst generate = (options: PartBaseOptions, path: string): Source => {\n const rules = [\n template({\n ...strings,\n ...options,\n nanoforgeFolder: \".nanoforge\",\n }),\n move(normalize(path)),\n filter((path) => {\n const splited = path.split(\"/\");\n return splited.at(-2) !== \".nanoforge\" || splited.at(-1) === `${options.part}.save.json`;\n }),\n ];\n if (!options.initFunctions) rules.push(filter((path) => path.split(\"/\").at(-2) !== \"init\"));\n\n return apply(url(join(\"./files\" as Path, options.language)), rules);\n};\n\nexport const main = (schema: PartBaseSchema): Rule => {\n const options = transform(schema);\n\n return mergeWith(generate(options, schema.directory ?? options.name));\n};\n","export const toKebabCase = (str: string): string => {\n return str\n .replace(/([a-z0-9]|(?=[A-Z]))([A-Z])/g, \"$1-$2\")\n .replace(/[\\s_]+/g, \"-\")\n .toLowerCase();\n};\n","import { basename, parse } from \"path\";\n\nexport const resolvePackageName = (path: string): string => {\n const { base: baseFilename, dir: dirname } = parse(path);\n if (baseFilename === \".\") {\n return basename(process.cwd());\n }\n if (dirname.match(/^@[^\\s]/)) {\n return `${dirname}/${baseFilename}`;\n }\n return baseFilename;\n};\n","export const DEFAULT_APP_NAME = \"nanoforge-app\";\nexport const DEFAULT_VERSION = \"0.0.0\";\nexport const DEFAULT_AUTHOR = \"\";\nexport const DEFAULT_DESCRIPTION = \"\";\nexport const DEFAULT_LANGUAGE = \"ts\";\nexport const DEFAULT_PACKAGE_MANAGER = \"npm\";\nexport const DEFAULT_CONFIG = {\n client: {\n build: {\n entryFile: \"client/main.ts\",\n outDir: \".nanoforge/client\",\n },\n runtime: {\n dir: \".nanoforge/client\",\n },\n },\n};\nexport const DEFAULT_SERVER_CONFIG = {\n server: {\n enable: true,\n build: {\n entryFile: \"server/main.ts\",\n outDir: \".nanoforge/server\",\n },\n runtime: {\n dir: \".nanoforge/server\",\n },\n },\n};\n"],"mappings":";;;;AAAA,SAAoB,MAAM,WAAW,eAAe;AACpD;AAAA,EAGE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;;;ACVA,IAAM,cAAc,wBAAC,QAAwB;AAClD,SAAO,IACJ,QAAQ,gCAAgC,OAAO,EAC/C,QAAQ,WAAW,GAAG,EACtB,YAAY;AACjB,GAL2B;;;ACA3B,SAAS,UAAU,aAAa;AAEzB,IAAM,qBAAqB,wBAAC,SAAyB;AAC1D,QAAM,EAAE,MAAM,cAAc,KAAK,QAAQ,IAAI,MAAM,IAAI;AACvD,MAAI,iBAAiB,KAAK;AACxB,WAAO,SAAS,QAAQ,IAAI,CAAC;AAAA,EAC/B;AACA,MAAI,QAAQ,MAAM,SAAS,GAAG;AAC5B,WAAO,GAAG,OAAO,IAAI,YAAY;AAAA,EACnC;AACA,SAAO;AACT,GATkC;;;ACF3B,IAAM,mBAAmB;AAIzB,IAAM,mBAAmB;;;AHgBhC,IAAM,YAAY,wBAAC,WAA4C;AAC7D,QAAM,OAAO,mBAAmB,YAAY,OAAO,MAAM,SAAS,KAAK,gBAAgB,CAAC;AAExF,SAAO;AAAA,IACL;AAAA,IACA,MAAM,OAAO;AAAA,IACb,QAAQ,OAAO;AAAA,IACf,UAAU,OAAO,SAAS,WAAW,oBAAoB;AAAA,IACzD,UAAU,OAAO,YAAY;AAAA,IAC7B,eAAe,OAAO,iBAAiB;AAAA,EACzC;AACF,GAXkB;AAalB,IAAM,WAAW,wBAAC,SAA0B,SAAyB;AACnE,QAAM,QAAQ;AAAA,IACZ,SAAS;AAAA,MACP,GAAG;AAAA,MACH,GAAG;AAAA,MACH,iBAAiB;AAAA,IACnB,CAAC;AAAA,IACD,KAAK,UAAU,IAAI,CAAC;AAAA,IACpB,OAAO,CAACA,UAAS;AACf,YAAM,UAAUA,MAAK,MAAM,GAAG;AAC9B,aAAO,QAAQ,GAAG,EAAE,MAAM,gBAAgB,QAAQ,GAAG,EAAE,MAAM,GAAG,QAAQ,IAAI;AAAA,IAC9E,CAAC;AAAA,EACH;AACA,MAAI,CAAC,QAAQ,cAAe,OAAM,KAAK,OAAO,CAACA,UAASA,MAAK,MAAM,GAAG,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AAE1F,SAAO,MAAM,IAAI,KAAK,WAAmB,QAAQ,QAAQ,CAAC,GAAG,KAAK;AACpE,GAhBiB;AAkBV,IAAM,OAAO,wBAAC,WAAiC;AACpD,QAAM,UAAU,UAAU,MAAM;AAEhC,SAAO,UAAU,SAAS,SAAS,OAAO,aAAa,QAAQ,IAAI,CAAC;AACtE,GAJoB;","names":["path"]}
@@ -2,7 +2,7 @@ var __defProp = Object.defineProperty;
2
2
  var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
3
 
4
4
  // src/libs/part-main/part-main.factory.ts
5
- import { join, strings } from "@angular-devkit/core";
5
+ import { join, normalize, strings } from "@angular-devkit/core";
6
6
  import {
7
7
  apply,
8
8
  asSource,
@@ -194,7 +194,7 @@ var generate = /* @__PURE__ */ __name((options, path) => {
194
194
  ...strings,
195
195
  ...options
196
196
  }),
197
- move(path)
197
+ move(normalize(path))
198
198
  ];
199
199
  return apply(asSource(writeMain(options, path)), rules);
200
200
  }, "generate");
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/libs/part-main/part-main.factory.ts","../../../src/utils/formatting.ts","../../../src/utils/main/const.ts","../../../src/utils/main/main.generator.ts","../../../src/utils/main/main-functions.ts","../../../src/utils/name.ts","../../../src/defaults.ts"],"sourcesContent":["import { type Path, join, strings } from \"@angular-devkit/core\";\nimport {\n type Rule,\n type Source,\n type Tree,\n apply,\n asSource,\n mergeWith,\n move,\n template,\n} from \"@angular-devkit/schematics\";\nimport * as fs from \"node:fs\";\n\nimport { toKebabCase } from \"@utils/formatting\";\nimport { generateMain } from \"@utils/main/main-functions\";\nimport { type Save } from \"@utils/main/save.type\";\nimport { resolvePackageName } from \"@utils/name\";\n\nimport { DEFAULT_APP_NAME, DEFAULT_LANGUAGE } from \"~/defaults\";\n\nimport { type PartMainOptions } from \"./part-main.options\";\nimport { type PartMainSchema } from \"./part-main.schema\";\n\nconst transform = (schema: PartMainSchema): PartMainOptions => {\n const name = resolvePackageName(toKebabCase(schema.name?.toString() ?? DEFAULT_APP_NAME));\n\n return {\n name,\n part: schema.part,\n language: schema.language ?? DEFAULT_LANGUAGE,\n initFunctions: schema.initFunctions ?? false,\n saveFile: schema.saveFile,\n };\n};\n\nconst generate = (options: PartMainOptions, path: string): Source => {\n const rules = [\n template({\n ...strings,\n ...options,\n }),\n move(path),\n ];\n\n return apply(asSource(writeMain(options, path)), rules);\n};\n\nconst writeMain = (options: PartMainOptions, path: string) => {\n return (tree: Tree) => {\n const save = getSave(path, options.part, options.saveFile);\n const resPath = join(options.part as Path, `main.${options.language}`);\n const content = generateMain(options, save);\n fs.rmSync(join(path as Path, resPath), { force: true });\n tree.create(resPath, content);\n return tree;\n };\n};\n\nconst getSave = (path: string, part: \"client\" | \"server\", saveFile?: string): Save => {\n return JSON.parse(\n fs.readFileSync(saveFile ?? join(path as Path, `.nanoforge/${part}.save.json`), \"utf-8\"),\n ) as Save;\n};\n\nexport const main = (schema: PartMainSchema): Rule => {\n const options = transform(schema);\n\n return mergeWith(generate(options, schema.directory ?? options.name));\n};\n","export const toKebabCase = (str: string): string => {\n return str\n .replace(/([a-z0-9]|(?=[A-Z]))([A-Z])/g, \"$1-$2\")\n .replace(/[\\s_]+/g, \"-\")\n .toLowerCase();\n};\n","import { SaveLibraryTypeEnum } from \"@utils/main/save.type\";\n\nexport const LIBS_FUNCTIONS_NAME: Record<SaveLibraryTypeEnum | string, string> = {\n [SaveLibraryTypeEnum.ASSET_MANAGER]: \"useAssetManager\",\n [SaveLibraryTypeEnum.COMPONENT_SYSTEM]: \"useComponentSystem\",\n [SaveLibraryTypeEnum.GRAPHICS]: \"useGraphics\",\n [SaveLibraryTypeEnum.INPUT]: \"useInput\",\n [SaveLibraryTypeEnum.NETWORK]: \"useNetwork\",\n [SaveLibraryTypeEnum.SOUND]: \"useSound\",\n};\n","import { InitFunctionEnum } from \"@utils/main/enums\";\n\nimport { LIBS_FUNCTIONS_NAME } from \"./const\";\nimport {\n type SaveComponent,\n type SaveEntity,\n type SaveLibrary,\n SaveLibraryTypeEnum,\n type SaveSystem,\n} from \"./save.type\";\n\nexport class MainGenerator {\n private buffer = \"\";\n private indentation = 0;\n\n toString(): string {\n return this.buffer;\n }\n\n generateBaseImports(hasTypes: boolean): MainGenerator {\n if (hasTypes) this.writeLine(`import { type IRunOptions } from \"@nanoforge-dev/common\";`);\n this.writeLine(`import { NanoforgeFactory } from \"@nanoforge-dev/core\";`);\n this.endSection();\n return this;\n }\n\n generateLibsImports(libs: SaveLibrary[]): MainGenerator {\n return this.generateImports(libs);\n }\n\n generateComponentsImports(libs: SaveComponent[]): MainGenerator {\n return this.generateImports(libs);\n }\n\n generateSystemsImports(libs: SaveSystem[]): MainGenerator {\n return this.generateImports(libs);\n }\n\n generateMainFunction(hasTypes: boolean, cb: (generator: MainGenerator) => void): MainGenerator {\n this.writeLine(`export async function main(options${hasTypes ? \": IRunOptions\" : \"\"}) {`);\n this.indentation += 1;\n cb(this);\n this.indentation -= 1;\n this.writeLine(\"}\");\n return this;\n }\n\n generateApp(isServer: boolean): MainGenerator {\n this.writeLine(`const app = NanoforgeFactory.create${isServer ? \"Server\" : \"Client\"}();`);\n this.endSection();\n return this;\n }\n\n generateAppInit(): MainGenerator {\n this.writeLine(`await app.init(options);`);\n this.endSection();\n return this;\n }\n\n generateAppRun(hasInitFunctions: boolean): MainGenerator {\n this.writeLine(`await app.run();`);\n if (hasInitFunctions) this.endSection();\n return this;\n }\n\n generateLibsInstances(libs: SaveLibrary[]): MainGenerator {\n libs.forEach(({ id, name }) => this.writeLine(`const ${id} = new ${name}();`));\n this.endSection();\n return this;\n }\n\n generateLibsInit(libs: SaveLibrary[]): MainGenerator {\n libs.forEach(({ id, type }) => this.writeLine(this.getInitFunction(id, type)));\n this.endSection();\n return this;\n }\n\n generateRegistry(libs: SaveLibrary[]): MainGenerator {\n const libName =\n libs.find((lib) => lib.type === SaveLibraryTypeEnum.COMPONENT_SYSTEM)?.id ?? \"ecsLibrary\";\n this.writeLine(`const registry = ${libName}.registry;`);\n this.endSection();\n return this;\n }\n\n generateEntities(entities: SaveEntity[]): MainGenerator {\n entities.forEach((entity) => this.generateEntity(entity));\n return this;\n }\n\n generateSystems(systems: SaveSystem[]): MainGenerator {\n systems.forEach(({ name }) => this.writeLine(`registry.addSystem(${name});`));\n this.endSection();\n return this;\n }\n\n generateInitFunctionIfNeeded(needed: boolean, func: InitFunctionEnum): MainGenerator {\n if (needed) return this.generateInitFunction(func);\n return this;\n }\n\n generateInitFunctionsImportsIfNeeded(needed: boolean): MainGenerator {\n if (!needed) return this;\n return this.generateImports([\n { name: \"afterInit\", path: \"./init/after-init\" },\n { name: \"afterRegistryInit\", path: \"./init/after-registry-init\" },\n { name: \"afterRun\", path: \"./init/after-run\" },\n { name: \"beforeInit\", path: \"./init/before-init\" },\n { name: \"beforeRegistryInit\", path: \"./init/before-registry-init\" },\n { name: \"beforeRun\", path: \"./init/before-run\" },\n ]);\n }\n\n private generateInitFunction(func: InitFunctionEnum): MainGenerator {\n const params = [\"app\"];\n if (\n [InitFunctionEnum.BEFORE_REGISTRY_INIT, InitFunctionEnum.AFTER_REGISTRY_INIT].includes(func)\n )\n params.push(\"registry\");\n this.writeLine(`await ${func}(${params.join(\", \")});`);\n if (func !== InitFunctionEnum.AFTER_RUN) this.endSection();\n return this;\n }\n\n private generateImports(els: { name: string; path: string }[]): MainGenerator {\n els\n .sort((a, b) => a.path.localeCompare(b.path))\n .forEach(({ name, path }) => this.writeLine(`import { ${name} } from \"${path}\";`));\n this.endSection();\n return this;\n }\n\n private generateEntity(entity: SaveEntity): void {\n this.writeLine(`const ${entity.id} = registry.spawnEntity();`);\n entity.components.forEach(({ name, params }) =>\n this.writeLine(`registry.addComponent(${entity.id}, new ${name}(${params.join(\", \")}));`),\n );\n this.endSection();\n }\n\n private getInitFunction(name: string, type: SaveLibraryTypeEnum | string): string {\n const baseName = LIBS_FUNCTIONS_NAME[type];\n if (baseName) return `app.${baseName}(${name});`;\n return `app.use(Symbol(\"${type}\"), ${name});`;\n }\n\n private writeLine(text: string, indentation = true): void {\n const line = `${\" \".repeat(indentation ? this.indentation * 2 : 0)}${text}\\n`;\n this.buffer += line;\n }\n\n private endSection(): void {\n this.writeLine(\"\");\n }\n}\n","import { InitFunctionEnum } from \"@utils/main/enums\";\n\nimport { MainGenerator } from \"./main.generator\";\nimport { type Save } from \"./save.type\";\n\nexport interface MainOptions {\n part: \"client\" | \"server\";\n language: \"js\" | \"ts\";\n initFunctions: boolean;\n}\n\nexport const generateMain = (options: MainOptions, save: Save) => {\n const isServer = options.part === \"server\";\n const hasTypes = options.language === \"ts\";\n const initFunctions = options.initFunctions;\n\n return new MainGenerator()\n .generateBaseImports(hasTypes)\n .generateLibsImports(save.libraries)\n .generateInitFunctionsImportsIfNeeded(initFunctions)\n .generateComponentsImports(save.components)\n .generateSystemsImports(save.systems)\n\n .generateMainFunction(hasTypes, (generator) => {\n generator\n .generateApp(isServer)\n\n .generateLibsInstances(save.libraries)\n .generateLibsInit(save.libraries)\n\n .generateInitFunctionIfNeeded(initFunctions, InitFunctionEnum.BEFORE_INIT)\n .generateAppInit()\n .generateInitFunctionIfNeeded(initFunctions, InitFunctionEnum.AFTER_INIT)\n\n .generateRegistry(save.libraries)\n\n .generateInitFunctionIfNeeded(initFunctions, InitFunctionEnum.BEFORE_REGISTRY_INIT)\n .generateEntities(save.entities)\n .generateSystems(save.systems)\n .generateInitFunctionIfNeeded(initFunctions, InitFunctionEnum.AFTER_REGISTRY_INIT)\n\n .generateInitFunctionIfNeeded(initFunctions, InitFunctionEnum.BEFORE_RUN)\n .generateAppRun(initFunctions)\n .generateInitFunctionIfNeeded(initFunctions, InitFunctionEnum.AFTER_RUN);\n })\n .toString();\n};\n","import { basename, parse } from \"path\";\n\nexport const resolvePackageName = (path: string): string => {\n const { base: baseFilename, dir: dirname } = parse(path);\n if (baseFilename === \".\") {\n return basename(process.cwd());\n }\n if (dirname.match(/^@[^\\s]/)) {\n return `${dirname}/${baseFilename}`;\n }\n return baseFilename;\n};\n","export const DEFAULT_APP_NAME = \"nanoforge-app\";\nexport const DEFAULT_VERSION = \"0.0.0\";\nexport const DEFAULT_AUTHOR = \"\";\nexport const DEFAULT_DESCRIPTION = \"\";\nexport const DEFAULT_LANGUAGE = \"ts\";\nexport const DEFAULT_PACKAGE_MANAGER = \"npm\";\nexport const DEFAULT_CONFIG = {\n client: {\n build: {\n entryFile: \"client/main.ts\",\n outDir: \".nanoforge/client\",\n },\n runtime: {\n dir: \".nanoforge/client\",\n },\n },\n};\nexport const DEFAULT_SERVER_CONFIG = {\n server: {\n enable: true,\n build: {\n entryFile: \"server/main.ts\",\n outDir: \".nanoforge/server\",\n },\n runtime: {\n dir: \".nanoforge/server\",\n },\n },\n};\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/libs/part-main/part-main.factory.ts","../../../src/utils/formatting.ts","../../../src/utils/main/const.ts","../../../src/utils/main/main.generator.ts","../../../src/utils/main/main-functions.ts","../../../src/utils/name.ts","../../../src/defaults.ts"],"sourcesContent":["import { type Path, join, normalize, strings } from \"@angular-devkit/core\";\nimport {\n type Rule,\n type Source,\n type Tree,\n apply,\n asSource,\n mergeWith,\n move,\n template,\n} from \"@angular-devkit/schematics\";\nimport * as fs from \"node:fs\";\n\nimport { toKebabCase } from \"@utils/formatting\";\nimport { generateMain } from \"@utils/main/main-functions\";\nimport { type Save } from \"@utils/main/save.type\";\nimport { resolvePackageName } from \"@utils/name\";\n\nimport { DEFAULT_APP_NAME, DEFAULT_LANGUAGE } from \"~/defaults\";\n\nimport { type PartMainOptions } from \"./part-main.options\";\nimport { type PartMainSchema } from \"./part-main.schema\";\n\nconst transform = (schema: PartMainSchema): PartMainOptions => {\n const name = resolvePackageName(toKebabCase(schema.name?.toString() ?? DEFAULT_APP_NAME));\n\n return {\n name,\n part: schema.part,\n language: schema.language ?? DEFAULT_LANGUAGE,\n initFunctions: schema.initFunctions ?? false,\n saveFile: schema.saveFile,\n };\n};\n\nconst generate = (options: PartMainOptions, path: string): Source => {\n const rules = [\n template({\n ...strings,\n ...options,\n }),\n move(normalize(path)),\n ];\n\n return apply(asSource(writeMain(options, path)), rules);\n};\n\nconst writeMain = (options: PartMainOptions, path: string) => {\n return (tree: Tree) => {\n const save = getSave(path, options.part, options.saveFile);\n const resPath = join(options.part as Path, `main.${options.language}`);\n const content = generateMain(options, save);\n fs.rmSync(join(path as Path, resPath), { force: true });\n tree.create(resPath, content);\n return tree;\n };\n};\n\nconst getSave = (path: string, part: \"client\" | \"server\", saveFile?: string): Save => {\n return JSON.parse(\n fs.readFileSync(saveFile ?? join(path as Path, `.nanoforge/${part}.save.json`), \"utf-8\"),\n ) as Save;\n};\n\nexport const main = (schema: PartMainSchema): Rule => {\n const options = transform(schema);\n\n return mergeWith(generate(options, schema.directory ?? options.name));\n};\n","export const toKebabCase = (str: string): string => {\n return str\n .replace(/([a-z0-9]|(?=[A-Z]))([A-Z])/g, \"$1-$2\")\n .replace(/[\\s_]+/g, \"-\")\n .toLowerCase();\n};\n","import { SaveLibraryTypeEnum } from \"@utils/main/save.type\";\n\nexport const LIBS_FUNCTIONS_NAME: Record<SaveLibraryTypeEnum | string, string> = {\n [SaveLibraryTypeEnum.ASSET_MANAGER]: \"useAssetManager\",\n [SaveLibraryTypeEnum.COMPONENT_SYSTEM]: \"useComponentSystem\",\n [SaveLibraryTypeEnum.GRAPHICS]: \"useGraphics\",\n [SaveLibraryTypeEnum.INPUT]: \"useInput\",\n [SaveLibraryTypeEnum.NETWORK]: \"useNetwork\",\n [SaveLibraryTypeEnum.SOUND]: \"useSound\",\n};\n","import { InitFunctionEnum } from \"@utils/main/enums\";\n\nimport { LIBS_FUNCTIONS_NAME } from \"./const\";\nimport {\n type SaveComponent,\n type SaveEntity,\n type SaveLibrary,\n SaveLibraryTypeEnum,\n type SaveSystem,\n} from \"./save.type\";\n\nexport class MainGenerator {\n private buffer = \"\";\n private indentation = 0;\n\n toString(): string {\n return this.buffer;\n }\n\n generateBaseImports(hasTypes: boolean): MainGenerator {\n if (hasTypes) this.writeLine(`import { type IRunOptions } from \"@nanoforge-dev/common\";`);\n this.writeLine(`import { NanoforgeFactory } from \"@nanoforge-dev/core\";`);\n this.endSection();\n return this;\n }\n\n generateLibsImports(libs: SaveLibrary[]): MainGenerator {\n return this.generateImports(libs);\n }\n\n generateComponentsImports(libs: SaveComponent[]): MainGenerator {\n return this.generateImports(libs);\n }\n\n generateSystemsImports(libs: SaveSystem[]): MainGenerator {\n return this.generateImports(libs);\n }\n\n generateMainFunction(hasTypes: boolean, cb: (generator: MainGenerator) => void): MainGenerator {\n this.writeLine(`export async function main(options${hasTypes ? \": IRunOptions\" : \"\"}) {`);\n this.indentation += 1;\n cb(this);\n this.indentation -= 1;\n this.writeLine(\"}\");\n return this;\n }\n\n generateApp(isServer: boolean): MainGenerator {\n this.writeLine(`const app = NanoforgeFactory.create${isServer ? \"Server\" : \"Client\"}();`);\n this.endSection();\n return this;\n }\n\n generateAppInit(): MainGenerator {\n this.writeLine(`await app.init(options);`);\n this.endSection();\n return this;\n }\n\n generateAppRun(hasInitFunctions: boolean): MainGenerator {\n this.writeLine(`await app.run();`);\n if (hasInitFunctions) this.endSection();\n return this;\n }\n\n generateLibsInstances(libs: SaveLibrary[]): MainGenerator {\n libs.forEach(({ id, name }) => this.writeLine(`const ${id} = new ${name}();`));\n this.endSection();\n return this;\n }\n\n generateLibsInit(libs: SaveLibrary[]): MainGenerator {\n libs.forEach(({ id, type }) => this.writeLine(this.getInitFunction(id, type)));\n this.endSection();\n return this;\n }\n\n generateRegistry(libs: SaveLibrary[]): MainGenerator {\n const libName =\n libs.find((lib) => lib.type === SaveLibraryTypeEnum.COMPONENT_SYSTEM)?.id ?? \"ecsLibrary\";\n this.writeLine(`const registry = ${libName}.registry;`);\n this.endSection();\n return this;\n }\n\n generateEntities(entities: SaveEntity[]): MainGenerator {\n entities.forEach((entity) => this.generateEntity(entity));\n return this;\n }\n\n generateSystems(systems: SaveSystem[]): MainGenerator {\n systems.forEach(({ name }) => this.writeLine(`registry.addSystem(${name});`));\n this.endSection();\n return this;\n }\n\n generateInitFunctionIfNeeded(needed: boolean, func: InitFunctionEnum): MainGenerator {\n if (needed) return this.generateInitFunction(func);\n return this;\n }\n\n generateInitFunctionsImportsIfNeeded(needed: boolean): MainGenerator {\n if (!needed) return this;\n return this.generateImports([\n { name: \"afterInit\", path: \"./init/after-init\" },\n { name: \"afterRegistryInit\", path: \"./init/after-registry-init\" },\n { name: \"afterRun\", path: \"./init/after-run\" },\n { name: \"beforeInit\", path: \"./init/before-init\" },\n { name: \"beforeRegistryInit\", path: \"./init/before-registry-init\" },\n { name: \"beforeRun\", path: \"./init/before-run\" },\n ]);\n }\n\n private generateInitFunction(func: InitFunctionEnum): MainGenerator {\n const params = [\"app\"];\n if (\n [InitFunctionEnum.BEFORE_REGISTRY_INIT, InitFunctionEnum.AFTER_REGISTRY_INIT].includes(func)\n )\n params.push(\"registry\");\n this.writeLine(`await ${func}(${params.join(\", \")});`);\n if (func !== InitFunctionEnum.AFTER_RUN) this.endSection();\n return this;\n }\n\n private generateImports(els: { name: string; path: string }[]): MainGenerator {\n els\n .sort((a, b) => a.path.localeCompare(b.path))\n .forEach(({ name, path }) => this.writeLine(`import { ${name} } from \"${path}\";`));\n this.endSection();\n return this;\n }\n\n private generateEntity(entity: SaveEntity): void {\n this.writeLine(`const ${entity.id} = registry.spawnEntity();`);\n entity.components.forEach(({ name, params }) =>\n this.writeLine(`registry.addComponent(${entity.id}, new ${name}(${params.join(\", \")}));`),\n );\n this.endSection();\n }\n\n private getInitFunction(name: string, type: SaveLibraryTypeEnum | string): string {\n const baseName = LIBS_FUNCTIONS_NAME[type];\n if (baseName) return `app.${baseName}(${name});`;\n return `app.use(Symbol(\"${type}\"), ${name});`;\n }\n\n private writeLine(text: string, indentation = true): void {\n const line = `${\" \".repeat(indentation ? this.indentation * 2 : 0)}${text}\\n`;\n this.buffer += line;\n }\n\n private endSection(): void {\n this.writeLine(\"\");\n }\n}\n","import { InitFunctionEnum } from \"@utils/main/enums\";\n\nimport { MainGenerator } from \"./main.generator\";\nimport { type Save } from \"./save.type\";\n\nexport interface MainOptions {\n part: \"client\" | \"server\";\n language: \"js\" | \"ts\";\n initFunctions: boolean;\n}\n\nexport const generateMain = (options: MainOptions, save: Save) => {\n const isServer = options.part === \"server\";\n const hasTypes = options.language === \"ts\";\n const initFunctions = options.initFunctions;\n\n return new MainGenerator()\n .generateBaseImports(hasTypes)\n .generateLibsImports(save.libraries)\n .generateInitFunctionsImportsIfNeeded(initFunctions)\n .generateComponentsImports(save.components)\n .generateSystemsImports(save.systems)\n\n .generateMainFunction(hasTypes, (generator) => {\n generator\n .generateApp(isServer)\n\n .generateLibsInstances(save.libraries)\n .generateLibsInit(save.libraries)\n\n .generateInitFunctionIfNeeded(initFunctions, InitFunctionEnum.BEFORE_INIT)\n .generateAppInit()\n .generateInitFunctionIfNeeded(initFunctions, InitFunctionEnum.AFTER_INIT)\n\n .generateRegistry(save.libraries)\n\n .generateInitFunctionIfNeeded(initFunctions, InitFunctionEnum.BEFORE_REGISTRY_INIT)\n .generateEntities(save.entities)\n .generateSystems(save.systems)\n .generateInitFunctionIfNeeded(initFunctions, InitFunctionEnum.AFTER_REGISTRY_INIT)\n\n .generateInitFunctionIfNeeded(initFunctions, InitFunctionEnum.BEFORE_RUN)\n .generateAppRun(initFunctions)\n .generateInitFunctionIfNeeded(initFunctions, InitFunctionEnum.AFTER_RUN);\n })\n .toString();\n};\n","import { basename, parse } from \"path\";\n\nexport const resolvePackageName = (path: string): string => {\n const { base: baseFilename, dir: dirname } = parse(path);\n if (baseFilename === \".\") {\n return basename(process.cwd());\n }\n if (dirname.match(/^@[^\\s]/)) {\n return `${dirname}/${baseFilename}`;\n }\n return baseFilename;\n};\n","export const DEFAULT_APP_NAME = \"nanoforge-app\";\nexport const DEFAULT_VERSION = \"0.0.0\";\nexport const DEFAULT_AUTHOR = \"\";\nexport const DEFAULT_DESCRIPTION = \"\";\nexport const DEFAULT_LANGUAGE = \"ts\";\nexport const DEFAULT_PACKAGE_MANAGER = \"npm\";\nexport const DEFAULT_CONFIG = {\n client: {\n build: {\n entryFile: \"client/main.ts\",\n outDir: \".nanoforge/client\",\n },\n runtime: {\n dir: \".nanoforge/client\",\n },\n },\n};\nexport const DEFAULT_SERVER_CONFIG = {\n server: {\n enable: true,\n build: {\n entryFile: \"server/main.ts\",\n outDir: \".nanoforge/server\",\n },\n runtime: {\n dir: \".nanoforge/server\",\n },\n },\n};\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/package.json",
3
3
  "name": "@nanoforge-dev/schematics",
4
- "version": "1.2.0",
4
+ "version": "1.2.1",
5
5
  "description": "NanoForge Schematics",
6
6
  "keywords": [
7
7
  "nanoforge",
@@ -46,27 +46,29 @@
46
46
  },
47
47
  "funding": "https://github.com/NanoForge-dev/schematics?sponsor",
48
48
  "dependencies": {
49
- "@angular-devkit/core": "^21.1.1",
50
- "@angular-devkit/schematics": "^21.1.1"
49
+ "@angular-devkit/core": "^21.2.2",
50
+ "@angular-devkit/schematics": "^21.2.2",
51
+ "rxjs": "^7.8.2"
51
52
  },
52
53
  "devDependencies": {
53
- "@commitlint/cli": "^20.3.1",
54
- "@commitlint/config-conventional": "^20.3.1",
54
+ "@angular-devkit/schematics-cli": "^21.2.2",
55
+ "@commitlint/cli": "^20.4.4",
56
+ "@commitlint/config-conventional": "^20.4.4",
55
57
  "@favware/cliff-jumper": "^6.0.0",
56
- "@nanoforge-dev/actions": "^1.1.0",
57
- "@nanoforge-dev/utils-eslint-config": "^1.0.1",
58
- "@nanoforge-dev/utils-prettier-config": "^1.0.1",
58
+ "@nanoforge-dev/actions": "^1.2.3",
59
+ "@nanoforge-dev/utils-eslint-config": "^1.0.2",
60
+ "@nanoforge-dev/utils-prettier-config": "^1.0.2",
59
61
  "@trivago/prettier-plugin-sort-imports": "^6.0.2",
60
- "@types/node": "^25.0.10",
61
- "@vitest/coverage-v8": "^4.0.18",
62
+ "@types/node": "^25.5.0",
63
+ "@vitest/coverage-v8": "^4.1.0",
62
64
  "cpx2": "^8.0.0",
63
- "eslint": "^9.39.2",
65
+ "eslint": "^10.0.3",
64
66
  "husky": "^9.1.7",
65
- "lint-staged": "^16.2.7",
67
+ "lint-staged": "^16.4.0",
66
68
  "prettier": "^3.8.1",
67
69
  "tsup": "^8.5.1",
68
70
  "typescript": "^5.9.3",
69
- "vitest": "^4.0.18"
71
+ "vitest": "^4.1.0"
70
72
  },
71
73
  "engines": {
72
74
  "node": "25"