@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":"drizzle-sqlite.d.ts","sourceRoot":"","sources":["../../../src/scaffold/features/drizzle-sqlite.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAE1C,eAAO,MAAM,oBAAoB,EAAE,OA2BlC,CAAA"}
@@ -0,0 +1,29 @@
1
+ export const drizzleSqliteFeature = {
2
+ id: 'drizzle-sqlite',
3
+ label: 'Drizzle + SQLite',
4
+ hint: '',
5
+ group: 'database',
6
+ requires: ['config'],
7
+ packages: {
8
+ '@miiajs/drizzle': '^0.1.0',
9
+ 'drizzle-orm': '^0.44.0',
10
+ 'better-sqlite3': '^11.9.0',
11
+ },
12
+ devPackages: {
13
+ 'drizzle-kit': '^0.31.0',
14
+ '@types/better-sqlite3': '^7.6.0',
15
+ },
16
+ moduleImport: {
17
+ statement: `import { DrizzleModule } from '@miiajs/drizzle'`,
18
+ entries: [
19
+ `DrizzleModule.configure((resolve) => ({
20
+ dialect: 'sqlite',
21
+ connection: { url: resolve(ConfigService).getOrThrow('DATABASE_URL') },
22
+ }))`,
23
+ ],
24
+ },
25
+ envVars: {
26
+ DATABASE_URL: 'file:./data.db',
27
+ },
28
+ };
29
+ //# sourceMappingURL=drizzle-sqlite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drizzle-sqlite.js","sourceRoot":"","sources":["../../../src/scaffold/features/drizzle-sqlite.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,oBAAoB,GAAY;IAC3C,EAAE,EAAE,gBAAgB;IACpB,KAAK,EAAE,kBAAkB;IACzB,IAAI,EAAE,EAAE;IACR,KAAK,EAAE,UAAU;IACjB,QAAQ,EAAE,CAAC,QAAQ,CAAC;IACpB,QAAQ,EAAE;QACR,iBAAiB,EAAE,QAAQ;QAC3B,aAAa,EAAE,SAAS;QACxB,gBAAgB,EAAE,SAAS;KAC5B;IACD,WAAW,EAAE;QACX,aAAa,EAAE,SAAS;QACxB,uBAAuB,EAAE,QAAQ;KAClC;IACD,YAAY,EAAE;QACZ,SAAS,EAAE,iDAAiD;QAC5D,OAAO,EAAE;YACP;;;QAGE;SACH;KACF;IACD,OAAO,EAAE;QACP,YAAY,EAAE,gBAAgB;KAC/B;CACF,CAAA"}
@@ -0,0 +1,3 @@
1
+ import type { Feature } from '../types.js';
2
+ export declare const jwtAuthFeature: Feature;
3
+ //# sourceMappingURL=jwt-auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jwt-auth.d.ts","sourceRoot":"","sources":["../../../src/scaffold/features/jwt-auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAE1C,eAAO,MAAM,cAAc,EAAE,OAmH5B,CAAA"}
@@ -0,0 +1,117 @@
1
+ export const jwtAuthFeature = {
2
+ id: 'jwt-auth',
3
+ label: 'JWT Auth',
4
+ hint: 'JWT authentication strategy',
5
+ group: 'core',
6
+ packages: {
7
+ '@miiajs/auth': '^0.1.0',
8
+ '@miiajs/jwt': '^0.1.0',
9
+ },
10
+ requires: ['config'],
11
+ moduleImport: {
12
+ statement: `import { JwtModule } from '@miiajs/jwt'
13
+ import { AuthModule } from '../auth/auth.module.js'`,
14
+ entries: [
15
+ `JwtModule.configure((resolve) => ({
16
+ secret: resolve(ConfigService).getOrThrow('JWT_SECRET'),
17
+ expiresIn: '1h',
18
+ }))`,
19
+ `AuthModule`,
20
+ ],
21
+ },
22
+ files: () => ({
23
+ 'src/types/core.d.ts': `export {}
24
+
25
+ declare module '@miiajs/core' {
26
+ interface RequestContext {
27
+ user?: Record<string, unknown>
28
+ }
29
+ }
30
+ `,
31
+ 'src/auth/auth.module.ts': `import { Module } from '@miiajs/core'
32
+ import { AuthController } from './auth.controller.js'
33
+ import { AuthService } from './auth.service.js'
34
+ import { JwtAuth } from './strategies/jwt.strategy.js'
35
+ import { LocalAuth } from './strategies/local.strategy.js'
36
+
37
+ @Module({
38
+ controllers: [AuthController],
39
+ providers: [AuthService, JwtAuth, LocalAuth],
40
+ })
41
+ export class AuthModule {}
42
+ `,
43
+ 'src/auth/auth.service.ts': `import { Injectable, inject } from '@miiajs/core'
44
+ import { JwtService } from '@miiajs/jwt'
45
+
46
+ @Injectable()
47
+ export class AuthService {
48
+ private jwtService = inject(JwtService)
49
+
50
+ async issueTokenFor(user: Record<string, unknown>) {
51
+ const token = await this.jwtService.sign({ sub: user.id ?? user.email })
52
+ return { accessToken: token }
53
+ }
54
+ }
55
+ `,
56
+ 'src/auth/auth.controller.ts': `import { Controller, Get, Post, inject, UseGuard } from '@miiajs/core'
57
+ import type { RequestContext } from '@miiajs/core'
58
+ import { AuthGuard } from '@miiajs/auth'
59
+ import { AuthService } from './auth.service.js'
60
+ import { JwtAuth } from './strategies/jwt.strategy.js'
61
+ import { LocalAuth } from './strategies/local.strategy.js'
62
+
63
+ @Controller('/auth')
64
+ export class AuthController {
65
+ private authService = inject(AuthService)
66
+
67
+ @Post('/login')
68
+ @UseGuard(AuthGuard(LocalAuth))
69
+ async login(ctx: RequestContext) {
70
+ return this.authService.issueTokenFor(ctx.user!)
71
+ }
72
+
73
+ @Get('/me')
74
+ @UseGuard(AuthGuard(JwtAuth))
75
+ me(ctx: RequestContext) {
76
+ return ctx.user
77
+ }
78
+ }
79
+ `,
80
+ 'src/auth/strategies/jwt.strategy.ts': `import { type AuthProvider, fromHeader } from '@miiajs/auth'
81
+ import { inject, Injectable, type RequestContext, UnauthorizedException } from '@miiajs/core'
82
+ import { JwtService } from '@miiajs/jwt'
83
+
84
+ @Injectable()
85
+ export class JwtAuth implements AuthProvider {
86
+ private jwtService = inject(JwtService)
87
+ private extract = fromHeader()
88
+
89
+ async authenticate(ctx: RequestContext) {
90
+ const token = this.extract(ctx)
91
+ if (!token) throw new UnauthorizedException('Missing token')
92
+ return this.jwtService.verify(token)
93
+ }
94
+ }
95
+ `,
96
+ 'src/auth/strategies/local.strategy.ts': `import { Injectable, UnauthorizedException } from '@miiajs/core'
97
+ import type { AuthProvider } from '@miiajs/auth'
98
+ import type { RequestContext } from '@miiajs/core'
99
+
100
+ @Injectable()
101
+ export class LocalAuth implements AuthProvider {
102
+ async authenticate(ctx: RequestContext) {
103
+ const body = await ctx.json<{ email: string; password: string }>()
104
+ // TODO: look up user and verify password
105
+ if (!body.email || !body.password) {
106
+ throw new UnauthorizedException('Invalid credentials')
107
+ }
108
+ return { email: body.email }
109
+ }
110
+ }
111
+ `,
112
+ }),
113
+ envVars: {
114
+ JWT_SECRET: 'change_me_in_production',
115
+ },
116
+ };
117
+ //# sourceMappingURL=jwt-auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jwt-auth.js","sourceRoot":"","sources":["../../../src/scaffold/features/jwt-auth.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,cAAc,GAAY;IACrC,EAAE,EAAE,UAAU;IACd,KAAK,EAAE,UAAU;IACjB,IAAI,EAAE,6BAA6B;IACnC,KAAK,EAAE,MAAM;IACb,QAAQ,EAAE;QACR,cAAc,EAAE,QAAQ;QACxB,aAAa,EAAE,QAAQ;KACxB;IACD,QAAQ,EAAE,CAAC,QAAQ,CAAC;IACpB,YAAY,EAAE;QACZ,SAAS,EAAE;oDACqC;QAChD,OAAO,EAAE;YACP;;;QAGE;YACF,YAAY;SACb;KACF;IACD,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QACZ,qBAAqB,EAAE;;;;;;;CAO1B;QACG,yBAAyB,EAAE;;;;;;;;;;;CAW9B;QACG,0BAA0B,EAAE;;;;;;;;;;;;CAY/B;QACG,6BAA6B,EAAE;;;;;;;;;;;;;;;;;;;;;;;CAuBlC;QACG,qCAAqC,EAAE;;;;;;;;;;;;;;;CAe1C;QACG,uCAAuC,EAAE;;;;;;;;;;;;;;;CAe5C;KACE,CAAC;IACF,OAAO,EAAE;QACP,UAAU,EAAE,yBAAyB;KACtC;CACF,CAAA"}
@@ -0,0 +1,3 @@
1
+ import type { Feature } from '../types.js';
2
+ export declare const mongooseFeature: Feature;
3
+ //# sourceMappingURL=mongoose.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mongoose.d.ts","sourceRoot":"","sources":["../../../src/scaffold/features/mongoose.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAE1C,eAAO,MAAM,eAAe,EAAE,OAqB7B,CAAA"}
@@ -0,0 +1,23 @@
1
+ export const mongooseFeature = {
2
+ id: 'mongoose',
3
+ label: 'Mongoose + MongoDB',
4
+ hint: '',
5
+ group: 'database',
6
+ requires: ['config'],
7
+ packages: {
8
+ '@miiajs/mongoose': '^0.1.0',
9
+ mongoose: '^8.14.0',
10
+ },
11
+ moduleImport: {
12
+ statement: `import { MongooseModule } from '@miiajs/mongoose'`,
13
+ entries: [
14
+ `MongooseModule.configure((resolve) => ({
15
+ uri: resolve(ConfigService).getOrThrow('MONGODB_URL'),
16
+ }))`,
17
+ ],
18
+ },
19
+ envVars: {
20
+ MONGODB_URL: 'mongodb://localhost:27017/myapp',
21
+ },
22
+ };
23
+ //# sourceMappingURL=mongoose.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mongoose.js","sourceRoot":"","sources":["../../../src/scaffold/features/mongoose.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,eAAe,GAAY;IACtC,EAAE,EAAE,UAAU;IACd,KAAK,EAAE,oBAAoB;IAC3B,IAAI,EAAE,EAAE;IACR,KAAK,EAAE,UAAU;IACjB,QAAQ,EAAE,CAAC,QAAQ,CAAC;IACpB,QAAQ,EAAE;QACR,kBAAkB,EAAE,QAAQ;QAC5B,QAAQ,EAAE,SAAS;KACpB;IACD,YAAY,EAAE;QACZ,SAAS,EAAE,mDAAmD;QAC9D,OAAO,EAAE;YACP;;QAEE;SACH;KACF;IACD,OAAO,EAAE;QACP,WAAW,EAAE,iCAAiC;KAC/C;CACF,CAAA"}
@@ -0,0 +1,3 @@
1
+ import type { Feature } from '../types.js';
2
+ export declare const paprFeature: Feature;
3
+ //# sourceMappingURL=papr.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"papr.d.ts","sourceRoot":"","sources":["../../../src/scaffold/features/papr.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAE1C,eAAO,MAAM,WAAW,EAAE,OAsBzB,CAAA"}
@@ -0,0 +1,24 @@
1
+ export const paprFeature = {
2
+ id: 'papr',
3
+ label: 'Papr + MongoDB',
4
+ hint: '',
5
+ group: 'database',
6
+ requires: ['config'],
7
+ packages: {
8
+ '@miiajs/papr': '^0.1.0',
9
+ papr: '^17.0.0',
10
+ mongodb: '^6.13.0',
11
+ },
12
+ moduleImport: {
13
+ statement: `import { PaprModule } from '@miiajs/papr'`,
14
+ entries: [
15
+ `PaprModule.configure((resolve) => ({
16
+ connection: { url: resolve(ConfigService).getOrThrow('MONGODB_URL') },
17
+ }))`,
18
+ ],
19
+ },
20
+ envVars: {
21
+ MONGODB_URL: 'mongodb://localhost:27017/myapp',
22
+ },
23
+ };
24
+ //# sourceMappingURL=papr.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"papr.js","sourceRoot":"","sources":["../../../src/scaffold/features/papr.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,WAAW,GAAY;IAClC,EAAE,EAAE,MAAM;IACV,KAAK,EAAE,gBAAgB;IACvB,IAAI,EAAE,EAAE;IACR,KAAK,EAAE,UAAU;IACjB,QAAQ,EAAE,CAAC,QAAQ,CAAC;IACpB,QAAQ,EAAE;QACR,cAAc,EAAE,QAAQ;QACxB,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,SAAS;KACnB;IACD,YAAY,EAAE;QACZ,SAAS,EAAE,2CAA2C;QACtD,OAAO,EAAE;YACP;;QAEE;SACH;KACF;IACD,OAAO,EAAE;QACP,WAAW,EAAE,iCAAiC;KAC/C;CACF,CAAA"}
@@ -0,0 +1,12 @@
1
+ import type { Feature, FeatureId } from '../types.js';
2
+ export declare function getFeature(id: FeatureId): Feature | undefined;
3
+ export declare function getAllFeatures(): Feature[];
4
+ /**
5
+ * Resolve `requires` dependencies: auto-select required features.
6
+ * Also validates `conflicts` - returns error message or null.
7
+ */
8
+ export declare function resolveFeatures(selectedIds: FeatureId[]): {
9
+ features: Feature[];
10
+ error?: string;
11
+ };
12
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/scaffold/features/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AA+BrD,wBAAgB,UAAU,CAAC,EAAE,EAAE,SAAS,GAAG,OAAO,GAAG,SAAS,CAE7D;AAED,wBAAgB,cAAc,IAAI,OAAO,EAAE,CAE1C;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,SAAS,EAAE,GAAG;IAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAsCjG"}
@@ -0,0 +1,76 @@
1
+ import { configFeature } from './config.js';
2
+ import { jwtAuthFeature } from './jwt-auth.js';
3
+ import { swaggerFeature } from './swagger.js';
4
+ import { drizzlePostgresFeature } from './drizzle-postgres.js';
5
+ import { drizzleMysqlFeature } from './drizzle-mysql.js';
6
+ import { drizzleSqliteFeature } from './drizzle-sqlite.js';
7
+ import { paprFeature } from './papr.js';
8
+ import { mongooseFeature } from './mongoose.js';
9
+ import { corsFeature } from './cors.js';
10
+ import { serveStaticFeature } from './serve-static.js';
11
+ import { logger } from '../../utils/logger.js';
12
+ const allFeatures = [
13
+ configFeature,
14
+ jwtAuthFeature,
15
+ swaggerFeature,
16
+ drizzlePostgresFeature,
17
+ drizzleMysqlFeature,
18
+ drizzleSqliteFeature,
19
+ paprFeature,
20
+ mongooseFeature,
21
+ corsFeature,
22
+ serveStaticFeature,
23
+ ];
24
+ const byId = new Map();
25
+ for (const f of allFeatures) {
26
+ byId.set(f.id, f);
27
+ }
28
+ export function getFeature(id) {
29
+ return byId.get(id);
30
+ }
31
+ export function getAllFeatures() {
32
+ return allFeatures;
33
+ }
34
+ /**
35
+ * Resolve `requires` dependencies: auto-select required features.
36
+ * Also validates `conflicts` - returns error message or null.
37
+ */
38
+ export function resolveFeatures(selectedIds) {
39
+ const resolved = new Set(selectedIds);
40
+ // Auto-resolve requires
41
+ let changed = true;
42
+ while (changed) {
43
+ changed = false;
44
+ for (const id of [...resolved]) {
45
+ const feature = byId.get(id);
46
+ if (!feature?.requires)
47
+ continue;
48
+ for (const req of feature.requires) {
49
+ if (!resolved.has(req)) {
50
+ resolved.add(req);
51
+ changed = true;
52
+ logger.info(` Auto-selected: ${byId.get(req)?.label ?? req} (required by ${feature.label})`);
53
+ }
54
+ }
55
+ }
56
+ }
57
+ // Check conflicts
58
+ for (const id of resolved) {
59
+ const feature = byId.get(id);
60
+ if (!feature?.conflicts)
61
+ continue;
62
+ for (const conflictId of feature.conflicts) {
63
+ if (resolved.has(conflictId)) {
64
+ const conflicting = byId.get(conflictId);
65
+ return {
66
+ features: [],
67
+ error: `${feature.label} conflicts with ${conflicting?.label ?? conflictId}. Pick one.`,
68
+ };
69
+ }
70
+ }
71
+ }
72
+ // Build ordered list (preserve allFeatures order for deterministic output)
73
+ const features = allFeatures.filter((f) => resolved.has(f.id));
74
+ return { features };
75
+ }
76
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/scaffold/features/registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Feature } from '../types.js';
2
+ export declare const serveStaticFeature: Feature;
3
+ //# sourceMappingURL=serve-static.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serve-static.d.ts","sourceRoot":"","sources":["../../../src/scaffold/features/serve-static.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAE1C,eAAO,MAAM,kBAAkB,EAAE,OAehC,CAAA"}
@@ -0,0 +1,17 @@
1
+ export const serveStaticFeature = {
2
+ id: 'serve-static',
3
+ label: 'Serve Static',
4
+ hint: 'static file serving',
5
+ group: 'extras',
6
+ packages: {
7
+ '@miiajs/serve-static': '^0.1.0',
8
+ },
9
+ mainSetup: {
10
+ imports: [`import { serveStatic } from '@miiajs/serve-static'`],
11
+ code: [`serveStatic(app, '/static', './public')`],
12
+ },
13
+ files: () => ({
14
+ 'public/.gitkeep': '',
15
+ }),
16
+ };
17
+ //# sourceMappingURL=serve-static.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serve-static.js","sourceRoot":"","sources":["../../../src/scaffold/features/serve-static.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,kBAAkB,GAAY;IACzC,EAAE,EAAE,cAAc;IAClB,KAAK,EAAE,cAAc;IACrB,IAAI,EAAE,qBAAqB;IAC3B,KAAK,EAAE,QAAQ;IACf,QAAQ,EAAE;QACR,sBAAsB,EAAE,QAAQ;KACjC;IACD,SAAS,EAAE;QACT,OAAO,EAAE,CAAC,oDAAoD,CAAC;QAC/D,IAAI,EAAE,CAAC,yCAAyC,CAAC;KAClD;IACD,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QACZ,iBAAiB,EAAE,EAAE;KACtB,CAAC;CACH,CAAA"}
@@ -0,0 +1,3 @@
1
+ import type { Feature } from '../types.js';
2
+ export declare const swaggerFeature: Feature;
3
+ //# sourceMappingURL=swagger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"swagger.d.ts","sourceRoot":"","sources":["../../../src/scaffold/features/swagger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAE1C,eAAO,MAAM,cAAc,EAAE,OAkB5B,CAAA"}
@@ -0,0 +1,20 @@
1
+ export const swaggerFeature = {
2
+ id: 'swagger',
3
+ label: 'Swagger',
4
+ hint: 'OpenAPI 3.1 + Swagger UI',
5
+ group: 'core',
6
+ packages: {
7
+ '@miiajs/swagger': '^0.1.0',
8
+ },
9
+ moduleImport: {
10
+ statement: `import { SwaggerModule } from '@miiajs/swagger'`,
11
+ entries: [
12
+ `SwaggerModule.configure({
13
+ title: 'My App',
14
+ version: '1.0.0',
15
+ description: 'API documentation',
16
+ })`,
17
+ ],
18
+ },
19
+ };
20
+ //# sourceMappingURL=swagger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"swagger.js","sourceRoot":"","sources":["../../../src/scaffold/features/swagger.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,cAAc,GAAY;IACrC,EAAE,EAAE,SAAS;IACb,KAAK,EAAE,SAAS;IAChB,IAAI,EAAE,0BAA0B;IAChC,KAAK,EAAE,MAAM;IACb,QAAQ,EAAE;QACR,iBAAiB,EAAE,QAAQ;KAC5B;IACD,YAAY,EAAE;QACZ,SAAS,EAAE,iDAAiD;QAC5D,OAAO,EAAE;YACP;;;;OAIC;SACF;KACF;CACF,CAAA"}
@@ -0,0 +1,3 @@
1
+ import type { PackageManager } from './prompts.js';
2
+ export declare function installDependencies(cwd: string, pm: PackageManager): Promise<void>;
3
+ //# sourceMappingURL=package-install.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-install.d.ts","sourceRoot":"","sources":["../../src/scaffold/package-install.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAElD,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAcxF"}
@@ -0,0 +1,17 @@
1
+ import { execa } from 'execa';
2
+ import { logger } from '../utils/logger.js';
3
+ export async function installDependencies(cwd, pm) {
4
+ logger.info(`Installing dependencies with ${pm}...`);
5
+ const result = await execa(pm, ['install'], {
6
+ cwd,
7
+ stdio: 'inherit',
8
+ reject: false,
9
+ });
10
+ if (result.exitCode !== 0) {
11
+ logger.warn('Dependency installation failed. Run install manually.');
12
+ }
13
+ else {
14
+ logger.success('Dependencies installed');
15
+ }
16
+ }
17
+ //# sourceMappingURL=package-install.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-install.js","sourceRoot":"","sources":["../../src/scaffold/package-install.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAA;AAC7B,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAG3C,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,GAAW,EAAE,EAAkB;IACvE,MAAM,CAAC,IAAI,CAAC,gCAAgC,EAAE,KAAK,CAAC,CAAA;IAEpD,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE;QAC1C,GAAG;QACH,KAAK,EAAE,SAAS;QAChB,MAAM,EAAE,KAAK;KACd,CAAC,CAAA;IAEF,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAA;IACtE,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAA;IAC1C,CAAC;AACH,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { Runtime } from '../runtime/types.js';
2
+ import type { Feature } from './types.js';
3
+ interface ProjectFilesContext {
4
+ name: string;
5
+ runtime: Runtime;
6
+ features: Feature[];
7
+ }
8
+ export declare function buildPackageJson(ctx: ProjectFilesContext): string;
9
+ export declare function buildTsconfig(runtime: Runtime): string;
10
+ export declare function buildGitignore(): string;
11
+ export declare function buildEnvFile(features: Feature[]): string;
12
+ export {};
13
+ //# sourceMappingURL=project-files.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-files.d.ts","sourceRoot":"","sources":["../../src/scaffold/project-files.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAEzC,UAAU,mBAAmB;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,OAAO,CAAA;IAChB,QAAQ,EAAE,OAAO,EAAE,CAAA;CACpB;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,mBAAmB,GAAG,MAAM,CAwCjE;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CA8BtD;AAED,wBAAgB,cAAc,IAAI,MAAM,CAMvC;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,MAAM,CAUxD"}
@@ -0,0 +1,78 @@
1
+ export function buildPackageJson(ctx) {
2
+ const deps = {
3
+ '@miiajs/core': '^0.1.0',
4
+ };
5
+ const devDeps = {
6
+ '@miiajs/cli': '^0.1.0',
7
+ typescript: '^6.0.2',
8
+ };
9
+ if (ctx.runtime === 'node') {
10
+ deps['@miiajs/node-server'] = '^0.1.0';
11
+ devDeps['tsx'] = '^4.19.0';
12
+ }
13
+ // Merge feature dependencies
14
+ for (const feature of ctx.features) {
15
+ Object.assign(deps, feature.packages);
16
+ if (feature.devPackages)
17
+ Object.assign(devDeps, feature.devPackages);
18
+ }
19
+ return (JSON.stringify({
20
+ name: ctx.name,
21
+ version: '0.1.0',
22
+ private: true,
23
+ type: 'module',
24
+ scripts: {
25
+ dev: 'miia dev',
26
+ build: 'miia build',
27
+ start: 'miia start',
28
+ check: 'miia check',
29
+ },
30
+ dependencies: sortObject(deps),
31
+ devDependencies: sortObject(devDeps),
32
+ }, null, 2) + '\n');
33
+ }
34
+ export function buildTsconfig(runtime) {
35
+ const base = {
36
+ target: 'ES2025',
37
+ module: 'nodenext',
38
+ strict: true,
39
+ skipLibCheck: true,
40
+ verbatimModuleSyntax: true,
41
+ };
42
+ if (runtime === 'node') {
43
+ Object.assign(base, {
44
+ outDir: './dist',
45
+ rootDir: './src',
46
+ declaration: true,
47
+ sourceMap: true,
48
+ });
49
+ }
50
+ else {
51
+ base.noEmit = true;
52
+ }
53
+ return (JSON.stringify({
54
+ compilerOptions: base,
55
+ include: ['src'],
56
+ }, null, 2) + '\n');
57
+ }
58
+ export function buildGitignore() {
59
+ return `node_modules/
60
+ dist/
61
+ *.tsbuildinfo
62
+ .env
63
+ `;
64
+ }
65
+ export function buildEnvFile(features) {
66
+ const vars = {};
67
+ for (const feature of features) {
68
+ if (feature.envVars)
69
+ Object.assign(vars, feature.envVars);
70
+ }
71
+ return (Object.entries(vars)
72
+ .map(([k, v]) => `${k}=${v}`)
73
+ .join('\n') + '\n');
74
+ }
75
+ function sortObject(obj) {
76
+ return Object.fromEntries(Object.entries(obj).sort(([a], [b]) => a.localeCompare(b)));
77
+ }
78
+ //# sourceMappingURL=project-files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-files.js","sourceRoot":"","sources":["../../src/scaffold/project-files.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { Runtime } from '../runtime/types.js';
2
+ import type { FeatureId } from './types.js';
3
+ export type PackageManager = 'bun' | 'pnpm' | 'npm' | 'yarn';
4
+ export interface ScaffoldAnswers {
5
+ name: string;
6
+ runtime: Runtime;
7
+ featureIds: FeatureId[];
8
+ packageManager: PackageManager;
9
+ }
10
+ export declare function runScaffoldPrompts(nameArg?: string): Promise<ScaffoldAnswers | null>;
11
+ //# sourceMappingURL=prompts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../src/scaffold/prompts.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAE3C,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,CAAA;AAE5D,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,OAAO,CAAA;IAChB,UAAU,EAAE,SAAS,EAAE,CAAA;IACvB,cAAc,EAAE,cAAc,CAAA;CAC/B;AAED,wBAAsB,kBAAkB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CA6E1F"}
@@ -0,0 +1,79 @@
1
+ import * as p from '@clack/prompts';
2
+ export async function runScaffoldPrompts(nameArg) {
3
+ p.intro('Create a new MiiaJS app');
4
+ const name = nameArg ??
5
+ (await p.text({
6
+ message: 'Project name:',
7
+ placeholder: 'my-miia-app',
8
+ validate: (val) => {
9
+ if (!val || !val.trim())
10
+ return 'Project name is required';
11
+ if (!/^[a-zA-Z][a-zA-Z0-9._-]*$/.test(val))
12
+ return 'Invalid project name';
13
+ },
14
+ }));
15
+ if (p.isCancel(name))
16
+ return null;
17
+ const runtime = await p.select({
18
+ message: 'Runtime:',
19
+ options: [
20
+ { value: 'bun', label: 'Bun', hint: 'recommended - fastest startup' },
21
+ { value: 'deno', label: 'Deno', hint: 'secure by default' },
22
+ { value: 'node', label: 'Node.js', hint: 'widest ecosystem' },
23
+ ],
24
+ });
25
+ if (p.isCancel(runtime))
26
+ return null;
27
+ // Bun is its own package manager; others get to choose
28
+ let packageManager = 'bun';
29
+ if (runtime !== 'bun') {
30
+ const pm = await p.select({
31
+ message: 'Package manager:',
32
+ options: [
33
+ { value: 'pnpm', label: 'pnpm', hint: 'recommended' },
34
+ { value: 'npm', label: 'npm' },
35
+ { value: 'yarn', label: 'yarn' },
36
+ ],
37
+ });
38
+ if (p.isCancel(pm))
39
+ return null;
40
+ packageManager = pm;
41
+ }
42
+ const features = await p.multiselect({
43
+ message: 'Select features:',
44
+ options: [
45
+ { value: 'config', label: 'Config', hint: 'typed env variables via Zod' },
46
+ { value: 'jwt-auth', label: 'JWT Auth', hint: 'JWT authentication' },
47
+ { value: 'swagger', label: 'Swagger', hint: 'OpenAPI 3.1 + Swagger UI' },
48
+ { value: 'cors', label: 'CORS', hint: 'cross-origin resource sharing' },
49
+ { value: 'serve-static', label: 'Serve Static', hint: 'static file serving' },
50
+ ],
51
+ required: false,
52
+ });
53
+ if (p.isCancel(features))
54
+ return null;
55
+ const database = await p.select({
56
+ message: 'Database:',
57
+ options: [
58
+ { value: 'none', label: 'None' },
59
+ { value: 'drizzle-postgres', label: 'Drizzle + PostgreSQL' },
60
+ { value: 'drizzle-mysql', label: 'Drizzle + MySQL' },
61
+ { value: 'drizzle-sqlite', label: 'Drizzle + SQLite' },
62
+ { value: 'papr', label: 'Papr + MongoDB' },
63
+ { value: 'mongoose', label: 'Mongoose + MongoDB' },
64
+ ],
65
+ });
66
+ if (p.isCancel(database))
67
+ return null;
68
+ const featureIds = [...features];
69
+ if (database !== 'none') {
70
+ featureIds.push(database);
71
+ }
72
+ return {
73
+ name: typeof name === 'string' ? name.trim() : name,
74
+ runtime: runtime,
75
+ featureIds,
76
+ packageManager,
77
+ };
78
+ }
79
+ //# sourceMappingURL=prompts.js.map