@miiajs/cli 0.1.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 (187) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +19 -0
  3. package/dist/bin.d.ts +3 -0
  4. package/dist/bin.d.ts.map +1 -0
  5. package/dist/bin.js +5 -0
  6. package/dist/bin.js.map +1 -0
  7. package/dist/cli.d.ts +2 -0
  8. package/dist/cli.d.ts.map +1 -0
  9. package/dist/cli.js +17 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/commands/build.d.ts +9 -0
  12. package/dist/commands/build.d.ts.map +1 -0
  13. package/dist/commands/build.js +39 -0
  14. package/dist/commands/build.js.map +1 -0
  15. package/dist/commands/check.d.ts +3 -0
  16. package/dist/commands/check.d.ts.map +1 -0
  17. package/dist/commands/check.js +27 -0
  18. package/dist/commands/check.js.map +1 -0
  19. package/dist/commands/dev.d.ts +18 -0
  20. package/dist/commands/dev.d.ts.map +1 -0
  21. package/dist/commands/dev.js +42 -0
  22. package/dist/commands/dev.js.map +1 -0
  23. package/dist/commands/generate.d.ts +28 -0
  24. package/dist/commands/generate.d.ts.map +1 -0
  25. package/dist/commands/generate.js +67 -0
  26. package/dist/commands/generate.js.map +1 -0
  27. package/dist/commands/new.d.ts +19 -0
  28. package/dist/commands/new.d.ts.map +1 -0
  29. package/dist/commands/new.js +44 -0
  30. package/dist/commands/new.js.map +1 -0
  31. package/dist/commands/start.d.ts +23 -0
  32. package/dist/commands/start.d.ts.map +1 -0
  33. package/dist/commands/start.js +49 -0
  34. package/dist/commands/start.js.map +1 -0
  35. package/dist/dev/orchestrator.d.ts +9 -0
  36. package/dist/dev/orchestrator.d.ts.map +1 -0
  37. package/dist/dev/orchestrator.js +80 -0
  38. package/dist/dev/orchestrator.js.map +1 -0
  39. package/dist/dev/tsc-pipe.d.ts +3 -0
  40. package/dist/dev/tsc-pipe.d.ts.map +1 -0
  41. package/dist/dev/tsc-pipe.js +44 -0
  42. package/dist/dev/tsc-pipe.js.map +1 -0
  43. package/dist/generate/module-updater.d.ts +20 -0
  44. package/dist/generate/module-updater.d.ts.map +1 -0
  45. package/dist/generate/module-updater.js +158 -0
  46. package/dist/generate/module-updater.js.map +1 -0
  47. package/dist/generate/runner.d.ts +3 -0
  48. package/dist/generate/runner.d.ts.map +1 -0
  49. package/dist/generate/runner.js +130 -0
  50. package/dist/generate/runner.js.map +1 -0
  51. package/dist/generate/schematics.d.ts +8 -0
  52. package/dist/generate/schematics.d.ts.map +1 -0
  53. package/dist/generate/schematics.js +68 -0
  54. package/dist/generate/schematics.js.map +1 -0
  55. package/dist/generate/templates/controller.d.ts +3 -0
  56. package/dist/generate/templates/controller.d.ts.map +1 -0
  57. package/dist/generate/templates/controller.js +14 -0
  58. package/dist/generate/templates/controller.js.map +1 -0
  59. package/dist/generate/templates/guard.d.ts +3 -0
  60. package/dist/generate/templates/guard.d.ts.map +1 -0
  61. package/dist/generate/templates/guard.js +13 -0
  62. package/dist/generate/templates/guard.js.map +1 -0
  63. package/dist/generate/templates/middleware.d.ts +3 -0
  64. package/dist/generate/templates/middleware.d.ts.map +1 -0
  65. package/dist/generate/templates/middleware.js +11 -0
  66. package/dist/generate/templates/middleware.js.map +1 -0
  67. package/dist/generate/templates/module.d.ts +3 -0
  68. package/dist/generate/templates/module.d.ts.map +1 -0
  69. package/dist/generate/templates/module.js +8 -0
  70. package/dist/generate/templates/module.js.map +1 -0
  71. package/dist/generate/templates/resource.d.ts +5 -0
  72. package/dist/generate/templates/resource.d.ts.map +1 -0
  73. package/dist/generate/templates/resource.js +78 -0
  74. package/dist/generate/templates/resource.js.map +1 -0
  75. package/dist/generate/templates/service.d.ts +3 -0
  76. package/dist/generate/templates/service.d.ts.map +1 -0
  77. package/dist/generate/templates/service.js +12 -0
  78. package/dist/generate/templates/service.js.map +1 -0
  79. package/dist/generate/types.d.ts +38 -0
  80. package/dist/generate/types.d.ts.map +1 -0
  81. package/dist/generate/types.js +2 -0
  82. package/dist/generate/types.js.map +1 -0
  83. package/dist/runtime/commands.d.ts +11 -0
  84. package/dist/runtime/commands.d.ts.map +1 -0
  85. package/dist/runtime/commands.js +46 -0
  86. package/dist/runtime/commands.js.map +1 -0
  87. package/dist/runtime/detect.d.ts +10 -0
  88. package/dist/runtime/detect.d.ts.map +1 -0
  89. package/dist/runtime/detect.js +65 -0
  90. package/dist/runtime/detect.js.map +1 -0
  91. package/dist/runtime/types.d.ts +2 -0
  92. package/dist/runtime/types.d.ts.map +1 -0
  93. package/dist/runtime/types.js +2 -0
  94. package/dist/runtime/types.js.map +1 -0
  95. package/dist/scaffold/app-composer.d.ts +12 -0
  96. package/dist/scaffold/app-composer.d.ts.map +1 -0
  97. package/dist/scaffold/app-composer.js +102 -0
  98. package/dist/scaffold/app-composer.js.map +1 -0
  99. package/dist/scaffold/features/config.d.ts +3 -0
  100. package/dist/scaffold/features/config.d.ts.map +1 -0
  101. package/dist/scaffold/features/config.js +43 -0
  102. package/dist/scaffold/features/config.js.map +1 -0
  103. package/dist/scaffold/features/cors.d.ts +3 -0
  104. package/dist/scaffold/features/cors.d.ts.map +1 -0
  105. package/dist/scaffold/features/cors.js +19 -0
  106. package/dist/scaffold/features/cors.js.map +1 -0
  107. package/dist/scaffold/features/drizzle-mysql.d.ts +3 -0
  108. package/dist/scaffold/features/drizzle-mysql.d.ts.map +1 -0
  109. package/dist/scaffold/features/drizzle-mysql.js +28 -0
  110. package/dist/scaffold/features/drizzle-mysql.js.map +1 -0
  111. package/dist/scaffold/features/drizzle-postgres.d.ts +3 -0
  112. package/dist/scaffold/features/drizzle-postgres.d.ts.map +1 -0
  113. package/dist/scaffold/features/drizzle-postgres.js +28 -0
  114. package/dist/scaffold/features/drizzle-postgres.js.map +1 -0
  115. package/dist/scaffold/features/drizzle-sqlite.d.ts +3 -0
  116. package/dist/scaffold/features/drizzle-sqlite.d.ts.map +1 -0
  117. package/dist/scaffold/features/drizzle-sqlite.js +29 -0
  118. package/dist/scaffold/features/drizzle-sqlite.js.map +1 -0
  119. package/dist/scaffold/features/jwt-auth.d.ts +3 -0
  120. package/dist/scaffold/features/jwt-auth.d.ts.map +1 -0
  121. package/dist/scaffold/features/jwt-auth.js +117 -0
  122. package/dist/scaffold/features/jwt-auth.js.map +1 -0
  123. package/dist/scaffold/features/mongoose.d.ts +3 -0
  124. package/dist/scaffold/features/mongoose.d.ts.map +1 -0
  125. package/dist/scaffold/features/mongoose.js +23 -0
  126. package/dist/scaffold/features/mongoose.js.map +1 -0
  127. package/dist/scaffold/features/papr.d.ts +3 -0
  128. package/dist/scaffold/features/papr.d.ts.map +1 -0
  129. package/dist/scaffold/features/papr.js +24 -0
  130. package/dist/scaffold/features/papr.js.map +1 -0
  131. package/dist/scaffold/features/registry.d.ts +12 -0
  132. package/dist/scaffold/features/registry.d.ts.map +1 -0
  133. package/dist/scaffold/features/registry.js +76 -0
  134. package/dist/scaffold/features/registry.js.map +1 -0
  135. package/dist/scaffold/features/serve-static.d.ts +3 -0
  136. package/dist/scaffold/features/serve-static.d.ts.map +1 -0
  137. package/dist/scaffold/features/serve-static.js +17 -0
  138. package/dist/scaffold/features/serve-static.js.map +1 -0
  139. package/dist/scaffold/features/swagger.d.ts +3 -0
  140. package/dist/scaffold/features/swagger.d.ts.map +1 -0
  141. package/dist/scaffold/features/swagger.js +20 -0
  142. package/dist/scaffold/features/swagger.js.map +1 -0
  143. package/dist/scaffold/package-install.d.ts +3 -0
  144. package/dist/scaffold/package-install.d.ts.map +1 -0
  145. package/dist/scaffold/package-install.js +17 -0
  146. package/dist/scaffold/package-install.js.map +1 -0
  147. package/dist/scaffold/project-files.d.ts +13 -0
  148. package/dist/scaffold/project-files.d.ts.map +1 -0
  149. package/dist/scaffold/project-files.js +78 -0
  150. package/dist/scaffold/project-files.js.map +1 -0
  151. package/dist/scaffold/prompts.d.ts +11 -0
  152. package/dist/scaffold/prompts.d.ts.map +1 -0
  153. package/dist/scaffold/prompts.js +79 -0
  154. package/dist/scaffold/prompts.js.map +1 -0
  155. package/dist/scaffold/scaffold.d.ts +14 -0
  156. package/dist/scaffold/scaffold.d.ts.map +1 -0
  157. package/dist/scaffold/scaffold.js +88 -0
  158. package/dist/scaffold/scaffold.js.map +1 -0
  159. package/dist/scaffold/types.d.ts +41 -0
  160. package/dist/scaffold/types.d.ts.map +1 -0
  161. package/dist/scaffold/types.js +2 -0
  162. package/dist/scaffold/types.js.map +1 -0
  163. package/dist/utils/format.d.ts +2 -0
  164. package/dist/utils/format.d.ts.map +1 -0
  165. package/dist/utils/format.js +43 -0
  166. package/dist/utils/format.js.map +1 -0
  167. package/dist/utils/fs.d.ts +2 -0
  168. package/dist/utils/fs.d.ts.map +1 -0
  169. package/dist/utils/fs.js +7 -0
  170. package/dist/utils/fs.js.map +1 -0
  171. package/dist/utils/logger.d.ts +8 -0
  172. package/dist/utils/logger.d.ts.map +1 -0
  173. package/dist/utils/logger.js +10 -0
  174. package/dist/utils/logger.js.map +1 -0
  175. package/dist/utils/naming.d.ts +4 -0
  176. package/dist/utils/naming.d.ts.map +1 -0
  177. package/dist/utils/naming.js +18 -0
  178. package/dist/utils/naming.js.map +1 -0
  179. package/dist/utils/preflight.d.ts +3 -0
  180. package/dist/utils/preflight.d.ts.map +1 -0
  181. package/dist/utils/preflight.js +32 -0
  182. package/dist/utils/preflight.js.map +1 -0
  183. package/dist/utils/writer.d.ts +16 -0
  184. package/dist/utils/writer.d.ts.map +1 -0
  185. package/dist/utils/writer.js +42 -0
  186. package/dist/utils/writer.js.map +1 -0
  187. package/package.json +64 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/scaffold/prompts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { Runtime } from '../runtime/types.js';
