@benjos/create-boilerplate 1.5.2 → 1.5.6

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 (108) hide show
  1. package/README.md +0 -4
  2. package/dist/constants.d.ts +8 -0
  3. package/dist/constants.d.ts.map +1 -0
  4. package/dist/constants.js +18 -0
  5. package/dist/constants.js.map +1 -0
  6. package/dist/constants.test.d.ts +2 -0
  7. package/dist/constants.test.d.ts.map +1 -0
  8. package/dist/constants.test.js +30 -0
  9. package/dist/constants.test.js.map +1 -0
  10. package/dist/createProject.d.ts +2 -0
  11. package/dist/createProject.d.ts.map +1 -0
  12. package/dist/createProject.js +52 -0
  13. package/dist/createProject.js.map +1 -0
  14. package/dist/createProject.test.d.ts +2 -0
  15. package/dist/createProject.test.d.ts.map +1 -0
  16. package/dist/createProject.test.js +85 -0
  17. package/dist/createProject.test.js.map +1 -0
  18. package/dist/index.js +16 -73
  19. package/dist/index.js.map +1 -1
  20. package/dist/prompts.d.ts +4 -0
  21. package/dist/prompts.d.ts.map +1 -0
  22. package/dist/prompts.js +26 -0
  23. package/dist/prompts.js.map +1 -0
  24. package/dist/prompts.test.d.ts +2 -0
  25. package/dist/prompts.test.d.ts.map +1 -0
  26. package/dist/prompts.test.js +50 -0
  27. package/dist/prompts.test.js.map +1 -0
  28. package/dist/types.d.ts +13 -0
  29. package/dist/types.d.ts.map +1 -0
  30. package/dist/types.js +7 -0
  31. package/dist/types.js.map +1 -0
  32. package/package.json +8 -7
  33. package/template-vanilla/package-lock.json +1000 -1476
  34. package/template-vanilla/package.json +11 -11
  35. package/template-vanilla/src/experiences/Experience.ts +1 -1
  36. package/template-vanilla/src/experiences/constants/experiences/ViewId.ts +2 -7
  37. package/template-vanilla/src/experiences/engines/threes/app/MainThreeApp.ts +8 -5
  38. package/template-vanilla/src/experiences/managers/LoaderManager.ts +4 -5
  39. package/template-vanilla/src/experiences/materials/threes/loaders/LoaderMaterial.ts +8 -5
  40. package/template-vanilla/src/experiences/views/threes/bases/ThreeViewBase.ts +1 -1
  41. package/{template-vue/src/experiences/views/threes/worlds/components/actors/bases → template-vanilla/src/experiences/views/threes/bases/components}/ThreeAnimatedModelBase.ts +3 -3
  42. package/template-vanilla/src/experiences/views/threes/{worlds/components/actors/bases → bases/components}/ThreeModelBase.ts +3 -3
  43. package/template-vanilla/src/experiences/views/threes/loaders/components/TemplateLoaderThreeActor.ts +1 -1
  44. package/template-vanilla/src/experiences/views/threes/worlds/World2ThreeView.ts +5 -5
  45. package/template-vanilla/src/experiences/views/threes/worlds/WorldThreeView.ts +5 -5
  46. package/template-vanilla/src/experiences/views/threes/worlds/components/Environment.ts +1 -1
  47. package/template-vanilla/src/experiences/views/threes/worlds/components/{actors/TemplateFont.ts → TemplateFont.ts} +3 -3
  48. package/template-vanilla/src/experiences/views/threes/worlds/components/{actors/TemplateMesh.ts → TemplateMesh.ts} +3 -3
  49. package/template-vanilla/src/experiences/views/threes/worlds/components/{actors/TemplateMesh2.ts → TemplateMesh2.ts} +3 -3
  50. package/template-vanilla/src/experiences/views/threes/worlds/components/{actors/TemplateModel.ts → TemplateModel.ts} +4 -4
  51. package/template-vanilla/tsconfig.json +3 -3
  52. package/template-vue/package-lock.json +639 -1127
  53. package/template-vue/package.json +12 -12
  54. package/template-vue/src/experiences/Experience.ts +1 -1
  55. package/template-vue/src/experiences/cameras/threes/DebugThreeCameraController.ts +1 -1
  56. package/template-vue/src/experiences/cameras/threes/LoaderThreeCameraController.ts +1 -1
  57. package/template-vue/src/experiences/cameras/threes/MainThreeCameraController.ts +1 -1
  58. package/template-vue/src/experiences/cameras/threes/bases/ThreeCameraControllerBase.ts +1 -1
  59. package/template-vue/src/experiences/constants/experiences/ViewId.ts +2 -7
  60. package/template-vue/src/experiences/engines/threes/app/MainThreeApp.ts +8 -5
  61. package/template-vue/src/experiences/managers/LoaderManager.ts +4 -5
  62. package/template-vue/src/experiences/materials/threes/loaders/LoaderMaterial.ts +8 -5
  63. package/template-vue/src/experiences/views/threes/bases/ThreeViewBase.ts +1 -1
  64. package/{template-vanilla/src/experiences/views/threes/worlds/components/actors/bases → template-vue/src/experiences/views/threes/bases/components}/ThreeAnimatedModelBase.ts +3 -3
  65. package/template-vue/src/experiences/views/threes/{worlds/components/actors/bases → bases/components}/ThreeModelBase.ts +3 -3
  66. package/template-vue/src/experiences/views/threes/loaders/components/TemplateLoaderThreeActor.ts +1 -1
  67. package/template-vue/src/experiences/views/threes/worlds/World2ThreeView.ts +5 -5
  68. package/template-vue/src/experiences/views/threes/worlds/WorldThreeView.ts +5 -5
  69. package/template-vue/src/experiences/views/threes/worlds/components/Environment.ts +1 -1
  70. package/template-vue/src/experiences/views/threes/worlds/components/{actors/TemplateFont.ts → TemplateFont.ts} +3 -3
  71. package/template-vue/src/experiences/views/threes/worlds/components/{actors/TemplateMesh.ts → TemplateMesh.ts} +3 -3
  72. package/template-vue/src/experiences/views/threes/worlds/components/{actors/TemplateMesh2.ts → TemplateMesh2.ts} +3 -3
  73. package/template-vue/src/experiences/views/threes/worlds/components/{actors/TemplateModel.ts → TemplateModel.ts} +4 -4
  74. package/template-vue/tsconfig.app.json +1 -7
  75. package/template-vue/tsconfig.node.json +0 -1
  76. package/template-react/.prettierignore +0 -6
  77. package/template-react/.prettierrc +0 -10
  78. package/template-react/assets_source/.gitkeep +0 -0
  79. package/template-react/eslint.config.js +0 -23
  80. package/template-react/index.html +0 -17
  81. package/template-react/package-lock.json +0 -4455
  82. package/template-react/package.json +0 -46
  83. package/template-react/public/assets/fonts/LICENSE +0 -13
  84. package/template-react/public/assets/fonts/template.typeface.json +0 -1
  85. package/template-react/public/assets/hdrs/template.hdr +0 -0
  86. package/template-react/public/assets/icons/benjosLogoBlack.svg +0 -5
  87. package/template-react/public/assets/loaders/draco/README.md +0 -32
  88. package/template-react/public/assets/loaders/draco/draco_decoder.js +0 -34
  89. package/template-react/public/assets/loaders/draco/draco_decoder.wasm +0 -0
  90. package/template-react/public/assets/loaders/draco/draco_encoder.js +0 -33
  91. package/template-react/public/assets/loaders/draco/draco_wasm_wrapper.js +0 -117
  92. package/template-react/public/assets/loaders/draco/gltf/draco_decoder.js +0 -33
  93. package/template-react/public/assets/loaders/draco/gltf/draco_decoder.wasm +0 -0
  94. package/template-react/public/assets/loaders/draco/gltf/draco_encoder.js +0 -33
  95. package/template-react/public/assets/loaders/draco/gltf/draco_wasm_wrapper.js +0 -116
  96. package/template-react/public/assets/models/template.glb +0 -0
  97. package/template-react/public/assets/textures/template.jpg +0 -0
  98. package/template-react/readme.md +0 -31
  99. package/template-react/src/App.css +0 -42
  100. package/template-react/src/App.tsx +0 -10
  101. package/template-react/src/index.css +0 -68
  102. package/template-react/src/main.tsx +0 -10
  103. package/template-react/tsconfig.app.json +0 -34
  104. package/template-react/tsconfig.json +0 -7
  105. package/template-react/tsconfig.node.json +0 -26
  106. package/template-react/vite.config.ts +0 -29
  107. /package/template-vanilla/src/experiences/views/threes/{worlds/components/actors/bases → bases/components}/ThreeActorBase.ts +0 -0
  108. /package/template-vue/src/experiences/views/threes/{worlds/components/actors/bases → bases/components}/ThreeActorBase.ts +0 -0
