@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.
- package/LICENSE +21 -0
- package/README.md +19 -0
- package/dist/bin.d.ts +3 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +5 -0
- package/dist/bin.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +17 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/build.d.ts +9 -0
- package/dist/commands/build.d.ts.map +1 -0
- package/dist/commands/build.js +39 -0
- package/dist/commands/build.js.map +1 -0
- package/dist/commands/check.d.ts +3 -0
- package/dist/commands/check.d.ts.map +1 -0
- package/dist/commands/check.js +27 -0
- package/dist/commands/check.js.map +1 -0
- package/dist/commands/dev.d.ts +18 -0
- package/dist/commands/dev.d.ts.map +1 -0
- package/dist/commands/dev.js +42 -0
- package/dist/commands/dev.js.map +1 -0
- package/dist/commands/generate.d.ts +28 -0
- package/dist/commands/generate.d.ts.map +1 -0
- package/dist/commands/generate.js +67 -0
- package/dist/commands/generate.js.map +1 -0
- package/dist/commands/new.d.ts +19 -0
- package/dist/commands/new.d.ts.map +1 -0
- package/dist/commands/new.js +44 -0
- package/dist/commands/new.js.map +1 -0
- package/dist/commands/start.d.ts +23 -0
- package/dist/commands/start.d.ts.map +1 -0
- package/dist/commands/start.js +49 -0
- package/dist/commands/start.js.map +1 -0
- package/dist/dev/orchestrator.d.ts +9 -0
- package/dist/dev/orchestrator.d.ts.map +1 -0
- package/dist/dev/orchestrator.js +80 -0
- package/dist/dev/orchestrator.js.map +1 -0
- package/dist/dev/tsc-pipe.d.ts +3 -0
- package/dist/dev/tsc-pipe.d.ts.map +1 -0
- package/dist/dev/tsc-pipe.js +44 -0
- package/dist/dev/tsc-pipe.js.map +1 -0
- package/dist/generate/module-updater.d.ts +20 -0
- package/dist/generate/module-updater.d.ts.map +1 -0
- package/dist/generate/module-updater.js +158 -0
- package/dist/generate/module-updater.js.map +1 -0
- package/dist/generate/runner.d.ts +3 -0
- package/dist/generate/runner.d.ts.map +1 -0
- package/dist/generate/runner.js +130 -0
- package/dist/generate/runner.js.map +1 -0
- package/dist/generate/schematics.d.ts +8 -0
- package/dist/generate/schematics.d.ts.map +1 -0
- package/dist/generate/schematics.js +68 -0
- package/dist/generate/schematics.js.map +1 -0
- package/dist/generate/templates/controller.d.ts +3 -0
- package/dist/generate/templates/controller.d.ts.map +1 -0
- package/dist/generate/templates/controller.js +14 -0
- package/dist/generate/templates/controller.js.map +1 -0
- package/dist/generate/templates/guard.d.ts +3 -0
- package/dist/generate/templates/guard.d.ts.map +1 -0
- package/dist/generate/templates/guard.js +13 -0
- package/dist/generate/templates/guard.js.map +1 -0
- package/dist/generate/templates/middleware.d.ts +3 -0
- package/dist/generate/templates/middleware.d.ts.map +1 -0
- package/dist/generate/templates/middleware.js +11 -0
- package/dist/generate/templates/middleware.js.map +1 -0
- package/dist/generate/templates/module.d.ts +3 -0
- package/dist/generate/templates/module.d.ts.map +1 -0
- package/dist/generate/templates/module.js +8 -0
- package/dist/generate/templates/module.js.map +1 -0
- package/dist/generate/templates/resource.d.ts +5 -0
- package/dist/generate/templates/resource.d.ts.map +1 -0
- package/dist/generate/templates/resource.js +78 -0
- package/dist/generate/templates/resource.js.map +1 -0
- package/dist/generate/templates/service.d.ts +3 -0
- package/dist/generate/templates/service.d.ts.map +1 -0
- package/dist/generate/templates/service.js +12 -0
- package/dist/generate/templates/service.js.map +1 -0
- package/dist/generate/types.d.ts +38 -0
- package/dist/generate/types.d.ts.map +1 -0
- package/dist/generate/types.js +2 -0
- package/dist/generate/types.js.map +1 -0
- package/dist/runtime/commands.d.ts +11 -0
- package/dist/runtime/commands.d.ts.map +1 -0
- package/dist/runtime/commands.js +46 -0
- package/dist/runtime/commands.js.map +1 -0
- package/dist/runtime/detect.d.ts +10 -0
- package/dist/runtime/detect.d.ts.map +1 -0
- package/dist/runtime/detect.js +65 -0
- package/dist/runtime/detect.js.map +1 -0
- package/dist/runtime/types.d.ts +2 -0
- package/dist/runtime/types.d.ts.map +1 -0
- package/dist/runtime/types.js +2 -0
- package/dist/runtime/types.js.map +1 -0
- package/dist/scaffold/app-composer.d.ts +12 -0
- package/dist/scaffold/app-composer.d.ts.map +1 -0
- package/dist/scaffold/app-composer.js +102 -0
- package/dist/scaffold/app-composer.js.map +1 -0
- package/dist/scaffold/features/config.d.ts +3 -0
- package/dist/scaffold/features/config.d.ts.map +1 -0
- package/dist/scaffold/features/config.js +43 -0
- package/dist/scaffold/features/config.js.map +1 -0
- package/dist/scaffold/features/cors.d.ts +3 -0
- package/dist/scaffold/features/cors.d.ts.map +1 -0
- package/dist/scaffold/features/cors.js +19 -0
- package/dist/scaffold/features/cors.js.map +1 -0
- package/dist/scaffold/features/drizzle-mysql.d.ts +3 -0
- package/dist/scaffold/features/drizzle-mysql.d.ts.map +1 -0
- package/dist/scaffold/features/drizzle-mysql.js +28 -0
- package/dist/scaffold/features/drizzle-mysql.js.map +1 -0
- package/dist/scaffold/features/drizzle-postgres.d.ts +3 -0
- package/dist/scaffold/features/drizzle-postgres.d.ts.map +1 -0
- package/dist/scaffold/features/drizzle-postgres.js +28 -0
- package/dist/scaffold/features/drizzle-postgres.js.map +1 -0
- package/dist/scaffold/features/drizzle-sqlite.d.ts +3 -0
- package/dist/scaffold/features/drizzle-sqlite.d.ts.map +1 -0
- package/dist/scaffold/features/drizzle-sqlite.js +29 -0
- package/dist/scaffold/features/drizzle-sqlite.js.map +1 -0
- package/dist/scaffold/features/jwt-auth.d.ts +3 -0
- package/dist/scaffold/features/jwt-auth.d.ts.map +1 -0
- package/dist/scaffold/features/jwt-auth.js +117 -0
- package/dist/scaffold/features/jwt-auth.js.map +1 -0
- package/dist/scaffold/features/mongoose.d.ts +3 -0
- package/dist/scaffold/features/mongoose.d.ts.map +1 -0
- package/dist/scaffold/features/mongoose.js +23 -0
- package/dist/scaffold/features/mongoose.js.map +1 -0
- package/dist/scaffold/features/papr.d.ts +3 -0
- package/dist/scaffold/features/papr.d.ts.map +1 -0
- package/dist/scaffold/features/papr.js +24 -0
- package/dist/scaffold/features/papr.js.map +1 -0
- package/dist/scaffold/features/registry.d.ts +12 -0
- package/dist/scaffold/features/registry.d.ts.map +1 -0
- package/dist/scaffold/features/registry.js +76 -0
- package/dist/scaffold/features/registry.js.map +1 -0
- package/dist/scaffold/features/serve-static.d.ts +3 -0
- package/dist/scaffold/features/serve-static.d.ts.map +1 -0
- package/dist/scaffold/features/serve-static.js +17 -0
- package/dist/scaffold/features/serve-static.js.map +1 -0
- package/dist/scaffold/features/swagger.d.ts +3 -0
- package/dist/scaffold/features/swagger.d.ts.map +1 -0
- package/dist/scaffold/features/swagger.js +20 -0
- package/dist/scaffold/features/swagger.js.map +1 -0
- package/dist/scaffold/package-install.d.ts +3 -0
- package/dist/scaffold/package-install.d.ts.map +1 -0
- package/dist/scaffold/package-install.js +17 -0
- package/dist/scaffold/package-install.js.map +1 -0
- package/dist/scaffold/project-files.d.ts +13 -0
- package/dist/scaffold/project-files.d.ts.map +1 -0
- package/dist/scaffold/project-files.js +78 -0
- package/dist/scaffold/project-files.js.map +1 -0
- package/dist/scaffold/prompts.d.ts +11 -0
- package/dist/scaffold/prompts.d.ts.map +1 -0
- package/dist/scaffold/prompts.js +79 -0
- package/dist/scaffold/prompts.js.map +1 -0
- package/dist/scaffold/scaffold.d.ts +14 -0
- package/dist/scaffold/scaffold.d.ts.map +1 -0
- package/dist/scaffold/scaffold.js +88 -0
- package/dist/scaffold/scaffold.js.map +1 -0
- package/dist/scaffold/types.d.ts +41 -0
- package/dist/scaffold/types.d.ts.map +1 -0
- package/dist/scaffold/types.js +2 -0
- package/dist/scaffold/types.js.map +1 -0
- package/dist/utils/format.d.ts +2 -0
- package/dist/utils/format.d.ts.map +1 -0
- package/dist/utils/format.js +43 -0
- package/dist/utils/format.js.map +1 -0
- package/dist/utils/fs.d.ts +2 -0
- package/dist/utils/fs.d.ts.map +1 -0
- package/dist/utils/fs.js +7 -0
- package/dist/utils/fs.js.map +1 -0
- package/dist/utils/logger.d.ts +8 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +10 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/naming.d.ts +4 -0
- package/dist/utils/naming.d.ts.map +1 -0
- package/dist/utils/naming.js +18 -0
- package/dist/utils/naming.js.map +1 -0
- package/dist/utils/preflight.d.ts +3 -0
- package/dist/utils/preflight.d.ts.map +1 -0
- package/dist/utils/preflight.js +32 -0
- package/dist/utils/preflight.js.map +1 -0
- package/dist/utils/writer.d.ts +16 -0
- package/dist/utils/writer.d.ts.map +1 -0
- package/dist/utils/writer.js +42 -0
- package/dist/utils/writer.js.map +1 -0
- 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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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
|