boilerforge 1.2.0-dev.1 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (22) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +107 -1
  3. package/dist/cli.js +34880 -33354
  4. package/dist/templates/create-node-app/app/README.md.hbs +54 -0
  5. package/dist/templates/{create-simple-app → create-node-app/app}/tsconfig.json.hbs +2 -1
  6. package/dist/templates/create-node-app/forge.config.json +14 -0
  7. package/dist/templates/create-node-app/forge.prompt.json +105 -0
  8. package/dist/templates/create-node-app/schema/prompt.schema.json +240 -0
  9. package/package.json +79 -66
  10. package/templates/create-simple-app/eslint.config.mjs.hbs +0 -23
  11. package/templates/create-simple-app/package.json.hbs +0 -30
  12. package/templates/create-simple-app/src/index.js.hbs +0 -5
  13. package/templates/create-simple-app/src/index.ts.hbs +0 -5
  14. package/templates/create-simple-app/tsconfig.json.hbs +0 -14
  15. /package/{templates/create-simple-app → dist/templates/create-node-app/app}/.editorconfig.hbs +0 -0
  16. /package/{templates/create-simple-app → dist/templates/create-node-app/app}/.gitignore.hbs +0 -0
  17. /package/{templates/create-simple-app → dist/templates/create-node-app/app}/.prettierignore.hbs +0 -0
  18. /package/{templates/create-simple-app → dist/templates/create-node-app/app}/.prettierrc.json.hbs +0 -0
  19. /package/dist/templates/{create-simple-app → create-node-app/app}/eslint.config.mjs.hbs +0 -0
  20. /package/dist/templates/{create-simple-app → create-node-app/app}/package.json.hbs +0 -0
  21. /package/dist/templates/{create-simple-app → create-node-app/app}/src/index.js.hbs +0 -0
  22. /package/dist/templates/{create-simple-app → create-node-app/app}/src/index.ts.hbs +0 -0