package/README.md CHANGED
@@ -31,10 +31,6 @@ Both templates include:
31
31
  - 🎬 ThreeApp architecture (LoaderThreeApp, MainThreeApp)
32
32
  - 📝 TypeScript + ESLint + Prettier
33
33
 
34
- ## 🔧 Development
35
-
36
- See [MAINTENANCE.md](./MAINTENANCE.md) for contributing.
37
-
38
34
  ## 📄 License
39
35
 
40
36
  MIT
@@ -0,0 +1,8 @@
1
+ import type { Framework } from './types.js';
2
+ export declare const RESERVED_NAMES: Set<string>;
3
+ export declare const IGNORED_FILES: Set<string>;
4
+ export declare const FRAMEWORK_CHOICES: {
5
+ name: string;
6
+ value: Framework;
7
+ }[];
8
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,eAAO,MAAM,cAAc,aAWzB,CAAC;AAEH,eAAO,MAAM,aAAa,aAAoF,CAAC;AAE/G,eAAO,MAAM,iBAAiB,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,SAAS,CAAA;CAAE,EAGjE,CAAC"}
@@ -0,0 +1,18 @@
1
+ export const RESERVED_NAMES = new Set([
2
+ 'node',
3
+ 'npm',
4
+ 'package',
5
+ 'test',
6
+ 'tests',
7
+ 'src',
8
+ 'dist',
9
+ 'build',
10
+ 'lib',
11
+ 'node_modules',
12
+ ]);
13
+ export const IGNORED_FILES = new Set(['.git', '.gitignore', '.editorconfig', '.DS_Store', '.vscode', '.idea']);
14
+ export const FRAMEWORK_CHOICES = [
15
+ { name: 'Vanilla (Three.js + TypeScript)', value: 'vanilla' },
16
+ { name: 'Vue (Three.js + TypeScript)', value: 'vue' },
17
+ ];
18
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC;IAClC,MAAM;IACN,KAAK;IACL,SAAS;IACT,MAAM;IACN,OAAO;IACP,KAAK;IACL,MAAM;IACN,OAAO;IACP,KAAK;IACL,cAAc;CACjB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,YAAY,EAAE,eAAe,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;AAE/G,MAAM,CAAC,MAAM,iBAAiB,GAAyC;IACnE,EAAE,IAAI,EAAE,iCAAiC,EAAE,KAAK,EAAE,SAAS,EAAE;IAC7D,EAAE,IAAI,EAAE,6BAA6B,EAAE,KAAK,EAAE,KAAK,EAAE;CACxD,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=constants.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.test.d.ts","sourceRoot":"","sources":["../src/constants.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,30 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { FRAMEWORK_CHOICES, IGNORED_FILES, RESERVED_NAMES } from './constants.js';
3
+ describe('RESERVED_NAMES', () => {
4
+ it('contains critical reserved names', () => {
5
+ const expected = ['node', 'npm', 'package', 'test', 'node_modules', 'dist', 'build'];
6
+ for (const name of expected) {
7
+ expect(RESERVED_NAMES.has(name)).toBe(true);
8
+ }
9
+ });
10
+ });
11
+ describe('IGNORED_FILES', () => {
12
+ it('contains common dotfiles', () => {
13
+ const expected = ['.git', '.gitignore', '.DS_Store'];
14
+ for (const file of expected) {
15
+ expect(IGNORED_FILES.has(file)).toBe(true);
16
+ }
17
+ });
18
+ });
19
+ describe('FRAMEWORK_CHOICES', () => {
20
+ it('has at least one framework available', () => {
21
+ expect(FRAMEWORK_CHOICES.length).toBeGreaterThan(0);
22
+ });
23
+ it('each choice has a name and value', () => {
24
+ for (const choice of FRAMEWORK_CHOICES) {
25
+ expect(choice.name).toBeTruthy();
26
+ expect(choice.value).toBeTruthy();
27
+ }
28
+ });
29
+ });
30
+ //# sourceMappingURL=constants.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.test.js","sourceRoot":"","sources":["../src/constants.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAElF,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC5B,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QACxC,MAAM,QAAQ,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QACrF,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;YAC1B,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChD,CAAC;IACL,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC3B,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QAChC,MAAM,QAAQ,GAAG,CAAC,MAAM,EAAE,YAAY,EAAE,WAAW,CAAC,CAAC;QACrD,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;YAC1B,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/C,CAAC;IACL,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IAC/B,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC5C,MAAM,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QACxC,KAAK,MAAM,MAAM,IAAI,iBAAiB,EAAE,CAAC;YACrC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC;YACjC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,UAAU,EAAE,CAAC;QACtC,CAAC;IACL,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function createProject(projectNameArg?: string, baseDir?: string): Promise<void>;
2
+ //# sourceMappingURL=createProject.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createProject.d.ts","sourceRoot":"","sources":["../src/createProject.ts"],"names":[],"mappings":"AAQA,wBAAsB,aAAa,CAAC,cAAc,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAoD5F"}
@@ -0,0 +1,52 @@
1
+ import chalk from 'chalk';
2
+ import fs from 'fs-extra';
3
+ import path from 'path';
4
+ import { IGNORED_FILES } from './constants.js';
5
+ import { promptForProject } from './prompts.js';
6
+ import { CliError } from './types.js';
7
+ export async function createProject(projectNameArg, baseDir) {
8
+ console.log(chalk.cyan.bold('\n🚀 Welcome to @benjos/boilerplate!\n'));
9
+ const answers = await promptForProject(projectNameArg);
10
+ const projectName = projectNameArg ?? answers.projectName ?? '.';
11
+ const isCurrentDir = projectName === '.';
12
+ const targetDir = isCurrentDir ? process.cwd() : path.join(process.cwd(), projectName);
13
+ if (!isCurrentDir && (await fs.pathExists(targetDir))) {
14
+ throw new CliError(`Directory "${projectName}" already exists!`);
15
+ }
16
+ if (isCurrentDir) {
17
+ const files = (await fs.readdir(targetDir)).filter((file) => !IGNORED_FILES.has(file));
18
+ if (files.length > 0) {
19
+ throw new CliError('Current directory is not empty!');
20
+ }
21
+ }
22
+ const finalProjectName = isCurrentDir ? path.basename(targetDir) : projectName;
23
+ const resolvedBaseDir = baseDir ?? path.join(path.dirname(new URL(import.meta.url).pathname), '..');
24
+ const templateDir = path.join(resolvedBaseDir, `template-${answers.framework}`);
25
+ if (!(await fs.pathExists(templateDir))) {
26
+ throw new CliError(`Template "${answers.framework}" not found. Your installation may be corrupted.`);
27
+ }
28
+ console.log(chalk.blue(`\n📦 Creating project in ${targetDir}...\n`));
29
+ try {
30
+ await fs.copy(templateDir, targetDir);
31
+ const packageJsonPath = path.join(targetDir, 'package.json');
32
+ const packageJson = (await fs.readJson(packageJsonPath));
33
+ packageJson.name = finalProjectName;
34
+ await fs.writeJson(packageJsonPath, packageJson, { spaces: 4 });
35
+ }
36
+ catch (error) {
37
+ if (!isCurrentDir && (await fs.pathExists(targetDir))) {
38
+ await fs.remove(targetDir);
39
+ }
40
+ if (error instanceof CliError)
41
+ throw error;
42
+ throw new CliError('Failed to create project.');
43
+ }
44
+ console.log(chalk.green('✅ Project created successfully!\n'));
45
+ console.log(chalk.cyan('Next steps:\n'));
46
+ if (!isCurrentDir) {
47
+ console.log(chalk.white(` cd ${projectName}`));
48
+ }
49
+ console.log(chalk.white(' npm install'));
50
+ console.log(chalk.white(' npm run dev\n'));
51
+ }
52
+ //# sourceMappingURL=createProject.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createProject.js","sourceRoot":"","sources":["../src/createProject.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAoB,MAAM,YAAY,CAAC;AAExD,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,cAAuB,EAAE,OAAgB;IACzE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC,CAAC;IAEvE,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC,cAAc,CAAC,CAAC;IAEvD,MAAM,WAAW,GAAG,cAAc,IAAI,OAAO,CAAC,WAAW,IAAI,GAAG,CAAC;IACjE,MAAM,YAAY,GAAG,WAAW,KAAK,GAAG,CAAC;IACzC,MAAM,SAAS,GAAG,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,WAAW,CAAC,CAAC;IAEvF,IAAI,CAAC,YAAY,IAAI,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;QACpD,MAAM,IAAI,QAAQ,CAAC,cAAc,WAAW,mBAAmB,CAAC,CAAC;IACrE,CAAC;IAED,IAAI,YAAY,EAAE,CAAC;QACf,MAAM,KAAK,GAAG,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;QACvF,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnB,MAAM,IAAI,QAAQ,CAAC,iCAAiC,CAAC,CAAC;QAC1D,CAAC;IACL,CAAC;IAED,MAAM,gBAAgB,GAAG,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC;IAE/E,MAAM,eAAe,GAAG,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC;IACpG,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,YAAY,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;IAChF,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,QAAQ,CAAC,aAAa,OAAO,CAAC,SAAS,kDAAkD,CAAC,CAAC;IACzG,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,4BAA4B,SAAS,OAAO,CAAC,CAAC,CAAC;IAEtE,IAAI,CAAC;QACD,MAAM,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;QAEtC,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;QAC7D,MAAM,WAAW,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAgB,CAAC;QACxE,WAAW,CAAC,IAAI,GAAG,gBAAgB,CAAC;QACpC,MAAM,EAAE,CAAC,SAAS,CAAC,eAAe,EAAE,WAAW,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;IACpE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,IAAI,CAAC,YAAY,IAAI,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;YACpD,MAAM,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC/B,CAAC;QACD,IAAI,KAAK,YAAY,QAAQ;YAAE,MAAM,KAAK,CAAC;QAC3C,MAAM,IAAI,QAAQ,CAAC,2BAA2B,CAAC,CAAC;IACpD,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC,CAAC;IAC9D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;IACzC,IAAI,CAAC,YAAY,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,WAAW,EAAE,CAAC,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC;IAC1C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC;AAChD,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=createProject.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createProject.test.d.ts","sourceRoot":"","sources":["../src/createProject.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,85 @@
1
+ import fs from 'fs-extra';
2
+ import os from 'os';
3
+ import path from 'path';
4
+ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
5
+ import { createProject } from './createProject.js';
6
+ import { CliError } from './types.js';
7
+ vi.mock('./prompts.js', () => ({
8
+ promptForProject: vi.fn(),
9
+ validateProjectName: vi.fn(() => true),
10
+ }));
11
+ import { promptForProject } from './prompts.js';
12
+ const mockedPrompt = vi.mocked(promptForProject);
13
+ describe('createProject', () => {
14
+ let tmpDir;
15
+ let originalCwd;
16
+ beforeEach(async () => {
17
+ tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), 'boilerplate-test-'));
18
+ originalCwd = process.cwd();
19
+ process.chdir(tmpDir);
20
+ // Create a fake template directory with a package.json
21
+ const templateDir = path.join(tmpDir, 'templates', 'template-vanilla');
22
+ await fs.mkdirp(templateDir);
23
+ await fs.writeJson(path.join(templateDir, 'package.json'), { name: 'template', version: '1.0.0' });
24
+ await fs.writeFile(path.join(templateDir, 'index.ts'), 'console.log("hello");');
25
+ });
26
+ afterEach(async () => {
27
+ process.chdir(originalCwd);
28
+ await fs.remove(tmpDir);
29
+ vi.restoreAllMocks();
30
+ });
31
+ it('creates a project in a new directory', async () => {
32
+ mockedPrompt.mockResolvedValue({ projectName: 'my-app', framework: 'vanilla' });
33
+ const baseDir = path.join(tmpDir, 'templates');
34
+ await createProject(undefined, baseDir);
35
+ const targetDir = path.join(tmpDir, 'my-app');
36
+ expect(await fs.pathExists(targetDir)).toBe(true);
37
+ expect(await fs.pathExists(path.join(targetDir, 'index.ts'))).toBe(true);
38
+ const pkg = (await fs.readJson(path.join(targetDir, 'package.json')));
39
+ expect(pkg.name).toBe('my-app');
40
+ });
41
+ it('throws CliError when target directory already exists', async () => {
42
+ mockedPrompt.mockResolvedValue({ projectName: 'existing', framework: 'vanilla' });
43
+ await fs.mkdirp(path.join(tmpDir, 'existing'));
44
+ const baseDir = path.join(tmpDir, 'templates');
45
+ await expect(createProject(undefined, baseDir)).rejects.toThrow(CliError);
46
+ await expect(createProject(undefined, baseDir)).rejects.toThrow('already exists');
47
+ });
48
+ it('throws CliError when current directory is not empty (ignoring dotfiles)', async () => {
49
+ mockedPrompt.mockResolvedValue({ projectName: '.', framework: 'vanilla' });
50
+ await fs.writeFile(path.join(tmpDir, 'somefile.txt'), 'content');
51
+ const baseDir = path.join(tmpDir, 'templates');
52
+ await expect(createProject(undefined, baseDir)).rejects.toThrow(CliError);
53
+ await expect(createProject(undefined, baseDir)).rejects.toThrow('not empty');
54
+ });
55
+ it('allows current directory when only dotfiles are present', async () => {
56
+ // Create a fresh empty dir for this test since beforeEach creates template files in tmpDir
57
+ const emptyDir = path.join(tmpDir, 'empty-project');
58
+ await fs.mkdirp(emptyDir);
59
+ process.chdir(emptyDir);
60
+ await fs.writeFile(path.join(emptyDir, '.gitignore'), 'node_modules');
61
+ mockedPrompt.mockResolvedValue({ projectName: '.', framework: 'vanilla' });
62
+ const baseDir = path.join(tmpDir, 'templates');
63
+ await createProject(undefined, baseDir);
64
+ expect(await fs.pathExists(path.join(emptyDir, 'index.ts'))).toBe(true);
65
+ });
66
+ it('throws CliError when template directory does not exist', async () => {
67
+ mockedPrompt.mockResolvedValue({ projectName: 'my-app', framework: 'vue' });
68
+ const baseDir = path.join(tmpDir, 'templates');
69
+ // template-vue doesn't exist, only template-vanilla was created
70
+ await expect(createProject(undefined, baseDir)).rejects.toThrow(CliError);
71
+ await expect(createProject(undefined, baseDir)).rejects.toThrow('not found');
72
+ });
73
+ it('cleans up target directory on copy failure', async () => {
74
+ mockedPrompt.mockResolvedValue({ projectName: 'fail-app', framework: 'vanilla' });
75
+ // Create a baseDir where template exists but package.json in template is malformed
76
+ const badTemplateDir = path.join(tmpDir, 'bad-templates', 'template-vanilla');
77
+ await fs.mkdirp(badTemplateDir);
78
+ await fs.writeFile(path.join(badTemplateDir, 'package.json'), 'not json');
79
+ const baseDir = path.join(tmpDir, 'bad-templates');
80
+ await expect(createProject(undefined, baseDir)).rejects.toThrow(CliError);
81
+ // The target directory should have been cleaned up
82
+ expect(await fs.pathExists(path.join(tmpDir, 'fail-app'))).toBe(false);
83
+ });
84
+ });
85
+ //# sourceMappingURL=createProject.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createProject.test.js","sourceRoot":"","sources":["../src/createProject.test.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -2,88 +2,31 @@
2
2
  import chalk from 'chalk';
