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.
Files changed (100) hide show
  1. package/dist/cjs/addons/arktype/index.cjs +6 -0
  2. package/dist/cjs/addons/arktype/index.cjs.map +1 -0
  3. package/dist/cjs/addons/arktype/index.d.cts +1 -0
  4. package/dist/cjs/addons/drizzle/index.cjs +9 -2
  5. package/dist/cjs/addons/drizzle/index.cjs.map +1 -1
  6. package/dist/cjs/addons/kysely/index.cjs +9 -2
  7. package/dist/cjs/addons/kysely/index.cjs.map +1 -1
  8. package/dist/cjs/addons/registry.cjs +26 -12
  9. package/dist/cjs/addons/registry.cjs.map +1 -1
  10. package/dist/cjs/addons/types.d.cts +2 -2
  11. package/dist/cjs/addons/valibot/index.cjs +6 -0
  12. package/dist/cjs/addons/valibot/index.cjs.map +1 -0
  13. package/dist/cjs/addons/valibot/index.d.cts +1 -0
  14. package/dist/cjs/addons/validators.cjs +40 -0
  15. package/dist/cjs/addons/validators.cjs.map +1 -0
  16. package/dist/cjs/addons/validators.d.cts +5 -0
  17. package/dist/cjs/addons/zod/index.cjs +6 -0
  18. package/dist/cjs/addons/zod/index.cjs.map +1 -0
  19. package/dist/cjs/addons/zod/index.d.cts +1 -0
  20. package/dist/cjs/cli.cjs +2 -0
  21. package/dist/cjs/cli.cjs.map +1 -1
  22. package/dist/cjs/commands/create.cjs +34 -1
  23. package/dist/cjs/commands/create.cjs.map +1 -1
  24. package/dist/cjs/commands/create.d.cts +1 -0
  25. package/dist/cjs/core/package-manager.cjs +5 -13
  26. package/dist/cjs/core/package-manager.cjs.map +1 -1
  27. package/dist/cjs/core/package-manager.d.cts +2 -1
  28. package/dist/cjs/core/parse-options.cjs +10 -0
  29. package/dist/cjs/core/parse-options.cjs.map +1 -1
  30. package/dist/cjs/core/parse-options.d.cts +3 -1
  31. package/dist/cjs/core/project-config.cjs +1 -0
  32. package/dist/cjs/core/project-config.cjs.map +1 -1
  33. package/dist/cjs/core/resolve-packages.cjs +2 -1
  34. package/dist/cjs/core/resolve-packages.cjs.map +1 -1
  35. package/dist/cjs/core/scaffold-engine.cjs +6 -3
  36. package/dist/cjs/core/scaffold-engine.cjs.map +1 -1
  37. package/dist/cjs/core/types.cjs +6 -0
  38. package/dist/cjs/core/types.cjs.map +1 -1
  39. package/dist/cjs/core/types.d.cts +4 -0
  40. package/dist/cjs/templates/base.cjs +12 -13
  41. package/dist/cjs/templates/base.cjs.map +1 -1
  42. package/dist/esm/addons/arktype/index.d.ts +1 -0
  43. package/dist/esm/addons/arktype/index.js +7 -0
  44. package/dist/esm/addons/arktype/index.js.map +1 -0
  45. package/dist/esm/addons/drizzle/index.js +9 -2
  46. package/dist/esm/addons/drizzle/index.js.map +1 -1
  47. package/dist/esm/addons/kysely/index.js +9 -2
  48. package/dist/esm/addons/kysely/index.js.map +1 -1
  49. package/dist/esm/addons/registry.js +18 -4
  50. package/dist/esm/addons/registry.js.map +1 -1
  51. package/dist/esm/addons/types.d.ts +2 -2
  52. package/dist/esm/addons/valibot/index.d.ts +1 -0
  53. package/dist/esm/addons/valibot/index.js +7 -0
  54. package/dist/esm/addons/valibot/index.js.map +1 -0
  55. package/dist/esm/addons/validators.d.ts +5 -0
  56. package/dist/esm/addons/validators.js +38 -0
  57. package/dist/esm/addons/validators.js.map +1 -0
  58. package/dist/esm/addons/zod/index.d.ts +1 -0
  59. package/dist/esm/addons/zod/index.js +7 -0
  60. package/dist/esm/addons/zod/index.js.map +1 -0
  61. package/dist/esm/cli.js +2 -0
  62. package/dist/esm/cli.js.map +1 -1
  63. package/dist/esm/commands/create.d.ts +1 -0
  64. package/dist/esm/commands/create.js +36 -3
  65. package/dist/esm/commands/create.js.map +1 -1
  66. package/dist/esm/core/package-manager.d.ts +2 -1
  67. package/dist/esm/core/package-manager.js +5 -14
  68. package/dist/esm/core/package-manager.js.map +1 -1
  69. package/dist/esm/core/parse-options.d.ts +3 -1
  70. package/dist/esm/core/parse-options.js +11 -2
  71. package/dist/esm/core/parse-options.js.map +1 -1
  72. package/dist/esm/core/project-config.js +1 -0
  73. package/dist/esm/core/project-config.js.map +1 -1
  74. package/dist/esm/core/resolve-packages.js +2 -1
  75. package/dist/esm/core/resolve-packages.js.map +1 -1
  76. package/dist/esm/core/scaffold-engine.js +6 -3
  77. package/dist/esm/core/scaffold-engine.js.map +1 -1
  78. package/dist/esm/core/types.d.ts +4 -0
  79. package/dist/esm/core/types.js +6 -1
  80. package/dist/esm/core/types.js.map +1 -1
  81. package/dist/esm/templates/base.js +12 -13
  82. package/dist/esm/templates/base.js.map +1 -1
  83. package/package.json +1 -1
  84. package/src/addons/arktype/index.ts +3 -0
  85. package/src/addons/drizzle/index.ts +15 -2
  86. package/src/addons/kysely/index.ts +15 -2
  87. package/src/addons/registry.ts +26 -2
  88. package/src/addons/types.ts +2 -2
  89. package/src/addons/valibot/index.ts +3 -0
  90. package/src/addons/validators.ts +39 -0
  91. package/src/addons/zod/index.ts +3 -0
  92. package/src/cli.ts +2 -0
  93. package/src/commands/create.ts +32 -2
  94. package/src/core/package-manager.ts +7 -10
  95. package/src/core/parse-options.ts +19 -0
  96. package/src/core/project-config.ts +4 -0
  97. package/src/core/resolve-packages.ts +1 -0
  98. package/src/core/scaffold-engine.ts +3 -0
  99. package/src/core/types.ts +6 -0
  100. package/src/templates/base.ts +12 -13