2
+ import type { FeatureId } from './types.js';
3
+ import type { PackageManager } from './prompts.js';
4
+ export interface ScaffoldOptions {
5
+ name: string;
6
+ runtime: Runtime;
7
+ featureIds: FeatureId[];
8
+ packageManager: PackageManager;
9
+ targetDir: string;
10
+ dryRun?: boolean;
11
+ skipInstall?: boolean;
12
+ }
13
+ export declare function scaffoldProject(options: ScaffoldOptions): Promise<void>;
14
+ //# sourceMappingURL=scaffold.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../../src/scaffold/scaffold.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,KAAK,EAAE,SAAS,EAAmB,MAAM,YAAY,CAAA;AAC5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAGlD,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,OAAO,CAAA;IAChB,UAAU,EAAE,SAAS,EAAE,CAAA;IACvB,cAAc,EAAE,cAAc,CAAA;IAC9B,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB;AAED,wBAAsB,eAAe,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAmF7E"}
@@ -0,0 +1,88 @@
1
+ import { resolve } from 'node:path';
2
+ import { existsSync } from 'node:fs';
3
+ import { writeFileRecursive } from '../utils/fs.js';
4
+ import { installDependencies } from './package-install.js';
5
+ import { resolveFeatures } from './features/registry.js';
6
+ import { buildPackageJson, buildTsconfig, buildGitignore, buildEnvFile } from './project-files.js';
7
+ import { composeAppModule, composeMainTs, composeAppController, composeAppService } from './app-composer.js';
8
+ import { logger } from '../utils/logger.js';
9
+ import * as p from '@clack/prompts';
10
+ export async function scaffoldProject(options) {
11
+ const { name, runtime, featureIds, packageManager, targetDir, dryRun = false, skipInstall = false } = options;
12
+ const root = resolve(process.cwd(), targetDir);
13
+ if (existsSync(root)) {
14
+ logger.error(`Directory "${targetDir}" already exists`);
15
+ process.exit(1);
16
+ }
17
+ // Resolve features (auto-select requires, check conflicts)
18
+ const { features, error } = resolveFeatures(featureIds);
19
+ if (error) {
20
+ logger.error(error);
21
+ process.exit(1);
22
+ }
23
+ const ctx = { name, runtime, features, dryRun };
24
+ if (dryRun) {
25
+ logger.info('DRY RUN - no files will be written\n');
26
+ }
27
+ // Collect all files to write
28
+ const files = {
29
+ 'package.json': buildPackageJson({ name, runtime, features }),
30
+ 'tsconfig.json': buildTsconfig(runtime),
31
+ '.gitignore': buildGitignore(),
32
+ 'src/main.ts': composeMainTs({ runtime, features }),
33
+ 'src/app/app.module.ts': composeAppModule({ runtime, features }),
34
+ 'src/app/app.controller.ts': composeAppController(),
35
+ 'src/app/app.service.ts': composeAppService(),
36
+ };
37
+ // Add .env if any feature has envVars (or base env needed)
38
+ const hasEnvVars = features.some((f) => f.envVars);
39
+ if (hasEnvVars) {
40
+ files['.env'] = buildEnvFile(features);
41
+ }
42
+ // Add feature-specific files
43
+ for (const feature of features) {
44
+ if (feature.files) {
45
+ const featureFiles = feature.files(ctx);
46
+ Object.assign(files, featureFiles);
47
+ }
48
+ }
49
+ // Write files
50
+ for (const [relativePath, content] of Object.entries(files)) {
51
+ const fullPath = resolve(root, relativePath);
52
+ if (dryRun) {
53
+ logger.info(` CREATE ${relativePath}`);
54
+ }
55
+ else {
56
+ await writeFileRecursive(fullPath, content);
57
+ logger.success(` CREATE ${relativePath}`);
58
+ }
59
+ }
60
+ // Install dependencies
61
+ if (!dryRun && !skipInstall) {
62
+ console.log();
63
+ await installDependencies(root, packageManager);
64
+ }
65
+ else if (dryRun) {
66
+ console.log();
67
+ const allDeps = Object.assign({}, ...features.map((f) => f.packages));
68
+ const allDevDeps = Object.assign({}, ...features.map((f) => f.devPackages ?? {}));
69
+ const depList = Object.entries(allDeps)
70
+ .map(([k, v]) => ` ${k} ${v}`)
71
+ .join('\n');
72
+ const devDepList = Object.entries(allDevDeps)
73
+ .map(([k, v]) => ` ${k} ${v} (dev)`)
74
+ .join('\n');
75
+ if (depList || devDepList) {
76
+ logger.info(' Dependencies that would be installed:');
77
+ if (depList)
78
+ logger.info(depList);
79
+ if (devDepList)
80
+ logger.info(devDepList);
81
+ }
82
+ }
83
+ if (!dryRun) {
84
+ console.log();
85
+ p.outro(`Project "${name}" created successfully!\n\n cd ${targetDir}\n miia dev`);
86
+ }
87
+ }
88
+ //# sourceMappingURL=scaffold.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../../src/scaffold/scaffold.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import type { Runtime } from '../runtime/types.js';
2
+ export type FeatureId = 'config' | 'jwt-auth' | 'swagger' | 'drizzle-postgres' | 'drizzle-mysql' | 'drizzle-sqlite' | 'papr' | 'mongoose' | 'cors' | 'serve-static';
3
+ export type FeatureGroup = 'core' | 'database' | 'extras';
4
+ export interface Feature {
5
+ id: FeatureId;
6
+ label: string;
7
+ hint: string;
8
+ group: FeatureGroup;
9
+ /** Production dependencies */
10
+ packages: Record<string, string>;
11
+ /** Dev dependencies */
12
+ devPackages?: Record<string, string>;
13
+ /** Import + registration in app.module.ts */
14
+ moduleImport?: {
15
+ /** Full import statement line */
16
+ statement: string;
17
+ /** Each entry is one complete expression inserted into @Module({ imports: [...] }) */
18
+ entries: string[];
19
+ };
20
+ /** Setup code injected into main.ts */
21
+ mainSetup?: {
22
+ imports: string[];
23
+ /** Code lines inserted before app.listen() */
24
+ code: string[];
25
+ };
26
+ /** Extra files to generate */
27
+ files?: (ctx: ScaffoldContext) => Record<string, string>;
28
+ /** Environment variables added to .env */
29
+ envVars?: Record<string, string>;
30
+ /** Feature IDs that will be auto-selected */
31
+ requires?: FeatureId[];
32
+ /** Feature IDs that are mutually exclusive */
33
+ conflicts?: FeatureId[];
34
+ }
35
+ export interface ScaffoldContext {
36
+ name: string;
37
+ runtime: Runtime;
38
+ features: Feature[];
39
+ dryRun: boolean;
40
+ }
41
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/scaffold/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAElD,MAAM,MAAM,SAAS,GACjB,QAAQ,GACR,UAAU,GACV,SAAS,GACT,kBAAkB,GAClB,eAAe,GACf,gBAAgB,GAChB,MAAM,GACN,UAAU,GACV,MAAM,GACN,cAAc,CAAA;AAElB,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,UAAU,GAAG,QAAQ,CAAA;AAEzD,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,SAAS,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,YAAY,CAAA;IAEnB,8BAA8B;IAC9B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAChC,uBAAuB;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAEpC,6CAA6C;IAC7C,YAAY,CAAC,EAAE;QACb,iCAAiC;QACjC,SAAS,EAAE,MAAM,CAAA;QACjB,sFAAsF;QACtF,OAAO,EAAE,MAAM,EAAE,CAAA;KAClB,CAAA;IAED,uCAAuC;IACvC,SAAS,CAAC,EAAE;QACV,OAAO,EAAE,MAAM,EAAE,CAAA;QACjB,8CAA8C;QAC9C,IAAI,EAAE,MAAM,EAAE,CAAA;KACf,CAAA;IAED,8BAA8B;IAC9B,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,eAAe,KAAK,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAExD,0CAA0C;IAC1C,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAEhC,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,SAAS,EAAE,CAAA;IACtB,8CAA8C;IAC9C,SAAS,CAAC,EAAE,SAAS,EAAE,CAAA;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,OAAO,CAAA;IAChB,QAAQ,EAAE,OAAO,EAAE,CAAA;IACnB,MAAM,EAAE,OAAO,CAAA;CAChB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/scaffold/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export declare function formatFiles(filePaths: string[], cwd: string): Promise<void>;
2
+ //# sourceMappingURL=format.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/utils/format.ts"],"names":[],"mappings":"AAgCA,wBAAsB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAajF"}
@@ -0,0 +1,43 @@
1
+ import { existsSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { execa } from 'execa';
4
+ const BIOME_CONFIGS = ['biome.json', 'biome.jsonc'];
5
+ const PRETTIER_CONFIGS = [
6
+ '.prettierrc',
7
+ '.prettierrc.json',
8
+ '.prettierrc.yaml',
9
+ '.prettierrc.yml',
10
+ 'prettier.config.js',
11
+ ];
12
+ function detectFormatter(cwd) {
13
+ if (BIOME_CONFIGS.some((f) => existsSync(join(cwd, f)))) {
14
+ const bin = join(cwd, 'node_modules', '.bin', 'biome');
15
+ if (existsSync(bin))
16
+ return { bin, args: (files) => ['format', '--write', ...files] };
17
+ return null;
18
+ }
19
+ if (PRETTIER_CONFIGS.some((f) => existsSync(join(cwd, f)))) {
20
+ const bin = join(cwd, 'node_modules', '.bin', 'prettier');
21
+ if (existsSync(bin))
22
+ return { bin, args: (files) => ['--write', ...files] };
23
+ return null;
24
+ }
25
+ return null;
26
+ }
27
+ export async function formatFiles(filePaths, cwd) {
28
+ if (filePaths.length === 0)
29
+ return;
30
+ const formatter = detectFormatter(cwd);
31
+ if (!formatter)
32
+ return;
33
+ try {
34
+ await execa(formatter.bin, formatter.args(filePaths), {
35
+ cwd,
36
+ stdio: 'pipe',
37
+ });
38
+ }
39
+ catch {
40
+ // formatter installed but failed - skip silently
41
+ }
42
+ }
43
+ //# sourceMappingURL=format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/utils/format.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAA;AAE7B,MAAM,aAAa,GAAG,CAAC,YAAY,EAAE,aAAa,CAAC,CAAA;AACnD,MAAM,gBAAgB,GAAG;IACvB,aAAa;IACb,kBAAkB;IAClB,kBAAkB;IAClB,iBAAiB;IACjB,oBAAoB;CACrB,CAAA;AAOD,SAAS,eAAe,CAAC,GAAW;IAClC,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACxD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,cAAc,EAAE,MAAM,EAAE,OAAO,CAAC,CAAA;QACtD,IAAI,UAAU,CAAC,GAAG,CAAC;YAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,QAAQ,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC,EAAE,CAAA;QACrF,OAAO,IAAI,CAAA;IACb,CAAC;IACD,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3D,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,cAAc,EAAE,MAAM,EAAE,UAAU,CAAC,CAAA;QACzD,IAAI,UAAU,CAAC,GAAG,CAAC;YAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,SAAS,EAAE,GAAG,KAAK,CAAC,EAAE,CAAA;QAC3E,OAAO,IAAI,CAAA;IACb,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,SAAmB,EAAE,GAAW;IAChE,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAM;IAClC,MAAM,SAAS,GAAG,eAAe,CAAC,GAAG,CAAC,CAAA;IACtC,IAAI,CAAC,SAAS;QAAE,OAAM;IAEtB,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE;YACpD,GAAG;YACH,KAAK,EAAE,MAAM;SACd,CAAC,CAAA;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,iDAAiD;IACnD,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function writeFileRecursive(path: string, content: string): Promise<void>;
2
+ //# sourceMappingURL=fs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs.d.ts","sourceRoot":"","sources":["../../src/utils/fs.ts"],"names":[],"mappings":"AAGA,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGrF"}
@@ -0,0 +1,7 @@
1
+ import { mkdir, writeFile } from 'node:fs/promises';
2
+ import { dirname } from 'node:path';
3
+ export async function writeFileRecursive(path, content) {
4
+ await mkdir(dirname(path), { recursive: true });
5
+ await writeFile(path, content, 'utf-8');
6
+ }
7
+ //# sourceMappingURL=fs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs.js","sourceRoot":"","sources":["../../src/utils/fs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAEnC,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,IAAY,EAAE,OAAe;IACpE,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAC/C,MAAM,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;AACzC,CAAC"}
@@ -0,0 +1,8 @@
1
+ export declare const logger: {
2
+ info: (msg: string) => void;
3
+ success: (msg: string) => void;
4
+ error: (msg: string) => void;
5
+ warn: (msg: string) => void;
6
+ box: (msg: string) => void;
7
+ };
8
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,MAAM;gBACL,MAAM;mBACH,MAAM;iBACR,MAAM;gBACP,MAAM;eACP,MAAM;CAClB,CAAA"}
@@ -0,0 +1,10 @@
1
+ import { consola } from 'consola';
2
+ import { colors } from 'consola/utils';
3
+ export const logger = {
4
+ info: (msg) => consola.log(msg),
5
+ success: (msg) => consola.log(colors.green(msg)),
6
+ error: (msg) => consola.log(colors.red(msg)),
7
+ warn: (msg) => consola.log(colors.yellow(msg)),
8
+ box: (msg) => consola.box(msg),
9
+ };
10
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAA;AAEtC,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,IAAI,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;IACvC,OAAO,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACxD,KAAK,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACpD,IAAI,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACtD,GAAG,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;CACvC,CAAA"}
@@ -0,0 +1,4 @@
1
+ export declare function toKebabCase(input: string): string;
2
+ export declare function toPascalCase(input: string): string;
3
+ export declare function lowerFirst(input: string): string;
4
+ //# sourceMappingURL=naming.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"naming.d.ts","sourceRoot":"","sources":["../../src/utils/naming.ts"],"names":[],"mappings":"AAAA,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAKjD;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAOlD;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEhD"}
@@ -0,0 +1,18 @@
1
+ export function toKebabCase(input) {
2
+ return input
3
+ .replace(/([a-z0-9])([A-Z])/g, '$1-$2')
4
+ .replace(/[_\s]+/g, '-')
5
+ .toLowerCase();
6
+ }
7
+ export function toPascalCase(input) {
8
+ return input
9
+ .replace(/([a-z0-9])([A-Z])/g, '$1-$2')
10
+ .split(/[-_\s]+/)
11
+ .filter(Boolean)
12
+ .map((segment) => segment.charAt(0).toUpperCase() + segment.slice(1).toLowerCase())
13
+ .join('');
14
+ }
15
+ export function lowerFirst(input) {
16
+ return input.charAt(0).toLowerCase() + input.slice(1);
17
+ }
18
+ //# sourceMappingURL=naming.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"naming.js","sourceRoot":"","sources":["../../src/utils/naming.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,OAAO,KAAK;SACT,OAAO,CAAC,oBAAoB,EAAE,OAAO,CAAC;SACtC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;SACvB,WAAW,EAAE,CAAA;AAClB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,OAAO,KAAK;SACT,OAAO,CAAC,oBAAoB,EAAE,OAAO,CAAC;SACtC,KAAK,CAAC,SAAS,CAAC;SAChB,MAAM,CAAC,OAAO,CAAC;SACf,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;SAClF,IAAI,CAAC,EAAE,CAAC,CAAA;AACb,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAa;IACtC,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;AACvD,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Runtime } from '../runtime/types.js';
2
+ export declare function preflight(runtime: Runtime, command: 'dev' | 'build' | 'start' | 'check'): boolean;
3
+ //# sourceMappingURL=preflight.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preflight.d.ts","sourceRoot":"","sources":["../../src/utils/preflight.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAWlD,wBAAgB,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,CAqBjG"}
@@ -0,0 +1,32 @@
1
+ import { execaSync } from 'execa';
2
+ import { logger } from './logger.js';
3
+ function hasCommand(cmd) {
4
+ try {
5
+ execaSync('which', [cmd]);
6
+ return true;
7
+ }
8
+ catch {
9
+ return false;
10
+ }
11
+ }
12
+ export function preflight(runtime, command) {
13
+ if (command !== 'start' && !hasCommand('tsc')) {
14
+ logger.error('TypeScript compiler (tsc) not found. Install typescript:\n npm install -D typescript');
15
+ return false;
16
+ }
17
+ if (runtime === 'node' && command === 'dev') {
18
+ try {
19
+ execaSync('node', ['--import', 'tsx', '-e', '""']);
20
+ }
21
+ catch {
22
+ logger.error('tsx not found. Install it for Node.js dev mode:\n npm install -D tsx');
23
+ return false;
24
+ }
25
+ }
26
+ if (runtime !== 'node' && !hasCommand(runtime)) {
27
+ logger.error(`Runtime "${runtime}" not found in PATH`);
28
+ return false;
29
+ }
30
+ return true;
31
+ }
32
+ //# sourceMappingURL=preflight.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preflight.js","sourceRoot":"","sources":["../../src/utils/preflight.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAGpC,SAAS,UAAU,CAAC,GAAW;IAC7B,IAAI,CAAC;QACH,SAAS,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC,CAAA;QACzB,OAAO,IAAI,CAAA;IACb,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,OAAgB,EAAE,OAA4C;IACtF,IAAI,OAAO,KAAK,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9C,MAAM,CAAC,KAAK,CAAC,uFAAuF,CAAC,CAAA;QACrG,OAAO,KAAK,CAAA;IACd,CAAC;IAED,IAAI,OAAO,KAAK,MAAM,IAAI,OAAO,KAAK,KAAK,EAAE,CAAC;QAC5C,IAAI,CAAC;YACH,SAAS,CAAC,MAAM,EAAE,CAAC,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAA;QACpD,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,CAAC,KAAK,CAAC,uEAAuE,CAAC,CAAA;YACrF,OAAO,KAAK,CAAA;QACd,CAAC;IACH,CAAC;IAED,IAAI,OAAO,KAAK,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC/C,MAAM,CAAC,KAAK,CAAC,YAAY,OAAO,qBAAqB,CAAC,CAAA;QACtD,OAAO,KAAK,CAAA;IACd,CAAC;IAED,OAAO,IAAI,CAAA;AACb,CAAC"}
@@ -0,0 +1,16 @@
1
+ export interface WriteResult {
2
+ created: string[];
3
+ modified: string[];
4
+ skipped: string[];
5
+ }
6
+ export interface WriteFileOptions {
7
+ dryRun?: boolean;
8
+ /** If true, allow overwriting existing files (used for module updates) */
9
+ allowOverwrite?: boolean;
10
+ }
11
+ export declare function writeGeneratedFile(absolutePath: string, content: string, options?: WriteFileOptions): Promise<'created' | 'skipped'>;
12
+ export declare function writeGeneratedFiles(files: Array<{
13
+ path: string;
14
+ content: string;
15
+ }>, options?: WriteFileOptions): Promise<WriteResult>;
16
+ //# sourceMappingURL=writer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"writer.d.ts","sourceRoot":"","sources":["../../src/utils/writer.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB,OAAO,EAAE,MAAM,EAAE,CAAA;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,0EAA0E;IAC1E,cAAc,CAAC,EAAE,OAAO,CAAA;CACzB;AAED,wBAAsB,kBAAkB,CACtC,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC,CAiBhC;AAED,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,EAC/C,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,WAAW,CAAC,CAuBtB"}
@@ -0,0 +1,42 @@
1
+ import { existsSync } from 'node:fs';
2
+ import { relative } from 'node:path';
3
+ import { writeFileRecursive } from './fs.js';
4
+ import { logger } from './logger.js';
5
+ export async function writeGeneratedFile(absolutePath, content, options = {}) {
6
+ const displayPath = relative(process.cwd(), absolutePath);
7
+ if (!options.allowOverwrite && existsSync(absolutePath)) {
8
+ logger.error(` File already exists: ${displayPath}`);
9
+ return 'skipped';
10
+ }
11
+ if (options.dryRun) {
12
+ const lines = content.split('\n').length;
13
+ logger.info(` CREATE ${displayPath} (${lines} lines)`);
14
+ return 'created';
15
+ }
16
+ await writeFileRecursive(absolutePath, content);
17
+ logger.success(` CREATE ${displayPath}`);
18
+ return 'created';
19
+ }
20
+ export async function writeGeneratedFiles(files, options = {}) {
21
+ const result = { created: [], modified: [], skipped: [] };
22
+ if (!options.allowOverwrite) {
23
+ const conflicts = files.filter((f) => existsSync(f.path));
24
+ if (conflicts.length > 0) {
25
+ for (const c of conflicts) {
26
+ logger.error(` File already exists: ${relative(process.cwd(), c.path)}`);
27
+ }
28
+ return { created: [], modified: [], skipped: files.map((f) => f.path) };
29
+ }
30
+ }
31
+ for (const file of files) {
32
+ const status = await writeGeneratedFile(file.path, file.content, options);
33
+ if (status === 'created') {
34
+ result.created.push(file.path);
35
+ }
36
+ else {
37
+ result.skipped.push(file.path);
38
+ }
39
+ }
40
+ return result;
41
+ }
42
+ //# sourceMappingURL=writer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"writer.js","sourceRoot":"","sources":["../../src/utils/writer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AACpC,OAAO,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAA;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAcpC,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,YAAoB,EACpB,OAAe,EACf,UAA4B,EAAE;IAE9B,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,YAAY,CAAC,CAAA;IAEzD,IAAI,CAAC,OAAO,CAAC,cAAc,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QACxD,MAAM,CAAC,KAAK,CAAC,0BAA0B,WAAW,EAAE,CAAC,CAAA;QACrD,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAA;QACxC,MAAM,CAAC,IAAI,CAAC,YAAY,WAAW,KAAK,KAAK,SAAS,CAAC,CAAA;QACvD,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,MAAM,kBAAkB,CAAC,YAAY,EAAE,OAAO,CAAC,CAAA;IAC/C,MAAM,CAAC,OAAO,CAAC,YAAY,WAAW,EAAE,CAAC,CAAA;IACzC,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,KAA+C,EAC/C,UAA4B,EAAE;IAE9B,MAAM,MAAM,GAAgB,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAA;IAEtE,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;QAC5B,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;QACzD,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;gBAC1B,MAAM,CAAC,KAAK,CAAC,0BAA0B,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;YAC3E,CAAC;YACD,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAA;QACzE,CAAC;IACH,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;QACzE,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAChC,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAChC,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC"}
package/package.json ADDED
@@ -0,0 +1,64 @@
1
+ {
2
+ "name": "@miiajs/cli",
3
+ "version": "0.1.0",
4
+ "author": "Ruslan Matiushev",
5
+ "license": "MIT",
6
+ "description": "CLI for MiiaJS - build, develop, and scaffold MiiaJS applications",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/miiajs/miia.git",
10
+ "directory": "packages/cli"
11
+ },
12
+ "homepage": "https://github.com/miiajs/miia/tree/main/packages/cli#readme",
13
+ "bugs": {
14
+ "url": "https://github.com/miiajs/miia/issues"
15
+ },
16
+ "keywords": [
17
+ "miiajs",
18
+ "miia",
19
+ "cli",
20
+ "scaffold",
21
+ "dev-server",
22
+ "build-tool"
23
+ ],
24
+ "publishConfig": {
25
+ "access": "public"
26
+ },
27
+ "type": "module",
28
+ "bin": {
29
+ "miia": "dist/bin.js"
30
+ },
31
+ "exports": {
32
+ ".": {
33
+ "types": "./dist/cli.d.ts",
34
+ "import": "./dist/cli.js"
35
+ }
36
+ },
37
+ "main": "./dist/cli.js",
38
+ "types": "./dist/cli.d.ts",
39
+ "files": [
40
+ "dist",
41
+ "README.md",
42
+ "LICENSE"
43
+ ],
44
+ "sideEffects": false,
45
+ "engines": {
46
+ "node": ">=22.22.1",
47
+ "bun": ">=1.3.11",
48
+ "deno": ">=2.6.1"
49
+ },
50
+ "dependencies": {
51
+ "@clack/prompts": "^1.2.0",
52
+ "citty": "^0.2.2",
53
+ "consola": "^3.4.2",
54
+ "execa": "^9.5.3",
55
+ "magicast": "^0.5.2"
56
+ },
57
+ "devDependencies": {
58
+ "@babel/types": "^7.29.0"
59
+ },
60
+ "scripts": {
61
+ "build": "tsc --build",
62
+ "clean": "tsc --build --clean"
63
+ }
64
+ }