3
3
  import { program } from 'commander';
4
4
  import fs from 'fs-extra';
5
- import inquirer from 'inquirer';
6
5
  import path from 'path';
7
6
  import { fileURLToPath } from 'url';
7
+ import { createProject } from './createProject.js';
8
+ import { CliError } from './types.js';
8
9
  // eslint-disable-next-line @typescript-eslint/naming-convention
9
10
  const __filename = fileURLToPath(import.meta.url);
10
11
  // eslint-disable-next-line @typescript-eslint/naming-convention
11
12
  const __dirname = path.dirname(__filename);
12
- // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
13
- const pkg = await fs.readJson(path.join(__dirname, '..', 'package.json'));
14
- // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
15
- const version = pkg.version;
16
- async function createProject(projectNameArg) {
17
- console.log(chalk.cyan.bold('\n🚀 Welcome to @benjos/boilerplate!\n'));
18
- const answers = await inquirer.prompt([
19
- {
20
- type: 'input',
21
- name: 'projectName',
22
- message: 'Project name:',
23
- default: projectNameArg ?? 'my-threejs-app',
24
- when: !projectNameArg,
25
- validate: (input) => {
26
- if (input === '.')
27
- return true;
28
- if (!/^[a-z0-9-]+$/.test(input)) {
29
- return 'Project name must contain only lowercase letters, numbers, and hyphens (or "." for current directory)';
30
- }
31
- return true;
32
- },
33
- },
34
- {
35
- type: 'list',
36
- name: 'framework',
37
- message: 'Choose a framework:',
38
- choices: [
39
- { name: 'Vanilla (Three.js + TypeScript)', value: 'vanilla' },
40
- { name: 'React (Coming soon)', value: 'react', disabled: true },
41
- { name: 'Vue (Three.js + TypeScript)', value: 'vue' },
42
- ],
43
- },
44
- ]);
45
- // Handle current directory case
46
- const projectName = projectNameArg ?? answers.projectName ?? '.';
47
- const isCurrentDir = projectName === '.';
48
- const targetDir = isCurrentDir ? process.cwd() : path.join(process.cwd(), projectName);
49
- // Check if directory already exists (only for new directories)
50
- if (!isCurrentDir && (await fs.pathExists(targetDir))) {
51
- console.log(chalk.red(`\n❌ Directory "${projectName}" already exists!`));
52
- process.exit(1);
13
+ const pkg = (await fs.readJson(path.join(__dirname, '..', 'package.json')));
14
+ program
15
+ .name('create-boilerplate')
16
+ .description('Create a new Three.js project with Vanilla/Vue')
17
+ .version(pkg.version)
18
+ .argument('[project-name]', 'Project name (use "." for current directory)')
19
+ .action(async (projectName) => {
20
+ try {
21
+ await createProject(projectName);
53
22
  }
54
- // Check if current directory is empty (only for current directory)
55
- if (isCurrentDir) {
56
- const files = await fs.readdir(targetDir);
57
- if (files.length > 0) {
58
- console.log(chalk.red('\n❌ Current directory is not empty!'));
23
+ catch (error) {
24
+ if (error instanceof CliError) {
25
+ console.log(chalk.red(`\n❌ ${error.message}`));
59
26
  process.exit(1);
60
27
  }
28
+ throw error;
61
29
  }
62
- const finalProjectName = isCurrentDir ? path.basename(targetDir) : projectName;
63
- console.log(chalk.blue(`\n📦 Creating project in ${targetDir}...\n`));
64
- // Copy template
65
- const templateDir = path.join(__dirname, '..', `template-${answers.framework}`);
66
- await fs.copy(templateDir, targetDir);
67
- // Update package.json with project name
68
- const packageJsonPath = path.join(targetDir, 'package.json');
69
- // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
70
- const packageJson = await fs.readJson(packageJsonPath);
71
- // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
72
- packageJson.name = finalProjectName;
73
- await fs.writeJson(packageJsonPath, packageJson, { spaces: 4 });
74
- console.log(chalk.green('✅ Project created successfully!\n'));
75
- console.log(chalk.cyan('Next steps:\n'));
76
- if (!isCurrentDir) {
77
- console.log(chalk.white(` cd ${projectName}`));
78
- }
79
- console.log(chalk.white(' npm install'));
80
- console.log(chalk.white(' npm run dev\n'));
81
- }
82
- program
83
- .name('create-boilerplate')
84
- .description('Create a new Three.js project with Vanilla/React/Vue')
85
- .version(version)
86
- .argument('[project-name]', 'Project name (use "." for current directory)')
87
- .action((projectName) => createProject(projectName));
30
+ });
88
31
  program.parse();
89
32
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAoB,MAAM,YAAY,CAAC;AAExD,gEAAgE;AAChE,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,gEAAgE;AAChE,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAE3C,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC,CAAgB,CAAC;AAE3F,OAAO;KACF,IAAI,CAAC,oBAAoB,CAAC;KAC1B,WAAW,CAAC,gDAAgD,CAAC;KAC7D,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;KACpB,QAAQ,CAAC,gBAAgB,EAAE,8CAA8C,CAAC;KAC1E,MAAM,CAAC,KAAK,EAAE,WAAoB,EAAE,EAAE;IACnC,IAAI,CAAC;QACD,MAAM,aAAa,CAAC,WAAW,CAAC,CAAC;IACrC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,IAAI,KAAK,YAAY,QAAQ,EAAE,CAAC;YAC5B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC;QACD,MAAM,KAAK,CAAC;IAChB,CAAC;AACL,CAAC,CAAC,CAAC;AAEP,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { ProjectAnswers } from './types.js';
2
+ export declare function validateProjectName(value: string): string | true;
3
+ export declare function promptForProject(projectNameArg?: string): Promise<ProjectAnswers>;
4
+ //# sourceMappingURL=prompts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAa,cAAc,EAAE,MAAM,YAAY,CAAC;AAE5D,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAShE;AAED,wBAAsB,gBAAgB,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAavF"}
@@ -0,0 +1,26 @@
1
+ import { input, select } from '@inquirer/prompts';
2
+ import { FRAMEWORK_CHOICES, RESERVED_NAMES } from './constants.js';
3
+ export function validateProjectName(value) {
4
+ if (value === '.')
5
+ return true;
6
+ if (!/^[a-z0-9-]+$/.test(value)) {
7
+ return 'Project name must contain only lowercase letters, numbers, and hyphens (or "." for current directory)';
8
+ }
9
+ if (RESERVED_NAMES.has(value)) {
10
+ return `"${value}" is a reserved name. Please choose a different project name.`;
11
+ }
12
+ return true;
13
+ }
14
+ export async function promptForProject(projectNameArg) {
15
+ const projectName = projectNameArg ?? await input({
16
+ message: 'Project name:',
17
+ default: 'my-threejs-app',
18
+ validate: validateProjectName,
19
+ });
20
+ const framework = await select({
21
+ message: 'Choose a framework:',
22
+ choices: FRAMEWORK_CHOICES,
23
+ });
24
+ return { projectName, framework };
25
+ }
26
+ //# sourceMappingURL=prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAElD,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAGnE,MAAM,UAAU,mBAAmB,CAAC,KAAa;IAC7C,IAAI,KAAK,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IAC/B,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,uGAAuG,CAAC;IACnH,CAAC;IACD,IAAI,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,IAAI,KAAK,+DAA+D,CAAC;IACpF,CAAC;IACD,OAAO,IAAI,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,cAAuB;IAC1D,MAAM,WAAW,GAAG,cAAc,IAAI,MAAM,KAAK,CAAC;QAC9C,OAAO,EAAE,eAAe;QACxB,OAAO,EAAE,gBAAgB;QACzB,QAAQ,EAAE,mBAAmB;KAChC,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,MAAM,MAAM,CAAY;QACtC,OAAO,EAAE,qBAAqB;QAC9B,OAAO,EAAE,iBAAiB;KAC7B,CAAC,CAAC;IAEH,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC;AACtC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=prompts.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.test.d.ts","sourceRoot":"","sources":["../src/prompts.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,50 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { RESERVED_NAMES } from './constants.js';
3
+ import { validateProjectName } from './prompts.js';
4
+ describe('validateProjectName', () => {
5
+ it('accepts valid lowercase names', () => {
6
+ expect(validateProjectName('my-app')).toBe(true);
7
+ expect(validateProjectName('app123')).toBe(true);
8
+ expect(validateProjectName('a')).toBe(true);
9
+ expect(validateProjectName('my-threejs-app')).toBe(true);
10
+ });
11
+ it('accepts "." for current directory', () => {
12
+ expect(validateProjectName('.')).toBe(true);
13
+ });
14
+ it('rejects names with uppercase letters', () => {
15
+ expect(validateProjectName('MyApp')).toBeTypeOf('string');
16
+ expect(validateProjectName('APP')).toBeTypeOf('string');
17
+ });
18
+ it('rejects names with spaces', () => {
19
+ expect(validateProjectName('my app')).toBeTypeOf('string');
20
+ });
21
+ it('rejects names with special characters', () => {
22
+ expect(validateProjectName('my_app')).toBeTypeOf('string');
23
+ expect(validateProjectName('my.app')).toBeTypeOf('string');
24
+ expect(validateProjectName('my@app')).toBeTypeOf('string');
25
+ });
26
+ it('rejects all reserved names that pass format validation', () => {
27
+ const formatValid = [...RESERVED_NAMES].filter((name) => /^[a-z0-9-]+$/.test(name));
28
+ expect(formatValid.length).toBeGreaterThan(0);
29
+ for (const name of formatValid) {
30
+ const result = validateProjectName(name);
31
+ expect(result).toBeTypeOf('string');
32
+ expect(result).toContain('reserved');
33
+ }
34
+ });
35
+ it('rejects reserved names with invalid characters via format check', () => {
36
+ const result = validateProjectName('node_modules');
37
+ expect(result).toBeTypeOf('string');
38
+ expect(result).toContain('lowercase');
39
+ });
40
+ it('returns descriptive error message for invalid format', () => {
41
+ const result = validateProjectName('My-App');
42
+ expect(result).toContain('lowercase');
43
+ });
44
+ it('returns descriptive error message for reserved name', () => {
45
+ const result = validateProjectName('node');
46
+ expect(result).toContain('"node"');
47
+ expect(result).toContain('reserved');
48
+ });
49
+ });
50
+ //# sourceMappingURL=prompts.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.test.js","sourceRoot":"","sources":["../src/prompts.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export interface PackageJson {
2
+ name: string;
3
+ version: string;
4
+ }
5
+ export type Framework = 'vanilla' | 'vue';
6
+ export interface ProjectAnswers {
7
+ projectName: string;
8
+ framework: Framework;
9
+ }
10
+ export declare class CliError extends Error {
11
+ constructor(message: string);
12
+ }
13
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,KAAK,CAAC;AAE1C,MAAM,WAAW,cAAc;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,SAAS,CAAC;CACxB;AAED,qBAAa,QAAS,SAAQ,KAAK;gBACnB,OAAO,EAAE,MAAM;CAI9B"}
package/dist/types.js ADDED
@@ -0,0 +1,7 @@
1
+ export class CliError extends Error {
2
+ constructor(message) {
3
+ super(message);
4
+ this.name = 'CliError';
5
+ }
6
+ }
7
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAYA,MAAM,OAAO,QAAS,SAAQ,KAAK;IAC/B,YAAY,OAAe;QACvB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;IAC3B,CAAC;CACJ"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@benjos/create-boilerplate",
3
- "version": "1.5.2",
3
+ "version": "1.5.6",
4
4
  "description": "CLI to scaffold Three.js projects with framework support",
5
5
  "type": "module",
6
6
  "bin": {
@@ -28,22 +28,23 @@
28
28
  ],
29
29
  "author": "Benjamin Schinkel",
30
30
  "license": "MIT",
31
+ "engines": {
32
+ "node": ">=18.0.0"
33
+ },
31
34
  "repository": {
32
35
  "type": "git",
33
36
  "url": "https://github.com/LeBenjos/boilerplate.git"
34
37
  },
35
38
  "homepage": "https://github.com/LeBenjos/boilerplate#readme",
36
39
  "dependencies": {
37
- "@inquirer/rawlist": "^5.1.0",
40
+ "@inquirer/prompts": "^8.3.2",
38
41
  "chalk": "^5.6.2",
39
- "commander": "^14.0.2",
40
- "fs-extra": "^11.3.3",
41
- "inquirer": "^9.2.12"
42
+ "commander": "^14.0.3",
43
+ "fs-extra": "^11.3.4"
42
44
  },
43
45
  "devDependencies": {
44
46
  "@types/fs-extra": "^11.0.4",
45
- "@types/inquirer": "^9.0.9",
46
- "@types/node": "^25.0.3",
47
+ "@types/node": "^25.5.0",
47
48
  "typescript": "~5.9.3"
48
49
  }
49
50
  }