create-taserjs 0.0.0 → 0.0.2
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/dist/cjs/addons/arktype/index.cjs +6 -0
- package/dist/cjs/addons/arktype/index.cjs.map +1 -0
- package/dist/cjs/addons/arktype/index.d.cts +1 -0
- package/dist/cjs/addons/drizzle/index.cjs +9 -2
- package/dist/cjs/addons/drizzle/index.cjs.map +1 -1
- package/dist/cjs/addons/kysely/index.cjs +9 -2
- package/dist/cjs/addons/kysely/index.cjs.map +1 -1
- package/dist/cjs/addons/registry.cjs +26 -12
- package/dist/cjs/addons/registry.cjs.map +1 -1
- package/dist/cjs/addons/types.d.cts +2 -2
- package/dist/cjs/addons/valibot/index.cjs +6 -0
- package/dist/cjs/addons/valibot/index.cjs.map +1 -0
- package/dist/cjs/addons/valibot/index.d.cts +1 -0
- package/dist/cjs/addons/validators.cjs +40 -0
- package/dist/cjs/addons/validators.cjs.map +1 -0
- package/dist/cjs/addons/validators.d.cts +5 -0
- package/dist/cjs/addons/zod/index.cjs +6 -0
- package/dist/cjs/addons/zod/index.cjs.map +1 -0
- package/dist/cjs/addons/zod/index.d.cts +1 -0
- package/dist/cjs/cli.cjs +2 -0
- package/dist/cjs/cli.cjs.map +1 -1
- package/dist/cjs/commands/create.cjs +34 -1
- package/dist/cjs/commands/create.cjs.map +1 -1
- package/dist/cjs/commands/create.d.cts +1 -0
- package/dist/cjs/core/package-manager.cjs +5 -13
- package/dist/cjs/core/package-manager.cjs.map +1 -1
- package/dist/cjs/core/package-manager.d.cts +2 -1
- package/dist/cjs/core/parse-options.cjs +10 -0
- package/dist/cjs/core/parse-options.cjs.map +1 -1
- package/dist/cjs/core/parse-options.d.cts +3 -1
- package/dist/cjs/core/project-config.cjs +1 -0
- package/dist/cjs/core/project-config.cjs.map +1 -1
- package/dist/cjs/core/resolve-packages.cjs +2 -1
- package/dist/cjs/core/resolve-packages.cjs.map +1 -1
- package/dist/cjs/core/scaffold-engine.cjs +6 -3
- package/dist/cjs/core/scaffold-engine.cjs.map +1 -1
- package/dist/cjs/core/types.cjs +6 -0
- package/dist/cjs/core/types.cjs.map +1 -1
- package/dist/cjs/core/types.d.cts +4 -0
- package/dist/cjs/templates/base.cjs +12 -13
- package/dist/cjs/templates/base.cjs.map +1 -1
- package/dist/esm/addons/arktype/index.d.ts +1 -0
- package/dist/esm/addons/arktype/index.js +7 -0
- package/dist/esm/addons/arktype/index.js.map +1 -0
- package/dist/esm/addons/drizzle/index.js +9 -2
- package/dist/esm/addons/drizzle/index.js.map +1 -1
- package/dist/esm/addons/kysely/index.js +9 -2
- package/dist/esm/addons/kysely/index.js.map +1 -1
- package/dist/esm/addons/registry.js +18 -4
- package/dist/esm/addons/registry.js.map +1 -1
- package/dist/esm/addons/types.d.ts +2 -2
- package/dist/esm/addons/valibot/index.d.ts +1 -0
- package/dist/esm/addons/valibot/index.js +7 -0
- package/dist/esm/addons/valibot/index.js.map +1 -0
- package/dist/esm/addons/validators.d.ts +5 -0
- package/dist/esm/addons/validators.js +38 -0
- package/dist/esm/addons/validators.js.map +1 -0
- package/dist/esm/addons/zod/index.d.ts +1 -0
- package/dist/esm/addons/zod/index.js +7 -0
- package/dist/esm/addons/zod/index.js.map +1 -0
- package/dist/esm/cli.js +2 -0
- package/dist/esm/cli.js.map +1 -1
- package/dist/esm/commands/create.d.ts +1 -0
- package/dist/esm/commands/create.js +36 -3
- package/dist/esm/commands/create.js.map +1 -1
- package/dist/esm/core/package-manager.d.ts +2 -1
- package/dist/esm/core/package-manager.js +5 -14
- package/dist/esm/core/package-manager.js.map +1 -1
- package/dist/esm/core/parse-options.d.ts +3 -1
- package/dist/esm/core/parse-options.js +11 -2
- package/dist/esm/core/parse-options.js.map +1 -1
- package/dist/esm/core/project-config.js +1 -0
- package/dist/esm/core/project-config.js.map +1 -1
- package/dist/esm/core/resolve-packages.js +2 -1
- package/dist/esm/core/resolve-packages.js.map +1 -1
- package/dist/esm/core/scaffold-engine.js +6 -3
- package/dist/esm/core/scaffold-engine.js.map +1 -1
- package/dist/esm/core/types.d.ts +4 -0
- package/dist/esm/core/types.js +6 -1
- package/dist/esm/core/types.js.map +1 -1
- package/dist/esm/templates/base.js +12 -13
- package/dist/esm/templates/base.js.map +1 -1
- package/package.json +1 -1
- package/src/addons/arktype/index.ts +3 -0
- package/src/addons/drizzle/index.ts +15 -2
- package/src/addons/kysely/index.ts +15 -2
- package/src/addons/registry.ts +26 -2
- package/src/addons/types.ts +2 -2
- package/src/addons/valibot/index.ts +3 -0
- package/src/addons/validators.ts +39 -0
- package/src/addons/zod/index.ts +3 -0
- package/src/cli.ts +2 -0
- package/src/commands/create.ts +32 -2
- package/src/core/package-manager.ts +7 -10
- package/src/core/parse-options.ts +19 -0
- package/src/core/project-config.ts +4 -0
- package/src/core/resolve-packages.ts +1 -0
- package/src/core/scaffold-engine.ts +3 -0
- package/src/core/types.ts +6 -0
- package/src/templates/base.ts +12 -13
package/src/addons/registry.ts
CHANGED
|
@@ -1,9 +1,12 @@
|
|
|
1
|
+
import { arktypeAddon } from './arktype/index.js'
|
|
1
2
|
import { drizzleAddon } from './drizzle/index.js'
|
|
2
3
|
import { kyselyAddon } from './kysely/index.js'
|
|
3
4
|
import { pinoAddon } from './pino/index.js'
|
|
4
5
|
import { prismaAddon } from './prisma/index.js'
|
|
5
|
-
import
|
|
6
|
+
import { valibotAddon } from './valibot/index.js'
|
|
6
7
|
import { winstonAddon } from './winston/index.js'
|
|
8
|
+
import { zodAddon } from './zod/index.js'
|
|
9
|
+
import type { AddonDefinition } from './types.js'
|
|
7
10
|
import type { CapabilitiesCatalog, ScaffoldContext } from '../core/types.js'
|
|
8
11
|
import {
|
|
9
12
|
DB_DRIVERS,
|
|
@@ -11,6 +14,7 @@ import {
|
|
|
11
14
|
DEFAULT_DB_DRIVER,
|
|
12
15
|
FRAMEWORKS,
|
|
13
16
|
LOGGERS,
|
|
17
|
+
VALIDATORS,
|
|
14
18
|
} from '../core/types.js'
|
|
15
19
|
|
|
16
20
|
const ALL_ADDONS: AddonDefinition[] = [
|
|
@@ -19,10 +23,14 @@ const ALL_ADDONS: AddonDefinition[] = [
|
|
|
19
23
|
kyselyAddon,
|
|
20
24
|
pinoAddon,
|
|
21
25
|
winstonAddon,
|
|
26
|
+
zodAddon,
|
|
27
|
+
arktypeAddon,
|
|
28
|
+
valibotAddon,
|
|
22
29
|
]
|
|
23
30
|
|
|
24
31
|
const DB_ADDONS = ALL_ADDONS.filter(addon => addon.category === 'database')
|
|
25
32
|
const LOGGER_ADDONS = ALL_ADDONS.filter(addon => addon.category === 'logger')
|
|
33
|
+
const VALIDATOR_ADDONS = ALL_ADDONS.filter(addon => addon.category === 'validator')
|
|
26
34
|
|
|
27
35
|
export function getCapabilitiesCatalog(): CapabilitiesCatalog {
|
|
28
36
|
return {
|
|
@@ -33,6 +41,7 @@ export function getCapabilitiesCatalog(): CapabilitiesCatalog {
|
|
|
33
41
|
defaultDriver: DEFAULT_DB_DRIVER,
|
|
34
42
|
},
|
|
35
43
|
loggers: [...LOGGERS],
|
|
44
|
+
validators: [...VALIDATORS],
|
|
36
45
|
}
|
|
37
46
|
}
|
|
38
47
|
|
|
@@ -65,9 +74,24 @@ export function resolveAddons(ctx: ScaffoldContext): AddonDefinition[] {
|
|
|
65
74
|
throw new Error('Only one logger addon can be selected')
|
|
66
75
|
}
|
|
67
76
|
|
|
77
|
+
if (ctx.validator) {
|
|
78
|
+
const validatorAddon = VALIDATOR_ADDONS.find(addon => addon.id === ctx.validator)
|
|
79
|
+
if (!validatorAddon) {
|
|
80
|
+
throw new Error(`Unknown validator addon "${ctx.validator}"`)
|
|
81
|
+
}
|
|
82
|
+
selected.push(validatorAddon)
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
const validatorCount = selected.filter(addon => addon.category === 'validator').length
|
|
86
|
+
if (validatorCount > 1) {
|
|
87
|
+
throw new Error('Only one validator addon can be selected')
|
|
88
|
+
}
|
|
89
|
+
|
|
68
90
|
return selected
|
|
69
91
|
}
|
|
70
92
|
|
|
71
93
|
export function collectBootBindings(ctx: ScaffoldContext) {
|
|
72
|
-
return resolveAddons(ctx)
|
|
94
|
+
return resolveAddons(ctx)
|
|
95
|
+
.map(addon => addon.bootBinding?.(ctx))
|
|
96
|
+
.filter((v): v is NonNullable<typeof v> => Boolean(v))
|
|
73
97
|
}
|
package/src/addons/types.ts
CHANGED
|
@@ -10,10 +10,10 @@ export type FileWriter = (filePath: string, contents: string) => Promise<void>
|
|
|
10
10
|
|
|
11
11
|
export type AddonDefinition = {
|
|
12
12
|
id: string
|
|
13
|
-
category: 'database' | 'logger'
|
|
13
|
+
category: 'database' | 'logger' | 'validator'
|
|
14
14
|
dependencies: (ctx: ScaffoldContext) => string[]
|
|
15
15
|
devDependencies: (ctx: ScaffoldContext) => string[]
|
|
16
16
|
scripts?: (ctx: ScaffoldContext) => Record<string, string>
|
|
17
|
-
bootBinding
|
|
17
|
+
bootBinding?: (ctx: ScaffoldContext) => BootBinding
|
|
18
18
|
apply: (ctx: ScaffoldContext, write: FileWriter) => Promise<void>
|
|
19
19
|
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { ValidatorId } from '../core/types'
|
|
2
|
+
import type { AddonDefinition } from './types'
|
|
3
|
+
|
|
4
|
+
export const IMPORT_LINES: Record<ValidatorId, string> = {
|
|
5
|
+
zod: `import { z } from 'zod'`,
|
|
6
|
+
arktype: `import { type } from 'arktype'`,
|
|
7
|
+
valibot: `import * as v from 'valibot'`,
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export const VALIDATION_BLOCK_TEMPLATE: Record<ValidatorId, string> = {
|
|
11
|
+
zod: `, {
|
|
12
|
+
query: z.object({ name: z.string() }),
|
|
13
|
+
}`,
|
|
14
|
+
arktype: `, {
|
|
15
|
+
query: type({ name: 'string' }),
|
|
16
|
+
}`,
|
|
17
|
+
valibot: `, {
|
|
18
|
+
query: v.object({ name: v.string() }),
|
|
19
|
+
}`,
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const ROUTE_TEMPLATE = (validator: ValidatorId) => `import { reply } from '@taserjs/router'
|
|
23
|
+
import { t } from '#src/taser.js'
|
|
24
|
+
${IMPORT_LINES[validator]}
|
|
25
|
+
|
|
26
|
+
export const Route = t.get('/'${VALIDATION_BLOCK_TEMPLATE[validator]}).handler((ctx) => {
|
|
27
|
+
return reply.json({ message: \`Hello, \${ctx.query.name}!\` })
|
|
28
|
+
})
|
|
29
|
+
`
|
|
30
|
+
|
|
31
|
+
export const ValidatorAddon = (validator: ValidatorId): AddonDefinition => {
|
|
32
|
+
return {
|
|
33
|
+
id: validator,
|
|
34
|
+
category: 'validator',
|
|
35
|
+
dependencies: () => [validator],
|
|
36
|
+
devDependencies: () => [],
|
|
37
|
+
apply: (ctx, write) => write('src/routes/index.get.ts', ROUTE_TEMPLATE(validator)),
|
|
38
|
+
}
|
|
39
|
+
}
|
package/src/cli.ts
CHANGED
|
@@ -14,6 +14,7 @@ async function main(): Promise<void> {
|
|
|
14
14
|
framework: { type: 'string' },
|
|
15
15
|
db: { type: 'string' },
|
|
16
16
|
logger: { type: 'string' },
|
|
17
|
+
validator: { type: 'string' },
|
|
17
18
|
y: { type: 'boolean', short: 'y' },
|
|
18
19
|
noInstall: { type: 'boolean' },
|
|
19
20
|
json: { type: 'boolean' },
|
|
@@ -26,6 +27,7 @@ async function main(): Promise<void> {
|
|
|
26
27
|
...(values.framework !== undefined ? { framework: values.framework } : {}),
|
|
27
28
|
...(values.db !== undefined ? { db: values.db } : {}),
|
|
28
29
|
...(values.logger !== undefined ? { logger: values.logger } : {}),
|
|
30
|
+
...(values.validator !== undefined ? { validator: values.validator } : {}),
|
|
29
31
|
...(values.y !== undefined ? { y: values.y } : {}),
|
|
30
32
|
...(values.noInstall !== undefined ? { noInstall: values.noInstall } : {}),
|
|
31
33
|
...(values.json !== undefined ? { json: values.json } : {}),
|
package/src/commands/create.ts
CHANGED
|
@@ -9,12 +9,13 @@ import {
|
|
|
9
9
|
parseDbFlag,
|
|
10
10
|
parseFrameworkFlag,
|
|
11
11
|
parseLoggerFlag,
|
|
12
|
+
parseValidatorFlag,
|
|
12
13
|
type ParsedCreateArgs,
|
|
13
14
|
resolveScaffoldDefaults,
|
|
14
15
|
} from '../core/parse-options.js'
|
|
15
16
|
import { scaffoldProject } from '../core/scaffold-engine.js'
|
|
16
|
-
import type { DbDriver, DbOdm, Framework, LoggerId, ScaffoldResult } from '../core/types.js'
|
|
17
|
-
import { DB_DRIVERS, DB_ODMS, FRAMEWORKS, LOGGERS } from '../core/types.js'
|
|
17
|
+
import type { DbDriver, DbOdm, Framework, LoggerId, ScaffoldResult, ValidatorId } from '../core/types.js'
|
|
18
|
+
import { DB_DRIVERS, DB_ODMS, FRAMEWORKS, LOGGERS, VALIDATORS } from '../core/types.js'
|
|
18
19
|
import { validateProjectName } from '../core/validate-project-name.js'
|
|
19
20
|
import { resolveUserAgent, runScript } from '../core/package-manager.js'
|
|
20
21
|
|
|
@@ -34,6 +35,10 @@ function isLoggerId(value: unknown): value is LoggerId {
|
|
|
34
35
|
return typeof value === 'string' && (LOGGERS as readonly string[]).includes(value)
|
|
35
36
|
}
|
|
36
37
|
|
|
38
|
+
function isValidatorId(value: unknown): value is ValidatorId {
|
|
39
|
+
return typeof value === 'string' && (VALIDATORS as readonly string[]).includes(value)
|
|
40
|
+
}
|
|
41
|
+
|
|
37
42
|
async function promptInteractiveOptions(
|
|
38
43
|
args: ParsedCreateArgs,
|
|
39
44
|
): Promise<ParsedCreateArgs> {
|
|
@@ -127,6 +132,25 @@ async function promptInteractiveOptions(
|
|
|
127
132
|
|
|
128
133
|
const logger = loggerChoice === 'none' ? undefined : isLoggerId(loggerChoice) ? loggerChoice : undefined
|
|
129
134
|
|
|
135
|
+
const validatorChoice = args.validator
|
|
136
|
+
?? await p.select({
|
|
137
|
+
message: 'Validator',
|
|
138
|
+
options: [
|
|
139
|
+
{ value: 'none', label: 'None', hint: 'default' },
|
|
140
|
+
{ value: 'zod', label: 'Zod' },
|
|
141
|
+
{ value: 'arktype', label: 'Arktype' },
|
|
142
|
+
{ value: 'valibot', label: 'Valibot' },
|
|
143
|
+
],
|
|
144
|
+
initialValue: 'none',
|
|
145
|
+
})
|
|
146
|
+
|
|
147
|
+
if (p.isCancel(validatorChoice)) {
|
|
148
|
+
p.cancel('Scaffold cancelled.')
|
|
149
|
+
process.exit(0)
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
const validator = validatorChoice === 'none' ? undefined : isValidatorId(validatorChoice) ? validatorChoice : undefined
|
|
153
|
+
|
|
130
154
|
return {
|
|
131
155
|
projectName: String(projectName).trim(),
|
|
132
156
|
framework,
|
|
@@ -135,6 +159,7 @@ async function promptInteractiveOptions(
|
|
|
135
159
|
json: args.json,
|
|
136
160
|
...(db ? { db, driver: driver! } : {}),
|
|
137
161
|
...(logger ? { logger } : {}),
|
|
162
|
+
...(validator ? { validator } : {}),
|
|
138
163
|
}
|
|
139
164
|
}
|
|
140
165
|
|
|
@@ -221,6 +246,7 @@ export function buildParsedArgsFromCli(values: {
|
|
|
221
246
|
framework?: string
|
|
222
247
|
db?: string
|
|
223
248
|
logger?: string
|
|
249
|
+
validator?: string
|
|
224
250
|
y?: boolean
|
|
225
251
|
noInstall?: boolean
|
|
226
252
|
json?: boolean
|
|
@@ -249,5 +275,9 @@ export function buildParsedArgsFromCli(values: {
|
|
|
249
275
|
args.logger = parseLoggerFlag(values.logger)
|
|
250
276
|
}
|
|
251
277
|
|
|
278
|
+
if (values.validator) {
|
|
279
|
+
args.validator = parseValidatorFlag(values.validator)
|
|
280
|
+
}
|
|
281
|
+
|
|
252
282
|
return args
|
|
253
283
|
}
|
|
@@ -27,18 +27,15 @@ function runCommand(command: string, args: string[], cwd: string): Promise<void>
|
|
|
27
27
|
})
|
|
28
28
|
}
|
|
29
29
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
return ['install', ...packages, dev ? '-D' : '']
|
|
34
|
-
},
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
function resolveInstallCommand(agent: Agent, packages: string[], dev: boolean): ResolvedCommand {
|
|
38
|
-
const command = resolveCommand(agent, 'install', packages)
|
|
30
|
+
export function resolveInstallCommand(agent: Agent, packages: string[], dev: boolean): ResolvedCommand {
|
|
31
|
+
const args = dev ? ['-D', ...packages] : packages
|
|
32
|
+
const command = resolveCommand(agent, 'add', args)
|
|
39
33
|
if (command) return command
|
|
40
34
|
|
|
41
|
-
return {
|
|
35
|
+
return {
|
|
36
|
+
command: 'npm',
|
|
37
|
+
args: ['install', ...args],
|
|
38
|
+
}
|
|
42
39
|
}
|
|
43
40
|
|
|
44
41
|
export async function installPackages(
|
|
@@ -4,11 +4,13 @@ import {
|
|
|
4
4
|
DEFAULT_DB_DRIVER,
|
|
5
5
|
FRAMEWORKS,
|
|
6
6
|
LOGGERS,
|
|
7
|
+
VALIDATORS,
|
|
7
8
|
type DbDriver,
|
|
8
9
|
type DbOdm,
|
|
9
10
|
type Framework,
|
|
10
11
|
type LoggerId,
|
|
11
12
|
type ScaffoldContext,
|
|
13
|
+
type ValidatorId,
|
|
12
14
|
} from './types.js'
|
|
13
15
|
|
|
14
16
|
export type ParsedCreateArgs = {
|
|
@@ -17,6 +19,7 @@ export type ParsedCreateArgs = {
|
|
|
17
19
|
db?: DbOdm
|
|
18
20
|
driver?: DbDriver
|
|
19
21
|
logger?: LoggerId
|
|
22
|
+
validator?: ValidatorId
|
|
20
23
|
yes: boolean
|
|
21
24
|
noInstall: boolean
|
|
22
25
|
json: boolean
|
|
@@ -38,6 +41,10 @@ function isLoggerId(value: string): value is LoggerId {
|
|
|
38
41
|
return (LOGGERS as readonly string[]).includes(value)
|
|
39
42
|
}
|
|
40
43
|
|
|
44
|
+
function isValidatorId(value: string): value is ValidatorId {
|
|
45
|
+
return (VALIDATORS as readonly string[]).includes(value)
|
|
46
|
+
}
|
|
47
|
+
|
|
41
48
|
export function parseDbFlag(value: string): { db: DbOdm, driver: DbDriver } {
|
|
42
49
|
const [odm, driver] = value.split(':')
|
|
43
50
|
if (!odm || !isDbOdm(odm)) {
|
|
@@ -59,6 +66,7 @@ export function resolveScaffoldDefaults(args: ParsedCreateArgs): ScaffoldContext
|
|
|
59
66
|
const framework = args.framework ?? 'node'
|
|
60
67
|
const db = args.db
|
|
61
68
|
const logger = args.logger
|
|
69
|
+
const validator = args.validator
|
|
62
70
|
|
|
63
71
|
if (!args.projectName) {
|
|
64
72
|
throw new Error('Project name is required')
|
|
@@ -79,6 +87,10 @@ export function resolveScaffoldDefaults(args: ParsedCreateArgs): ScaffoldContext
|
|
|
79
87
|
result.logger = logger
|
|
80
88
|
}
|
|
81
89
|
|
|
90
|
+
if (validator) {
|
|
91
|
+
result.validator = validator
|
|
92
|
+
}
|
|
93
|
+
|
|
82
94
|
return result
|
|
83
95
|
}
|
|
84
96
|
|
|
@@ -95,3 +107,10 @@ export function parseLoggerFlag(value: string): LoggerId {
|
|
|
95
107
|
}
|
|
96
108
|
return value
|
|
97
109
|
}
|
|
110
|
+
|
|
111
|
+
export function parseValidatorFlag(value: string): ValidatorId {
|
|
112
|
+
if (!isValidatorId(value)) {
|
|
113
|
+
throw new Error(`Invalid --validator "${value}". Use zod, arktype, or valibot.`)
|
|
114
|
+
}
|
|
115
|
+
return value
|
|
116
|
+
}
|
|
@@ -19,6 +19,10 @@ export async function writeProjectConfig(root: string, ctx: ScaffoldContext): Pr
|
|
|
19
19
|
config.logger = ctx.logger
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
+
if (ctx.validator) {
|
|
23
|
+
config.validator = ctx.validator
|
|
24
|
+
}
|
|
25
|
+
|
|
22
26
|
await writeFile(
|
|
23
27
|
path.join(root, '.taser.json'),
|
|
24
28
|
`${JSON.stringify(config, null, 2)}\n`,
|
|
@@ -32,6 +32,7 @@ export async function scaffoldProject(options: ScaffoldOptions): Promise<Scaffol
|
|
|
32
32
|
framework: options.framework,
|
|
33
33
|
...(options.db ? { db: options.db, driver: options.driver } : {}),
|
|
34
34
|
...(options.logger ? { logger: options.logger } : {}),
|
|
35
|
+
...(options.validator ? { validator: options.validator } : {}),
|
|
35
36
|
}
|
|
36
37
|
|
|
37
38
|
const addons = resolveAddons(ctx)
|
|
@@ -63,6 +64,7 @@ export async function scaffoldProject(options: ScaffoldOptions): Promise<Scaffol
|
|
|
63
64
|
framework: ctx.framework,
|
|
64
65
|
...(ctx.db ? { db: ctx.db, driver: ctx.driver } : {}),
|
|
65
66
|
...(ctx.logger ? { logger: ctx.logger } : {}),
|
|
67
|
+
...(ctx.validator ? { validator: ctx.validator } : {}),
|
|
66
68
|
}
|
|
67
69
|
}
|
|
68
70
|
|
|
@@ -78,5 +80,6 @@ export async function scaffoldProject(options: ScaffoldOptions): Promise<Scaffol
|
|
|
78
80
|
framework: ctx.framework,
|
|
79
81
|
...(ctx.db ? { db: ctx.db, driver: ctx.driver } : {}),
|
|
80
82
|
...(ctx.logger ? { logger: ctx.logger } : {}),
|
|
83
|
+
...(ctx.validator ? { validator: ctx.validator } : {}),
|
|
81
84
|
}
|
|
82
85
|
}
|
package/src/core/types.ts
CHANGED
|
@@ -18,6 +18,10 @@ export type LoggerId = 'pino' | 'winston'
|
|
|
18
18
|
|
|
19
19
|
export const LOGGERS: readonly LoggerId[] = ['pino', 'winston']
|
|
20
20
|
|
|
21
|
+
export type ValidatorId = 'zod' | 'arktype' | 'valibot'
|
|
22
|
+
|
|
23
|
+
export const VALIDATORS: readonly ValidatorId[] = ['zod', 'arktype', 'valibot']
|
|
24
|
+
|
|
21
25
|
export type PackageGroups = {
|
|
22
26
|
dependencies: string[]
|
|
23
27
|
devDependencies: string[]
|
|
@@ -31,6 +35,7 @@ export type ScaffoldContext = {
|
|
|
31
35
|
db?: DbOdm
|
|
32
36
|
driver?: DbDriver
|
|
33
37
|
logger?: LoggerId
|
|
38
|
+
validator?: ValidatorId
|
|
34
39
|
}
|
|
35
40
|
|
|
36
41
|
export type ScaffoldOptions = ScaffoldContext & {
|
|
@@ -48,4 +53,5 @@ export type CapabilitiesCatalog = {
|
|
|
48
53
|
defaultDriver: DbDriver
|
|
49
54
|
}
|
|
50
55
|
loggers: LoggerId[]
|
|
56
|
+
validators: ValidatorId[]
|
|
51
57
|
}
|
package/src/templates/base.ts
CHANGED
|
@@ -16,8 +16,8 @@ export function packageJsonTemplate(projectName: string, scripts: Record<string,
|
|
|
16
16
|
'dev:taser': 'taser watch',
|
|
17
17
|
'start': 'tsx src/index.ts',
|
|
18
18
|
'generate': 'taser generate',
|
|
19
|
-
'build': 'taser generate && tsdown
|
|
20
|
-
'serve': 'node dist/index.
|
|
19
|
+
'build': 'taser generate && tsdown',
|
|
20
|
+
'serve': 'node dist/index.mjs',
|
|
21
21
|
'typecheck': 'tsc --noEmit -p tsconfig.json',
|
|
22
22
|
...scripts,
|
|
23
23
|
},
|
|
@@ -31,9 +31,7 @@ export function tsdownConfigTemplate(): string {
|
|
|
31
31
|
|
|
32
32
|
export default defineConfig({
|
|
33
33
|
entry: ['./src/index.ts'],
|
|
34
|
-
format: 'esm',
|
|
35
34
|
platform: 'node',
|
|
36
|
-
target: 'node20',
|
|
37
35
|
outDir: 'dist',
|
|
38
36
|
clean: true,
|
|
39
37
|
sourcemap: true,
|
|
@@ -45,9 +43,7 @@ export function tsconfigTemplate(): string {
|
|
|
45
43
|
return `${JSON.stringify({
|
|
46
44
|
compilerOptions: {
|
|
47
45
|
target: 'ES2022',
|
|
48
|
-
|
|
49
|
-
module: 'ESNext',
|
|
50
|
-
moduleResolution: 'bundler',
|
|
46
|
+
module: 'NodeNext',
|
|
51
47
|
paths: {
|
|
52
48
|
'#src/*': ['./src/*'],
|
|
53
49
|
},
|
|
@@ -112,10 +108,11 @@ export const Middleware = t.middleware('/$')
|
|
|
112
108
|
}
|
|
113
109
|
|
|
114
110
|
export function indexRouteTemplate(): string {
|
|
115
|
-
return `import {
|
|
111
|
+
return `import { reply } from '@taserjs/router'
|
|
112
|
+
import { t } from '#src/taser.js'
|
|
116
113
|
|
|
117
|
-
export const Route = t.get('/').handler((
|
|
118
|
-
return
|
|
114
|
+
export const Route = t.get('/').handler(() => {
|
|
115
|
+
return reply.json({ message: 'Welcome to Taser' })
|
|
119
116
|
})
|
|
120
117
|
`
|
|
121
118
|
}
|
|
@@ -132,11 +129,13 @@ export function healthRouteTemplate(ctx: ScaffoldContext): string {
|
|
|
132
129
|
}
|
|
133
130
|
|
|
134
131
|
const body = lines.length > 0 ? `${lines.join('\n')}\n` : ''
|
|
132
|
+
const ctxArg = lines.length > 0 ? '(ctx)' : '()'
|
|
135
133
|
|
|
136
|
-
return `import {
|
|
134
|
+
return `import { reply } from '@taserjs/router'
|
|
135
|
+
import { t } from '#src/taser.js'
|
|
137
136
|
|
|
138
|
-
export const Route = t.get('/health').handler(
|
|
139
|
-
${body} return
|
|
137
|
+
export const Route = t.get('/health').handler(${ctxArg} => {
|
|
138
|
+
${body} return reply.json({ ok: true })
|
|
140
139
|
})
|
|
141
140
|
`
|
|
142
141
|
}
|