@@ -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 type { AddonDefinition } from './types.js'
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).map(addon => addon.bootBinding(ctx))
94
+ return resolveAddons(ctx)
95
+ .map(addon => addon.bootBinding?.(ctx))
96
+ .filter((v): v is NonNullable<typeof v> => Boolean(v))
73
97
  }
@@ -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: (ctx: ScaffoldContext) => BootBinding
17
+ bootBinding?: (ctx: ScaffoldContext) => BootBinding
18
18
  apply: (ctx: ScaffoldContext, write: FileWriter) => Promise<void>
19
19
  }
@@ -0,0 +1,3 @@
1
+ import { ValidatorAddon } from '../validators.js'
2
+
3
+ export const valibotAddon = ValidatorAddon('valibot')
@@ -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
+ }
@@ -0,0 +1,3 @@
1
+ import { ValidatorAddon } from '../validators.js'
2
+
3
+ export const zodAddon = ValidatorAddon('zod')
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 } : {}),
@@ -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
- const fallback = {
31
- agent: 'npm',
32
- install: (packages: string[], dev: boolean) => {
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 { command: fallback.agent, args: fallback.install(packages, dev) }
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`,
@@ -9,6 +9,7 @@ function frameworkPackages(framework: Framework): PackageGroups {
9
9
  'tsdown',
10
10
  'tsx',
11
11
  'typescript',
12
+ '@types/node',
12
13
  ]
13
14
  const scripts: Record<string, string> = {}
14
15
 
@@ -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
  }
@@ -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 build',
20
- 'serve': 'node dist/index.js',
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
- lib: ['ES2022', 'DOM'],
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 { t } from '#src/taser.js'
111
+ return `import { reply } from '@taserjs/router'
112
+ import { t } from '#src/taser.js'
116
113
 
117
- export const Route = t.get('/').handler((ctx) => {
118
- return ctx.reply.json({ message: 'Welcome to Taser' })
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 { t } from '#src/taser.js'
134
+ return `import { reply } from '@taserjs/router'
135
+ import { t } from '#src/taser.js'
137
136
 
138
- export const Route = t.get('/health').handler((ctx) => {
139
- ${body} return ctx.reply.json({ ok: true })
137
+ export const Route = t.get('/health').handler(${ctxArg} => {
138
+ ${body} return reply.json({ ok: true })
140
139
  })
141
140
  `
142
141
  }