@forinda/kickjs-cli 6.15.0 → 6.15.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 (40) hide show
  1. package/dist/{agent-docs-RzUq1w3g.mjs → agent-docs-CpVNxPXD.mjs} +2 -2
  2. package/dist/{agent-docs-UjZY8eIH.mjs → agent-docs-DUcdJj9b.mjs} +3 -3
  3. package/dist/{agent-docs-UjZY8eIH.mjs.map → agent-docs-DUcdJj9b.mjs.map} +1 -1
  4. package/dist/{build-BFVauqjB.mjs → build-CQl0YJbD.mjs} +3 -3
  5. package/dist/{build-BFVauqjB.mjs.map → build-CQl0YJbD.mjs.map} +1 -1
  6. package/dist/{build-D5YferX_.mjs → build-DfxdnjMV.mjs} +2 -2
  7. package/dist/{builtins-DmHWitfb.mjs → builtins-DXVb_-6f.mjs} +2 -2
  8. package/dist/{builtins-BcVTwsM2.mjs → builtins-TOygGCrz.mjs} +6 -6
  9. package/dist/cli.mjs +2 -2
  10. package/dist/{config-BR-SjJdX.mjs → config-CKBLLO-j.mjs} +3 -3
  11. package/dist/{config-BR-SjJdX.mjs.map → config-CKBLLO-j.mjs.map} +1 -1
  12. package/dist/{config-CHhcvsYA.mjs → config-Ot0ZhGQi.mjs} +2 -2
  13. package/dist/{doctor-SbR1xW8I.mjs → doctor-CHB6rl5Q.mjs} +4 -4
  14. package/dist/{doctor-SbR1xW8I.mjs.map → doctor-CHB6rl5Q.mjs.map} +1 -1
  15. package/dist/{fullstack-C9MW0tvI.mjs → fullstack-CS9vKXOa.mjs} +3 -3
  16. package/dist/{fullstack-dCjwUVC7.mjs → fullstack-D1YuNkEe.mjs} +4 -4
  17. package/dist/{fullstack-dCjwUVC7.mjs.map → fullstack-D1YuNkEe.mjs.map} +1 -1
  18. package/dist/index.mjs +2 -2
  19. package/dist/{plugin-DTQnluc3.mjs → plugin-CmoOrd3O.mjs} +3 -3
  20. package/dist/{plugin-DTQnluc3.mjs.map → plugin-CmoOrd3O.mjs.map} +1 -1
  21. package/dist/{plugin-BsRrj_kY.mjs → plugin-Y-IVgvlu.mjs} +2 -2
  22. package/dist/{project-GekbCLn_.mjs → project-CKN4-nV4.mjs} +4 -4
  23. package/dist/{project-docs-DT-rkK_c.mjs → project-docs-m3jPVPAH.mjs} +1 -1
  24. package/dist/{project-docs-CwjrMj8x.mjs → project-docs-rYxsjZzT.mjs} +2 -2
  25. package/dist/{project-docs-CwjrMj8x.mjs.map → project-docs-rYxsjZzT.mjs.map} +1 -1
  26. package/dist/{project-CcOnvi2Z.mjs → project-mSo3W3zE.mjs} +5 -5
  27. package/dist/{project-CcOnvi2Z.mjs.map → project-mSo3W3zE.mjs.map} +1 -1
  28. package/dist/{project-root-D_srTNIh.mjs → project-root-Aq5DOz-j.mjs} +3 -3
  29. package/dist/{project-root-D_srTNIh.mjs.map → project-root-Aq5DOz-j.mjs.map} +1 -1
  30. package/dist/{project-root-Cl_W-7A_.mjs → project-root-CAM62woQ.mjs} +2 -2
  31. package/dist/{prompts-B7kUC0iX.mjs → prompts-CQQjtoKB.mjs} +2 -2
  32. package/dist/{prompts-B7kUC0iX.mjs.map → prompts-CQQjtoKB.mjs.map} +1 -1
  33. package/dist/{rolldown-runtime-DJDWk3oJ.mjs → rolldown-runtime-Pz0cqJu0.mjs} +1 -1
  34. package/dist/{run-plugins-BQPBSfB7.mjs → run-plugins-DBnVyuyi.mjs} +6 -6
  35. package/dist/{run-plugins-BQPBSfB7.mjs.map → run-plugins-DBnVyuyi.mjs.map} +1 -1
  36. package/dist/{typegen-D0790Kwg.mjs → typegen-DpENVFpt.mjs} +4 -4
  37. package/dist/{typegen-oYhFwjVU.mjs → typegen-lmpEgt9z.mjs} +5 -5
  38. package/dist/{typegen-oYhFwjVU.mjs.map → typegen-lmpEgt9z.mjs.map} +1 -1
  39. package/dist/{types-B2U2Sfj5.mjs → types-BQOKyLP8.mjs} +1 -1
  40. package/package.json +3 -3
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @forinda/kickjs-cli v6.15.0
2
+ * @forinda/kickjs-cli v6.15.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{c as e,l as t,s as n}from"./project-docs-CwjrMj8x.mjs";import{a as r,c as i,d as a,i as o,l as s,n as c,o as l,r as u,s as d,t as f,u as p}from"./prompts-B7kUC0iX.mjs";import{A as m,C as h,D as g,E as _,F as v,M as y,N as b,O as ee,P as x,S,T as te,_ as ne,a as C,b as re,c as ie,f as ae,g as oe,h as se,i as ce,j as w,k as le,l as ue,m as de,p as fe,r as pe,u as me,v as he,w as ge,x as _e,y as ve}from"./doctor-SbR1xW8I.mjs";import{a as ye,c as be,o as xe,r as Se,t as Ce,u as we}from"./project-CcOnvi2Z.mjs";import{a as T,i as E,o as Te,s as Ee}from"./config-BR-SjJdX.mjs";import{t as De}from"./project-root-D_srTNIh.mjs";import{n as D}from"./types-B2U2Sfj5.mjs";import{t as Oe}from"./build-BFVauqjB.mjs";import{n as ke}from"./agent-docs-UjZY8eIH.mjs";import{n as Ae}from"./plugin-DTQnluc3.mjs";import{a as je,c as Me,d as Ne,f as Pe,g as Fe,h as Ie,i as Le,l as Re,m as ze,o as Be,p as Ve,r as He,s as Ue,t as O,u as We}from"./typegen-oYhFwjVU.mjs";import{createRequire as Ge}from"node:module";import k,{basename as A,dirname as j,join as M,relative as N,resolve as P,sep as Ke}from"node:path";import{cpSync as qe,existsSync as F,mkdirSync as Je,readFileSync as I,readdirSync as Ye,rmSync as Xe,writeFileSync as Ze}from"node:fs";import{copyFile as Qe,mkdir as $e,readFile as L,readdir as et,rm as tt,stat as nt,writeFile as R}from"node:fs/promises";import{fork as rt,spawn as it}from"node:child_process";import{fileURLToPath as at,pathToFileURL as z}from"node:url";import{arch as ot,platform as st,release as ct}from"node:os";const lt=[{value:`swagger`,label:`Swagger`,hint:`OpenAPI docs`},{value:`ws`,label:`WebSocket`,hint:`rooms, heartbeat`},{value:`queue`,label:`Queue`,hint:`BullMQ/RabbitMQ/Kafka`},{value:`devtools`,label:`DevTools`,hint:`debug dashboard`}];function ut(e){e.command(`new [name]`).alias(`init`).description(`Create a new KickJS project (use "." for current directory)`).option(`-d, --directory <dir>`,`Target directory (defaults to project name)`).option(`--pm <manager>`,`Package manager: pnpm | npm | yarn | bun`).option(`--git`,`Initialize git repository`).option(`--no-git`,`Skip git initialization`).option(`--install`,`Install dependencies after scaffolding`).option(`--no-install`,`Skip dependency installation`).option(`-f, --force`,`Remove existing files without prompting`).option(`-t, --template <type>`,`Project template: rest | minimal | fullstack`).option(`--runtime <engine>`,`HTTP runtime: express | fastify | h3`).option(`-r, --repo <type>`,`Repository name (inmemory, or any DB name e.g. postgres)`).option(`-s, --schema <lib>`,`Schema library for env / DTOs: zod | valibot | yup (default: zod)`).option(`--packages <packages>`,`Comma-separated packages to include (e.g. auth,swagger,ws,queue)`).option(`-y, --yes`,`Pick safe defaults for every prompt (template=minimal, repo=inmemory, no extras, git+install on)`).option(`--non-interactive`,`alias for --yes`).action(async(e,t)=>{c(`KickJS — Create a new project`);let n=!!(t.yes||t.nonInteractive);e||=n?`my-api`:await i({message:`Project name`,placeholder:`my-api`,defaultValue:`my-api`});let a;if(e===`.`?(a=P(`.`),e=A(a)):a=P(t.directory||e),F(a)){let i=Ye(a);if(i.length>0){if(t.force)u.warn(`Clearing existing files in ${a}`);else if(n){u.warn(`Directory "${e}" is not empty. Pass --force to clear it.`),r(`Aborted.`);return}else{u.warn(`Directory "${e}" is not empty:`);let t=i.slice(0,5);for(let e of t)u.message(` - ${e}`);if(i.length>5&&u.message(` ... and ${i.length-5} more`),!await f({message:p.red(`Remove all existing files and proceed?`),initialValue:!1})){r(`Aborted.`);return}}for(let e of i)Xe(P(a,e),{recursive:!0,force:!0})}}let s=t.template;s||=n?`minimal`:await l({message:`Project template`,options:[{value:`rest`,label:`REST API`,hint:`Express + Swagger`},{value:`minimal`,label:`Minimal`,hint:`bare Express`},{value:`fullstack`,label:`Fullstack`,hint:`server + Vite React web, typed client`}]});let d=t.runtime;d||=n?`express`:await l({message:`HTTP runtime`,options:[{value:`express`,label:`Express`,hint:`default, zero-config`},{value:`fastify`,label:`Fastify`,hint:`fastify + @fastify/middie`},{value:`h3`,label:`h3`,hint:`Nitro / Nuxt engine`}]});let m=t.pm;m||=n?await be(void 0):await l({message:`Package manager`,options:[{value:`pnpm`,label:`pnpm`},{value:`npm`,label:`npm`},{value:`yarn`,label:`yarn`},{value:`bun`,label:`bun`}]});let h=t.repo;h||=n?`inmemory`:await i({message:`Repository name`,placeholder:`inmemory (or a DB name, e.g. postgres)`,defaultValue:`inmemory`}),Ee(h);let g=t.schema;g||=n?`zod`:await l({message:`Schema library (env + DTO validation)`,options:[{value:`zod`,label:`Zod`,hint:`default — broad ecosystem`},{value:`valibot`,label:`Valibot`,hint:`smaller bundle`},{value:`yup`,label:`Yup`,hint:`classic API`}]}),[`zod`,`valibot`,`yup`].includes(g)||(u.warn(`Unknown --schema "${g}", falling back to zod.`),g=`zod`);let _;if(t.packages!==void 0){let e=t.packages.trim().toLowerCase();_=e===``||e===`none`||e===`false`?[]:t.packages.split(`,`).map(e=>e.trim()).filter(Boolean)}else _=n?[]:await o({message:`Select packages to include`,options:[...lt],required:!1});let v;v=t.git===void 0?n?!0:await f({message:`Initialize git repository?`,initialValue:!0}):t.git;let y;if(y=t.install===void 0?n?!0:await f({message:`Install dependencies?`,initialValue:!0}):t.install,s===`fullstack`){let{initFullstackProject:t}=await import(`./fullstack-dCjwUVC7.mjs`);await t({name:e,directory:a,packageManager:m,initGit:v,installDeps:y,schemaLib:g,runtime:d}),r(`Done! Next steps: ${p.cyan(`cd ${e} && ${m}${m===`pnpm`?` dev`:` run dev:server`}`)}`);return}await Ce({name:e,directory:a,packageManager:m,initGit:v,installDeps:y,template:s,defaultRepo:h,packages:_,schemaLib:g,runtime:d}),r(`Done! Next steps: ${p.cyan(`cd ${e} && ${m} dev`)}`)})}async function dt(e){let{name:n,outDir:r}=e,i=x(n),a=v(n),o=[],s=M(r,`${i}.plugin.ts`);return await t(s,`import {
11
+ import{c as e,l as t,s as n}from"./project-docs-rYxsjZzT.mjs";import{a as r,c as i,d as a,i as o,l as s,n as c,o as l,r as u,s as d,t as f,u as p}from"./prompts-CQQjtoKB.mjs";import{A as m,C as h,D as g,E as _,F as v,M as y,N as b,O as ee,P as x,S,T as te,_ as ne,a as C,b as re,c as ie,f as ae,g as oe,h as se,i as ce,j as w,k as le,l as ue,m as de,p as fe,r as pe,u as me,v as he,w as ge,x as _e,y as ve}from"./doctor-CHB6rl5Q.mjs";import{a as ye,c as be,o as xe,r as Se,t as Ce,u as we}from"./project-mSo3W3zE.mjs";import{a as T,i as E,o as Te,s as Ee}from"./config-CKBLLO-j.mjs";import{t as De}from"./project-root-Aq5DOz-j.mjs";import{n as D}from"./types-BQOKyLP8.mjs";import{t as Oe}from"./build-CQl0YJbD.mjs";import{n as ke}from"./agent-docs-DUcdJj9b.mjs";import{n as Ae}from"./plugin-CmoOrd3O.mjs";import{a as je,c as Me,d as Ne,f as Pe,g as Fe,h as Ie,i as Le,l as Re,m as ze,o as Be,p as Ve,r as He,s as Ue,t as O,u as We}from"./typegen-lmpEgt9z.mjs";import{createRequire as Ge}from"node:module";import k,{basename as A,dirname as j,join as M,relative as N,resolve as P,sep as Ke}from"node:path";import{cpSync as qe,existsSync as F,mkdirSync as Je,readFileSync as I,readdirSync as Ye,rmSync as Xe,writeFileSync as Ze}from"node:fs";import{copyFile as Qe,mkdir as $e,readFile as L,readdir as et,rm as tt,stat as nt,writeFile as R}from"node:fs/promises";import{fork as rt,spawn as it}from"node:child_process";import{fileURLToPath as at,pathToFileURL as z}from"node:url";import{arch as ot,platform as st,release as ct}from"node:os";const lt=[{value:`swagger`,label:`Swagger`,hint:`OpenAPI docs`},{value:`ws`,label:`WebSocket`,hint:`rooms, heartbeat`},{value:`queue`,label:`Queue`,hint:`BullMQ/RabbitMQ/Kafka`},{value:`devtools`,label:`DevTools`,hint:`debug dashboard`}];function ut(e){e.command(`new [name]`).alias(`init`).description(`Create a new KickJS project (use "." for current directory)`).option(`-d, --directory <dir>`,`Target directory (defaults to project name)`).option(`--pm <manager>`,`Package manager: pnpm | npm | yarn | bun`).option(`--git`,`Initialize git repository`).option(`--no-git`,`Skip git initialization`).option(`--install`,`Install dependencies after scaffolding`).option(`--no-install`,`Skip dependency installation`).option(`-f, --force`,`Remove existing files without prompting`).option(`-t, --template <type>`,`Project template: rest | minimal | fullstack`).option(`--runtime <engine>`,`HTTP runtime: express | fastify | h3`).option(`-r, --repo <type>`,`Repository name (inmemory, or any DB name e.g. postgres)`).option(`-s, --schema <lib>`,`Schema library for env / DTOs: zod | valibot | yup (default: zod)`).option(`--packages <packages>`,`Comma-separated packages to include (e.g. auth,swagger,ws,queue)`).option(`-y, --yes`,`Pick safe defaults for every prompt (template=minimal, repo=inmemory, no extras, git+install on)`).option(`--non-interactive`,`alias for --yes`).action(async(e,t)=>{c(`KickJS — Create a new project`);let n=!!(t.yes||t.nonInteractive);e||=n?`my-api`:await i({message:`Project name`,placeholder:`my-api`,defaultValue:`my-api`});let a;if(e===`.`?(a=P(`.`),e=A(a)):a=P(t.directory||e),F(a)){let i=Ye(a);if(i.length>0){if(t.force)u.warn(`Clearing existing files in ${a}`);else if(n){u.warn(`Directory "${e}" is not empty. Pass --force to clear it.`),r(`Aborted.`);return}else{u.warn(`Directory "${e}" is not empty:`);let t=i.slice(0,5);for(let e of t)u.message(` - ${e}`);if(i.length>5&&u.message(` ... and ${i.length-5} more`),!await f({message:p.red(`Remove all existing files and proceed?`),initialValue:!1})){r(`Aborted.`);return}}for(let e of i)Xe(P(a,e),{recursive:!0,force:!0})}}let s=t.template;s||=n?`minimal`:await l({message:`Project template`,options:[{value:`rest`,label:`REST API`,hint:`Express + Swagger`},{value:`minimal`,label:`Minimal`,hint:`bare Express`},{value:`fullstack`,label:`Fullstack`,hint:`server + Vite React web, typed client`}]});let d=t.runtime;d||=n?`express`:await l({message:`HTTP runtime`,options:[{value:`express`,label:`Express`,hint:`default, zero-config`},{value:`fastify`,label:`Fastify`,hint:`fastify + @fastify/middie`},{value:`h3`,label:`h3`,hint:`Nitro / Nuxt engine`}]});let m=t.pm;m||=n?await be(void 0):await l({message:`Package manager`,options:[{value:`pnpm`,label:`pnpm`},{value:`npm`,label:`npm`},{value:`yarn`,label:`yarn`},{value:`bun`,label:`bun`}]});let h=t.repo;h||=n?`inmemory`:await i({message:`Repository name`,placeholder:`inmemory (or a DB name, e.g. postgres)`,defaultValue:`inmemory`}),Ee(h);let g=t.schema;g||=n?`zod`:await l({message:`Schema library (env + DTO validation)`,options:[{value:`zod`,label:`Zod`,hint:`default — broad ecosystem`},{value:`valibot`,label:`Valibot`,hint:`smaller bundle`},{value:`yup`,label:`Yup`,hint:`classic API`}]}),[`zod`,`valibot`,`yup`].includes(g)||(u.warn(`Unknown --schema "${g}", falling back to zod.`),g=`zod`);let _;if(t.packages!==void 0){let e=t.packages.trim().toLowerCase();_=e===``||e===`none`||e===`false`?[]:t.packages.split(`,`).map(e=>e.trim()).filter(Boolean)}else _=n?[]:await o({message:`Select packages to include`,options:[...lt],required:!1});let v;v=t.git===void 0?n?!0:await f({message:`Initialize git repository?`,initialValue:!0}):t.git;let y;if(y=t.install===void 0?n?!0:await f({message:`Install dependencies?`,initialValue:!0}):t.install,s===`fullstack`){let{initFullstackProject:t}=await import(`./fullstack-D1YuNkEe.mjs`);await t({name:e,directory:a,packageManager:m,initGit:v,installDeps:y,schemaLib:g,runtime:d}),r(`Done! Next steps: ${p.cyan(`cd ${e} && ${m}${m===`pnpm`?` dev`:` run dev:server`}`)}`);return}await Ce({name:e,directory:a,packageManager:m,initGit:v,installDeps:y,template:s,defaultRepo:h,packages:_,schemaLib:g,runtime:d}),r(`Done! Next steps: ${p.cyan(`cd ${e} && ${m} dev`)}`)})}async function dt(e){let{name:n,outDir:r}=e,i=x(n),a=v(n),o=[],s=M(r,`${i}.plugin.ts`);return await t(s,`import {
12
12
  definePlugin,
13
13
  type AppAdapter,
14
14
  type AppModuleEntry,
@@ -597,7 +597,7 @@ server.on('exit', () => {
597
597
  Cancelled.
598
598
  `);return}await tt(l,{recursive:!0,force:!0}),console.log(` Deleted: ${l}`);let u=M(r,`index.ts`);if(await n(u)){let e=await L(u,`utf-8`),t=e,n=RegExp(`^import\\s*\\{\\s*${m(s)}Module\\s*\\}\\s*from\\s*['"][^'"]*${m(c)}(?:/[^'"]*)?['"].*\\n?`,`gm`);e=e.replace(n,``),e=zn(e,s),e=e.replace(/\n{3,}/g,`
599
599
 
600
- `),e!==t&&(await R(u,e,`utf-8`),console.log(` Unregistered: ${s}Module from ${u}`))}console.log(`\n Module '${c}' removed.\n`)}function Vn(e){e.command(`remove`).alias(`rm`).description(`Remove generated code`).command(`module <names...>`).description(`Remove one or more modules (e.g. kick rm module user task)`).option(`--modules-dir <dir>`,`Modules directory`).option(`--no-pluralize`,`Use singular module name`).option(`-f, --force`,`Skip confirmation prompt`).action(async(e,t)=>{let n=T(await E(process.cwd())),r=t.modulesDir??n.dir??`src/modules`,i=t.pluralize===!1?!1:n.pluralize??!0;for(let n of e)await Bn({name:n,modulesDir:P(r),force:t.force,pluralize:i})})}function Hn(e){if(e!==void 0){if(e===`false`||e===`off`||e===`none`)return!1;if(e===`zod`)return`zod`;if(e===`kickjs-schema`||e===`schema`)return`kickjs-schema`;console.warn(` kick typegen: unknown --schema-validator '${e}' (supported: 'zod', 'kickjs-schema', 'false'). Falling back to project config.`)}}function Un(e){if(e!==void 0)return e===`false`||e===`off`||e===`none`?!1:e}function Wn(e){e.command(`typegen`).description(`Generate type-safe DI registry and module types into .kickjs/types/`).option(`-w, --watch`,`Watch source files and regenerate on change`).option(`-s, --src <dir>`,`Source directory to scan`,`src`).option(`-o, --out <dir>`,`Output directory`,`.kickjs/types`).option(`--silent`,`Suppress output`).option(`--allow-duplicates`,`Auto-namespace duplicate class names instead of failing (use with caution)`).option(`--schema-validator <name>`,`Schema validator for body/query/params typing (currently 'zod' or 'false')`).option(`--env-file <path>`,`Path to env schema file for KickEnv typing (default 'src/env.ts'; pass 'false' to disable)`).option(`--check`,`CI gate: exit non-zero if any generated file in .kickjs/types/ is out of date (routes, env, db, assets, adopter plugins) instead of writing it`).option(`--fix`,`Patch module import.meta.glob() calls to cover decorated classes that aren't loaded by any glob (orphans)`).option(`--list`,"List every registered typegen plugin id (use to populate `typegen.disable`)").option(`--no-cache`,`Disable the persistent scan cache; re-read + re-extract every file from cold`).action(async e=>{let t=De(process.cwd()),n=await E(t);if(e.list){let{mergeCliPlugins:e}=await import(`./plugin-DTQnluc3.mjs`).then(e=>e.t),{builtinCliPlugins:t}=await import(`./builtins-DmHWitfb.mjs`),r=e([...t,...n?.plugins??[]],n?.commands??[]),i=new Set(n?.typegen?.disable??[]);if(r.typegens.length===0){console.log(` No typegen plugins registered.`);return}let a=Math.max(...r.typegens.map(e=>e.id.length));console.log(`
600
+ `),e!==t&&(await R(u,e,`utf-8`),console.log(` Unregistered: ${s}Module from ${u}`))}console.log(`\n Module '${c}' removed.\n`)}function Vn(e){e.command(`remove`).alias(`rm`).description(`Remove generated code`).command(`module <names...>`).description(`Remove one or more modules (e.g. kick rm module user task)`).option(`--modules-dir <dir>`,`Modules directory`).option(`--no-pluralize`,`Use singular module name`).option(`-f, --force`,`Skip confirmation prompt`).action(async(e,t)=>{let n=T(await E(process.cwd())),r=t.modulesDir??n.dir??`src/modules`,i=t.pluralize===!1?!1:n.pluralize??!0;for(let n of e)await Bn({name:n,modulesDir:P(r),force:t.force,pluralize:i})})}function Hn(e){if(e!==void 0){if(e===`false`||e===`off`||e===`none`)return!1;if(e===`zod`)return`zod`;if(e===`kickjs-schema`||e===`schema`)return`kickjs-schema`;console.warn(` kick typegen: unknown --schema-validator '${e}' (supported: 'zod', 'kickjs-schema', 'false'). Falling back to project config.`)}}function Un(e){if(e!==void 0)return e===`false`||e===`off`||e===`none`?!1:e}function Wn(e){e.command(`typegen`).description(`Generate type-safe DI registry and module types into .kickjs/types/`).option(`-w, --watch`,`Watch source files and regenerate on change`).option(`-s, --src <dir>`,`Source directory to scan`,`src`).option(`-o, --out <dir>`,`Output directory`,`.kickjs/types`).option(`--silent`,`Suppress output`).option(`--allow-duplicates`,`Auto-namespace duplicate class names instead of failing (use with caution)`).option(`--schema-validator <name>`,`Schema validator for body/query/params typing (currently 'zod' or 'false')`).option(`--env-file <path>`,`Path to env schema file for KickEnv typing (default 'src/env.ts'; pass 'false' to disable)`).option(`--check`,`CI gate: exit non-zero if any generated file in .kickjs/types/ is out of date (routes, env, db, assets, adopter plugins) instead of writing it`).option(`--fix`,`Patch module import.meta.glob() calls to cover decorated classes that aren't loaded by any glob (orphans)`).option(`--list`,"List every registered typegen plugin id (use to populate `typegen.disable`)").option(`--no-cache`,`Disable the persistent scan cache; re-read + re-extract every file from cold`).action(async e=>{let t=De(process.cwd()),n=await E(t);if(e.list){let{mergeCliPlugins:e}=await import(`./plugin-CmoOrd3O.mjs`).then(e=>e.t),{builtinCliPlugins:t}=await import(`./builtins-DXVb_-6f.mjs`),r=e([...t,...n?.plugins??[]],n?.commands??[]),i=new Set(n?.typegen?.disable??[]);if(r.typegens.length===0){console.log(` No typegen plugins registered.`);return}let a=Math.max(...r.typegens.map(e=>e.id.length));console.log(`
601
601
  Registered typegen plugins:
602
602
  `);for(let e of r.typegens){let t=i.has(e.id)?` (disabled)`:``;console.log(` ${e.id.padEnd(a+2)}inputs: ${e.inputs.join(`, `)||`(none)`}${t}`)}console.log();return}let r=Hn(e.schemaValidator)??n?.typegen?.schemaValidator??`zod`,i=Un(e.envFile)??n?.typegen?.envFile,a={cwd:t,srcDir:e.src??n?.typegen?.srcDir,outDir:e.out??n?.typegen?.outDir,silent:e.silent,fix:e.fix,allowDuplicates:e.allowDuplicates,noCache:e.cache===!1,schemaValidator:r,envFile:i,assetMap:n?.assetMap,runPlugins:!1};try{if(e.watch){let t=await He(a);e.silent||console.log(` kick typegen: watching for changes (Ctrl-C to exit)`);let n=()=>{t(),process.exit(0)};process.on(`SIGINT`,n),process.on(`SIGTERM`,n),await new Promise(()=>{})}else{await O(a);let r=await Kt({cwd:t,config:n??null,silent:e.silent,check:e.check});e.check&&r.some(e=>e.status===`written`)&&process.exit(1),e.check||await Le(P(t,e.out??n?.typegen?.outDir??`.kickjs/types`),r,e.silent??!1)}}catch(e){e instanceof Ue?console.error(`
603
603
  `+e.message+`
@@ -657,9 +657,9 @@ ${g}
657
657
  `)+`
658
658
  `}function pr(e,t,n){if(e===null)return`unknown`;let r=j(n);if(e===``){let e=N(r,t).split(Ke).join(`/`);return e=e.replace(/\.(ts|tsx|mts|cts)$/i,``),e.startsWith(`.`)||(e=`./`+e),e}if(!e.startsWith(`.`)&&!e.startsWith(`/`))return e;let i=N(r,P(j(t),e)).split(Ke).join(`/`);return i=i.replace(/\.(ts|tsx|mts|cts)$/i,``),i.startsWith(`.`)||(i=`./`+i),i}function mr(e){let t=e.endsWith(`Controller`)?e.slice(0,-10):e,n=t.length>0?t:e;return n.charAt(0).toLowerCase()+n.slice(1)}const hr=()=>({id:`kick/routes`,outExtension:`.ts`,inputs:[`src/**/*.controller.ts`,`src/**/*.module.ts`],async generate(e){let t=await e.getScanResult({root:gr(e),cwd:e.cwd,envFile:_r(e)}),n=e.config?.typegen?.schemaValidator??`zod`,r=k.resolve(e.cwd,`.kickjs/types/kick__routes.ts`);return sr(t.routes,r,n,{onWarn:t=>e.log.warn(t)})}});function gr(e){return k.resolve(e.cwd,e.config?.typegen?.srcDir??`src`)}function _r(e){let t=e.config?.typegen?.envFile;if(t!==!1)return t}const Q=`@typescript/typescript6`;function vr(e){return typeof e?.createProgram==`function`}function yr(e){if(vr(e.typescript))return{api:e.typescript,source:`typescript`};if(vr(e.ts6))return{api:e.ts6,source:Q};let t=`Install it in the project:\n pnpm add -D ${Q}`;throw e.typescript?Error(`kick typegen: the client route map needs a TypeScript compiler API.
659
659
  TypeScript 7 does not ship a compiler API, so the compatibility package is required.\n ${t}`):Error(`kick typegen: the client route map needs a TypeScript compiler API, and neither 'typescript' nor '${Q}' resolved from this project.\n ${t}`)}async function br(e){let t=Ge(M(e,`package.json`)),n=async e=>{try{return await import(z(t.resolve(e)).href)}catch{return null}},[r,i]=await Promise.all([n(`typescript`),n(Q)]);return yr({typescript:xr(r),ts6:xr(i)}).api}function xr(e){let t=e;return t?.default&&typeof t.default==`object`?t.default:e}var Sr=class{ts;checker;program;opts;hoistedByType=new Map;blocks=[];maxDepth;constructor(e,t,n,r={}){this.ts=e,this.checker=t,this.program=n,this.opts=r,this.maxDepth=r.maxDepth??12}hoisted(){return this.blocks}expand(e){return this.render(e,0)}render(e,t){let n=this.ts.TypeFlags;if(t>this.maxDepth)return this.opts.onWarn?.(`type nesting exceeded ${this.maxDepth} levels — emitting 'unknown'. Declare a response schema on the route for an exact type.`),`unknown`;if(e.flags&(n.String|n.Number|n.Boolean|n.BigInt|n.ESSymbol)||e.flags&(n.Any|n.Unknown|n.Never|n.Void|n.Undefined|n.Null)||e.isLiteral()||e.flags&n.BooleanLiteral)return this.checker.typeToString(e);if(e.isUnion())return e.types.map(e=>this.render(e,t+1)).join(` | `);if(e.isIntersection())return e.types.map(e=>this.render(e,t+1)).join(` & `);if(this.isTuple(e))return this.renderTuple(e,t);let r=this.arrayElement(e);if(r){let e=this.render(r.element,t+1),n=/[|&]/.test(e)?`(${e})[]`:`${e}[]`;return r.readonly?`readonly ${n}`:n}return this.isLibType(e)?this.renderLibType(e,t):e.flags&n.Object?this.renderObject(e,t):(this.opts.onWarn?.(`could not expand type '${this.checker.typeToString(e)}' — emitting 'unknown'`),`unknown`)}renderObject(e,t){let n=this.hoistedByType.get(e);if(n)return n;if(this.isNamed(e)){let n=`__T${this.hoistedByType.size}`;this.hoistedByType.set(e,n);let r=this.blocks.length;return this.blocks.push(``),this.blocks[r]=`interface ${n} {\n${this.members(e,t,` `)}\n}`,n}let r=this.members(e,t,``,`; `);return r.length>0?`{ ${r} }`:`{}`}members(e,t,n,r=`
660
- `){let i=[];for(let r of this.checker.getIndexInfosOfType(e)){let e=this.checker.typeToString(r.keyType);i.push(`${n}[key: ${e}]: ${this.render(r.type,t+1)}`)}for(let r of this.checker.getPropertiesOfType(e)){let e=r.valueDeclaration??r.declarations?.[0],a=e?this.checker.getTypeOfSymbolAtLocation(r,e):this.checker.getDeclaredTypeOfSymbol(r),o=(r.flags&this.ts.SymbolFlags.Optional)!==0,s=this.renderPropertyType(a,o,r,t+1),c=this.isReadonlyProp(r)?`readonly `:``;i.push(`${n}${c}${this.propName(r.getName())}${o?`?`:``}: ${s}`)}return i.join(r===`
660
+ `){let i=[];for(let r of this.checker.getIndexInfosOfType(e)){let e=this.checker.typeToString(r.keyType);i.push(`${n}[key: ${e}]: ${this.render(r.type,t+1)}`)}for(let r of this.checker.getPropertiesOfType(e)){let e=this.typeOfProperty(r),a=(r.flags&this.ts.SymbolFlags.Optional)!==0,o=this.renderPropertyType(e,a,r,t+1),s=this.isReadonlyProp(r)?`readonly `:``;i.push(`${n}${s}${this.propName(r.getName())}${a?`?`:``}: ${o}`)}return i.join(r===`
661
661
  `?`
662
- `:r)}renderPropertyType(e,t,n,r){if(!t||!e.isUnion()||this.declaresUndefined(n))return this.render(e,r);let i=e.types.filter(e=>!(e.flags&this.ts.TypeFlags.Undefined));return i.length===0?`undefined`:i.map(e=>this.render(e,r)).join(` | `)}isReadonlyProp(e){let t=e.valueDeclaration??e.declarations?.[0];return t?(this.ts.getCombinedModifierFlags(t)&this.ts.ModifierFlags.Readonly)!==0:!1}declaresUndefined(e){let t=e.valueDeclaration??e.declarations?.[0];if(!t||!(this.ts.isPropertySignature(t)||this.ts.isPropertyDeclaration(t))||!t.type)return!1;let n=this.checker.getTypeFromTypeNode(t.type);return(n.isUnion()?n.types:[n]).some(e=>(e.flags&this.ts.TypeFlags.Undefined)!==0)}renderTuple(e,t){let n=this.ts.ElementFlags,r=this.checker.getTypeArguments(e),i=e.target,a=i.elementFlags??[],o=r.map((e,r)=>{let i=a[r]??n.Required;return i&n.Optional?`${(e.isUnion()?e.types.filter(e=>!(e.flags&this.ts.TypeFlags.Undefined)):[e]).map(e=>this.render(e,t+1)).join(` | `)}?`:i&n.Rest?`...${this.render(e,t+1)}[]`:i&n.Variadic?`...${this.render(e,t+1)}`:this.render(e,t+1)});return`${i.readonly?`readonly `:``}[${o.join(`, `)}]`}propName(e){return/^[A-Za-z_$][A-Za-z0-9_$]*$/.test(e)?e:JSON.stringify(e)}isLibType(e){let t=e.aliasSymbol?.declarations??e.getSymbol()?.declarations;return!t||t.length===0?!1:t.every(e=>this.program.isSourceFileDefaultLibrary(e.getSourceFile()))}renderLibType(e,t){let n=(e.aliasSymbol??e.getSymbol())?.getName(),r=e.aliasTypeArguments??this.typeArguments(e);return!n||r.length===0?this.checker.typeToString(e):`${n}<${r.map(e=>this.render(e,t+1)).join(`, `)}>`}typeArguments(e){return!(e.flags&this.ts.TypeFlags.Object)||!(e.objectFlags&this.ts.ObjectFlags.Reference)?[]:this.checker.getTypeArguments(e)}isNamed(e){let t=e.getSymbol();if(!t)return!1;let n=t.getName();return n!==`__type`&&n!==`__object`&&n.length>0}isTuple(e){let t=this.ts.ObjectFlags;if(!(e.flags&this.ts.TypeFlags.Object)||!(e.objectFlags&t.Reference))return!1;let n=e.target;return!!(n&&n.objectFlags&t.Tuple)}arrayElement(e){let t=e.getSymbol()?.getName();if(t!==`Array`&&t!==`ReadonlyArray`)return null;let n=this.checker.getTypeArguments(e);return n.length===1?{element:n[0],readonly:t===`ReadonlyArray`}:null}};async function Cr(e){let t=await br(e.compilerFrom??e.projectDir),n=M(j(e.routesFile),`__kick_client_probe__.ts`),r=Er(e.routesFile,e.keys),i=Or(t,e.projectDir,n,r),a=i.getTypeChecker(),o=i.getSourceFile(n);if(!o)throw Error(`kick/client: could not add the resolution probe to the program. Check that ${e.routesFile} exists — run \`kick typegen\` first.`);wr(t,i,e.routesFile);let s=Dr(t,i,o,e.keys),c=new Sr(t,a,i,{onWarn:e.onWarn}),l=new Map;for(let[n,r]of e.keys.entries()){if(s.has(r)){e.onWarn?.(`route '${r}' is not present in KickRoutes.Api — skipped. Re-run \`kick typegen\` so the two maps agree.`);continue}let i=o.statements.find(e=>t.isTypeAliasDeclaration(e)&&e.name.text===Tr(n));if(!i){e.onWarn?.(`route '${r}' could not be resolved — skipped.`);continue}let u=a.getTypeAtLocation(i.type);if(u.flags&t.TypeFlags.Any){e.onWarn?.(`route '${r}' resolved to 'any' — skipped rather than emitted, since an 'any' entry silently accepts every call. Check that the server type-checks.`);continue}l.set(r,c.expand(u))}return{entries:l,hoisted:c.hoisted()}}function wr(e,t,n){let r=t.getSourceFile(n);if(!r)throw Error(`kick/client: ${n} is not in the TypeScript program. Run \`kick typegen\` first, and check that tsconfig.json includes .kickjs.`);let i=t.getSemanticDiagnostics(r);if(i.length===0)return;let a=i.slice(0,3).map(t=>` ${e.flattenDiagnosticMessageText(t.messageText,` `)}`).join(`
662
+ `:r)}typeOfProperty(e){let t=this.checker;if(typeof t.getTypeOfSymbol==`function`)return t.getTypeOfSymbol(e);let n=e.valueDeclaration??e.declarations?.[0];return n?this.checker.getTypeOfSymbolAtLocation(e,n):this.checker.getDeclaredTypeOfSymbol(e)}renderPropertyType(e,t,n,r){if(!t||!e.isUnion()||this.declaresUndefined(n))return this.render(e,r);let i=e.types.filter(e=>!(e.flags&this.ts.TypeFlags.Undefined));return i.length===0?`undefined`:i.map(e=>this.render(e,r)).join(` | `)}isReadonlyProp(e){let t=e.valueDeclaration??e.declarations?.[0];return t?(this.ts.getCombinedModifierFlags(t)&this.ts.ModifierFlags.Readonly)!==0:!1}declaresUndefined(e){let t=e.valueDeclaration??e.declarations?.[0];if(!t||!(this.ts.isPropertySignature(t)||this.ts.isPropertyDeclaration(t))||!t.type)return!1;let n=this.checker.getTypeFromTypeNode(t.type);return(n.isUnion()?n.types:[n]).some(e=>(e.flags&this.ts.TypeFlags.Undefined)!==0)}renderTuple(e,t){let n=this.ts.ElementFlags,r=this.checker.getTypeArguments(e),i=e.target,a=i.elementFlags??[],o=r.map((e,r)=>{let i=a[r]??n.Required;return i&n.Optional?`${(e.isUnion()?e.types.filter(e=>!(e.flags&this.ts.TypeFlags.Undefined)):[e]).map(e=>this.render(e,t+1)).join(` | `)}?`:i&n.Rest?`...${this.render(e,t+1)}[]`:i&n.Variadic?`...${this.render(e,t+1)}`:this.render(e,t+1)});return`${i.readonly?`readonly `:``}[${o.join(`, `)}]`}propName(e){return/^[A-Za-z_$][A-Za-z0-9_$]*$/.test(e)?e:JSON.stringify(e)}isLibType(e){let t=e.aliasSymbol?.declarations??e.getSymbol()?.declarations;return!t||t.length===0?!1:t.every(e=>this.program.isSourceFileDefaultLibrary(e.getSourceFile()))}renderLibType(e,t){let n=(e.aliasSymbol??e.getSymbol())?.getName(),r=e.aliasTypeArguments??this.typeArguments(e);return!n||r.length===0?this.checker.typeToString(e):`${n}<${r.map(e=>this.render(e,t+1)).join(`, `)}>`}typeArguments(e){return!(e.flags&this.ts.TypeFlags.Object)||!(e.objectFlags&this.ts.ObjectFlags.Reference)?[]:this.checker.getTypeArguments(e)}isNamed(e){let t=e.getSymbol();if(!t)return!1;let n=t.getName();return n!==`__type`&&n!==`__object`&&n.length>0}isTuple(e){let t=this.ts.ObjectFlags;if(!(e.flags&this.ts.TypeFlags.Object)||!(e.objectFlags&t.Reference))return!1;let n=e.target;return!!(n&&n.objectFlags&t.Tuple)}arrayElement(e){let t=e.getSymbol()?.getName();if(t!==`Array`&&t!==`ReadonlyArray`)return null;let n=this.checker.getTypeArguments(e);return n.length===1?{element:n[0],readonly:t===`ReadonlyArray`}:null}};async function Cr(e){let t=await br(e.compilerFrom??e.projectDir),n=M(j(e.routesFile),`__kick_client_probe__.ts`),r=Er(e.routesFile,e.keys),i=Or(t,e.projectDir,n,r),a=i.getTypeChecker(),o=i.getSourceFile(n);if(!o)throw Error(`kick/client: could not add the resolution probe to the program. Check that ${e.routesFile} exists — run \`kick typegen\` first.`);wr(t,i,e.routesFile);let s=Dr(t,i,o,e.keys),c=new Sr(t,a,i,{onWarn:e.onWarn}),l=new Map;for(let[n,r]of e.keys.entries()){if(s.has(r)){e.onWarn?.(`route '${r}' is not present in KickRoutes.Api — skipped. Re-run \`kick typegen\` so the two maps agree.`);continue}let i=o.statements.find(e=>t.isTypeAliasDeclaration(e)&&e.name.text===Tr(n));if(!i){e.onWarn?.(`route '${r}' could not be resolved — skipped.`);continue}let u=a.getTypeAtLocation(i.type);if(u.flags&t.TypeFlags.Any){e.onWarn?.(`route '${r}' resolved to 'any' — skipped rather than emitted, since an 'any' entry silently accepts every call. Check that the server type-checks.`);continue}l.set(r,c.expand(u))}return{entries:l,hoisted:c.hoisted()}}function wr(e,t,n){let r=t.getSourceFile(n);if(!r)throw Error(`kick/client: ${n} is not in the TypeScript program. Run \`kick typegen\` first, and check that tsconfig.json includes .kickjs.`);let i=t.getSemanticDiagnostics(r);if(i.length===0)return;let a=i.slice(0,3).map(t=>` ${e.flattenDiagnosticMessageText(t.messageText,` `)}`).join(`
663
663
  `);throw Error(`${n} has ${i.length} type error(s), so its route types cannot be resolved — every entry would come out as 'any'.\n${a}\n Usually this means dependencies are not installed or the server does not type-check.`)}function Tr(e){return`_K${e}`}function Er(e,t){let n=`./`+A(e).replace(/\.tsx?$/,``),r=t.map((e,t)=>`type ${Tr(t)} = KickRoutes.Api[${JSON.stringify(e)}]`);return[`import ${JSON.stringify(n)}`,...r].join(`
664
664
  `)+`
665
665
  `}function Dr(e,t,n,r){let i=new Set,a=new Map;for(let t of n.statements)e.isTypeAliasDeclaration(t)&&a.set(t.name.text,t);for(let e of t.getSemanticDiagnostics(n))if(e.start!==void 0)for(let[t,o]of r.entries()){let r=a.get(Tr(t));r&&e.start>=r.getStart(n)&&e.start<r.getEnd()&&i.add(o)}return i}function Or(e,t,n,r){let i=M(t,`tsconfig.json`),a={...e.sys,onUnRecoverableConfigFileDiagnostic:t=>{throw Error(e.flattenDiagnosticMessageText(t.messageText,`
@@ -727,4 +727,4 @@ declare global {
727
727
  export {}
728
728
  `}const Fr=()=>({id:`kick/env`,outExtension:`.ts`,inputs:[`src/env.ts`,`src/**/env.ts`,`src/**/*.env.ts`],async generate(e){let t=Lr(e);if(t===!1)return null;let n=await e.getScanResult({root:Ir(e),cwd:e.cwd,envFile:t});if(!n.env)return null;let r=e.config?.typegen?.schemaValidator??`zod`,i=k.resolve(e.cwd,`.kickjs/types/kick__env.ts`);return Pr(n.env,i,r)}});function Ir(e){return k.resolve(e.cwd,e.config?.typegen?.srcDir??`src`)}function Lr(e){return e.config?.typegen?.envFile}function Rr(e){return k.resolve(e.cwd,e.config?.typegen?.srcDir??`src`)}function zr(e){let t=e.config?.typegen?.envFile;if(t!==!1)return t}function $(e){return{root:Rr(e),cwd:e.cwd,envFile:zr(e)}}const Br=()=>({id:`kick/registry`,inputs:[`src/**/*.ts`],async generate(e){let t=await e.getScanResult($(e)),n=k.resolve(e.cwd,`.kickjs/types/kick__registry.d.ts`),r=new Set(t.collisions.map(e=>e.className));return Ve(t.classes,n,r)}}),Vr=()=>({id:`kick/services`,inputs:[`src/**/*.ts`],async generate(e){let t=await e.getScanResult($(e)),n=new Set(t.collisions.map(e=>e.className));return ze(`ServiceToken`,Re(t.classes,t.tokens,t.injects,n),"(no tokens discovered — declare with createToken<T>() or `kick g service <name>`)")}}),Hr=()=>({id:`kick/modules`,inputs:[`src/**/*.ts`],async generate(e){return ze(`ModuleToken`,Me((await e.getScanResult($(e))).classes),"(no @Module classes discovered — `kick g module <name>` to add one)")}}),Ur=()=>({id:`kick/plugins`,inputs:[`src/**/*.ts`],async generate(e){return Pe((await e.getScanResult($(e))).pluginsAndAdapters)}}),Wr=()=>({id:`kick/augmentations`,inputs:[`src/**/*.ts`],async generate(e){return We((await e.getScanResult($(e))).augmentations)}}),Gr=()=>({id:`kick/context`,inputs:[`src/**/*.ts`],async generate(e){let t=await e.getScanResult($(e));return t.contextKeys.length===0?null:Ne(t.contextKeys)}}),Kr={fastify:{subpath:`@forinda/kickjs/fastify`,typeName:`FastifyRuntimeTypes`},h3:{subpath:`@forinda/kickjs/h3`,typeName:`H3RuntimeTypes`}},qr=[D({name:`kick/init`,register:ut}),D({name:`kick/generate`,register:Bt}),D({name:`kick/run`,register:Qt}),D({name:`kick/info`,register:rn}),D({name:`kick/inspect`,register:fn}),D({name:`kick/add`,register:ye}),D({name:`kick/list`,register:xe}),D({name:`kick/explain`,register:Sn}),D({name:`kick/mcp`,register:jn}),D({name:`kick/tinker`,register:Fn}),D({name:`kick/remove`,register:Vn}),D({name:`kick/typegen`,register:Wn}),D({name:`kick/check`,register:nr}),D({name:`kick/doctor`,register:pe}),D({name:`kick/codemod`,register:ir}),D({name:`kick/registry`,typegens:[Br()]}),D({name:`kick/services`,typegens:[Vr()]}),D({name:`kick/modules`,typegens:[Hr()]}),D({name:`kick/plugins`,typegens:[Ur()]}),D({name:`kick/augmentations`,typegens:[Wr()]}),D({name:`kick/context`,typegens:[Gr()]}),D({name:`kick/assets`,typegens:[ar()]}),D({name:`kick/routes`,typegens:[hr()]}),D({name:`kick/client`,typegens:[Nr()]}),D({name:`kick/env`,typegens:[Fr()]}),D({name:`kick/runtime`,typegens:[{id:`kick/runtime`,outExtension:`.ts`,inputs:[`kick.config.ts`,`kick.config.js`,`kick.config.mjs`,`kick.config.json`],async generate(e){let t=e.config?.runtime;if(t!==`fastify`&&t!==`h3`)return null;let{subpath:n,typeName:r}=Kr[t];return[`// Runtime escape-hatch types for the '${t}' engine (kick.config runtime).`,`declare module '@forinda/kickjs' {`,` interface KickRuntimeRegister {`,` runtime: import('${n}').${r}`,` }`,`}`,``,`export {}`,``].join(`
729
729
  `)}}]})];export{Wt as applyDisableFilter,Kt as runAllPluginTypegens,qr as t};
730
- //# sourceMappingURL=run-plugins-BQPBSfB7.mjs.map
730
+ //# sourceMappingURL=run-plugins-DBnVyuyi.mjs.map