@@ -0,0 +1,54 @@
1
+ # 🚀 {{name}}
2
+
3
+ ![version](https://img.shields.io/badge/version-{{version}}-green.svg)
4
+
5
+ {{#if description}}
6
+ ## 📖 About Project
7
+
8
+ {{description}}
9
+
10
+ {{/if}}
11
+ ### Built With
12
+
13
+ #### ![nodejs]({{badges.NODEJS}}) ![{{packageManager}}]({{badges.[packageManagerUpper]}}) ![{{#if enabledTypescript}}typescript{{else}}javascript{{/if}}]({{#if enabledTypescript}}{{badges.TYPESCRIPT}}{{else}}{{badges.JAVASCRIPT}}{{/if}}){{#if enabledEslintPrettier}} ![eslint]({{badges.ESLINT}}) ![prettier]({{badges.PRETTIER}}){{/if}}
14
+
15
+ ### 🛠️ Installation
16
+
17
+ #### Navigate into the project directory
18
+
19
+ ```
20
+ cd {{name}}
21
+ ```
22
+
23
+ #### Install dependencies
24
+
25
+ ```
26
+ {{installDepsCommand}}
27
+ ```
28
+
29
+ ### ▶️ Running the App
30
+
31
+ {{#if enabledTypescript}}
32
+ #### To start the app in development mode:
33
+
34
+ ```
35
+ {{packageManager}} run dev
36
+ ```
37
+
38
+ {{/if}}
39
+ To start the app in production mode:
40
+
41
+ {{#if enabledTypescript}}
42
+ - Build the project
43
+ ```
44
+ {{packageManager}} run build
45
+ ```
46
+ - Run app in production
47
+ ```
48
+ {{packageManager}} run start
49
+ ```
50
+ {{else}}
51
+ ```
52
+ {{packageManager}} run start
53
+ ```
54
+ {{/if}}
@@ -1,7 +1,8 @@
1
1
  {
2
2
  "compilerOptions": {
3
3
  "target": "ES2024",
4
- "module": "commonjs",
4
+ "module": "NodeNext",
5
+ "moduleResolution": "nodenext",
5
6
  "outDir": "./dist",
6
7
  "esModuleInterop": true,
7
8
  "forceConsistentCasingInFileNames": true,
@@ -0,0 +1,14 @@
1
+ {
2
+ "metadata": {
3
+ "name": "create-simple-app",
4
+ "version": "1.0.0"
5
+ },
6
+ "fileConfig": {
7
+ "src/index.ts": "isTypescript == true",
8
+ "src/index.js": "isTypescript == false",
9
+ ".prettierignore": "isEslintPrettier == true",
10
+ ".prettierrc.json": "isEslintPrettier == true",
11
+ "eslint.config.mjs": "isEslintPrettier == true",
12
+ "tsconfig.json": "isTypescript == true"
13
+ }
14
+ }
@@ -0,0 +1,105 @@
1
+ {
2
+ "prompts": [
3
+ {
4
+ "type": "text",
5
+ "name": "name",
6
+ "description": "Name of application",
7
+ "prompt": {
8
+ "message": "Project name",
9
+ "defaultValue": "getCwdDirName()"
10
+ }
11
+ },
12
+ {
13
+ "type": "text",
14
+ "name": "description",
15
+ "description": "A description for application",
16
+ "prompt": {
17
+ "message": "Description",
18
+ "defaultValue": "''"
19
+ }
20
+ },
21
+ {
22
+ "type": "text",
23
+ "name": "version",
24
+ "description": "Application version",
25
+ "prompt": {
26
+ "message": "Version",
27
+ "defaultValue": "'0.0.1'"
28
+ },
29
+ "validate": {
30
+ "expression": "matches(input, Regex.VERSION)",
31
+ "error": "Invalid version format"
32
+ }
33
+ },
34
+ {
35
+ "type": "text",
36
+ "name": "author",
37
+ "description": "Name of author",
38
+ "prompt": {
39
+ "message": "Author",
40
+ "defaultValue": "''"
41
+ }
42
+ },
43
+ {
44
+ "type": "select",
45
+ "name": "packageManager",
46
+ "description": "Package manager",
47
+ "prompt": {
48
+ "message": "Package manager",
49
+ "defaultValue": "0"
50
+ },
51
+ "choices": [
52
+ {
53
+ "name": "npm",
54
+ "value": "npm"
55
+ },
56
+ {
57
+ "name": "yarn",
58
+ "value": "yarn"
59
+ },
60
+ {
61
+ "name": "pnpm",
62
+ "value": "pnpm"
63
+ }
64
+ ],
65
+ "validate": {
66
+ "expression": "input in ['npm', 'yarn', 'pnpm']",
67
+ "error": "Please select a valid package manager (npm, yarn, or pnpm)."
68
+ }
69
+ },
70
+ {
71
+ "type": "toggle",
72
+ "name": "isTypescript",
73
+ "description": "Typescript enabled",
74
+ "prompt": {
75
+ "message": "Use TypeScript",
76
+ "defaultValue": "true"
77
+ },
78
+ "options": {
79
+ "enabled": "Yes",
80
+ "disabled": "No"
81
+ },
82
+ "validate": {
83
+ "expression": "isBoolean(input)",
84
+ "error": "isTypescript must be true or false"
85
+ }
86
+ },
87
+ {
88
+ "type": "toggle",
89
+ "name": "isEslintPrettier",
90
+ "description": "Eslint & prettier enabled",
91
+ "prompt": {
92
+ "message": "Use ESLint & Prettier formatting",
93
+ "defaultValue": "true"
94
+ },
95
+ "options": {
96
+ "enabled": "Yes",
97
+ "disabled": "No"
98
+ },
99
+ "validate": {
100
+ "expression": "isBoolean(input)",
101
+ "error": "isEslintPrettier must be true or false"
102
+ }
103
+ }
104
+ ]
105
+ }
@@ -0,0 +1,240 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "title": "CLI Prompt Generator Schema",
4
+ "type": "object",
5
+ "required": [
6
+ "prompts"
7
+ ],
8
+ "properties": {
9
+ "prompts": {
10
+ "type": "array",
11
+ "minItems": 1,
12
+ "uniqueItemProperties": [
13
+ "name"
14
+ ],
15
+ "items": {
16
+ "$ref": "#/$defs/promptItem"
17
+ },
18
+ "contains": {
19
+ "type": "object",
20
+ "properties": {
21
+ "type": {
22
+ "const": "text"
23
+ },
24
+ "name": {
25
+ "const": "name"
26
+ },
27
+ "description": {
28
+ "type": "string"
29
+ },
30
+ "prompt": {
31
+ "type": "object",
32
+ "required": [
33
+ "message"
34
+ ],
35
+ "properties": {
36
+ "message": {
37
+ "type": "string"
38
+ },
39
+ "defaultValue": {
40
+ "type": "string"
41
+ }
42
+ }
43
+ },
44
+ "validate": {
45
+ "$ref": "#/$defs/validationConfig"
46
+ },
47
+ "skip": {
48
+ "type": "string"
49
+ }
50
+ },
51
+ "required": [
52
+ "type",
53
+ "name",
54
+ "description",
55
+ "prompt"
56
+ ]
57
+ },
58
+ "errorMessage": {
59
+ "uniqueItemProperties": "Each prompt must have a unique 'name'.",
60
+ "contains": "A prompt with name 'name' and type 'text' must exist."
61
+ }
62
+ }
63
+ },
64
+ "$defs": {
65
+ "promptItem": {
66
+ "type": "object",
67
+ "required": [
68
+ "type",
69
+ "description",
70
+ "name",
71
+ "prompt"
72
+ ],
73
+ "additionalProperties": false,
74
+ "properties": {
75
+ "type": {
76
+ "$ref": "#/$defs/inputType"
77
+ },
78
+ "name": {
79
+ "type": "string"
80
+ },
81
+ "description": {
82
+ "type": "string"
83
+ },
84
+ "prompt": {
85
+ "$ref": "#/$defs/promptConfig"
86
+ },
87
+ "skip": {
88
+ "$ref": "#/$defs/jexlExpression"
89
+ },
90
+ "validate": {
91
+ "$ref": "#/$defs/validationConfig"
92
+ },
93
+ "choices": {
94
+ "$ref": "#/$defs/choicesConfig"
95
+ },
96
+ "options": {
97
+ "$ref": "#/$defs/toggleOptions"
98
+ }
99
+ },
100
+ "allOf": [
101
+ {
102
+ "if": {
103
+ "properties": {
104
+ "type": {
105
+ "enum": [
106
+ "select",
107
+ "multiselect"
108
+ ]
109
+ }
110
+ }
111
+ },
112
+ "then": {
113
+ "required": [
114
+ "choices"
115
+ ],
116
+ "errorMessage": {
117
+ "required": "Type 'select' or 'multiselect' requires a 'choices' array."
118
+ }
119
+ },
120
+ "else": {
121
+ "not": {
122
+ "required": [
123
+ "choices"
124
+ ]
125
+ },
126
+ "errorMessage": "The 'choices' property is only allowed for 'select' or 'multiselect' types."
127
+ }
128
+ },
129
+ {
130
+ "if": {
131
+ "properties": {
132
+ "type": {
133
+ "const": "toggle"
134
+ }
135
+ }
136
+ },
137
+ "then": {
138
+ "required": [
139
+ "options"
140
+ ],
141
+ "errorMessage": {
142
+ "required": "Type 'toggle' requires 'options' (enabled/disabled labels)."
143
+ }
144
+ },
145
+ "else": {
146
+ "not": {
147
+ "required": [
148
+ "options"
149
+ ]
150
+ },
151
+ "errorMessage": "The 'options' property is only allowed for 'toggle' types."
152
+ }
153
+ }
154
+ ]
155
+ },
156
+ "inputType": {
157
+ "type": "string",
158
+ "enum": [
159
+ "text",
160
+ "select",
161
+ "toggle",
162
+ "multiselect"
163
+ ]
164
+ },
165
+ "promptConfig": {
166
+ "type": "object",
167
+ "required": [
168
+ "message"
169
+ ],
170
+ "properties": {
171
+ "message": {
172
+ "type": "string"
173
+ },
174
+ "defaultValue": {
175
+ "$ref": "#/$defs/jexlExpression"
176
+ }
177
+ }
178
+ },
179
+ "validationConfig": {
180
+ "type": "object",
181
+ "required": [
182
+ "expression",
183
+ "error"
184
+ ],
185
+ "properties": {
186
+ "expression": {
187
+ "$ref": "#/$defs/jexlExpression"
188
+ },
189
+ "error": {
190
+ "type": "string"
191
+ }
192
+ }
193
+ },
194
+ "jexlExpression": {
195
+ "type": "string"
196
+ },
197
+ "choicesConfig": {
198
+ "type": "array",
199
+ "minItems": 1,
200
+ "items": {
201
+ "type": "object",
202
+ "properties": {
203
+ "name": {
204
+ "type": "string"
205
+ },
206
+ "value": {
207
+ "type": "string"
208
+ }
209
+ },
210
+ "required": [
211
+ "name",
212
+ "value"
213
+ ],
214
+ "additionalProperties": false
215
+ }
216
+ },
217
+ "choicesConfig2": {
218
+ "type": "array",
219
+ "minItems": 1,
220
+ "items": {
221
+ "type": "string"
222
+ }
223
+ },
224
+ "toggleOptions": {
225
+ "type": "object",
226
+ "required": [
227
+ "enabled",
228
+ "disabled"
229
+ ],
230
+ "properties": {
231
+ "enabled": {
232
+ "type": "string"
233
+ },
234
+ "disabled": {
235
+ "type": "string"
236
+ }
237
+ }
238
+ }
239
+ }
240
+ }
package/package.json CHANGED
@@ -1,68 +1,81 @@
1
1
  {
2
- "name": "boilerforge",
3
- "version": "1.2.0-dev.1",
4
- "description": " boilerforge is a blazing-fast CLI utility that scaffolds clean, ready-to-use project structures so you can skip the setup and start building instantly.",
5
- "main": "dist/cli.js",
6
- "bin": {
7
- "boilerforge": "dist/cli.js"
8
- },
9
- "files": [
10
- "dist",
11
- "templates",
12
- "README.md"
13
- ],
14
- "engines": {
15
- "node": ">= 20.11.1"
16
- },
17
- "scripts": {
18
- "clean": "rimraf dist",
19
- "ci": "pnpm install --frozen-lockfile",
20
- "build": "ts-node esbuild.config.ts",
21
- "prebuild": "pnpm run clean && pnpm run lint && pnpm run format",
22
- "start": "node dist/cli.js",
23
- "lint": "eslint --ext .js,.ts .",
24
- "format": "prettier --write \"**/*.+(js|ts)\"",
25
- "test": "echo \"Error: no test specified\" && exit 1",
26
- "dev": "ts-node bin/cli.ts",
27
- "prepare": "husky"
28
- },
29
- "keywords": [],
30
- "publishConfig": {
31
- "tag": "dev"
32
- },
33
- "author": "tspyder7",
34
- "license": "MIT",
35
- "packageManager": "pnpm@10.9.0",
36
- "devDependencies": {
37
- "@commitlint/cli": "^19.8.1",
38
- "@commitlint/config-conventional": "^19.8.1",
39
- "@eslint/js": "^9.25.1",
40
- "@types/node": "^22.15.2",
41
- "@typescript-eslint/eslint-plugin": "^8.31.0",
42
- "@typescript-eslint/parser": "^8.31.0",
43
- "esbuild": "^0.25.3",
44
- "esbuild-plugin-copy": "^2.1.1",
45
- "eslint": "^9.25.1",
46
- "globals": "^16.0.0",
47
- "husky": "^9.1.7",
48
- "prettier": "^3.5.3",
49
- "rimraf": "^6.0.1",
50
- "ts-node": "^10.9.2",
51
- "tslint-config-prettier": "^1.18.0",
52
- "typescript": "^5.8.3",
53
- "typescript-eslint": "^8.31.0"
54
- },
55
- "dependencies": {
56
- "chalk": "^5.4.1",
57
- "commander": "^13.1.0",
58
- "enquirer": "^2.4.1",
59
- "execa": "^9.5.2",
60
- "globby": "^14.1.0",
61
- "handlebars": "^4.7.8",
62
- "inquirer": "^12.6.1",
63
- "listr2": "^8.3.2",
64
- "remark-stringify": "^11.0.0",
65
- "unified": "^11.0.5",
66
- "unist-builder": "^4.0.0"
67
- }
2
+ "name": "boilerforge",
3
+ "version": "1.2.0",
4
+ "description": "A blazing-fast CLI utility that scaffolds clean, ready-to-use project structures so you can skip the setup and start building instantly.",
5
+ "main": "dist/cli.js",
6
+ "bin": {
7
+ "boilerforge": "dist/cli.js"
8
+ },
9
+ "files": [
10
+ "dist",
11
+ "LICENSE",
12
+ "README.md"
13
+ ],
14
+ "engines": {
15
+ "node": ">= 24"
16
+ },
17
+ "scripts": {
18
+ "clean": "rimraf dist",
19
+ "ci": "pnpm install --frozen-lockfile",
20
+ "build": "ts-node esbuild.config.ts",
21
+ "prebuild": "pnpm run clean && pnpm run lint && pnpm run format",
22
+ "start": "node dist/cli.js",
23
+ "lint": "eslint --ext .js,.ts .",
24
+ "format": "prettier --write \"**/*.+(js|ts)\"",
25
+ "test": "echo \"Error: no test specified\" && exit 1",
26
+ "dev": "ts-node bin/cli.ts",
27
+ "prepare": "husky"
28
+ },
29
+ "keywords": [
30
+ "cli",
31
+ "boilerplate",
32
+ "scaffolding-tool",
33
+ "automation"
34
+ ],
35
+ "repository": {
36
+ "type": "git",
37
+ "url": "https://github.com/tspyder7/boilerforge.git"
38
+ },
39
+ "author": "tspyder7",
40
+ "license": "MIT",
41
+ "packageManager": "pnpm@10.9.0",
42
+ "devDependencies": {
43
+ "@commitlint/cli": "^19.8.1",
44
+ "@commitlint/config-conventional": "^19.8.1",
45
+ "@eslint/js": "^9.25.1",
46
+ "@types/jexl": "^2.3.4",
47
+ "@types/lodash": "^4.17.20",
48
+ "@types/node": "^22.15.2",
49
+ "@typescript-eslint/eslint-plugin": "^8.31.0",
50
+ "@typescript-eslint/parser": "^8.31.0",
51
+ "esbuild": "^0.25.3",
52
+ "esbuild-plugin-copy": "^2.1.1",
53
+ "eslint": "^9.25.1",
54
+ "globals": "^16.0.0",
55
+ "husky": "^9.1.7",
56
+ "prettier": "^3.5.3",
57
+ "rimraf": "^6.0.1",
58
+ "ts-node": "^10.9.2",
59
+ "tslint-config-prettier": "^1.18.0",
60
+ "typescript": "^5.8.3",
61
+ "typescript-eslint": "^8.31.0"
62
+ },
63
+ "dependencies": {
64
+ "ajv": "^8.17.1",
65
+ "ajv-errors": "^3.0.0",
66
+ "ajv-keywords": "^5.1.0",
67
+ "chalk": "^5.4.1",
68
+ "commander": "^13.1.0",
69
+ "enquirer": "^2.4.1",
70
+ "execa": "^9.5.2",
71
+ "globby": "^14.1.0",
72
+ "handlebars": "^4.7.8",
73
+ "inquirer": "^12.6.1",
74
+ "jexl": "^2.3.0",
75
+ "listr2": "^8.3.2",
76
+ "lodash": "^4.17.21",
77
+ "remark-stringify": "^11.0.0",
78
+ "unified": "^11.0.5",
79
+ "unist-builder": "^4.0.0"
80
+ }
68
81
  }
@@ -1,23 +0,0 @@
1
- import js from "@eslint/js";
2
- import globals from "globals";
3
- import tseslint from "typescript-eslint";
4
- import eslintPluginTs from '@typescript-eslint/eslint-plugin';
5
- import { defineConfig } from "eslint/config";
6
-
7
- export default defineConfig([
8
- { files: ["**/*.{js,mjs,cjs,ts}"], plugins: { js }, extends: ["js/recommended"] },
9
- { files: ["**/*.{js,mjs,cjs,ts}"], languageOptions: { globals: globals.node } },
10
- tseslint.configs.recommended,
11
- {
12
- plugins: {
13
- '@typescript-eslint': eslintPluginTs,
14
- },
15
- rules: {
16
- "@typescript-eslint/no-namespace": "off",
17
- "@typescript-eslint/no-empty-interface": "off",
18
- "@typescript-eslint/no-empty-object-type": "off",
19
- "@typescript-eslint/no-unused-expressions": "off"
20
- }
21
- },
22
- { ignores: ["node_modules/*", "dist/*"] },
23
- ]);
@@ -1,30 +0,0 @@
1
- {
2
- "name": "{{name}}",
3
- "version": "{{version}}",
4
- "description": "{{description}}",
5
- "author": "{{author}}",
6
- "license": "ISC",
7
- "main": "{{main}}",
8
- {{#if scripts}}
9
- "scripts": {
10
- {{#each scripts}}
11
- "{{@key}}": "{{this}}"{{#unless @last}},{{/unless}}
12
- {{/each}}
13
- },
14
- {{/if}}
15
- {{#if devDependencies}}
16
- "devDependencies": {
17
- {{#each devDependencies}}
18
- "{{@key}}": "{{this}}"{{#unless @last}},{{/unless}}
19
- {{/each}}
20
- },
21
- {{/if}}
22
- {{#if dependencies}}
23
- "dependencies": {
24
- {{#each dependencies}}
25
- "{{@key}}": "{{this}}"{{#unless @last}},{{/unless}}
26
- {{/each}}
27
- },
28
- {{/if}}
29
- "packageManager": "{{packageManager}}"
30
- }
@@ -1,5 +0,0 @@
1
- async function main() {
2
- console.log('Hello from {{name}}');
3
- }
4
-
5
- main().catch((error) => console.error(error));
@@ -1,5 +0,0 @@
1
- async function main() {
2
- console.log('Hello from {{name}}');
3
- }
4
-
5
- main().catch((error) => console.error(error));
@@ -1,14 +0,0 @@
1
- {
2
- "compilerOptions": {
3
- "target": "ES2024",
4
- "module": "commonjs",
5
- "outDir": "./dist",
6
- "esModuleInterop": true,
7
- "forceConsistentCasingInFileNames": true,
8
- "strict": true,
9
- "skipLibCheck": true
10
- },
11
- "include": [
12
- "src"
13
- ]
14
- }