@forinda/kickjs-cli 6.2.0-alpha.2 → 6.2.1

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 (26) hide show
  1. package/dist/{agent-docs-BHxKWIf4.mjs → agent-docs-BnMTYOiD.mjs} +3 -3
  2. package/dist/{agent-docs-BHxKWIf4.mjs.map → agent-docs-BnMTYOiD.mjs.map} +1 -1
  3. package/dist/{build-DH7RVYT6.mjs → build-DxVQQIQS.mjs} +3 -3
  4. package/dist/{build-DH7RVYT6.mjs.map → build-DxVQQIQS.mjs.map} +1 -1
  5. package/dist/{builtins-B9jAir23.mjs → builtins-DIyfh8Vq.mjs} +2 -2
  6. package/dist/cli.mjs +137 -137
  7. package/dist/{config-DOnwtASE.mjs → config-DQFyBrSP.mjs} +3 -3
  8. package/dist/{config-DOnwtASE.mjs.map → config-DQFyBrSP.mjs.map} +1 -1
  9. package/dist/{doctor-CUR55xM0.mjs → doctor-D6Vqf-Ws.mjs} +44 -44
  10. package/dist/doctor-D6Vqf-Ws.mjs.map +1 -0
  11. package/dist/index.d.mts.map +1 -1
  12. package/dist/index.mjs +2 -2
  13. package/dist/{plugin-DiLjdUhB.mjs → plugin-Dl2YqKay.mjs} +3 -3
  14. package/dist/{plugin-DiLjdUhB.mjs.map → plugin-Dl2YqKay.mjs.map} +1 -1
  15. package/dist/{project-docs-M1yY0Jfu.mjs → project-docs-CIzEv44w.mjs} +2 -2
  16. package/dist/{project-docs-M1yY0Jfu.mjs.map → project-docs-CIzEv44w.mjs.map} +1 -1
  17. package/dist/{project-root-t0bXso9G.mjs → project-root-DYK_xUvF.mjs} +3 -3
  18. package/dist/{project-root-t0bXso9G.mjs.map → project-root-DYK_xUvF.mjs.map} +1 -1
  19. package/dist/{rolldown-runtime-DM9iduxt.mjs → rolldown-runtime-B13ILhgX.mjs} +1 -1
  20. package/dist/{run-plugins-DujFeVh4.mjs → run-plugins-u58MFV45.mjs} +13 -13
  21. package/dist/{run-plugins-DujFeVh4.mjs.map → run-plugins-u58MFV45.mjs.map} +1 -1
  22. package/dist/{typegen-6pW2cOTw.mjs → typegen-CuciH349.mjs} +5 -5
  23. package/dist/{typegen-6pW2cOTw.mjs.map → typegen-CuciH349.mjs.map} +1 -1
  24. package/dist/{types-D34YF7B6.mjs → types-zO8PDAjk.mjs} +1 -1
  25. package/package.json +5 -5
  26. package/dist/doctor-CUR55xM0.mjs.map +0 -1
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @forinda/kickjs-cli v6.2.0-alpha.2
2
+ * @forinda/kickjs-cli v6.2.1
3
3
  *
4
4
  * Copyright (c) Felix Orinda
5
5
  *
@@ -8,7 +8,7 @@
8
8
  *
9
9
  * @license MIT
10
10
  */
