@nanoforge-dev/schematics 1.1.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.
- package/dist/collection.json +5 -0
- package/dist/libs/application/application.factory.d.ts +5 -0
- package/dist/libs/application/application.factory.js +24 -7
- package/dist/libs/application/application.factory.js.map +1 -1
- package/dist/libs/application/files/js/.prettierignore +8 -0
- package/dist/libs/application/files/js/{__package__.json → package.json.template} +17 -11
- package/dist/libs/application/files/ts/.prettierignore +8 -0
- package/dist/libs/application/files/ts/{__package__.json → package.json.template} +19 -13
- package/dist/libs/application/schema.json +5 -0
- package/dist/libs/configuration/configuration.factory.d.ts +5 -0
- package/dist/libs/configuration/configuration.factory.js +10 -23
- package/dist/libs/configuration/configuration.factory.js.map +1 -1
- package/dist/libs/configuration/schema.json +6 -0
- package/dist/libs/docker/docker.factory.d.ts +22 -0
- package/dist/libs/docker/docker.factory.js +61 -0
- package/dist/libs/docker/docker.factory.js.map +1 -0
- package/dist/libs/docker/files/.dockerignore +1 -0
- package/dist/libs/docker/files/Dockerfile +39 -0
- package/dist/libs/docker/schema.json +28 -0
- package/dist/libs/part-base/files/js/__nanoforgeFolder__/client.save.json +11 -4
- package/dist/libs/part-base/files/js/__nanoforgeFolder__/server.save.json +11 -4
- package/dist/libs/part-base/files/js/__part__/components/example.component.js +1 -1
- package/dist/libs/part-base/files/js/__part__/systems/example.system.js +2 -2
- package/dist/libs/part-base/files/ts/__nanoforgeFolder__/client.save.json +8 -1
- package/dist/libs/part-base/files/ts/__nanoforgeFolder__/server.save.json +8 -1
- package/dist/libs/part-base/part-base.factory.js +2 -2
- package/dist/libs/part-base/part-base.factory.js.map +1 -1
- package/dist/libs/part-main/part-main.factory.js +2 -2
- package/dist/libs/part-main/part-main.factory.js.map +1 -1
- package/package.json +16 -14
package/dist/collection.json
CHANGED
|
@@ -20,6 +20,11 @@
|
|
|
20
20
|
"factory": "./libs/part-main/part-main.factory#main",
|
|
21
21
|
"description": "Create a Main file for client or server.",
|
|
22
22
|
"schema": "./libs/part-main/schema.json"
|
|
23
|
+
},
|
|
24
|
+
"docker": {
|
|
25
|
+
"factory": "./libs/docker/docker.factory#main",
|
|
26
|
+
"description": "Create a Dockerfile for the application.",
|
|
27
|
+
"schema": "./libs/docker/schema.json"
|
|
23
28
|
}
|
|
24
29
|
}
|
|
25
30
|
}
|
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
|
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"
|
|
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"
|
|
23
|
-
"@nanoforge-dev/
|
|
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"
|
|
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"
|
|
23
|
-
"@nanoforge-dev/
|
|
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"],
|
|
@@ -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
|
-
|
|
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 ??
|
|
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"
|
|
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"]
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Rule } from '@angular-devkit/schematics';
|
|
2
|
+
|
|
3
|
+
interface DockerSchema {
|
|
4
|
+
/**
|
|
5
|
+
* NanoForge application name
|
|
6
|
+
*/
|
|
7
|
+
name: string;
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* NanoForge application package manager
|
|
11
|
+
*/
|
|
12
|
+
packageManager: "npm" | "yarn" | "pnpm" | "bun";
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Target directory for generated Docker files
|
|
16
|
+
*/
|
|
17
|
+
directory?: string;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
declare const main: (schema: DockerSchema) => Rule;
|
|
21
|
+
|
|
22
|
+
export { main };
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
3
|
+
|
|
4
|
+
// src/libs/docker/docker.factory.ts
|
|
5
|
+
import { normalize, strings } from "@angular-devkit/core";
|
|
6
|
+
import {
|
|
7
|
+
apply,
|
|
8
|
+
mergeWith,
|
|
9
|
+
move,
|
|
10
|
+
template,
|
|
11
|
+
url
|
|
12
|
+
} from "@angular-devkit/schematics";
|
|
13
|
+
|
|
14
|
+
// src/utils/formatting.ts
|
|
15
|
+
var toKebabCase = /* @__PURE__ */ __name((str) => {
|
|
16
|
+
return str.replace(/([a-z0-9]|(?=[A-Z]))([A-Z])/g, "$1-$2").replace(/[\s_]+/g, "-").toLowerCase();
|
|
17
|
+
}, "toKebabCase");
|
|
18
|
+
|
|
19
|
+
// src/utils/name.ts
|
|
20
|
+
import { basename, parse } from "path";
|
|
21
|
+
var resolvePackageName = /* @__PURE__ */ __name((path) => {
|
|
22
|
+
const { base: baseFilename, dir: dirname } = parse(path);
|
|
23
|
+
if (baseFilename === ".") {
|
|
24
|
+
return basename(process.cwd());
|
|
25
|
+
}
|
|
26
|
+
if (dirname.match(/^@[^\s]/)) {
|
|
27
|
+
return `${dirname}/${baseFilename}`;
|
|
28
|
+
}
|
|
29
|
+
return baseFilename;
|
|
30
|
+
}, "resolvePackageName");
|
|
31
|
+
|
|
32
|
+
// src/defaults.ts
|
|
33
|
+
var DEFAULT_APP_NAME = "nanoforge-app";
|
|
34
|
+
var DEFAULT_PACKAGE_MANAGER = "npm";
|
|
35
|
+
|
|
36
|
+
// src/libs/docker/docker.factory.ts
|
|
37
|
+
var transform = /* @__PURE__ */ __name((schema) => {
|
|
38
|
+
const name = resolvePackageName(toKebabCase(schema.name?.toString() ?? DEFAULT_APP_NAME));
|
|
39
|
+
return {
|
|
40
|
+
name,
|
|
41
|
+
packageManager: schema.packageManager ?? DEFAULT_PACKAGE_MANAGER,
|
|
42
|
+
directory: schema.directory
|
|
43
|
+
};
|
|
44
|
+
}, "transform");
|
|
45
|
+
var generate = /* @__PURE__ */ __name((options, path) => {
|
|
46
|
+
return apply(url("./files"), [
|
|
47
|
+
template({
|
|
48
|
+
...strings,
|
|
49
|
+
...options
|
|
50
|
+
}),
|
|
51
|
+
move(normalize(path))
|
|
52
|
+
]);
|
|
53
|
+
}, "generate");
|
|
54
|
+
var main = /* @__PURE__ */ __name((schema) => {
|
|
55
|
+
const options = transform(schema);
|
|
56
|
+
return mergeWith(generate(options, schema.directory ?? options.name));
|
|
57
|
+
}, "main");
|
|
58
|
+
export {
|
|
59
|
+
main
|
|
60
|
+
};
|
|
61
|
+
//# sourceMappingURL=docker.factory.js.map
|
|
@@ -0,0 +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, 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":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
node_modules
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
<% if (packageManager === 'bun') { %>
|
|
2
|
+
FROM oven/bun:1.3
|
|
3
|
+
<% } else { %>
|
|
4
|
+
FROM node:25-alpine
|
|
5
|
+
<% } %>
|
|
6
|
+
|
|
7
|
+
<% if (packageManager === 'pnpm') { %>
|
|
8
|
+
ENV PNPM_HOME="/pnpm"
|
|
9
|
+
ENV PATH="$PNPM_HOME:$PATH"
|
|
10
|
+
RUN npm install -g pnpm
|
|
11
|
+
<% } %>
|
|
12
|
+
|
|
13
|
+
<% if (packageManager === 'yarn') { %>
|
|
14
|
+
RUN npm install -g yarn
|
|
15
|
+
<% } %>
|
|
16
|
+
|
|
17
|
+
WORKDIR /app
|
|
18
|
+
COPY package.json ./
|
|
19
|
+
<% if (packageManager === 'npm') { %>
|
|
20
|
+
COPY package-lock.json ./
|
|
21
|
+
<% } else if (packageManager === 'yarn') { %>
|
|
22
|
+
COPY yarn.lock ./
|
|
23
|
+
<% } else if (packageManager === 'pnpm') { %>
|
|
24
|
+
COPY pnpm-lock.yaml ./
|
|
25
|
+
<% } else if (packageManager === 'bun') { %>
|
|
26
|
+
COPY bun.lock ./
|
|
27
|
+
<% } %>
|
|
28
|
+
<% if (packageManager === 'npm') { %>
|
|
29
|
+
RUN npm install --no-lockfile
|
|
30
|
+
<% } if (packageManager === 'pnpm') { %>
|
|
31
|
+
RUN pnpm install --frozen-lockfile --allow-build=bun
|
|
32
|
+
<% } else { %>
|
|
33
|
+
RUN <%= packageManager %> install --frozen-lockfile
|
|
34
|
+
<% } %>
|
|
35
|
+
COPY . .
|
|
36
|
+
|
|
37
|
+
RUN <%= packageManager %> run build
|
|
38
|
+
|
|
39
|
+
CMD ["<%= packageManager %>", "run", "start"]
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema",
|
|
3
|
+
"$id": "SchematicsNanoForgeDocker",
|
|
4
|
+
"title": "NanoForge Base Docker Options Schema",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"properties": {
|
|
7
|
+
"name": {
|
|
8
|
+
"type": "string",
|
|
9
|
+
"description": "The name of the application",
|
|
10
|
+
"$default": {
|
|
11
|
+
"$source": "argv",
|
|
12
|
+
"index": 0
|
|
13
|
+
},
|
|
14
|
+
"x-prompt": "What name would you like to use for the new project ?"
|
|
15
|
+
},
|
|
16
|
+
"packageManager": {
|
|
17
|
+
"type": "string",
|
|
18
|
+
"enum": ["npm", "yarn", "pnpm", "bun"],
|
|
19
|
+
"description": "NanoForge application package manager",
|
|
20
|
+
"default": "npm"
|
|
21
|
+
},
|
|
22
|
+
"directory": {
|
|
23
|
+
"type": "string",
|
|
24
|
+
"description": "NanoForge application destination directory"
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
"required": ["name"]
|
|
28
|
+
}
|
|
@@ -10,9 +10,9 @@
|
|
|
10
10
|
{
|
|
11
11
|
"id": "ecsLibrary",
|
|
12
12
|
"type": "component-system",
|
|
13
|
-
"name": "
|
|
14
|
-
"path": "@nanoforge-dev/ecs",
|
|
15
|
-
"params": [
|
|
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
|
-
}
|
|
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": "
|
|
14
|
-
"path": "@nanoforge-dev/ecs",
|
|
15
|
-
"params": [
|
|
16
|
-
}
|
|
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,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
|
-
}
|
|
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
|
-
}
|
|
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;
|
|
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.1
|
|
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.
|
|
50
|
-
"@angular-devkit/schematics": "^21.
|
|
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
|
-
"@
|
|
54
|
-
"@commitlint/
|
|
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.
|
|
57
|
-
"@nanoforge-dev/utils-eslint-config": "^1.0.
|
|
58
|
-
"@nanoforge-dev/utils-prettier-config": "^1.0.
|
|
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
|
|
61
|
-
"@vitest/coverage-v8": "^4.0
|
|
62
|
+
"@types/node": "^25.5.0",
|
|
63
|
+
"@vitest/coverage-v8": "^4.1.0",
|
|
62
64
|
"cpx2": "^8.0.0",
|
|
63
|
-
"eslint": "^
|
|
65
|
+
"eslint": "^10.0.3",
|
|
64
66
|
"husky": "^9.1.7",
|
|
65
|
-
"lint-staged": "^16.
|
|
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
|
|
71
|
+
"vitest": "^4.1.0"
|
|
70
72
|
},
|
|
71
73
|
"engines": {
|
|
72
74
|
"node": "25"
|
|
@@ -87,7 +89,7 @@
|
|
|
87
89
|
"build": "tsc --noEmit && tsup",
|
|
88
90
|
"postbuild": "pnpm run copy:collection && pnpm run copy:lib",
|
|
89
91
|
"copy:collection": "cpx src/collection.json dist && cpx 'src/libs/**/schema.json' dist/libs",
|
|
90
|
-
"copy:lib": "cpx 'src/libs/**/files
|
|
92
|
+
"copy:lib": "cpx 'src/libs/**/files/**/{.,}*' dist/libs",
|
|
91
93
|
"lint": "prettier --check . && eslint --format=pretty src",
|
|
92
94
|
"format": "prettier --write . && eslint --fix --format=pretty src",
|
|
93
95
|
"changelog": "git cliff --prepend ./CHANGELOG.md -u -c ./cliff.toml -r . --include-path '.'",
|