11
- import{b as e,c as t,d as n,g as r,l as i,o as a,s as o,v as s}from"./project-docs-M1yY0Jfu.mjs";import{i as c,t as l}from"./config-DOnwtASE.mjs";import{t as u}from"./project-root-t0bXso9G.mjs";import{createRequire as d}from"node:module";import f,{dirname as p,join as m,relative as h,resolve as g}from"node:path";import{existsSync as _,readFileSync as v,readdirSync as y,statSync as b}from"node:fs";import{readFile as x,writeFile as S}from"node:fs/promises";import C from"pluralize";import{execFileSync as w,execSync as T}from"node:child_process";import{fileURLToPath as ee,pathToFileURL as te}from"node:url";import{defineGenerator as ne}from"@forinda/kickjs-cli-kit";function E(e){return e.replace(/[-_\s]+(.)?/g,(e,t)=>t?t.toUpperCase():``).replace(/^(.)/,e=>e.toUpperCase())}function D(e){let t=E(e);return t.charAt(0).toLowerCase()+t.slice(1)}function O(e){return e.replace(/([a-z])([A-Z])/g,`$1-$2`).replace(/[\s_]+/g,`-`).toLowerCase()}function k(e){return C.plural(e)}function re(e){return C.plural(e)}function A(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function ie(e){return e.charAt(0).toUpperCase()+e.slice(1).replace(/-([a-z])/g,(e,t)=>t.toUpperCase())}function ae(e){return e.replace(/([a-z])([A-Z])/g,`$1-$2`).toLowerCase()}function oe(e,t,n){let r={inmemory:`InMemory${e}Repository`,drizzle:`Drizzle${e}Repository`,prisma:`Prisma${e}Repository`},i={inmemory:`in-memory-${t}`,drizzle:`drizzle-${t}`,prisma:`prisma-${t}`};return{repoClass:r[n]??`${ie(n)}${e}Repository`,repoFile:i[n]??`${ae(n)}-${t}`}}function j(e){return e??`define`}function M(e){let{pascal:t,kebab:n,plural:r=``,repo:i,style:a}=e,{repoClass:o,repoFile:s}=oe(t,n,i),c=j(a),l=`/**
11
+ import{b as e,c as t,d as n,g as r,l as i,o as a,s as o,v as s}from"./project-docs-CIzEv44w.mjs";import{i as c,t as l}from"./config-DQFyBrSP.mjs";import{t as u}from"./project-root-DYK_xUvF.mjs";import{createRequire as d}from"node:module";import f,{dirname as p,join as m,relative as h,resolve as g}from"node:path";import{existsSync as _,readFileSync as v,readdirSync as y,statSync as b}from"node:fs";import{readFile as x,writeFile as S}from"node:fs/promises";import C from"pluralize";import{execFileSync as w,execSync as T}from"node:child_process";import{fileURLToPath as ee,pathToFileURL as te}from"node:url";import{defineGenerator as ne}from"@forinda/kickjs-cli-kit";function E(e){return e.replace(/[-_\s]+(.)?/g,(e,t)=>t?t.toUpperCase():``).replace(/^(.)/,e=>e.toUpperCase())}function D(e){let t=E(e);return t.charAt(0).toLowerCase()+t.slice(1)}function O(e){return e.replace(/([a-z])([A-Z])/g,`$1-$2`).replace(/[\s_]+/g,`-`).toLowerCase()}function k(e){return C.plural(e)}function A(e){return C.plural(e)}function j(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function re(e){return e.charAt(0).toUpperCase()+e.slice(1).replace(/-([a-z])/g,(e,t)=>t.toUpperCase())}function ie(e){return e.replace(/([a-z])([A-Z])/g,`$1-$2`).toLowerCase()}function ae(e,t,n){let r={inmemory:`InMemory${e}Repository`,drizzle:`Drizzle${e}Repository`,prisma:`Prisma${e}Repository`},i={inmemory:`in-memory-${t}`,drizzle:`drizzle-${t}`,prisma:`prisma-${t}`};return{repoClass:r[n]??`${re(n)}${e}Repository`,repoFile:i[n]??`${ie(n)}-${t}`}}function M(e){return e??`define`}function N(e){let{pascal:t,kebab:n,plural:r=``,repo:i,style:a}=e,{repoClass:o,repoFile:s}=ae(t,n,i),c=M(a),l=`/**
12
12
  * ${t} Module
13
13
  *
14
14
  * REST module with a flat folder structure.
@@ -80,7 +80,7 @@ ${d}
80
80
  },
81
81
  }),
82
82
  })
83
- `}function se(e){let{pascal:t,kebab:n,plural:r=``,style:i}=e,a=j(i),o=` /**
83
+ `}function oe(e){let{pascal:t,kebab:n,plural:r=``,style:i}=e,a=M(i),o=` /**
84
84
  * Declare HTTP routes. Return value shape:
85
85
  *
86
86
  * - \`path\` — URL prefix for this route set.
@@ -120,7 +120,7 @@ ${o}
120
120
  },
121
121
  }),
122
122
  })
123
- `}function N(e){let{pascal:t,kebab:n}=e,r=t.charAt(0).toLowerCase()+t.slice(1);return`import { Controller, Get, Post, Put, Delete, Autowired, ApiQueryParams, type Ctx } from '@forinda/kickjs'
123
+ `}function se(e){let{pascal:t,kebab:n}=e,r=t.charAt(0).toLowerCase()+t.slice(1);return`import { Controller, Get, Post, Put, Delete, Autowired, ApiQueryParams, type Ctx } from '@forinda/kickjs'
124
124
  import { ApiTags } from '@forinda/kickjs-swagger'
125
125
  import { ${t}Service } from './${n}.service'
126
126
  import { create${t}Schema } from './dtos/create-${n}.dto'
@@ -204,7 +204,7 @@ export type Update${t}DTO = z.infer<typeof update${t}Schema>
204
204
  createdAt: string
205
205
  updatedAt: string
206
206
  }
207
- `}function P(e){let{pascal:t,kebab:n,dtoPrefix:r=`../../application/dtos`,tokenScope:i=`app`}=e;return`/**
207
+ `}function de(e){let{pascal:t,kebab:n,dtoPrefix:r=`../../application/dtos`,tokenScope:i=`app`}=e;return`/**
208
208
  * ${t} Repository Interface
209
209
  *
210
210
  * Defines the contract for data access.
@@ -239,7 +239,7 @@ export interface I${t}Repository {
239
239
  * adopters must NOT use the reserved \`'kick/'\` namespace.
240
240
  */
241
241
  export const ${t.toUpperCase()}_REPOSITORY = createToken<I${t}Repository>('${i}/${t}/repository')
242
- `}function F(e){let{pascal:t,kebab:n,repoPrefix:r=`../../domain/repositories`,dtoPrefix:i=`../../application/dtos`}=e;return`/**
242
+ `}function P(e){let{pascal:t,kebab:n,repoPrefix:r=`../../domain/repositories`,dtoPrefix:i=`../../application/dtos`}=e;return`/**
243
243
  * In-Memory ${t} Repository
244
244
  *
245
245
  * Implements the repository interface using a Map.
@@ -299,7 +299,7 @@ export class InMemory${t}Repository implements I${t}Repository {
299
299
  this.store.delete(id)
300
300
  }
301
301
  }
302
- `}function I(e){let{pascal:t,kebab:n,repoType:r=``,repoPrefix:i=`../../domain/repositories`,dtoPrefix:a=`../../application/dtos`}=e,o=r.charAt(0).toUpperCase()+r.slice(1).replace(/-([a-z])/g,(e,t)=>t.toUpperCase());return`/**
302
+ `}function F(e){let{pascal:t,kebab:n,repoType:r=``,repoPrefix:i=`../../domain/repositories`,dtoPrefix:a=`../../application/dtos`}=e,o=r.charAt(0).toUpperCase()+r.slice(1).replace(/-([a-z])/g,(e,t)=>t.toUpperCase());return`/**
303
303
  * ${o} ${t} Repository
304
304
  *
305
305
  * Stub implementation for a custom '${r}' repository.
@@ -368,7 +368,7 @@ export class ${o}${t}Repository implements I${t}Repository {
368
368
  this.store.delete(id)
369
369
  }
370
370
  }
371
- `}function de(e){let{pascal:t,kebab:n,plural:r=``}=e;return`import { describe, it, expect, beforeEach } from 'vitest'
371
+ `}function fe(e){let{pascal:t,kebab:n,plural:r=``}=e;return`import { describe, it, expect, beforeEach } from 'vitest'
372
372
  import { Container } from '@forinda/kickjs'
373
373
 
374
374
  describe('${t}Controller', () => {
@@ -420,7 +420,7 @@ describe('${t}Controller', () => {
420
420
  })
421
421
  })
422
422
  })
423
- `}function fe(e){let{pascal:t,kebab:n,plural:r=``,repoPrefix:i=`../infrastructure/repositories/in-memory-${n}.repository`}=e;return`import { describe, it, expect, beforeEach } from 'vitest'
423
+ `}function pe(e){let{pascal:t,kebab:n,plural:r=``,repoPrefix:i=`../infrastructure/repositories/in-memory-${n}.repository`}=e;return`import { describe, it, expect, beforeEach } from 'vitest'
424
424
  import { InMemory${t}Repository } from '${i}'
425
425
 
426
426
  describe('InMemory${t}Repository', () => {
@@ -482,7 +482,7 @@ describe('InMemory${t}Repository', () => {
482
482
  expect(found).toBeNull()
483
483
  })
484
484
  })
485
- `}function L(e){let{pascal:t,kebab:n}=e;return`import { Service, Inject, HttpException } from '@forinda/kickjs'
485
+ `}function I(e){let{pascal:t,kebab:n}=e;return`import { Service, Inject, HttpException } from '@forinda/kickjs'
486
486
  import type { ParsedQuery } from '@forinda/kickjs'
487
487
  import { ${t.toUpperCase()}_REPOSITORY, type I${t}Repository } from './${n}.repository'
488
488
  import type { ${t}ResponseDTO } from './dtos/${n}-response.dto'
@@ -519,14 +519,14 @@ export class ${t}Service {
519
519
  await this.repo.delete(id)
520
520
  }
521
521
  }
522
- `}function R(e){let{pascal:t}=e;return`import type { QueryFieldConfig } from '@forinda/kickjs'
522
+ `}function L(e){let{pascal:t}=e;return`import type { QueryFieldConfig } from '@forinda/kickjs'
523
523
 
524
524
  export const ${t.toUpperCase()}_QUERY_CONFIG: QueryFieldConfig = {
525
525
  filterable: ['name'],
526
526
  sortable: ['name', 'createdAt'],
527
527
  searchable: ['name'],
528
528
  }
529
- `}const pe={express:{from:`@forinda/kickjs`,name:`expressRuntime`},fastify:{from:`@forinda/kickjs/fastify`,name:`fastifyRuntime`},h3:{from:`@forinda/kickjs/h3`,name:`h3Runtime`}};function me(e,t,n,r=[],i=`express`){let a=pe[i],o=i===`express`;switch(t){case`minimal`:{let t=[],i=[],s=o?`import { bootstrap, ${a.name} } from '@forinda/kickjs'`:`import { bootstrap } from '@forinda/kickjs'\nimport { ${a.name} } from '${a.from}'`;r.includes(`swagger`)&&(t.push(`import { SwaggerAdapter } from '@forinda/kickjs-swagger'`),i.push(` SwaggerAdapter({ info: { title: '${e}', version: '${n}' } }),`)),r.includes(`devtools`)&&(t.push(`import { DevToolsAdapter } from '@forinda/kickjs-devtools'`),i.push(` DevToolsAdapter(),`));let c=t.length?t.join(`
529
+ `}const me={express:{from:`@forinda/kickjs`,name:`expressRuntime`},fastify:{from:`@forinda/kickjs/fastify`,name:`fastifyRuntime`},h3:{from:`@forinda/kickjs/h3`,name:`h3Runtime`}};function he(e,t,n,r=[],i=`express`){let a=me[i],o=i===`express`;switch(t){case`minimal`:{let t=[],i=[],s=o?`import { bootstrap, ${a.name} } from '@forinda/kickjs'`:`import { bootstrap } from '@forinda/kickjs'\nimport { ${a.name} } from '${a.from}'`;r.includes(`swagger`)&&(t.push(`import { SwaggerAdapter } from '@forinda/kickjs-swagger'`),i.push(` SwaggerAdapter({ info: { title: '${e}', version: '${n}' } }),`)),r.includes(`devtools`)&&(t.push(`import { DevToolsAdapter } from '@forinda/kickjs-devtools'`),i.push(` DevToolsAdapter(),`));let c=t.length?t.join(`
530
530
  `)+`
531
531
  `:``,l=i.length?`,\n adapters: [\n${i.join(`
532
532
  `)}\n ]`:``;return`import 'reflect-metadata'
@@ -566,14 +566,14 @@ export const app = await bootstrap({
566
566
  requestLogger(),${d}
567
567
  ],
568
568
  })
569
- `}}}function he(){return`import { defineModules } from '@forinda/kickjs'
569
+ `}}}function ge(){return`import { defineModules } from '@forinda/kickjs'
570
570
  import { HelloModule } from './hello/hello.module'
571
571
 
572
572
  // Remove HelloModule and run: kick g module <name>
573
573
  // \`defineModules()\` returns a chainable list — \`kick g module\` appends
574
574
  // \`.mount(NewModule())\` to the chain on every generation.
575
575
  export const modules = defineModules().mount(HelloModule())
576
- `}function ge(e=`zod`){return e===`valibot`?`import { loadEnvFromSchema } from '@forinda/kickjs/config'
576
+ `}function _e(e=`zod`){return e===`valibot`?`import { loadEnvFromSchema } from '@forinda/kickjs/config'
577
577
  import { fromValibot } from '@forinda/kickjs-schema/valibot'
578
578
  import * as v from 'valibot'
579
579
 
@@ -701,7 +701,7 @@ const envSchema = fromZod(
701
701
  export const env = loadEnvFromSchema(envSchema)
702
702
 
703
703
  export default envSchema
704
- `}function _e(){return`import { Service } from '@forinda/kickjs'
704
+ `}function ve(){return`import { Service } from '@forinda/kickjs'
705
705
 
706
706
  @Service()
707
707
  export class HelloService {
@@ -713,7 +713,7 @@ export class HelloService {
713
713
  return { status: 'ok', uptime: process.uptime() }
714
714
  }
715
715
  }
716
- `}function ve(){return`import { Controller, Get, Autowired, type Ctx } from '@forinda/kickjs'
716
+ `}function ye(){return`import { Controller, Get, Autowired, type Ctx } from '@forinda/kickjs'
717
717
  import { HelloService } from './hello.service'
718
718
 
719
719
  // \`Ctx<KickRoutes.HelloController['<method>']>\` is generated by
@@ -735,7 +735,7 @@ export class HelloController {
735
735
  ctx.json(this.helloService.healthCheck())
736
736
  }
737
737
  }
738
- `}function ye(){return`import { defineModule } from '@forinda/kickjs'
738
+ `}function be(){return`import { defineModule } from '@forinda/kickjs'
739
739
  import { HelloController } from './hello.controller'
740
740
 
741
741
  export const HelloModule = defineModule({
@@ -756,7 +756,7 @@ export const HelloModule = defineModule({
756
756
  },
757
757
  }),
758
758
  })
759
- `}function be(e,t=`inmemory`,n=`pnpm`,r=`express`){return`import { defineConfig } from '@forinda/kickjs-cli'
759
+ `}function xe(e,t=`inmemory`,n=`pnpm`,r=`express`){return`import { defineConfig } from '@forinda/kickjs-cli'
760
760
 
761
761
  export default defineConfig({
762
762
  pattern: '${e}',
@@ -808,7 +808,7 @@ export default defineConfig({
808
808
  },
809
809
  ],
810
810
  })
811
- `}async function xe(e){let{pascal:t,kebab:n,plural:r,style:i,write:a}=e;await a(`${n}.module.ts`,se({pascal:t,kebab:n,plural:r,style:i})),await a(`${n}.controller.ts`,`import { Controller, Get, type Ctx } from '@forinda/kickjs'
811
+ `}async function Se(e){let{pascal:t,kebab:n,plural:r,style:i,write:a}=e;await a(`${n}.module.ts`,oe({pascal:t,kebab:n,plural:r,style:i})),await a(`${n}.controller.ts`,`import { Controller, Get, type Ctx } from '@forinda/kickjs'
812
812
 
813
813
  // \`Ctx<KickRoutes.${t}Controller['<method>']>\` is generated by
814
814
  // \`kick typegen\` (auto-run on \`kick dev\`).
@@ -820,7 +820,7 @@ export class ${t}Controller {
820
820
  ctx.json({ message: '${t} list' })
821
821
  }
822
822
  }
823
- `)}async function Se(e){let{pascal:t,kebab:n,plural:r,pluralPascal:i,repo:a,noTests:o,tokenScope:s,style:c,write:l}=e;await l(`${n}.module.ts`,M({pascal:t,kebab:n,plural:r,repo:a,style:c})),await l(`${n}.constants.ts`,R({pascal:t,kebab:n})),await l(`${n}.controller.ts`,N({pascal:t,kebab:n,plural:r,pluralPascal:i})),await l(`${n}.service.ts`,L({pascal:t,kebab:n})),await l(`dtos/create-${n}.dto.ts`,ce({pascal:t,kebab:n})),await l(`dtos/update-${n}.dto.ts`,le({pascal:t,kebab:n})),await l(`dtos/${n}-response.dto.ts`,ue({pascal:t,kebab:n})),await l(`${n}.repository.ts`,P({pascal:t,kebab:n,dtoPrefix:`./dtos`,tokenScope:s}));let u=a===`inmemory`,d=u?`in-memory-${n}`:`${O(a)}-${n}`,f=u?F({pascal:t,kebab:n,repoPrefix:`.`,dtoPrefix:`./dtos`}):I({pascal:t,kebab:n,repoType:a,repoPrefix:`.`,dtoPrefix:`./dtos`});await l(`${d}.repository.ts`,f),o||(a!==`inmemory`&&await l(`in-memory-${n}.repository.ts`,F({pascal:t,kebab:n,repoPrefix:`.`,dtoPrefix:`./dtos`})),await l(`__tests__/${n}.controller.test.ts`,de({pascal:t,kebab:n,plural:r})),await l(`__tests__/${n}.repository.test.ts`,fe({pascal:t,kebab:n,plural:r,repoPrefix:`../in-memory-${n}.repository`})))}function Ce(e){return e?typeof e==`string`?e:e.name:`inmemory`}async function we(t){let{name:n,modulesDir:a,noEntity:c,noTests:l,repo:u=`inmemory`,force:d,dryRun:f}=t,p=t.pluralize!==!1,h=t.pattern??`rest`;t.minimal&&(h=`minimal`);let g=O(n),_=E(n),v=p?k(g):g,y=p?re(_):_,b=m(a,v),x=[],S=d??!1,C={kebab:g,pascal:_,plural:v,pluralPascal:y,moduleDir:b,repo:u,noEntity:c??!1,noTests:l??!1,prismaClientPath:t.prismaClientPath??`@prisma/client`,tokenScope:t.tokenScope??`app`,style:t.style??`define`,write:async(t,n)=>{let a=m(b,t);if(f){x.push(a);return}if(!S&&await s(a)&&!await o({message:`File exists: ${r.dim(t)}. Overwrite?`,initialValue:!1})){i.warn(`Skipped: ${t}`);return}await e(a,n),x.push(a)},files:x};switch(h){case`minimal`:await xe(C);break;default:await Se(C);break}return f||await z(a,_,v,g,C.style),x}async function z(t,n,r,i,a=`define`){let o=m(t,`index.ts`),c=await s(o),l=`./${r}/${i}.module`,u=a===`class`?`${n}Module`:`${n}Module()`;if(!c){await e(o,a===`class`?`import type { AppModuleEntry } from '@forinda/kickjs'
823
+ `)}async function Ce(e){let{pascal:t,kebab:n,plural:r,pluralPascal:i,repo:a,noTests:o,tokenScope:s,style:c,write:l}=e;await l(`${n}.module.ts`,N({pascal:t,kebab:n,plural:r,repo:a,style:c})),await l(`${n}.constants.ts`,L({pascal:t,kebab:n})),await l(`${n}.controller.ts`,se({pascal:t,kebab:n,plural:r,pluralPascal:i})),await l(`${n}.service.ts`,I({pascal:t,kebab:n})),await l(`dtos/create-${n}.dto.ts`,ce({pascal:t,kebab:n})),await l(`dtos/update-${n}.dto.ts`,le({pascal:t,kebab:n})),await l(`dtos/${n}-response.dto.ts`,ue({pascal:t,kebab:n})),await l(`${n}.repository.ts`,de({pascal:t,kebab:n,dtoPrefix:`./dtos`,tokenScope:s}));let u=a===`inmemory`,d=u?`in-memory-${n}`:`${O(a)}-${n}`,f=u?P({pascal:t,kebab:n,repoPrefix:`.`,dtoPrefix:`./dtos`}):F({pascal:t,kebab:n,repoType:a,repoPrefix:`.`,dtoPrefix:`./dtos`});await l(`${d}.repository.ts`,f),o||(a!==`inmemory`&&await l(`in-memory-${n}.repository.ts`,P({pascal:t,kebab:n,repoPrefix:`.`,dtoPrefix:`./dtos`})),await l(`__tests__/${n}.controller.test.ts`,fe({pascal:t,kebab:n,plural:r})),await l(`__tests__/${n}.repository.test.ts`,pe({pascal:t,kebab:n,plural:r,repoPrefix:`../in-memory-${n}.repository`})))}function we(e){return e?typeof e==`string`?e:e.name:`inmemory`}async function Te(t){let{name:n,modulesDir:a,noEntity:c,noTests:l,repo:u=`inmemory`,force:d,dryRun:f}=t,p=t.pluralize!==!1,h=t.pattern??`rest`;t.minimal&&(h=`minimal`);let g=O(n),_=E(n),v=p?k(g):g,y=p?A(_):_,b=m(a,v),x=[],S=d??!1,C={kebab:g,pascal:_,plural:v,pluralPascal:y,moduleDir:b,repo:u,noEntity:c??!1,noTests:l??!1,prismaClientPath:t.prismaClientPath??`@prisma/client`,tokenScope:t.tokenScope??`app`,style:t.style??`define`,write:async(t,n)=>{let a=m(b,t);if(f){x.push(a);return}if(!S&&await s(a)&&!await o({message:`File exists: ${r.dim(t)}. Overwrite?`,initialValue:!1})){i.warn(`Skipped: ${t}`);return}await e(a,n),x.push(a)},files:x};switch(h){case`minimal`:await Se(C);break;default:await Ce(C);break}return f||await R(a,_,v,g,C.style),x}async function R(t,n,r,i,a=`define`){let o=m(t,`index.ts`),c=await s(o),l=`./${r}/${i}.module`,u=a===`class`?`${n}Module`:`${n}Module()`;if(!c){await e(o,a===`class`?`import type { AppModuleEntry } from '@forinda/kickjs'
824
824
  import { ${n}Module } from '${l}'
825
825
 
826
826
  export const modules: AppModuleEntry[] = [${u}]
@@ -828,11 +828,11 @@ export const modules: AppModuleEntry[] = [${u}]
828
828
  import { ${n}Module } from '${l}'
829
829
 
830
830
  export const modules = defineModules().mount(${u})
831
- `);return}let d=await x(o,`utf-8`),f=`import { ${n}Module } from '${l}'`,p=A(l);if(!RegExp(`^import\\s*\\{[^}]*\\b${A(n)}Module\\b[^}]*\\}\\s*from\\s*['"]${p}['"]`,`m`).test(d)){let e=d.lastIndexOf(`import `);if(e!==-1){let t=d.indexOf(`
831
+ `);return}let d=await x(o,`utf-8`),f=`import { ${n}Module } from '${l}'`,p=j(l);if(!RegExp(`^import\\s*\\{[^}]*\\b${j(n)}Module\\b[^}]*\\}\\s*from\\s*['"]${p}['"]`,`m`).test(d)){let e=d.lastIndexOf(`import `);if(e!==-1){let t=d.indexOf(`
832
832
  `,e);d=d.slice(0,t+1)+f+`
833
833
  `+d.slice(t+1)}else d=f+`
834
- `+d}let h=V(d);if(h){let e=d.slice(h.rhsStart,h.rhsEnd+1);RegExp(`\\b${A(n)}Module\\b`).test(e)||(d=B(d,u))}else d=B(d,u);await S(o,d,`utf-8`)}function B(e,t){let n=V(e);if(!n)return e;if(n.shape===`array`){let r=e.slice(n.rhsStart+1,n.rhsEnd),i=r.trim(),a;if(!i)a=`[${t}]`;else{let e=i.endsWith(`,`)?``:`,`;a=`[${r.trimEnd()}${e} ${t}]`}return e.slice(0,n.rhsStart)+a+e.slice(n.rhsEnd+1)}return`${e.slice(0,n.chainEnd)}\n .mount(${t})${e.slice(n.chainEnd)}`}function V(e){let t=/export\s+const\s+modules\b[^=]*=/.exec(e);if(!t)return null;let n=t.index+t[0].length;for(;n<e.length&&/\s/.test(e[n]??``);)n++;if(e[n]===`[`){let t=Ee(e,n);return t===-1?null:{shape:`array`,rhsStart:n,rhsEnd:t}}if(e.slice(n,n+13)===`defineModules`){let t=Te(e,n);return t===-1?null:{shape:`chain`,rhsStart:n,rhsEnd:t-1,chainEnd:t}}return null}function Te(e,t=0){let n=/defineModules\s*\(/g;n.lastIndex=t;let r=n.exec(e);if(!r)return-1;let i=r.index+r[0].length-1;if(e[i]!==`(`||(i=U(e,i),i===-1))return-1;for(i++;;){let t=i;for(;t<e.length&&/\s/.test(e[t]??``);)t++;if(e[t]!==`.`||e.slice(t,t+6)!==`.mount`)break;for(t+=6;t<e.length&&/\s/.test(e[t]??``);)t++;if(e[t]!==`(`)break;let n=U(e,t);if(n===-1)break;i=n+1}return i}function H(e,t){let n=e.slice(t,t+2);if(n===`//`){for(t+=2;t<e.length&&e[t]!==`
835
- `;)t++;return t}if(n===`/*`){for(t+=2;t+1<e.length&&!(e[t]===`*`&&e[t+1]===`/`);)t++;return t+2}return t}function Ee(e,t){if(e[t]!==`[`)return-1;let n=1,r=t+1;for(;r<e.length;){let t=e.slice(r,r+2);if(t===`//`||t===`/*`){r=H(e,r);continue}let i=e[r]??``;if(i===`'`||i===`"`||i==="`"){let t=i;for(r++;r<e.length&&e[r]!==t;)e[r]===`\\`&&r++,r++;r<e.length&&r++;continue}if(i===`[`)n++;else if(i===`]`&&(n--,n===0))return r;r++}return-1}function U(e,t){if(e[t]!==`(`)return-1;let n=1,r=t+1;for(;r<e.length;){let t=e.slice(r,r+2);if(t===`//`||t===`/*`){r=H(e,r);continue}let i=e[r]??``;if(i===`'`||i===`"`||i==="`"){let t=i;for(r++;r<e.length&&e[r]!==t;)e[r]===`\\`&&r++,r++;r<e.length&&r++;continue}if(i===`(`)n++;else if(i===`)`&&(n--,n===0))return r;r++}return-1}async function De(t){let{name:n,outDir:r}=t,i=O(n),a=E(n),o=[],s=m(r,`${i}.adapter.ts`);return await e(s,`import {
834
+ `+d}let h=B(d);if(h){let e=d.slice(h.rhsStart,h.rhsEnd+1);RegExp(`\\b${j(n)}Module\\b`).test(e)||(d=z(d,u))}else d=z(d,u);await S(o,d,`utf-8`)}function z(e,t){let n=B(e);if(!n)return e;if(n.shape===`array`){let r=e.slice(n.rhsStart+1,n.rhsEnd),i=r.trim(),a;if(!i)a=`[${t}]`;else{let e=i.endsWith(`,`)?``:`,`;a=`[${r.trimEnd()}${e} ${t}]`}return e.slice(0,n.rhsStart)+a+e.slice(n.rhsEnd+1)}return`${e.slice(0,n.chainEnd)}\n .mount(${t})${e.slice(n.chainEnd)}`}function B(e){let t=/export\s+const\s+modules\b[^=]*=/.exec(e);if(!t)return null;let n=t.index+t[0].length;for(;n<e.length&&/\s/.test(e[n]??``);)n++;if(e[n]===`[`){let t=De(e,n);return t===-1?null:{shape:`array`,rhsStart:n,rhsEnd:t}}if(e.slice(n,n+13)===`defineModules`){let t=Ee(e,n);return t===-1?null:{shape:`chain`,rhsStart:n,rhsEnd:t-1,chainEnd:t}}return null}function Ee(e,t=0){let n=/defineModules\s*\(/g;n.lastIndex=t;let r=n.exec(e);if(!r)return-1;let i=r.index+r[0].length-1;if(e[i]!==`(`||(i=H(e,i),i===-1))return-1;for(i++;;){let t=i;for(;t<e.length&&/\s/.test(e[t]??``);)t++;if(e[t]!==`.`||e.slice(t,t+6)!==`.mount`)break;for(t+=6;t<e.length&&/\s/.test(e[t]??``);)t++;if(e[t]!==`(`)break;let n=H(e,t);if(n===-1)break;i=n+1}return i}function V(e,t){let n=e.slice(t,t+2);if(n===`//`){for(t+=2;t<e.length&&e[t]!==`
835
+ `;)t++;return t}if(n===`/*`){for(t+=2;t+1<e.length&&!(e[t]===`*`&&e[t+1]===`/`);)t++;return t+2}return t}function De(e,t){if(e[t]!==`[`)return-1;let n=1,r=t+1;for(;r<e.length;){let t=e.slice(r,r+2);if(t===`//`||t===`/*`){r=V(e,r);continue}let i=e[r]??``;if(i===`'`||i===`"`||i==="`"){let t=i;for(r++;r<e.length&&e[r]!==t;)e[r]===`\\`&&r++,r++;r<e.length&&r++;continue}if(i===`[`)n++;else if(i===`]`&&(n--,n===0))return r;r++}return-1}function H(e,t){if(e[t]!==`(`)return-1;let n=1,r=t+1;for(;r<e.length;){let t=e.slice(r,r+2);if(t===`//`||t===`/*`){r=V(e,r);continue}let i=e[r]??``;if(i===`'`||i===`"`||i==="`"){let t=i;for(r++;r<e.length&&e[r]!==t;)e[r]===`\\`&&r++,r++;r<e.length&&r++;continue}if(i===`(`)n++;else if(i===`)`&&(n--,n===0))return r;r++}return-1}async function Oe(t){let{name:n,outDir:r}=t,i=O(n),a=E(n),o=[],s=m(r,`${i}.adapter.ts`);return await e(s,`import {
836
836
  defineAdapter,
837
837
  type AdapterContext,
838
838
  type AdapterMiddleware,
@@ -1001,7 +1001,7 @@ export const ${a}Adapter = defineAdapter<${a}AdapterConfig>({
1001
1001
  }
1002
1002
  },
1003
1003
  })
1004
- `),o.push(s),o}const Oe={controller:``,service:``,dto:`dtos`,guard:`guards`,middleware:`middleware`,contributor:`contributors`};function W(e){let{type:t,outDir:n,moduleName:r,modulesDir:i=`src/modules`,defaultDir:a,shouldPluralize:o=!0}=e;if(n)return g(n);if(r){let e=Oe,n=O(r),a=o?k(n):n,s=e[t]??``,c=m(i,a);return g(s?m(c,s):c)}return g(a)}async function ke(t){let{name:n,moduleName:r,modulesDir:i,pattern:a}=t,o=W({type:`middleware`,outDir:t.outDir,moduleName:r,modulesDir:i,defaultDir:`src/middleware`,pattern:a,shouldPluralize:t.pluralize??!0}),s=O(n),c=D(n),l=[],u=m(o,`${s}.middleware.ts`);return await e(u,`import type { Request, Response, NextFunction } from 'express'
1004
+ `),o.push(s),o}const ke={controller:``,service:``,dto:`dtos`,guard:`guards`,middleware:`middleware`,contributor:`contributors`};function U(e){let{type:t,outDir:n,moduleName:r,modulesDir:i=`src/modules`,defaultDir:a,shouldPluralize:o=!0}=e;if(n)return g(n);if(r){let e=ke,n=O(r),a=o?k(n):n,s=e[t]??``,c=m(i,a);return g(s?m(c,s):c)}return g(a)}async function Ae(t){let{name:n,moduleName:r,modulesDir:i,pattern:a}=t,o=U({type:`middleware`,outDir:t.outDir,moduleName:r,modulesDir:i,defaultDir:`src/middleware`,pattern:a,shouldPluralize:t.pluralize??!0}),s=O(n),c=D(n),l=[],u=m(o,`${s}.middleware.ts`);return await e(u,`import type { Request, Response, NextFunction } from 'express'
1005
1005
 
1006
1006
  export interface ${E(n)}Options {
1007
1007
  // Add configuration options here. The factory below closes over the
@@ -1051,7 +1051,7 @@ export function ${c}(options: ${E(n)}Options = {}) {
1051
1051
  next()
1052
1052
  }
1053
1053
  }
1054
- `),l.push(u),l}async function Ae(t){let{name:n,moduleName:r,modulesDir:i,pattern:a}=t,o=W({type:`guard`,outDir:t.outDir,moduleName:r,modulesDir:i,defaultDir:`src/guards`,pattern:a,shouldPluralize:t.pluralize??!0}),s=O(n),c=D(n),l=E(n),u=[],d=m(o,`${s}.guard.ts`);return await e(d,`import { Container, HttpException } from '@forinda/kickjs'
1054
+ `),l.push(u),l}async function je(t){let{name:n,moduleName:r,modulesDir:i,pattern:a}=t,o=U({type:`guard`,outDir:t.outDir,moduleName:r,modulesDir:i,defaultDir:`src/guards`,pattern:a,shouldPluralize:t.pluralize??!0}),s=O(n),c=D(n),l=E(n),u=[],d=m(o,`${s}.guard.ts`);return await e(d,`import { Container, HttpException } from '@forinda/kickjs'
1055
1055
  import type { RequestContext } from '@forinda/kickjs'
1056
1056
 
1057
1057
  /**
@@ -1087,7 +1087,7 @@ export async function ${c}Guard(ctx: RequestContext, next: () => void): Promise<
1087
1087
  ctx.res.status(401).json({ message: 'Invalid or expired token' })
1088
1088
  }
1089
1089
  }
1090
- `),u.push(d),u}async function je(t){let{name:n,moduleName:r,modulesDir:i,pattern:a}=t,o=W({type:`service`,outDir:t.outDir,moduleName:r,modulesDir:i,defaultDir:`src/services`,pattern:a,shouldPluralize:t.pluralize??!0}),s=O(n),c=E(n),l=[],u=m(o,`${s}.service.ts`);return await e(u,`import { Service } from '@forinda/kickjs'
1090
+ `),u.push(d),u}async function Me(t){let{name:n,moduleName:r,modulesDir:i,pattern:a}=t,o=U({type:`service`,outDir:t.outDir,moduleName:r,modulesDir:i,defaultDir:`src/services`,pattern:a,shouldPluralize:t.pluralize??!0}),s=O(n),c=E(n),l=[],u=m(o,`${s}.service.ts`);return await e(u,`import { Service } from '@forinda/kickjs'
1091
1091
 
1092
1092
  @Service()
1093
1093
  export class ${c}Service {
@@ -1096,7 +1096,7 @@ export class ${c}Service {
1096
1096
  // @Inject(MY_REPO) private readonly repo: IMyRepository,
1097
1097
  // ) {}
1098
1098
  }
1099
- `),l.push(u),l}async function Me(t){let{name:n,moduleName:r,modulesDir:i,pattern:a}=t,o=W({type:`controller`,outDir:t.outDir,moduleName:r,modulesDir:i,defaultDir:`src/controllers`,pattern:a,shouldPluralize:t.pluralize??!0}),s=O(n),c=E(n),l=[],u=m(o,`${s}.controller.ts`);return await e(u,`import { Controller, Get, Post, type Ctx } from '@forinda/kickjs'
1099
+ `),l.push(u),l}async function Ne(t){let{name:n,moduleName:r,modulesDir:i,pattern:a}=t,o=U({type:`controller`,outDir:t.outDir,moduleName:r,modulesDir:i,defaultDir:`src/controllers`,pattern:a,shouldPluralize:t.pluralize??!0}),s=O(n),c=E(n),l=[],u=m(o,`${s}.controller.ts`);return await e(u,`import { Controller, Get, Post, type Ctx } from '@forinda/kickjs'
1100
1100
 
1101
1101
  // \`Ctx<KickRoutes.${c}Controller['<method>']>\` is generated by
1102
1102
  // \`kick typegen\` (auto-run on \`kick dev\`). After the first run, your IDE
@@ -1117,7 +1117,7 @@ export class ${c}Controller {
1117
1117
  ctx.created({ message: '${c} created', data: ctx.body })
1118
1118
  }
1119
1119
  }
1120
- `),l.push(u),l}async function Ne(t){let{name:n,moduleName:r,modulesDir:i,pattern:a}=t,o=W({type:`dto`,outDir:t.outDir,moduleName:r,modulesDir:i,defaultDir:`src/dtos`,pattern:a,shouldPluralize:t.pluralize??!0}),s=O(n),c=E(n),l=D(n),u=[],d=m(o,`${s}.dto.ts`);return await e(d,`import { z } from 'zod'
1120
+ `),l.push(u),l}async function Pe(t){let{name:n,moduleName:r,modulesDir:i,pattern:a}=t,o=U({type:`dto`,outDir:t.outDir,moduleName:r,modulesDir:i,defaultDir:`src/dtos`,pattern:a,shouldPluralize:t.pluralize??!0}),s=O(n),c=E(n),l=D(n),u=[],d=m(o,`${s}.dto.ts`);return await e(d,`import { z } from 'zod'
1121
1121
 
1122
1122
  export const ${l}Schema = z.object({
1123
1123
  // Define your schema fields here
@@ -1125,7 +1125,7 @@ export const ${l}Schema = z.object({
1125
1125
  })
1126
1126
 
1127
1127
  export type ${c}DTO = z.infer<typeof ${l}Schema>
1128
- `),u.push(d),u}const Pe={swagger:`@forinda/kickjs-swagger`,ws:`@forinda/kickjs-ws`,queue:`@forinda/kickjs-queue`,devtools:`@forinda/kickjs-devtools`},Fe={zod:{name:`zod`,range:`^4.3.6`},valibot:{name:`valibot`,range:`^1.4.1`},yup:{name:`yup`,range:`^1.7.1`}};function G(e,t){let n=e[t];if(!n)throw Error(`generatePackageJson: missing resolved version for ${t}. Add it to SIBLING_PACKAGES in generators/project.ts.`);return n}function Ie(e,t,n,r=[],i=`zod`,a=`express`){let o=Fe[i],s={"@forinda/kickjs":G(n,`@forinda/kickjs`),"@forinda/kickjs-schema":G(n,`@forinda/kickjs-schema`),dotenv:`^17.3.1`,"reflect-metadata":`^0.2.2`,[o.name]:o.range};a===`express`?s.express=`^5.1.0`:a===`fastify`?(s.fastify=`^5.0.0`,s[`@fastify/middie`]=`^9.0.0`,s[`serve-static`]=`^2.2.0`):a===`h3`&&(s.h3=`^1.0.0`,s[`serve-static`]=`^2.2.0`);for(let e of r){let t=Pe[e];t&&!s[t]&&(s[t]=G(n,t))}return JSON.stringify({name:e,version:`0.0.0`,type:`module`,scripts:{dev:`kick dev`,"dev:debug":`kick dev:debug`,build:`kick build`,start:`kick start`,test:`vitest run`,"test:watch":`vitest`,typecheck:`tsc --noEmit`,typegen:`kick typegen`,lint:`eslint src/`,format:`prettier --write src/`},dependencies:s,devDependencies:{"@forinda/kickjs-cli":G(n,`@forinda/kickjs-cli`),"@forinda/kickjs-vite":G(n,`@forinda/kickjs-vite`),"@swc/core":`^1.15.21`,...a===`express`?{"@types/express":`^5.0.6`}:{},"@types/node":`^25.0.0`,"unplugin-swc":`^1.5.9`,vite:`^8.0.3`,vitest:`^4.1.2`,typescript:`^6.0.3`,prettier:`^3.8.1`}},null,2)}function Le(){return`import { defineConfig } from 'vite'
1128
+ `),u.push(d),u}const Fe={swagger:`@forinda/kickjs-swagger`,ws:`@forinda/kickjs-ws`,queue:`@forinda/kickjs-queue`,devtools:`@forinda/kickjs-devtools`},Ie={zod:{name:`zod`,range:`^4.3.6`},valibot:{name:`valibot`,range:`^1.4.1`},yup:{name:`yup`,range:`^1.7.1`}};function W(e,t){let n=e[t];if(!n)throw Error(`generatePackageJson: missing resolved version for ${t}. Add it to SIBLING_PACKAGES in generators/project.ts.`);return n}function Le(e,t,n,r=[],i=`zod`,a=`express`){let o=Ie[i],s={"@forinda/kickjs":W(n,`@forinda/kickjs`),"@forinda/kickjs-schema":W(n,`@forinda/kickjs-schema`),dotenv:`^17.3.1`,"reflect-metadata":`^0.2.2`,[o.name]:o.range};a===`express`?s.express=`^5.1.0`:a===`fastify`?(s.fastify=`^5.0.0`,s[`@fastify/middie`]=`^9.0.0`,s[`serve-static`]=`^2.2.0`):a===`h3`&&(s.h3=`^1.0.0`,s[`serve-static`]=`^2.2.0`);for(let e of r){let t=Fe[e];t&&!s[t]&&(s[t]=W(n,t))}return JSON.stringify({name:e,version:`0.0.0`,type:`module`,scripts:{dev:`kick dev`,"dev:debug":`kick dev:debug`,build:`kick build`,start:`kick start`,test:`vitest run`,"test:watch":`vitest`,typecheck:`tsc --noEmit`,typegen:`kick typegen`,lint:`eslint src/`,format:`prettier --write src/`},dependencies:s,devDependencies:{"@forinda/kickjs-cli":W(n,`@forinda/kickjs-cli`),"@forinda/kickjs-vite":W(n,`@forinda/kickjs-vite`),"@swc/core":`^1.15.21`,...a===`express`?{"@types/express":`^5.0.6`}:{},"@types/node":`^25.0.0`,"unplugin-swc":`^1.5.9`,vite:`^8.0.3`,vitest:`^4.1.2`,typescript:`^6.0.3`,prettier:`^3.8.1`}},null,2)}function Re(){return`import { defineConfig } from 'vite'
1129
1129
  import { resolve } from 'node:path'
1130
1130
  import swc from 'unplugin-swc'
1131
1131
  import { kickjsVitePlugin, envWatchPlugin } from '@forinda/kickjs-vite'
@@ -1155,7 +1155,7 @@ export default defineConfig({
1155
1155
  },
1156
1156
  },
1157
1157
  })
1158
- `}function Re(){return JSON.stringify({compilerOptions:{target:`ES2022`,module:`ESNext`,moduleResolution:`bundler`,lib:[`ES2022`],types:[`node`,`vite/client`],strict:!0,esModuleInterop:!0,skipLibCheck:!0,sourceMap:!0,declaration:!0,experimentalDecorators:!0,emitDecoratorMetadata:!0,outDir:`dist`,paths:{"@/*":[`./src/*`]}},include:[`src`,`.kickjs/types/**/*.d.ts`,`.kickjs/types/**/*.ts`]},null,2)}function ze(){return JSON.stringify({semi:!1,singleQuote:!0,trailingComma:`all`,printWidth:100,tabWidth:2},null,2)}function Be(){return`# https://editorconfig.org
1158
+ `}function ze(){return JSON.stringify({compilerOptions:{target:`ES2022`,module:`ESNext`,moduleResolution:`bundler`,lib:[`ES2022`],types:[`node`,`vite/client`],strict:!0,esModuleInterop:!0,skipLibCheck:!0,sourceMap:!0,declaration:!0,experimentalDecorators:!0,emitDecoratorMetadata:!0,outDir:`dist`,paths:{"@/*":[`./src/*`]}},include:[`src`,`.kickjs/types/**/*.d.ts`,`.kickjs/types/**/*.ts`]},null,2)}function Be(){return JSON.stringify({semi:!1,singleQuote:!0,trailingComma:`all`,printWidth:100,tabWidth:2},null,2)}function Ve(){return`# https://editorconfig.org
1159
1159
  root = true
1160
1160
 
1161
1161
  [*]
@@ -1168,14 +1168,14 @@ insert_final_newline = true
1168
1168
 
1169
1169
  [*.md]
1170
1170
  trim_trailing_whitespace = false
1171
- `}function Ve(){return`node_modules/
1171
+ `}function He(){return`node_modules/
1172
1172
  dist/
1173
1173
  .env
1174
1174
  coverage/
1175
1175
  .DS_Store
1176
1176
  *.tsbuildinfo
1177
1177
  .kickjs/
1178
- `}function He(){return`# Auto-detect text files and normalise line endings to LF
1178
+ `}function Ue(){return`# Auto-detect text files and normalise line endings to LF
1179
1179
  * text=auto eol=lf
1180
1180
 
1181
1181
  # Explicitly mark generated / binary files
@@ -1193,11 +1193,11 @@ coverage/
1193
1193
  pnpm-lock.yaml -diff linguist-generated
1194
1194
  yarn.lock -diff linguist-generated
1195
1195
  package-lock.json -diff linguist-generated
1196
- `}function Ue(){return`PORT=3000
1197
- NODE_ENV=development
1198
1196
  `}function We(){return`PORT=3000
1199
1197
  NODE_ENV=development
1200
- `}function Ge(){return`import { defineConfig } from 'vitest/config'
1198
+ `}function Ge(){return`PORT=3000
1199
+ NODE_ENV=development
1200
+ `}function Ke(){return`import { defineConfig } from 'vitest/config'
1201
1201
  import swc from 'unplugin-swc'
1202
1202
 
1203
1203
  export default defineConfig({
@@ -1208,22 +1208,22 @@ export default defineConfig({
1208
1208
  include: ['src/**/*.test.ts'],
1209
1209
  },
1210
1210
  })
1211
- `}const Ke=p(ee(import.meta.url)),K=JSON.parse(v(m(Ke,`..`,`package.json`),`utf-8`)),qe=`^${K.version}`,Je=[`@forinda/kickjs`,`@forinda/kickjs-cli`,`@forinda/kickjs-schema`,`@forinda/kickjs-vite`,`@forinda/kickjs-swagger`,`@forinda/kickjs-ws`,`@forinda/kickjs-queue`,`@forinda/kickjs-devtools`,`@forinda/kickjs-testing`];async function Ye(){let e=await Promise.all(Je.map(async e=>{try{let t=w(`npm`,[`view`,e,`version`],{encoding:`utf-8`,timeout:5e3,stdio:[`ignore`,`pipe`,`ignore`]}).toString().trim();if(t&&/^\d+\.\d+\.\d+/.test(t))return[e,`^${t}`]}catch{}return[e,qe]}));return Object.fromEntries(e)}function Xe(e,t){try{let n=w(`npm`,[`view`,`${e}@${t}`,`version`],{encoding:`utf-8`,timeout:5e3,stdio:[`ignore`,`pipe`,`ignore`]}).toString().trim();return n&&/^\d+\.\d+\.\d+/.test(n)?n:null}catch{return null}}function q(e){return(e??``).replace(/^[\^~>=<\s]+/,``)}function Ze(e,t){let n=e=>q(e).split(`-`)[0].split(`.`).map(e=>Number.parseInt(e,10)||0),[r=0,i=0,a=0]=n(e),[o=0,s=0,c=0]=n(t);return r===o?i===s?a>=c:i>s:r>o}function Qe(e,t,n){try{let r=w(`npm`,[`view`,`${e}@${t}`,`exports`,`--json`],{encoding:`utf-8`,timeout:5e3,stdio:[`ignore`,`pipe`,`ignore`]}).toString().trim();if(!r)return!1;let i=JSON.parse(r);return Object.prototype.hasOwnProperty.call(i,n)}catch{return!1}}async function $e(t){let{name:n,directory:r,packageManager:i=`pnpm`,template:o=`rest`,defaultRepo:s=`inmemory`,packages:c=[],schemaLib:l=`zod`,runtime:u=`express`}=t,d=r,f=e=>console.log(` ${e}`);console.log(`\n Creating KickJS project: ${n}\n`),f(`Resolving package versions...`);let p=await Ye();if(u!==`express`)if(Qe(`@forinda/kickjs`,`latest`,`./${u}`))f(`Using @forinda/kickjs@latest (stable ships the ${u} runtime)`);else{let e=[`@forinda/kickjs`,`@forinda/kickjs-cli`,`@forinda/kickjs-vite`],t=[],n=!1;for(let r of e){let e=Xe(r,`alpha`);e&&Ze(e,q(p[r]))&&(p[r]=`^${e}`,t.push(`${r}@^${e}`),r===`@forinda/kickjs`&&(n=!0))}f(n?`Using the alpha channel for the ${u} runtime: ${t.join(`, `)}`:`WARNING: could not resolve @forinda/kickjs@alpha the ${u} runtime subpath may be missing. After install, run: ${i} add @forinda/kickjs@alpha`)}await e(m(d,`package.json`),Ie(n,o,p,c,l,u)),await e(m(d,`vite.config.ts`),Le()),await e(m(d,`tsconfig.json`),Re()),await e(m(d,`.prettierrc`),ze()),await e(m(d,`.editorconfig`),Be()),await e(m(d,`.gitignore`),Ve()),await e(m(d,`.gitattributes`),He()),await e(m(d,`.env`),Ue()),await e(m(d,`.env.example`),We()),await e(m(d,`src/config/index.ts`),ge(l)),await e(m(d,`src/index.ts`),me(n,o,K.version,c,u)),await e(m(d,`src/modules/index.ts`),he()),await e(m(d,`src/modules/hello/hello.service.ts`),_e()),await e(m(d,`src/modules/hello/hello.controller.ts`),ve()),await e(m(d,`src/modules/hello/hello.module.ts`),ye()),await e(m(d,`kick.config.ts`),be(o,s,i,u)),await e(m(d,`vitest.config.ts`),Ge()),await e(m(d,`README.md`),a(n,o,i));let{generateAgentDocs:h}=await import(`./agent-docs-BHxKWIf4.mjs`).then(e=>e.t);if(await h({outDir:d,name:n,pm:i,template:o,only:`all`,force:!0}),t.installDeps){console.log(`\n Installing dependencies with ${i}...\n`);try{T(`${i} install`,{cwd:d,stdio:`inherit`}),console.log(`
1212
- Dependencies installed successfully!`)}catch{console.log(`\n Warning: ${i} install failed. Run it manually.`)}}try{let{runTypegen:e}=await import(`./typegen-6pW2cOTw.mjs`).then(e=>e.n);await e({cwd:d,allowDuplicates:!0,silent:!0})}catch{}if(t.initGit)try{T(`git init`,{cwd:d,stdio:`pipe`}),T(`git branch -M main`,{cwd:d,stdio:`pipe`}),T(`git add -A`,{cwd:d,stdio:`pipe`}),T(`git commit -m "chore: initial commit from kick new"`,{cwd:d,stdio:`pipe`}),f(`Git repository initialized`)}catch{f(`Warning: git init failed (git may not be installed)`)}console.log(`
1213
- Project scaffolded successfully!`),console.log();let g=d!==process.cwd();f(`Next steps:`),g&&f(` cd ${n}`),t.installDeps||f(` ${i} install`);let _={rest:`kick g module user`,ddd:`kick g module user --repo drizzle`,cqrs:`kick g module user --pattern cqrs`,minimal:`# add your routes to src/index.ts`};f(` ${_[o]??_.rest}`),f(` kick dev`),f(``),f(`Commands:`),f(` kick dev Start dev server with Vite HMR`),f(` kick build Production build via Vite`),f(` kick start Run production build`),f(``),f(`Generators:`),f(` kick g module <name> Full DDD module (controller, DTOs, use-cases, repo)`),f(` kick g scaffold <n> <f..> CRUD module from field definitions`),f(` kick g controller <name> Standalone controller`),f(` kick g service <name> @Service() class`),f(` kick g middleware <name> Express middleware`),f(` kick g guard <name> Route guard (auth, roles, etc.)`),f(` kick g adapter <name> AppAdapter with lifecycle hooks`),f(` kick g dto <name> Zod DTO schema`),f(` kick g config Generate kick.config.ts`),f(``),f(`Add packages:`),f(` kick add <pkg> Install a KickJS package + peers`),f(` kick add --list Show all available packages`),f(``),f(`Available: auth, swagger, drizzle, prisma, ws, queue, devtools, mcp, testing`),f(``)}function et(e){let t=new Map;return{report(n,r){let i=r instanceof Error?r.message:String(r);t.get(n)!==i&&(t.set(n,i),e(` kick typegen: ${n} pass failed (${i}) — types in .kickjs/types may be stale`))},clear(e){t.delete(e)}}}const tt=`__kickjs_typegen_owner`;function nt(e){let{cwd:t,config:n}=e,r=e.debounceMs??100,i=e.pipeline??{runTypegen:async e=>(await import(`./typegen-6pW2cOTw.mjs`).then(e=>e.n)).runTypegen(e),runAllPluginTypegens:async e=>(await import(`./run-plugins-DujFeVh4.mjs`)).runAllPluginTypegens(e),writeTypegenArtifacts:async(e,t,n)=>(await import(`./typegen-6pW2cOTw.mjs`).then(e=>e.n)).writeTypegenArtifacts(e,t,n),buildAssets:async(e,t)=>(await import(`./build-DH7RVYT6.mjs`).then(e=>e.n)).buildAssets(e,t)},a=n?.typegen?.schemaValidator??`zod`,o=n?.typegen?.envFile,s=f.resolve(t,n?.typegen?.outDir??`.kickjs/types`),c=n?.assetMap?Object.values(n.assetMap).map(e=>e?.src).filter(e=>typeof e==`string`&&e.length>0).map(e=>f.resolve(t,e)):[],l=!!n?.assetMap&&Object.keys(n.assetMap).length>0,u=e=>e.replaceAll(`\\`,`/`),d=c.map(u),p=e=>{let t=u(e);return d.some(e=>t===e||t.startsWith(`${e}/`))},m=et(e.emitWarning),h=null,g=!1,_=new Set,v=new Set,y=!1,b=!1;function x(r,c){i.runTypegen({cwd:t,silent:!0,allowDuplicates:!0,schemaValidator:a,envFile:o,srcDir:n?.typegen?.srcDir,outDir:n?.typegen?.outDir,assetMap:n?.assetMap,changedFiles:r,runPlugins:!1}).then(()=>m.clear(`scan`)).catch(e=>m.report(`scan`,e)),i.runAllPluginTypegens({cwd:t,config:n,silent:!0,changedFiles:r}).then(e=>i.writeTypegenArtifacts(s,e,!0)).then(()=>m.clear(`plugins`)).catch(e=>m.report(`plugins`,e)).finally(()=>e.onPassComplete?.()),c&&n&&i.buildAssets(n,{cwd:t,silent:!0}).catch(()=>{})}function S(){let e=y?void 0:{changed:[..._],removed:[...v]},t=b;_.clear(),v.clear(),y=!1,b=!1,x(e,t)}return{assetSrcRoots:c,handleWatchEvent(e,t){if(!g&&!u(t).includes(`/.kickjs/`)){if(e===`unlinkDir`)y=!0,l&&(b=!0);else{if(t.endsWith(`.d.ts`))return;let n=/\.(ts|tsx|mts|cts)$/.test(t),r=p(t);if(!n&&!r)return;r&&l&&(b=!0),n&&(e===`unlink`?(v.add(t),_.delete(t)):(_.add(t),v.delete(t)))}h&&clearTimeout(h),h=setTimeout(S,r)}},runOnce(){g||x(void 0,l)},dispose(){g=!0,h&&clearTimeout(h),h=null}}}function rt(e){return O(e).replace(/-/g,`_`)}function J(e){let t=e.cwd??process.cwd(),n=e.projectRoot??u(t),r=e.pluralize??!0,i=E(e.name),a=D(e.name),o=O(e.name),s=rt(e.name),c={name:e.name,pascal:i,camel:a,kebab:o,snake:s,modulesDir:e.modulesDir??`src/modules`,cwd:t,projectRoot:n,args:e.args??[],flags:e.flags??{}};if(r){let e=k(o);c.pluralKebab=e,c.pluralPascal=E(e),c.pluralCamel=D(e)}return c}function it(e,t){return g(e.cwd,t)}async function at(e){return import(te(e).href)}const Y=new Map;async function X(e){let t=Y.get(e);if(t)return t;let n=ot(e);return Y.set(e,n),n}async function ot(e){let t=g(e,`package.json`);if(!_(t))return{generators:[],loaded:[],failed:[]};let n=st(JSON.parse(await x(t,`utf-8`))),r=d(g(e,`package.json`)),i=[],a=[],o=[];for(let e of n){let t;try{t=r.resolve(`${e}/package.json`)}catch{continue}let n;try{n=JSON.parse(await x(t,`utf-8`))}catch(t){o.push({source:e,reason:`failed to parse package.json: ${t}`});continue}if(!n.kickjs?.generators)continue;let s=n.kickjs.generators,c=g(p(t),s);if(!_(c)){o.push({source:e,reason:`kickjs.generators points to missing file: ${s}`});continue}let l;try{l=await at(c)}catch(t){o.push({source:e,reason:`failed to import manifest: ${t}`});continue}let u=l.default;if(!Array.isArray(u)){o.push({source:e,reason:`manifest's default export is not an array of GeneratorSpec`});continue}for(let t of u){if(!ct(t)){o.push({source:e,reason:`manifest entry is not a valid GeneratorSpec (missing name/files)`});continue}i.push({source:e,spec:t})}a.push(e)}return{generators:i,loaded:a,failed:o}}function st(e){let t=new Set;for(let n of[e.dependencies,e.devDependencies,e.peerDependencies])if(n)for(let e of Object.keys(n))t.add(e);return Array.from(t)}function ct(e){if(!e||typeof e!=`object`)return!1;let t=e;return typeof t.name==`string`&&typeof t.files==`function`}async function lt(e,t=[]){let n=e.cwd??process.cwd(),r=t.find(t=>t.spec.name===e.generatorName);if(r)return ft(r.spec,r.source,e,n);let i=dt(await X(n),e.generatorName);return i?ft(i.spec,i.source,e,n):null}async function ut(e,t=[]){let n=await X(e),r=new Set(t.map(e=>e.spec.name)),i=n.generators.filter(e=>!r.has(e.spec.name));return{generators:[...t,...i],loaded:n.loaded,failed:n.failed}}function dt(e,t){return e.generators.find(e=>e.spec.name===t)}async function ft(t,n,r,i){let a=J({name:r.itemName,args:r.args,flags:r.flags,modulesDir:r.modulesDir,pluralize:r.pluralize,cwd:i,projectRoot:r.projectRoot}),o=await t.files(a),s=[];for(let t of o){let n=it(a,t.path);await e(n,t.content),s.push(n)}return{files:s,source:n}}const Z={kickjs:{pkg:`@forinda/kickjs`,peers:[`express`],description:`Unified framework: DI, decorators, routing, middleware`,core:!0},vite:{pkg:`@forinda/kickjs-vite`,peers:[`vite`],description:`Vite plugin: dev server, HMR, module discovery`,dev:!0,core:!0},cli:{pkg:`@forinda/kickjs-cli`,peers:[],description:`CLI tool and code generators`,dev:!0,core:!0},zod:{pkg:`zod`,peers:[],description:`Zod schema validation (env, DTOs, OpenAPI) — wrap with fromZod()`},valibot:{pkg:`valibot`,peers:[],description:`Valibot schema validation — wrap with fromValibot()`},yup:{pkg:`yup`,peers:[],description:`Yup schema validation — wrap with fromYup()`},auth:{pkg:`@forinda/kickjs-auth`,peers:[`jsonwebtoken`],description:`JWT, API key, OAuth strategies, @Public, @Roles (+ optional argon2/bcryptjs)`,deprecated:`auth is moving to BYO — compose @LoadAuthUser/@RequireRole/@Public from defineContextDecorator (see the BYO Auth recipe in the docs)`},ai:{pkg:`@forinda/kickjs-ai`,peers:[`zod`],description:`AI toolkit — LLM providers, tool definitions from controllers`},swagger:{pkg:`@forinda/kickjs-swagger`,peers:[],description:`OpenAPI spec + Swagger UI + ReDoc`},db:{pkg:`@forinda/kickjs-db`,peers:[],description:`kick/db core — schema DSL, migrations, KickDbClient, customType`},pg:{pkg:`@forinda/kickjs-db`,peers:[`pg`],description:`kick/db + PostgreSQL driver (use @forinda/kickjs-db/pg)`},sqlite:{pkg:`@forinda/kickjs-db`,peers:[`better-sqlite3`],description:`kick/db + SQLite driver (use @forinda/kickjs-db/sqlite)`},mysql:{pkg:`@forinda/kickjs-db`,peers:[`mysql2`],description:`kick/db + MySQL driver (use @forinda/kickjs-db/mysql)`},drizzle:{pkg:`@forinda/kickjs-drizzle`,peers:[`drizzle-orm`],description:`Drizzle ORM adapter + query builder`,deprecated:"early-adoption adapter, no longer maintained — wire Drizzle directly (BYO), or use @forinda/kickjs-db, the built-in Kick ORM (`kick add db` / pg / sqlite / mysql)"},prisma:{pkg:`@forinda/kickjs-prisma`,peers:[`@prisma/client`],description:`Prisma adapter + query builder`,deprecated:"early-adoption adapter, no longer maintained — wire Prisma directly (BYO), or use @forinda/kickjs-db, the built-in Kick ORM (`kick add db` / pg / sqlite / mysql)"},ws:{pkg:`@forinda/kickjs-ws`,peers:[`ws`],description:`WebSocket with @WsController decorators`},devtools:{pkg:`@forinda/kickjs-devtools`,peers:[],description:`Development dashboard — routes, DI, metrics, health`,dev:!0},queue:{pkg:`@forinda/kickjs-queue`,peers:[],description:`Queue adapter (BullMQ/RabbitMQ/Kafka)`},"queue:bullmq":{pkg:`@forinda/kickjs-queue`,peers:[`bullmq`,`ioredis`],description:`Queue with BullMQ + Redis`},"queue:rabbitmq":{pkg:`@forinda/kickjs-queue`,peers:[`amqplib`],description:`Queue with RabbitMQ`},"queue:kafka":{pkg:`@forinda/kickjs-queue`,peers:[`kafkajs`],description:`Queue with Kafka`},"queue:redis-pubsub":{pkg:`@forinda/kickjs-queue`,peers:[`ioredis`],description:`Lightweight pub/sub via Redis (no persistence)`},mcp:{pkg:`@forinda/kickjs-mcp`,peers:[`@modelcontextprotocol/sdk`],description:`Model Context Protocol server — expose @Controller endpoints as AI tools`},testing:{pkg:`@forinda/kickjs-testing`,peers:[],description:`Test utilities and TestModule builder`,dev:!0}},pt={express:{prod:`multer`,dev:`@types/multer`,note:`Express uploads use multer (memory/disk storage, ctx.file / ctx.files).`},fastify:{prod:`@fastify/multipart`,note:`Fastify uploads use @fastify/multipart (buffered into ctx.file / ctx.files).`},h3:{note:`h3 parses multipart natively (readMultipartFormData) — no driver to install.`}};async function mt(e=process.cwd()){let t=(await c(e))?.runtime;return t===`express`||t===`fastify`||t===`h3`?t:ht(e)}function ht(e=process.cwd()){let t=Q(`package.json`,e);if(t)try{let e=JSON.parse(v(g(t,`package.json`),`utf-8`)),n={...e.dependencies,...e.devDependencies};if(`fastify`in n)return`fastify`;if(`h3`in n)return`h3`}catch{}return`express`}function Q(e,t=process.cwd()){let n=t;for(;;){if(_(g(n,e)))return n;let t=p(n);if(t===n)return null;n=t}}function gt(){return Q(`pnpm-lock.yaml`)?`pnpm`:Q(`yarn.lock`)?`yarn`:Q(`bun.lockb`)||Q(`bun.lock`)?`bun`:Q(`package-lock.json`)?`npm`:null}function _t(){let e=process.cwd();for(;e;){let t=g(e,`package.json`);if(_(t))try{let e=JSON.parse(v(t,`utf-8`)).packageManager;if(typeof e==`string`){let t=e.split(`@`)[0];if(l.includes(t))return t}}catch{}let n=p(e);if(n===e)return null;e=n}return null}async function vt(e){if(e&&l.includes(e))return{pm:e,source:`flag`};let t=await c(process.cwd());if(t?.packageManager&&l.includes(t.packageManager))return{pm:t.packageManager,source:`config`};let n=_t();if(n)return{pm:n,source:`package.json`};let r=gt();return r?{pm:r,source:`lockfile`}:{pm:`npm`,source:`default`}}async function yt(e){let{pm:t}=await vt(e);return t}function bt(e=!1){let t=Object.entries(Z),n=Math.max(...t.map(([e])=>e.length)),r=t.filter(([,e])=>e.core),i=t.filter(([,e])=>!e.core),a=([e,t])=>{let r=e.padEnd(n+2),i=t.peers.length?` (+ ${t.peers.join(`, `)})`:``,a=t.deprecated?` [DEPRECATED — ${t.deprecated}]`:``;return` ${r} ${t.description}${i}${a}`};console.log(`
1211
+ `}const G={kickjs:{pkg:`@forinda/kickjs`,peers:[`express`],description:`Unified framework: DI, decorators, routing, middleware`,core:!0},vite:{pkg:`@forinda/kickjs-vite`,peers:[`vite`],description:`Vite plugin: dev server, HMR, module discovery`,dev:!0,core:!0},cli:{pkg:`@forinda/kickjs-cli`,peers:[],description:`CLI tool and code generators`,dev:!0,core:!0},zod:{pkg:`zod`,peers:[],description:`Zod schema validation (env, DTOs, OpenAPI) — wrap with fromZod()`},valibot:{pkg:`valibot`,peers:[],description:`Valibot schema validation — wrap with fromValibot()`},yup:{pkg:`yup`,peers:[],description:`Yup schema validation — wrap with fromYup()`},auth:{pkg:`@forinda/kickjs-auth`,peers:[`jsonwebtoken`],description:`JWT, API key, OAuth strategies, @Public, @Roles (+ optional argon2/bcryptjs)`,deprecated:`auth is moving to BYO — compose @LoadAuthUser/@RequireRole/@Public from defineContextDecorator (see the BYO Auth recipe in the docs)`},ai:{pkg:`@forinda/kickjs-ai`,peers:[`zod`],description:`AI toolkit — LLM providers, tool definitions from controllers`},swagger:{pkg:`@forinda/kickjs-swagger`,peers:[],description:`OpenAPI spec + Swagger UI + ReDoc`},db:{pkg:`@forinda/kickjs-db`,peers:[],description:`kick/db core — schema DSL, migrations, KickDbClient, customType`},pg:{pkg:`@forinda/kickjs-db`,peers:[`pg`],description:`kick/db + PostgreSQL driver (use @forinda/kickjs-db/pg)`},sqlite:{pkg:`@forinda/kickjs-db`,peers:[`better-sqlite3`],description:`kick/db + SQLite driver (use @forinda/kickjs-db/sqlite)`},mysql:{pkg:`@forinda/kickjs-db`,peers:[`mysql2`],description:`kick/db + MySQL driver (use @forinda/kickjs-db/mysql)`},drizzle:{pkg:`@forinda/kickjs-drizzle`,peers:[`drizzle-orm`],description:`Drizzle ORM adapter + query builder`,deprecated:"early-adoption adapter, no longer maintained — wire Drizzle directly (BYO), or use @forinda/kickjs-db, the built-in Kick ORM (`kick add db` / pg / sqlite / mysql)"},prisma:{pkg:`@forinda/kickjs-prisma`,peers:[`@prisma/client`],description:`Prisma adapter + query builder`,deprecated:"early-adoption adapter, no longer maintained — wire Prisma directly (BYO), or use @forinda/kickjs-db, the built-in Kick ORM (`kick add db` / pg / sqlite / mysql)"},ws:{pkg:`@forinda/kickjs-ws`,peers:[`ws`],description:`WebSocket with @WsController decorators`},devtools:{pkg:`@forinda/kickjs-devtools`,peers:[],description:`Development dashboard routes, DI, metrics, health`,dev:!0},queue:{pkg:`@forinda/kickjs-queue`,peers:[],description:`Queue adapter (BullMQ/RabbitMQ/Kafka)`},"queue:bullmq":{pkg:`@forinda/kickjs-queue`,peers:[`bullmq`,`ioredis`],description:`Queue with BullMQ + Redis`},"queue:rabbitmq":{pkg:`@forinda/kickjs-queue`,peers:[`amqplib`],description:`Queue with RabbitMQ`},"queue:kafka":{pkg:`@forinda/kickjs-queue`,peers:[`kafkajs`],description:`Queue with Kafka`},"queue:redis-pubsub":{pkg:`@forinda/kickjs-queue`,peers:[`ioredis`],description:`Lightweight pub/sub via Redis (no persistence)`},mcp:{pkg:`@forinda/kickjs-mcp`,peers:[`@modelcontextprotocol/sdk`],description:`Model Context Protocol server — expose @Controller endpoints as AI tools`},testing:{pkg:`@forinda/kickjs-testing`,peers:[],description:`Test utilities and TestModule builder`,dev:!0}},qe=Object.entries(G).filter(([e,t])=>!t.core&&!t.deprecated&&!e.includes(`:`)&&![`pg`,`sqlite`,`mysql`,`zod`,`valibot`,`yup`].includes(e)).map(([e])=>e).join(`, `),K={express:{prod:`multer`,dev:`@types/multer`,note:`Express uploads use multer (memory/disk storage, ctx.file / ctx.files).`},fastify:{prod:`@fastify/multipart`,note:`Fastify uploads use @fastify/multipart (buffered into ctx.file / ctx.files).`},h3:{note:`h3 parses multipart natively (readMultipartFormData) no driver to install.`}};async function q(e=process.cwd()){let t=(await c(e))?.runtime;return t===`express`||t===`fastify`||t===`h3`?t:Je(e)}function Je(e=process.cwd()){let t=J(`package.json`,e);if(t)try{let e=JSON.parse(v(g(t,`package.json`),`utf-8`)),n={...e.dependencies,...e.devDependencies};if(`fastify`in n)return`fastify`;if(`h3`in n)return`h3`}catch{}return`express`}function J(e,t=process.cwd()){let n=t;for(;;){if(_(g(n,e)))return n;let t=p(n);if(t===n)return null;n=t}}function Ye(){return J(`pnpm-lock.yaml`)?`pnpm`:J(`yarn.lock`)?`yarn`:J(`bun.lockb`)||J(`bun.lock`)?`bun`:J(`package-lock.json`)?`npm`:null}function Xe(){let e=process.cwd();for(;e;){let t=g(e,`package.json`);if(_(t))try{let e=JSON.parse(v(t,`utf-8`)).packageManager;if(typeof e==`string`){let t=e.split(`@`)[0];if(l.includes(t))return t}}catch{}let n=p(e);if(n===e)return null;e=n}return null}async function Y(e){if(e&&l.includes(e))return{pm:e,source:`flag`};let t=await c(process.cwd());if(t?.packageManager&&l.includes(t.packageManager))return{pm:t.packageManager,source:`config`};let n=Xe();if(n)return{pm:n,source:`package.json`};let r=Ye();return r?{pm:r,source:`lockfile`}:{pm:`npm`,source:`default`}}async function Ze(e){let{pm:t}=await Y(e);return t}function X(e=!1){let t=Object.entries(G),n=Math.max(...t.map(([e])=>e.length)),r=t.filter(([,e])=>e.core),i=t.filter(([,e])=>!e.core),a=([e,t])=>{let r=e.padEnd(n+2),i=t.peers.length?` (+ ${t.peers.join(`, `)})`:``,a=t.deprecated?` [DEPRECATED — ${t.deprecated}]`:``;return` ${r} ${t.description}${i}${a}`};console.log(`
1214
1212
  Core packages (always installed by \`kick new\`):
1215
1213
  `);for(let e of r)console.log(a(e));if(e){console.log(`
1216
1214
  Optional packages (add as needed):
1217
1215
  `);for(let e of i)console.log(a(e))}else console.log(`\n Plus ${i.length} optional packages (auth, swagger, db, queue, …).`),console.log(" Run `kick add --list --all` for the full catalog.");console.log(`
1218
- Usage: kick add ai db swagger`),console.log(` kick add queue:bullmq`),console.log(` kick add upload # installs the multipart driver for your runtime`),console.log()}function xt(e,t,n=`express`){let r=new Set,i=new Set,a=[],o=[],s=[];for(let c of e){if(c===`upload`){let e=pt[n];s.push(`upload (${n}): ${e.note}`),e.prod&&(t?i:r).add(e.prod),e.dev&&i.add(e.dev);continue}let e=Z[c];if(!e){a.push(c);continue}e.deprecated&&o.push(`'${c}' (${e.pkg}) is deprecated — ${e.deprecated}`);let l=t||e.dev?i:r;l.add(e.pkg);for(let t of e.peers)l.add(t)}return{prodDeps:[...r],devDeps:[...i],unknown:a,warnings:o,notices:s}}function St(e){e.command(`list`).alias(`ls`).description(`List KickJS packages (core only; pair with --all for the full catalog)`).option(`--all`,`Include the full optional catalog`).action(e=>{bt(!!e.all)})}function Ct(e){e.command(`add [packages...]`).description(`Add KickJS packages with their required dependencies`).option(`--pm <manager>`,`Package manager override`).option(`-D, --dev`,`Install as dev dependency`).option(`--list`,`List packages (core only by default; pair with --all)`).option(`--all`,`When listing, include the full optional catalog`).action(async(e,t)=>{if(t.list||e.length===0){bt(!!t.all);return}let{pm:n,source:r}=await vt(t.pm);console.log(`\n Using ${n} (resolved from ${r})`);let i=await mt(process.cwd()),{prodDeps:a,devDeps:o,unknown:s,warnings:c,notices:l}=xt(e,!!t.dev,i);for(let e of c)console.warn(`\n WARNING: ${e}`);for(let e of l)console.log(`\n ${e}`);if(!(s.length>0&&(console.log(`\n Unknown packages: ${s.join(`, `)}`),console.log(` Run "kick add --list" to see available packages.
1216
+ Usage: kick add ai db swagger`),console.log(` kick add queue:bullmq`),console.log(` kick add upload # installs the multipart driver for your runtime`),console.log()}function Qe(e,t,n=`express`){let r=new Set,i=new Set,a=[],o=[],s=[];for(let c of e){if(c===`upload`){let e=K[n];s.push(`upload (${n}): ${e.note}`),e.prod&&(t?i:r).add(e.prod),e.dev&&i.add(e.dev);continue}let e=G[c];if(!e){a.push(c);continue}e.deprecated&&o.push(`'${c}' (${e.pkg}) is deprecated — ${e.deprecated}`);let l=t||e.dev?i:r;l.add(e.pkg);for(let t of e.peers)l.add(t)}return{prodDeps:[...r],devDeps:[...i],unknown:a,warnings:o,notices:s}}function $e(e){e.command(`list`).alias(`ls`).description(`List KickJS packages (core only; pair with --all for the full catalog)`).option(`--all`,`Include the full optional catalog`).action(e=>{X(!!e.all)})}function et(e){e.command(`add [packages...]`).description(`Add KickJS packages with their required dependencies`).option(`--pm <manager>`,`Package manager override`).option(`-D, --dev`,`Install as dev dependency`).option(`--list`,`List packages (core only by default; pair with --all)`).option(`--all`,`When listing, include the full optional catalog`).action(async(e,t)=>{if(t.list||e.length===0){X(!!t.all);return}let{pm:n,source:r}=await Y(t.pm);console.log(`\n Using ${n} (resolved from ${r})`);let i=await q(process.cwd()),{prodDeps:a,devDeps:o,unknown:s,warnings:c,notices:l}=Qe(e,!!t.dev,i);for(let e of c)console.warn(`\n WARNING: ${e}`);for(let e of l)console.log(`\n ${e}`);if(!(s.length>0&&(console.log(`\n Unknown packages: ${s.join(`, `)}`),console.log(` Run "kick add --list" to see available packages.
1219
1217
  `),a.length===0&&o.length===0))){if(a.length>0){let e=a,t=`${n} add ${e.join(` `)}`;console.log(`\n Installing ${e.length} dependency(ies):`);for(let t of e)console.log(` + ${t}`);console.log();try{T(t,{stdio:`inherit`})}catch{console.log(`\n Installation failed. Run manually:\n ${t}\n`)}}if(o.length>0){let e=o,t=`${n} add -D ${e.join(` `)}`;console.log(`\n Installing ${e.length} dev dependency(ies):`);for(let t of e)console.log(` + ${t} (dev)`);console.log();try{T(t,{stdio:`inherit`})}catch{console.log(`\n Installation failed. Run manually:\n ${t}\n`)}}console.log(` Done!
1220
- `)}})}function wt(e){return e}function Tt(e){return e}function Et(e){try{return JSON.parse(v(e,`utf-8`))}catch{return null}}function $(e){try{return v(e,`utf-8`)}catch{return null}}function Dt(e){let t=$(m(e,`tsconfig.json`));if(!t)return null;let n=t.replace(/\/\*[\s\S]*?\*\//g,``).replace(/\/\/.*$/gm,``),r;try{r=JSON.parse(n)}catch{return null}if(typeof r?.extends==`string`){let t=Ot(e,r.extends);if(t){let e=Et(t)??{};r.compilerOptions={...e.compilerOptions,...r.compilerOptions}}}return r}function Ot(e,t){if(t.startsWith(`.`)){let n=g(e,t);return _(n)?n:null}let n=m(e,`node_modules`,t);return _(n)?n:null}function kt(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function At(){let e=process.version,t=Number.parseInt(e.replace(/^v/,``).split(`.`)[0],10);return Number.isNaN(t)||t<20?{name:`Node version`,status:`fail`,message:e,fix:`KickJS requires Node 20 or newer.
1221
- Install a supported version via nvm / fnm / volta.`}:{name:`Node version`,status:`pass`,message:e}}function jt(e){if(!e.pkg)return{name:`@forinda/kickjs installed`,status:`warn`,message:`no package.json`};let t={...e.pkg.dependencies,...e.pkg.peerDependencies};return t[`@forinda/kickjs`]?{name:`@forinda/kickjs installed`,status:`pass`,message:t[`@forinda/kickjs`]}:{name:`@forinda/kickjs installed`,status:`fail`,fix:"This directory does not look like a KickJS project — `@forinda/kickjs` is not in your package.json. Run `kick doctor` from the project root, or scaffold a fresh project with `kick new <name>`."}}function Mt(e){if(!e.pkg)return null;let t={...e.pkg.dependencies,...e.pkg.peerDependencies};return t[`@forinda/kickjs`]&&!t.express?{name:`express installed`,status:`fail`,fix:"`@forinda/kickjs` declares `express` as a required peer dependency, but your package.json does not include it. Install: pnpm add express"}:t.express?{name:`express installed`,status:`pass`,message:t.express}:null}const Nt={express:[],fastify:[`fastify`,`@fastify/middie`],h3:[`h3`]};function Pt(e){if(!e.pkg||e.runtime===`express`)return null;let t={...e.pkg.dependencies,...e.pkg.peerDependencies,...e.pkg.devDependencies},n=Nt[e.runtime].filter(e=>!t[e]),r=`runtime engine (${e.runtime})`;return n.length>0?{name:r,status:`fail`,fix:`Resolved runtime '${e.runtime}' is missing engine peer(s): ${n.join(`, `)}.\nInstall: pnpm add ${n.join(` `)}`}:{name:r,status:`pass`}}function Ft(e){if(!e.pkg||!Lt(e.cwd))return null;let t=pt[e.runtime],n=`upload driver (${e.runtime})`;return t.prod?{...e.pkg.dependencies,...e.pkg.peerDependencies,...e.pkg.devDependencies}[t.prod]?{name:n,status:`pass`,message:t.prod}:{name:n,status:`fail`,fix:`This project uses file uploads on the '${e.runtime}' runtime, which needs '${t.prod}'.\nInstall it: kick add upload (or pnpm add ${t.prod})`}:{name:n,status:`pass`,message:`native multipart`}}const It=2e3;function Lt(e){let t=m(e,`src`);if(!_(t))return!1;let n=/@FileUpload\b|\bupload\.(single|array|none)\s*\(/,r=[t],i=0;for(;r.length>0&&i<It;){let e=r.pop(),t;try{t=y(e,{withFileTypes:!0})}catch{continue}for(let a of t){if(i>=It)break;let t=m(e,a.name);if(a.isDirectory()){a.name!==`node_modules`&&r.push(t);continue}if(/\.(ts|tsx|mts|cts)$/.test(a.name)&&(i++,n.test($(t)??``)))return!0}}return!1}function Rt(e){if(!e.pkg)return{name:`reflect-metadata installed`,status:`warn`,message:`no package.json`};let t={...e.pkg.dependencies,...e.pkg.peerDependencies,...e.pkg.devDependencies};return t[`reflect-metadata`]?{name:`reflect-metadata installed`,status:`pass`,message:t[`reflect-metadata`]}:{name:`reflect-metadata installed`,status:`fail`,fix:`KickJS decorators require the reflect-metadata polyfill.
1218
+ `)}})}const tt=p(ee(import.meta.url)),Z=JSON.parse(v(m(tt,`..`,`package.json`),`utf-8`)),nt=`^${Z.version}`,rt=[`@forinda/kickjs`,`@forinda/kickjs-cli`,`@forinda/kickjs-schema`,`@forinda/kickjs-vite`,`@forinda/kickjs-swagger`,`@forinda/kickjs-ws`,`@forinda/kickjs-queue`,`@forinda/kickjs-devtools`,`@forinda/kickjs-testing`];async function it(){let e=await Promise.all(rt.map(async e=>{try{let t=w(`npm`,[`view`,e,`version`],{encoding:`utf-8`,timeout:5e3,stdio:[`ignore`,`pipe`,`ignore`]}).toString().trim();if(t&&/^\d+\.\d+\.\d+/.test(t))return[e,`^${t}`]}catch{}return[e,nt]}));return Object.fromEntries(e)}function at(e,t){try{let n=w(`npm`,[`view`,`${e}@${t}`,`version`],{encoding:`utf-8`,timeout:5e3,stdio:[`ignore`,`pipe`,`ignore`]}).toString().trim();return n&&/^\d+\.\d+\.\d+/.test(n)?n:null}catch{return null}}function Q(e){return(e??``).replace(/^[\^~>=<\s]+/,``)}function ot(e,t){let n=e=>Q(e).split(`-`)[0].split(`.`).map(e=>Number.parseInt(e,10)||0),[r=0,i=0,a=0]=n(e),[o=0,s=0,c=0]=n(t);return r===o?i===s?a>=c:i>s:r>o}function st(e,t,n){try{let r=w(`npm`,[`view`,`${e}@${t}`,`exports`,`--json`],{encoding:`utf-8`,timeout:5e3,stdio:[`ignore`,`pipe`,`ignore`]}).toString().trim();if(!r)return!1;let i=JSON.parse(r);return Object.prototype.hasOwnProperty.call(i,n)}catch{return!1}}async function ct(t){let{name:n,directory:r,packageManager:i=`pnpm`,template:o=`rest`,defaultRepo:s=`inmemory`,packages:c=[],schemaLib:l=`zod`,runtime:u=`express`}=t,d=r,f=e=>console.log(` ${e}`);console.log(`\n Creating KickJS project: ${n}\n`),f(`Resolving package versions...`);let p=await it();if(u!==`express`)if(st(`@forinda/kickjs`,`latest`,`./${u}`))f(`Using @forinda/kickjs@latest (stable ships the ${u} runtime)`);else{let e=[`@forinda/kickjs`,`@forinda/kickjs-cli`,`@forinda/kickjs-vite`],t=[],n=!1;for(let r of e){let e=at(r,`alpha`);e&&ot(e,Q(p[r]))&&(p[r]=`^${e}`,t.push(`${r}@^${e}`),r===`@forinda/kickjs`&&(n=!0))}f(n?`Using the alpha channel for the ${u} runtime: ${t.join(`, `)}`:`WARNING: could not resolve @forinda/kickjs@alpha — the ${u} runtime subpath may be missing. After install, run: ${i} add @forinda/kickjs@alpha`)}await e(m(d,`package.json`),Le(n,o,p,c,l,u)),await e(m(d,`vite.config.ts`),Re()),await e(m(d,`tsconfig.json`),ze()),await e(m(d,`.prettierrc`),Be()),await e(m(d,`.editorconfig`),Ve()),await e(m(d,`.gitignore`),He()),await e(m(d,`.gitattributes`),Ue()),await e(m(d,`.env`),We()),await e(m(d,`.env.example`),Ge()),await e(m(d,`src/config/index.ts`),_e(l)),await e(m(d,`src/index.ts`),he(n,o,Z.version,c,u)),await e(m(d,`src/modules/index.ts`),ge()),await e(m(d,`src/modules/hello/hello.service.ts`),ve()),await e(m(d,`src/modules/hello/hello.controller.ts`),ye()),await e(m(d,`src/modules/hello/hello.module.ts`),be()),await e(m(d,`kick.config.ts`),xe(o,s,i,u)),await e(m(d,`vitest.config.ts`),Ke()),await e(m(d,`README.md`),a(n,o,i));let{generateAgentDocs:h}=await import(`./agent-docs-BnMTYOiD.mjs`).then(e=>e.t);if(await h({outDir:d,name:n,pm:i,template:o,only:`all`,force:!0}),t.installDeps){console.log(`\n Installing dependencies with ${i}...\n`);try{T(`${i} install`,{cwd:d,stdio:`inherit`}),console.log(`
1219
+ Dependencies installed successfully!`)}catch{console.log(`\n Warning: ${i} install failed. Run it manually.`)}}try{let{runTypegen:e}=await import(`./typegen-CuciH349.mjs`).then(e=>e.n);await e({cwd:d,allowDuplicates:!0,silent:!0})}catch{}if(t.initGit)try{T(`git init`,{cwd:d,stdio:`pipe`}),T(`git branch -M main`,{cwd:d,stdio:`pipe`}),T(`git add -A`,{cwd:d,stdio:`pipe`}),T(`git commit -m "chore: initial commit from kick new"`,{cwd:d,stdio:`pipe`}),f(`Git repository initialized`)}catch{f(`Warning: git init failed (git may not be installed)`)}console.log(`
1220
+ Project scaffolded successfully!`),console.log();let g=d!==process.cwd();f(`Next steps:`),g&&f(` cd ${n}`),t.installDeps||f(` ${i} install`);let _={rest:`kick g module user`,ddd:`kick g module user --repo drizzle`,cqrs:`kick g module user --pattern cqrs`,minimal:`# add your routes to src/index.ts`};f(` ${_[o]??_.rest}`),f(` kick dev`),f(``),f(`Commands:`),f(` kick dev Start dev server with Vite HMR`),f(` kick build Production build via Vite`),f(` kick start Run production build`),f(``),f(`Generators:`),f(` kick g module <name> Full DDD module (controller, DTOs, use-cases, repo)`),f(` kick g scaffold <n> <f..> CRUD module from field definitions`),f(` kick g controller <name> Standalone controller`),f(` kick g service <name> @Service() class`),f(` kick g middleware <name> Express middleware`),f(` kick g guard <name> Route guard (auth, roles, etc.)`),f(` kick g adapter <name> AppAdapter with lifecycle hooks`),f(` kick g dto <name> Zod DTO schema`),f(` kick g config Generate kick.config.ts`),f(``),f(`Add packages:`),f(` kick add <pkg> Install a KickJS package + peers`),f(` kick add --list Show all available packages`),f(``),f(`Available: ${qe}`),f(``)}function lt(e){let t=new Map;return{report(n,r){let i=r instanceof Error?r.message:String(r);t.get(n)!==i&&(t.set(n,i),e(` kick typegen: ${n} pass failed (${i}) — types in .kickjs/types may be stale`))},clear(e){t.delete(e)}}}const ut=`__kickjs_typegen_owner`;function dt(e){let{cwd:t,config:n}=e,r=e.debounceMs??100,i=e.pipeline??{runTypegen:async e=>(await import(`./typegen-CuciH349.mjs`).then(e=>e.n)).runTypegen(e),runAllPluginTypegens:async e=>(await import(`./run-plugins-u58MFV45.mjs`)).runAllPluginTypegens(e),writeTypegenArtifacts:async(e,t,n)=>(await import(`./typegen-CuciH349.mjs`).then(e=>e.n)).writeTypegenArtifacts(e,t,n),buildAssets:async(e,t)=>(await import(`./build-DxVQQIQS.mjs`).then(e=>e.n)).buildAssets(e,t)},a=n?.typegen?.schemaValidator??`zod`,o=n?.typegen?.envFile,s=f.resolve(t,n?.typegen?.outDir??`.kickjs/types`),c=n?.assetMap?Object.values(n.assetMap).map(e=>e?.src).filter(e=>typeof e==`string`&&e.length>0).map(e=>f.resolve(t,e)):[],l=!!n?.assetMap&&Object.keys(n.assetMap).length>0,u=e=>e.replaceAll(`\\`,`/`),d=c.map(u),p=e=>{let t=u(e);return d.some(e=>t===e||t.startsWith(`${e}/`))},m=lt(e.emitWarning),h=null,g=!1,_=new Set,v=new Set,y=!1,b=!1;function x(r,c){i.runTypegen({cwd:t,silent:!0,allowDuplicates:!0,schemaValidator:a,envFile:o,srcDir:n?.typegen?.srcDir,outDir:n?.typegen?.outDir,assetMap:n?.assetMap,changedFiles:r,runPlugins:!1}).then(()=>m.clear(`scan`)).catch(e=>m.report(`scan`,e)),i.runAllPluginTypegens({cwd:t,config:n,silent:!0,changedFiles:r}).then(e=>i.writeTypegenArtifacts(s,e,!0)).then(()=>m.clear(`plugins`)).catch(e=>m.report(`plugins`,e)).finally(()=>e.onPassComplete?.()),c&&n&&i.buildAssets(n,{cwd:t,silent:!0}).catch(()=>{})}function S(){let e=y?void 0:{changed:[..._],removed:[...v]},t=b;_.clear(),v.clear(),y=!1,b=!1,x(e,t)}return{assetSrcRoots:c,handleWatchEvent(e,t){if(!g&&!u(t).includes(`/.kickjs/`)){if(e===`unlinkDir`)y=!0,l&&(b=!0);else{if(t.endsWith(`.d.ts`))return;let n=/\.(ts|tsx|mts|cts)$/.test(t),r=p(t);if(!n&&!r)return;r&&l&&(b=!0),n&&(e===`unlink`?(v.add(t),_.delete(t)):(_.add(t),v.delete(t)))}h&&clearTimeout(h),h=setTimeout(S,r)}},runOnce(){g||x(void 0,l)},dispose(){g=!0,h&&clearTimeout(h),h=null}}}function ft(e){return O(e).replace(/-/g,`_`)}function pt(e){let t=e.cwd??process.cwd(),n=e.projectRoot??u(t),r=e.pluralize??!0,i=E(e.name),a=D(e.name),o=O(e.name),s=ft(e.name),c={name:e.name,pascal:i,camel:a,kebab:o,snake:s,modulesDir:e.modulesDir??`src/modules`,cwd:t,projectRoot:n,args:e.args??[],flags:e.flags??{}};if(r){let e=k(o);c.pluralKebab=e,c.pluralPascal=E(e),c.pluralCamel=D(e)}return c}function mt(e,t){return g(e.cwd,t)}async function ht(e){return import(te(e).href)}const gt=new Map;async function _t(e){let t=gt.get(e);if(t)return t;let n=vt(e);return gt.set(e,n),n}async function vt(e){let t=g(e,`package.json`);if(!_(t))return{generators:[],loaded:[],failed:[]};let n=yt(JSON.parse(await x(t,`utf-8`))),r=d(g(e,`package.json`)),i=[],a=[],o=[];for(let e of n){let t;try{t=r.resolve(`${e}/package.json`)}catch{continue}let n;try{n=JSON.parse(await x(t,`utf-8`))}catch(t){o.push({source:e,reason:`failed to parse package.json: ${t}`});continue}if(!n.kickjs?.generators)continue;let s=n.kickjs.generators,c=g(p(t),s);if(!_(c)){o.push({source:e,reason:`kickjs.generators points to missing file: ${s}`});continue}let l;try{l=await ht(c)}catch(t){o.push({source:e,reason:`failed to import manifest: ${t}`});continue}let u=l.default;if(!Array.isArray(u)){o.push({source:e,reason:`manifest's default export is not an array of GeneratorSpec`});continue}for(let t of u){if(!bt(t)){o.push({source:e,reason:`manifest entry is not a valid GeneratorSpec (missing name/files)`});continue}i.push({source:e,spec:t})}a.push(e)}return{generators:i,loaded:a,failed:o}}function yt(e){let t=new Set;for(let n of[e.dependencies,e.devDependencies,e.peerDependencies])if(n)for(let e of Object.keys(n))t.add(e);return Array.from(t)}function bt(e){if(!e||typeof e!=`object`)return!1;let t=e;return typeof t.name==`string`&&typeof t.files==`function`}async function xt(e,t=[]){let n=e.cwd??process.cwd(),r=t.find(t=>t.spec.name===e.generatorName);if(r)return wt(r.spec,r.source,e,n);let i=Ct(await _t(n),e.generatorName);return i?wt(i.spec,i.source,e,n):null}async function St(e,t=[]){let n=await _t(e),r=new Set(t.map(e=>e.spec.name)),i=n.generators.filter(e=>!r.has(e.spec.name));return{generators:[...t,...i],loaded:n.loaded,failed:n.failed}}function Ct(e,t){return e.generators.find(e=>e.spec.name===t)}async function wt(t,n,r,i){let a=pt({name:r.itemName,args:r.args,flags:r.flags,modulesDir:r.modulesDir,pluralize:r.pluralize,cwd:i,projectRoot:r.projectRoot}),o=await t.files(a),s=[];for(let t of o){let n=mt(a,t.path);await e(n,t.content),s.push(n)}return{files:s,source:n}}function Tt(e){return e}function Et(e){return e}function Dt(e){try{return JSON.parse(v(e,`utf-8`))}catch{return null}}function $(e){try{return v(e,`utf-8`)}catch{return null}}function Ot(e){let t=$(m(e,`tsconfig.json`));if(!t)return null;let n=t.replace(/\/\*[\s\S]*?\*\//g,``).replace(/\/\/.*$/gm,``),r;try{r=JSON.parse(n)}catch{return null}if(typeof r?.extends==`string`){let t=kt(e,r.extends);if(t){let e=Dt(t)??{};r.compilerOptions={...e.compilerOptions,...r.compilerOptions}}}return r}function kt(e,t){if(t.startsWith(`.`)){let n=g(e,t);return _(n)?n:null}let n=m(e,`node_modules`,t);return _(n)?n:null}function At(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function jt(){let e=process.version,t=Number.parseInt(e.replace(/^v/,``).split(`.`)[0],10);return Number.isNaN(t)||t<20?{name:`Node version`,status:`fail`,message:e,fix:`KickJS requires Node 20 or newer.
1221
+ Install a supported version via nvm / fnm / volta.`}:{name:`Node version`,status:`pass`,message:e}}function Mt(e){if(!e.pkg)return{name:`@forinda/kickjs installed`,status:`warn`,message:`no package.json`};let t={...e.pkg.dependencies,...e.pkg.peerDependencies};return t[`@forinda/kickjs`]?{name:`@forinda/kickjs installed`,status:`pass`,message:t[`@forinda/kickjs`]}:{name:`@forinda/kickjs installed`,status:`fail`,fix:"This directory does not look like a KickJS project — `@forinda/kickjs` is not in your package.json. Run `kick doctor` from the project root, or scaffold a fresh project with `kick new <name>`."}}function Nt(e){if(!e.pkg)return null;let t={...e.pkg.dependencies,...e.pkg.peerDependencies};return t[`@forinda/kickjs`]&&!t.express?{name:`express installed`,status:`fail`,fix:"`@forinda/kickjs` declares `express` as a required peer dependency, but your package.json does not include it. Install: pnpm add express"}:t.express?{name:`express installed`,status:`pass`,message:t.express}:null}const Pt={express:[],fastify:[`fastify`,`@fastify/middie`],h3:[`h3`]};function Ft(e){if(!e.pkg||e.runtime===`express`)return null;let t={...e.pkg.dependencies,...e.pkg.peerDependencies,...e.pkg.devDependencies},n=Pt[e.runtime].filter(e=>!t[e]),r=`runtime engine (${e.runtime})`;return n.length>0?{name:r,status:`fail`,fix:`Resolved runtime '${e.runtime}' is missing engine peer(s): ${n.join(`, `)}.\nInstall: pnpm add ${n.join(` `)}`}:{name:r,status:`pass`}}function It(e){if(!e.pkg||!Rt(e.cwd))return null;let t=K[e.runtime],n=`upload driver (${e.runtime})`;return t.prod?{...e.pkg.dependencies,...e.pkg.peerDependencies,...e.pkg.devDependencies}[t.prod]?{name:n,status:`pass`,message:t.prod}:{name:n,status:`fail`,fix:`This project uses file uploads on the '${e.runtime}' runtime, which needs '${t.prod}'.\nInstall it: kick add upload (or pnpm add ${t.prod})`}:{name:n,status:`pass`,message:`native multipart`}}const Lt=2e3;function Rt(e){let t=m(e,`src`);if(!_(t))return!1;let n=/@FileUpload\b|\bupload\.(single|array|none)\s*\(/,r=[t],i=0;for(;r.length>0&&i<Lt;){let e=r.pop(),t;try{t=y(e,{withFileTypes:!0})}catch{continue}for(let a of t){if(i>=Lt)break;let t=m(e,a.name);if(a.isDirectory()){a.name!==`node_modules`&&r.push(t);continue}if(/\.(ts|tsx|mts|cts)$/.test(a.name)&&(i++,n.test($(t)??``)))return!0}}return!1}function zt(e){if(!e.pkg)return{name:`reflect-metadata installed`,status:`warn`,message:`no package.json`};let t={...e.pkg.dependencies,...e.pkg.peerDependencies,...e.pkg.devDependencies};return t[`reflect-metadata`]?{name:`reflect-metadata installed`,status:`pass`,message:t[`reflect-metadata`]}:{name:`reflect-metadata installed`,status:`fail`,fix:`KickJS decorators require the reflect-metadata polyfill.
1222
1222
  Install it: pnpm add reflect-metadata
1223
1223
  Then import it at the top of src/index.ts:
1224
1224
 
1225
1225
  import 'reflect-metadata'
1226
- // ... rest of bootstrap`}}function zt(e){if(!e.tsconfig)return[{name:`tsconfig.json present`,status:`fail`,fix:"Create a tsconfig.json with `experimentalDecorators: true` and `emitDecoratorMetadata: true`. `kick new` scaffolds one automatically."}];let t=e.tsconfig.compilerOptions??{},n=[];return n.push(t.experimentalDecorators===!0?{name:`tsconfig: experimentalDecorators`,status:`pass`}:{name:`tsconfig: experimentalDecorators`,status:`fail`,fix:'Add `"experimentalDecorators": true` to compilerOptions in tsconfig.json. Without it, @Service / @Controller / @Get etc. don\'t register any metadata at compile time.'}),n.push(t.emitDecoratorMetadata===!0?{name:`tsconfig: emitDecoratorMetadata`,status:`pass`}:{name:`tsconfig: emitDecoratorMetadata`,status:`fail`,fix:'Add `"emitDecoratorMetadata": true` to compilerOptions in tsconfig.json. The DI container uses this metadata for constructor-parameter injection.'}),n}function Bt(e){let t=[`src/env.ts`,`src/env/index.ts`,`src/config/env.ts`,`src/config/index.ts`].map(t=>m(e.cwd,t)).filter(e=>_(e)).filter(e=>/\bloadEnv\s*\(/.test($(e)??``));if(t.length===0)return null;let n=[`src/index.ts`,`src/main.ts`].map(t=>m(e.cwd,t)).find(e=>_(e));if(!n)return{name:`env wiring`,status:`warn`,message:`env-init file exists but no src/index.ts or src/main.ts found`};let r=$(n)??``,i=p(n),a=[];for(let e of t){let t=h(i,e).replace(/\\/g,`/`).replace(/\.ts$/,``),n=t.startsWith(`.`)?t:`./`+t,r=n.replace(/\/index$/,``);a.push(n,r);let o=e.replace(/\\/g,`/`).match(/\/src\/(.+?)(?:\.ts)?$/);if(o){let e=`@/`+o[1],t=e.replace(/\/index$/,``);a.push(e,t)}}let o=-1;for(let e of new Set(a)){let t=RegExp(`^import\\s+(?:.*?from\\s+)?['"]${kt(e)}['"]`,`m`),n=r.match(t);n&&n.index!==void 0&&(o===-1||n.index<o)&&(o=n.index)}let s=r.search(/\bbootstrap\s*\(/),c=t.map(t=>h(e.cwd,t).replace(/\\/g,`/`)).join(`, `);return o===-1?{name:`env wiring`,status:`fail`,message:c,fix:`An env-init file (${c}) calls \`loadEnv(...)\` but \`${h(e.cwd,n).replace(/\\/g,`/`)}\` doesn't import it.\nWithout this, ConfigService.get('X') returns undefined while @Value('X') works via process.env fallback — a half-broken config you won't notice until something is missing.\n\nFix: add a side-effect import at the top of ${h(e.cwd,n).replace(/\\/g,`/`)} (above bootstrap()), pointing at one of the detected files. For example:\n\n import './env'\n // or\n import './config'\n // or, with the @/ alias:\n import '@/config/env'`}:s!==-1&&o>s?{name:`env wiring`,status:`warn`,message:`env-init imported AFTER bootstrap() — should be before`,fix:`Move the env import above the bootstrap() call so the schema runs before any service reads from ConfigService.`}:{name:`env wiring`,status:`pass`}}function Vt(e,t=Ht){let n=0,r=0,i=[e];for(;i.length>0&&r<t;){let e=i.pop(),a;try{a=y(e,{withFileTypes:!0})}catch{continue}for(let o of a){if(r>=t)break;r++;let a=m(e,o.name);if(o.isDirectory()){i.push(a);continue}try{let e=b(a).mtimeMs;e>n&&(n=e)}catch{}}}return n}const Ht=2e3;function Ut(e){let t=m(e.cwd,`.kickjs`,`types`);if(!_(t))return null;let n=Vt(t);if(n===0)return null;let r=Date.now()-n,i=Math.floor(r/6e4);return i>60?{name:`typegen freshness`,status:`warn`,message:`last updated ${i} minutes ago`,fix:"Re-run `kick typegen` (or `kick dev`, which runs it on every reload) so generated types match the current code."}:{name:`typegen freshness`,status:`pass`,message:i===0?`just now`:`${i}m ago`}}const Wt=[()=>At(),jt,Mt,Pt,Ft,Rt,zt,Bt,Ut];async function Gt(e,t={}){let n={cwd:e,pkg:Et(m(e,`package.json`)),tsconfig:Dt(e),runtime:t.runtime??`express`},r=[...Wt,...t.extraChecks??[]],i=[];for(let e of r){let t;try{t=await e(n)}catch(t){i.push({name:e.name||`doctor check`,status:`fail`,message:t instanceof Error?t.message:String(t)});continue}t!=null&&(Array.isArray(t)?i.push(...t):i.push(t))}return i}function Kt(e){switch(e){case`pass`:return r.green(`✔`);case`warn`:return r.yellow(`⚠`);case`fail`:return r.red(`✖`)}}function qt(e){let t=Kt(e.status),n=e.message?` ${r.dim(`(${e.message})`)}`:``;return`${t} ${e.name}${n}`}function Jt(e){return e.split(`
1226
+ // ... rest of bootstrap`}}function Bt(e){if(!e.tsconfig)return[{name:`tsconfig.json present`,status:`fail`,fix:"Create a tsconfig.json with `experimentalDecorators: true` and `emitDecoratorMetadata: true`. `kick new` scaffolds one automatically."}];let t=e.tsconfig.compilerOptions??{},n=[];return n.push(t.experimentalDecorators===!0?{name:`tsconfig: experimentalDecorators`,status:`pass`}:{name:`tsconfig: experimentalDecorators`,status:`fail`,fix:'Add `"experimentalDecorators": true` to compilerOptions in tsconfig.json. Without it, @Service / @Controller / @Get etc. don\'t register any metadata at compile time.'}),n.push(t.emitDecoratorMetadata===!0?{name:`tsconfig: emitDecoratorMetadata`,status:`pass`}:{name:`tsconfig: emitDecoratorMetadata`,status:`fail`,fix:'Add `"emitDecoratorMetadata": true` to compilerOptions in tsconfig.json. The DI container uses this metadata for constructor-parameter injection.'}),n}function Vt(e){let t=[`src/env.ts`,`src/env/index.ts`,`src/config/env.ts`,`src/config/index.ts`].map(t=>m(e.cwd,t)).filter(e=>_(e)).filter(e=>/\bloadEnv\s*\(/.test($(e)??``));if(t.length===0)return null;let n=[`src/index.ts`,`src/main.ts`].map(t=>m(e.cwd,t)).find(e=>_(e));if(!n)return{name:`env wiring`,status:`warn`,message:`env-init file exists but no src/index.ts or src/main.ts found`};let r=$(n)??``,i=p(n),a=[];for(let e of t){let t=h(i,e).replace(/\\/g,`/`).replace(/\.ts$/,``),n=t.startsWith(`.`)?t:`./`+t,r=n.replace(/\/index$/,``);a.push(n,r);let o=e.replace(/\\/g,`/`).match(/\/src\/(.+?)(?:\.ts)?$/);if(o){let e=`@/`+o[1],t=e.replace(/\/index$/,``);a.push(e,t)}}let o=-1;for(let e of new Set(a)){let t=RegExp(`^import\\s+(?:.*?from\\s+)?['"]${At(e)}['"]`,`m`),n=r.match(t);n&&n.index!==void 0&&(o===-1||n.index<o)&&(o=n.index)}let s=r.search(/\bbootstrap\s*\(/),c=t.map(t=>h(e.cwd,t).replace(/\\/g,`/`)).join(`, `);return o===-1?{name:`env wiring`,status:`fail`,message:c,fix:`An env-init file (${c}) calls \`loadEnv(...)\` but \`${h(e.cwd,n).replace(/\\/g,`/`)}\` doesn't import it.\nWithout this, ConfigService.get('X') returns undefined while @Value('X') works via process.env fallback — a half-broken config you won't notice until something is missing.\n\nFix: add a side-effect import at the top of ${h(e.cwd,n).replace(/\\/g,`/`)} (above bootstrap()), pointing at one of the detected files. For example:\n\n import './env'\n // or\n import './config'\n // or, with the @/ alias:\n import '@/config/env'`}:s!==-1&&o>s?{name:`env wiring`,status:`warn`,message:`env-init imported AFTER bootstrap() — should be before`,fix:`Move the env import above the bootstrap() call so the schema runs before any service reads from ConfigService.`}:{name:`env wiring`,status:`pass`}}function Ht(e,t=Ut){let n=0,r=0,i=[e];for(;i.length>0&&r<t;){let e=i.pop(),a;try{a=y(e,{withFileTypes:!0})}catch{continue}for(let o of a){if(r>=t)break;r++;let a=m(e,o.name);if(o.isDirectory()){i.push(a);continue}try{let e=b(a).mtimeMs;e>n&&(n=e)}catch{}}}return n}const Ut=2e3;function Wt(e){let t=m(e.cwd,`.kickjs`,`types`);if(!_(t))return null;let n=Ht(t);if(n===0)return null;let r=Date.now()-n,i=Math.floor(r/6e4);return i>60?{name:`typegen freshness`,status:`warn`,message:`last updated ${i} minutes ago`,fix:"Re-run `kick typegen` (or `kick dev`, which runs it on every reload) so generated types match the current code."}:{name:`typegen freshness`,status:`pass`,message:i===0?`just now`:`${i}m ago`}}const Gt=[()=>jt(),Mt,Nt,Ft,It,zt,Bt,Vt,Wt];async function Kt(e,t={}){let n={cwd:e,pkg:Dt(m(e,`package.json`)),tsconfig:Ot(e),runtime:t.runtime??`express`},r=[...Gt,...t.extraChecks??[]],i=[];for(let e of r){let t;try{t=await e(n)}catch(t){i.push({name:e.name||`doctor check`,status:`fail`,message:t instanceof Error?t.message:String(t)});continue}t!=null&&(Array.isArray(t)?i.push(...t):i.push(t))}return i}function qt(e){switch(e){case`pass`:return r.green(`✔`);case`warn`:return r.yellow(`⚠`);case`fail`:return r.red(`✖`)}}function Jt(e){let t=qt(e.status),n=e.message?` ${r.dim(`(${e.message})`)}`:``;return`${t} ${e.name}${n}`}function Yt(e){return e.split(`
1227
1227
  `).map(e=>` ${r.dim(`→`)} ${e}`).join(`
1228
- `)}function Yt(e){return e?.doctor?.checks??[]}function Xt(e){e.command(`doctor`).description(`Pre-flight checks for your KickJS project (dev environment health)`).action(async()=>{let e=process.cwd(),a=Yt(await c(e)),o=await mt(e);t(`KickJS Doctor`);let s=await Gt(e,{extraChecks:a,runtime:o});for(let e of s)i.message(qt(e)),e.fix&&e.status!==`pass`&&i.message(Jt(e.fix));let l=s.filter(e=>e.status===`pass`).length,u=s.filter(e=>e.status===`warn`).length,d=s.filter(e=>e.status===`fail`).length,f=[r.green(`${l} passed`),u>0?r.yellow(`${u} warning${u===1?``:`s`}`):`${u} warnings`,d>0?r.red(`${d} error${d===1?``:`s`}`):`${d} errors`].join(`, `);d>0?(n(`${f} — fix the errors above before running the app`),process.exit(1)):n(u>0?`${f} — review the warnings`:r.green(`${f} — your environment looks good`))})}export{P as A,V as C,L as D,R as E,re as F,D as I,O as L,M,A as N,I as O,k as P,E as R,z as S,Ce as T,je as _,Ct as a,W as b,ut as c,ne as d,tt as f,Me as g,Ne as h,Z as i,N as j,F as k,lt as l,$e as m,wt as n,St as o,nt as p,Xt as r,yt as s,Tt as t,J as u,Ae as v,we as w,De as x,ke as y};
1229
- //# sourceMappingURL=doctor-CUR55xM0.mjs.map
1228
+ `)}function Xt(e){return e?.doctor?.checks??[]}function Zt(e){e.command(`doctor`).description(`Pre-flight checks for your KickJS project (dev environment health)`).action(async()=>{let e=process.cwd(),a=Xt(await c(e)),o=await q(e);t(`KickJS Doctor`);let s=await Kt(e,{extraChecks:a,runtime:o});for(let e of s)i.message(Jt(e)),e.fix&&e.status!==`pass`&&i.message(Yt(e.fix));let l=s.filter(e=>e.status===`pass`).length,u=s.filter(e=>e.status===`warn`).length,d=s.filter(e=>e.status===`fail`).length,f=[r.green(`${l} passed`),u>0?r.yellow(`${u} warning${u===1?``:`s`}`):`${u} warnings`,d>0?r.red(`${d} error${d===1?``:`s`}`):`${d} errors`].join(`, `);d>0?(n(`${f} — fix the errors above before running the app`),process.exit(1)):n(u>0?`${f} — review the warnings`:r.green(`${f} — your environment looks good`))})}export{de as A,B as C,I as D,L as E,A as F,D as I,O as L,N as M,j as N,F as O,k as P,E as R,R as S,we as T,Me as _,xt as a,U as b,ut as c,G as d,et as f,Ne as g,Pe as h,St as i,se as j,P as k,dt as l,Ze as m,Tt as n,pt as o,$e as p,Zt as r,ne as s,Et as t,ct as u,je as v,Te as w,Oe as x,Ae as y};
1229
+ //# sourceMappingURL=doctor-D6Vqf-Ws.mjs.map