@forinda/kickjs-cli 5.2.3 → 5.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @forinda/kickjs-cli v5.2.3
2
+ * @forinda/kickjs-cli v5.3.0
3
3
  *
4
4
  * Copyright (c) Felix Orinda
5
5
  *
@@ -8,7 +8,7 @@
8
8
  *
9
9
  * @license MIT
10
10
  */
11
- import{A as e,C as t,D as n,E as r,F as i,M as a,N as o,O as s,P as c,S as l,T as u,_ as d,a as f,b as p,c as m,d as h,f as ee,g,h as _,j as v,k as te,l as ne,m as re,n as ie,o as ae,p as oe,s as se,t as ce,u as le,v as ue,w as y,x as b,y as de}from"./generator-extension-Cp5FUUAw.mjs";import{a as x,i as S,o as fe,t as C}from"./config-lCKbrRnt.mjs";import{n as w}from"./types-n4LRUF_c.mjs";import{n as T}from"./plugin-VPl_QQGb.mjs";import{a as pe,i as me,o as he,r as ge,s as _e,t as E}from"./typegen-CBI7dNXr.mjs";import D,{basename as ve,dirname as O,isAbsolute as ye,join as k,relative as A,resolve as j,sep as M}from"node:path";import{cpSync as be,existsSync as N,mkdirSync as P,readFileSync as F,readdirSync as xe,rmSync as Se,statSync as Ce,writeFileSync as we}from"node:fs";import{mkdir as Te,readFile as I,rm as Ee,writeFile as L}from"node:fs/promises";import{execSync as De,fork as Oe,spawn as ke,spawnSync as Ae}from"node:child_process";import{pathToFileURL as R}from"node:url";import{glob as je}from"glob";import{groupAssetKeys as Me}from"@forinda/kickjs";import{arch as Ne,platform as Pe,release as Fe}from"node:os";import{generate as Ie,migrateDown as Le,migrateLatest as Re,migrateRollback as ze,migrateStatus as Be,migrateUp as Ve,renderSchemaSource as He,resolveDbConfig as Ue}from"@forinda/kickjs-db";const We={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},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`},"db-pg":{pkg:`@forinda/kickjs-db-pg`,peers:[`pg`],description:`kick/db PostgreSQL dialect + adapter (pgDialect, pgAdapter)`},drizzle:{pkg:`@forinda/kickjs-drizzle`,peers:[`drizzle-orm`],description:`Drizzle ORM adapter + query builder`},prisma:{pkg:`@forinda/kickjs-prisma`,peers:[`@prisma/client`],description:`Prisma adapter + query builder`},ws:{pkg:`@forinda/kickjs-ws`,peers:[`socket.io`],description:`WebSocket with @WsController decorators`},devtools:{pkg:`@forinda/kickjs-devtools`,peers:[],description:`Development dashboard — routes, DI, metrics, health`,dev:!0},auth:{pkg:`@forinda/kickjs-auth`,peers:[`jsonwebtoken`],description:`Authentication — JWT, API key, and custom strategies`},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`},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}};function z(e,t=process.cwd()){let n=t;for(;;){if(N(j(n,e)))return n;let t=O(n);if(t===n)return null;n=t}}function Ge(){return z(`pnpm-lock.yaml`)?`pnpm`:z(`yarn.lock`)?`yarn`:z(`bun.lockb`)||z(`bun.lock`)?`bun`:z(`package-lock.json`)?`npm`:null}function Ke(){let e=process.cwd();for(;e;){let t=j(e,`package.json`);if(N(t))try{let e=JSON.parse(F(t,`utf-8`)).packageManager;if(typeof e==`string`){let t=e.split(`@`)[0];if(C.includes(t))return t}}catch{}let n=O(e);if(n===e)return null;e=n}return null}async function qe(e){if(e&&C.includes(e))return{pm:e,source:`flag`};let t=await S(process.cwd());if(t?.packageManager&&C.includes(t.packageManager))return{pm:t.packageManager,source:`config`};let n=Ke();if(n)return{pm:n,source:`package.json`};let r=Ge();return r?{pm:r,source:`lockfile`}:{pm:`npm`,source:`default`}}async function Je(e){let{pm:t}=await qe(e);return t}function Ye(e=!1){let t=Object.entries(We),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(`, `)})`:``;return` ${r} ${t.description}${i}`};console.log(`
11
+ import{A as e,C as t,D as n,E as r,F as i,M as a,N as o,O as s,P as c,S as l,T as u,_ as d,a as f,b as p,c as m,d as h,f as ee,g,h as _,j as v,k as te,l as ne,m as re,n as ie,o as ae,p as oe,s as se,t as ce,u as le,v as ue,w as y,x as b,y as de}from"./generator-extension-Ba3TqDk4.mjs";import{a as x,i as S,o as fe,t as C}from"./config-DdlM0SJN.mjs";import{n as w}from"./types-Bcro6dIS.mjs";import{n as T}from"./plugin-DgxIJkPU.mjs";import{a as pe,i as me,o as he,r as ge,s as _e,t as E}from"./typegen-VziXMsqI.mjs";import D,{basename as ve,dirname as O,isAbsolute as ye,join as k,relative as A,resolve as j,sep as M}from"node:path";import{cpSync as be,existsSync as N,mkdirSync as P,readFileSync as F,readdirSync as xe,rmSync as Se,statSync as Ce,writeFileSync as we}from"node:fs";import{mkdir as Te,readFile as I,rm as Ee,writeFile as L}from"node:fs/promises";import{execSync as De,fork as Oe,spawn as ke,spawnSync as Ae}from"node:child_process";import{pathToFileURL as R}from"node:url";import{glob as je}from"glob";import{groupAssetKeys as Me}from"@forinda/kickjs";import{arch as Ne,platform as Pe,release as Fe}from"node:os";import{generate as Ie,migrateDown as Le,migrateLatest as Re,migrateRollback as ze,migrateStatus as Be,migrateUp as Ve,renderSchemaSource as He,resolveDbConfig as Ue}from"@forinda/kickjs-db";const We={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},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`},"db-pg":{pkg:`@forinda/kickjs-db-pg`,peers:[`pg`],description:`kick/db PostgreSQL dialect + adapter (pgDialect, pgAdapter)`},drizzle:{pkg:`@forinda/kickjs-drizzle`,peers:[`drizzle-orm`],description:`Drizzle ORM adapter + query builder`},prisma:{pkg:`@forinda/kickjs-prisma`,peers:[`@prisma/client`],description:`Prisma adapter + query builder`},ws:{pkg:`@forinda/kickjs-ws`,peers:[`socket.io`],description:`WebSocket with @WsController decorators`},devtools:{pkg:`@forinda/kickjs-devtools`,peers:[],description:`Development dashboard — routes, DI, metrics, health`,dev:!0},auth:{pkg:`@forinda/kickjs-auth`,peers:[`jsonwebtoken`],description:`Authentication — JWT, API key, and custom strategies`},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`},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}};function z(e,t=process.cwd()){let n=t;for(;;){if(N(j(n,e)))return n;let t=O(n);if(t===n)return null;n=t}}function Ge(){return z(`pnpm-lock.yaml`)?`pnpm`:z(`yarn.lock`)?`yarn`:z(`bun.lockb`)||z(`bun.lock`)?`bun`:z(`package-lock.json`)?`npm`:null}function Ke(){let e=process.cwd();for(;e;){let t=j(e,`package.json`);if(N(t))try{let e=JSON.parse(F(t,`utf-8`)).packageManager;if(typeof e==`string`){let t=e.split(`@`)[0];if(C.includes(t))return t}}catch{}let n=O(e);if(n===e)return null;e=n}return null}async function qe(e){if(e&&C.includes(e))return{pm:e,source:`flag`};let t=await S(process.cwd());if(t?.packageManager&&C.includes(t.packageManager))return{pm:t.packageManager,source:`config`};let n=Ke();if(n)return{pm:n,source:`package.json`};let r=Ge();return r?{pm:r,source:`lockfile`}:{pm:`npm`,source:`default`}}async function Je(e){let{pm:t}=await qe(e);return t}function Ye(e=!1){let t=Object.entries(We),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(`, `)})`:``;return` ${r} ${t.description}${i}`};console.log(`
12
12
  Core packages (always installed by \`kick new\`):
13
13
  `);for(let e of r)console.log(a(e));if(e){console.log(`
14
14
  Optional packages (add as needed):
@@ -994,7 +994,7 @@ server.on('exit', () => {
994
994
  Cancelled.
995
995
  `);return}await Ee(u,{recursive:!0,force:!0}),console.log(` Deleted: ${u}`);let f=k(n,`index.ts`);if(await o(f)){let e=await I(f,`utf-8`),t=e,n=RegExp(`^import\\s*\\{\\s*${s}Module\\s*\\}\\s*from\\s*['"][^'"]*${c}(?:/[^'"]*)?['"].*\\n?`,`gm`);e=e.replace(n,``),e=e.replace(RegExp(`\\s*,?\\s*${s}Module\\s*,?`,`g`),e=>{let t=e.trimStart().startsWith(`,`),n=e.trimEnd().endsWith(`,`);return t&&n?`,`:``}),e=e.replace(/,(\s*])/,`$1`),e=e.replace(/\n{3,}/g,`
996
996
 
997
- `),e!==t&&(await L(f,e,`utf-8`),console.log(` Unregistered: ${s}Module from ${f}`))}console.log(`\n Module '${c}' removed.\n`)}function On(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=x(await S(process.cwd())),r=t.modulesDir??n.dir??`src/modules`,i=t.pluralize===!1?!1:n.pluralize??!0;for(let n of e)await Dn({name:n,modulesDir:j(r),force:t.force,pluralize:i})})}function kn(e){if(e!==void 0){if(e===`false`||e===`off`||e===`none`)return!1;if(e===`zod`)return`zod`;console.warn(` kick typegen: unknown --schema-validator '${e}' (only 'zod' and 'false' are supported). Falling back to project config.`)}}function An(e){if(e!==void 0)return e===`false`||e===`off`||e===`none`?!1:e}function jn(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: fail on plugin-typegen drift instead of writing`).option(`--list`,"List every registered typegen plugin id (use to populate `typegen.disable`)").action(async e=>{let t=process.cwd(),n=await S(t);if(e.list){let{mergeCliPlugins:e}=await import(`./plugin-VPl_QQGb.mjs`).then(e=>e.t),{builtinCliPlugins:t}=await import(`./builtins-Du70nybS.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(`
997
+ `),e!==t&&(await L(f,e,`utf-8`),console.log(` Unregistered: ${s}Module from ${f}`))}console.log(`\n Module '${c}' removed.\n`)}function On(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=x(await S(process.cwd())),r=t.modulesDir??n.dir??`src/modules`,i=t.pluralize===!1?!1:n.pluralize??!0;for(let n of e)await Dn({name:n,modulesDir:j(r),force:t.force,pluralize:i})})}function kn(e){if(e!==void 0){if(e===`false`||e===`off`||e===`none`)return!1;if(e===`zod`)return`zod`;console.warn(` kick typegen: unknown --schema-validator '${e}' (only 'zod' and 'false' are supported). Falling back to project config.`)}}function An(e){if(e!==void 0)return e===`false`||e===`off`||e===`none`?!1:e}function jn(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: fail on plugin-typegen drift instead of writing`).option(`--list`,"List every registered typegen plugin id (use to populate `typegen.disable`)").action(async e=>{let t=process.cwd(),n=await S(t);if(e.list){let{mergeCliPlugins:e}=await import(`./plugin-DgxIJkPU.mjs`).then(e=>e.t),{builtinCliPlugins:t}=await import(`./builtins-B1iai4Mu.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(`
998
998
  Registered typegen plugins:
999
999
  `);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=kn(e.schemaValidator)??n?.typegen?.schemaValidator??`zod`,i=An(e.envFile)??n?.typegen?.envFile,a={cwd:t,srcDir:e.src??n?.typegen?.srcDir,outDir:e.out??n?.typegen?.outDir,silent:e.silent,allowDuplicates:e.allowDuplicates,schemaValidator:r,envFile:i,assetMap:n?.assetMap,runPlugins:!1};try{if(e.watch){let t=await ge(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 E(a);let r=await U({cwd:t,config:n??null,silent:e.silent,check:e.check});e.check&&r.some(e=>e.status===`written`)&&process.exit(1)}}catch(e){e instanceof me?console.error(`
1000
1000
  `+e.message+`
@@ -1003,7 +1003,7 @@ server.on('exit', () => {
1003
1003
 
1004
1004
  Available checks:
1005
1005
  --deploy Audit for production readiness (security, config, best practices)
1006
- `);return}let n=process.cwd();t(`KickJS Deploy Check`);let i=s();i.start(`Scanning project...`);let o=Hn(n);i.stop(`Scan complete`);let c={CRITICAL:0,WARNING:1,INFO:2};o.sort((e,t)=>c[e.severity]-c[t.severity]);for(let e of o)y.message(`${a(e.severity)} ${e.message}`);let l=o.filter(e=>e.severity===`CRITICAL`).length,u=o.filter(e=>e.severity===`WARNING`).length,d=o.filter(e=>e.severity===`INFO`).length,f=u===1?`warning`:`warnings`,p=[l>0?v.red(`${l} critical`):`${l} critical`,u>0?v.yellow(`${u} ${f}`):`${u} ${f}`,`${d} info`].join(`, `);l>0?(r(v.red(`${p} — fix critical issues before deploying`)),process.exit(1)):r(v.green(`${p} — looking good!`))})}async function Q(e){return Ue({configPath:D.resolve(process.cwd(),e.config)})}async function $(e){if(e.adapter){let t=await e.adapter();return{adapter:t,cleanup:async()=>t.close()}}if(!e.connectionString)throw Error(`kickjs-db: no adapter resolved — set db.connectionString (or DATABASE_URL) in kick.config.ts, or supply db.adapter() factory`);let t=e.dialect??`postgres`;if(t!==`postgres`)throw Error(`kickjs-db: built-in CLI adapter only supports postgres in M1 (dialect=${t}); use db.adapter() factory for other dialects`);let[{pgAdapter:n},r]=await Promise.all([import(`@forinda/kickjs-db-pg`),import(`pg`)]),i=new r.default.Pool({connectionString:e.connectionString}),a=n({pool:i});return{adapter:a,cleanup:async()=>{await a.close(),await i.end()}}}function Wn(e){if(e.length===0){console.log(`No migrations.`);return}console.table(e.map(e=>({id:e.id,state:e.state,batch:e.batch??`-`,reviewed:e.reviewed,applied:e.appliedAt??`-`})))}function Gn(e){let t=e.command(`db`).description(`Database commands (kickjs-db)`);t.command(`generate <name>`).description(`Generate a new migration from schema diff`).option(`-c, --config <path>`,`Path to kick.config.ts`,`kick.config.ts`).option(`-e, --empty`,`Skip schema diff and create an empty migration shell (data migration, seed, freeform SQL)`).action(async(e,t)=>{let n=process.cwd(),r=await Ie({name:e,config:await Q(t),cwd:n,empty:t.empty});if(r.status===`no-changes`){console.log(`No schema changes detected.`);return}if(r.empty){console.log(`Created empty migration ${r.migrationDir} (author up.sql + down.sql).`);return}let i=r.changeCount===1?``:`s`;console.log(`Created migration ${r.migrationDir} (${r.changeCount} change${i}).`)});let n=t.command(`migrate`).description(`Migration runner subcommands`);n.command(`latest`).description(`Apply all pending migrations in a new batch`).option(`-c, --config <path>`,`Path to kick.config.ts`,`kick.config.ts`).action(async e=>{let t=await Q(e),{adapter:n,cleanup:r}=await $(t);try{let e=await Re({adapter:n,migrationsDir:t.migrationsDir});e.applied.length===0?console.log(`No pending migrations.`):console.log(`Applied batch ${e.batch}: ${e.applied.join(`, `)}`)}finally{await r()}}),n.command(`up`).description(`Apply the next single pending migration`).option(`-c, --config <path>`,`Path to kick.config.ts`,`kick.config.ts`).action(async e=>{let t=await Q(e),{adapter:n,cleanup:r}=await $(t);try{let e=await Ve({adapter:n,migrationsDir:t.migrationsDir});e.applied.length===0?console.log(`No pending migrations.`):console.log(`Applied ${e.applied[0]} (batch ${e.batch})`)}finally{await r()}}),n.command(`down`).description(`Reverse the most recent applied migration`).option(`-c, --config <path>`,`Path to kick.config.ts`,`kick.config.ts`).action(async e=>{let t=await Q(e),{adapter:n,cleanup:r}=await $(t);try{let e=await Le({adapter:n,migrationsDir:t.migrationsDir});e.reversed?console.log(`Reversed ${e.reversed}.`):console.log(`Nothing to reverse.`)}finally{await r()}}),n.command(`rollback`).description(`Reverse the entire last batch as a single unit`).option(`-c, --config <path>`,`Path to kick.config.ts`,`kick.config.ts`).action(async e=>{let t=await Q(e),{adapter:n,cleanup:r}=await $(t);try{let e=await ze({adapter:n,migrationsDir:t.migrationsDir});e.reversed.length===0?console.log(`Nothing to roll back.`):console.log(`Rolled back batch ${e.batch}: ${e.reversed.join(`, `)}`)}finally{await r()}}),n.command(`status`).description(`Print applied + pending migrations`).option(`-c, --config <path>`,`Path to kick.config.ts`,`kick.config.ts`).action(async e=>{let t=await Q(e),{adapter:n,cleanup:r}=await $(t);try{Wn(await Be({adapter:n,migrationsDir:t.migrationsDir}))}finally{await r()}}),t.command(`introspect`).description(`Generate a TypeScript schema file from a live database`).option(`-c, --config <path>`,`Path to kick.config.ts`,`kick.config.ts`).option(`--out <path>`,`Output file (defaults to db.schemaPath from config)`).option(`--json`,`Print the raw SchemaSnapshot JSON to stdout instead of writing TS source`).action(async e=>{let t=await Q(e),{adapter:n,cleanup:r}=await $(t);try{let r=await n.introspect();if(e.json){console.log(JSON.stringify(r,null,2));return}let i=e.out??t.schemaPath;await L(i,He(r),`utf8`);let a=Object.keys(r.tables).length;console.log(`Wrote ${i} (${a} table${a===1?``:`s`}).`)}finally{await r()}})}const Kn=[`src/db/schema.ts`,`src/db/schema/index.ts`,`src/db/schema`],qn=()=>({id:`kick/db`,inputs:[`src/db/schema.ts`,`src/db/schema/**/*.ts`],async generate(e){let t=Jn(e.cwd);if(!t)return null;let n=D.resolve(e.cwd,`.kickjs/types`);return[`import type { SchemaToTypes, KickDbClient } from '@forinda/kickjs-db'`,`import type * as appSchema from '${Yn(D.relative(n,t)).replace(/\.ts$/,``).replace(/\/index$/,``)}'`,``,`declare global {`,` interface KickDbSchema extends SchemaToTypes<typeof appSchema> {}`,`}`,``,`declare module '@forinda/kickjs-db' {`,` interface KickDbRegister {`,` db: KickDbClient<KickDbSchema>`,` }`,`}`].join(`
1006
+ `);return}let n=process.cwd();t(`KickJS Deploy Check`);let i=s();i.start(`Scanning project...`);let o=Hn(n);i.stop(`Scan complete`);let c={CRITICAL:0,WARNING:1,INFO:2};o.sort((e,t)=>c[e.severity]-c[t.severity]);for(let e of o)y.message(`${a(e.severity)} ${e.message}`);let l=o.filter(e=>e.severity===`CRITICAL`).length,u=o.filter(e=>e.severity===`WARNING`).length,d=o.filter(e=>e.severity===`INFO`).length,f=u===1?`warning`:`warnings`,p=[l>0?v.red(`${l} critical`):`${l} critical`,u>0?v.yellow(`${u} ${f}`):`${u} ${f}`,`${d} info`].join(`, `);l>0?(r(v.red(`${p} — fix critical issues before deploying`)),process.exit(1)):r(v.green(`${p} — looking good!`))})}async function Q(e){return Ue({configPath:D.resolve(process.cwd(),e.config)})}async function $(e){if(e.adapter){let t=await e.adapter();return{adapter:t,cleanup:async()=>t.close()}}if(!e.connectionString)throw Error(`kickjs-db: no adapter resolved — set db.connectionString (or DATABASE_URL) in kick.config.ts, or supply db.adapter() factory`);let t=e.dialect??`postgres`;if(t!==`postgres`)throw Error(`kickjs-db: built-in CLI adapter only supports postgres in M1 (dialect=${t}); use db.adapter() factory for other dialects`);let[{pgAdapter:n},r]=await Promise.all([import(`@forinda/kickjs-db-pg`),import(`pg`)]),i=new r.default.Pool({connectionString:e.connectionString}),a=n({pool:i});return{adapter:a,cleanup:async()=>{await a.close(),await i.end()}}}function Wn(e){if(e.length===0){console.log(`No migrations.`);return}console.table(e.map(e=>({id:e.id,state:e.state,batch:e.batch??`-`,reviewed:e.reviewed,applied:e.appliedAt??`-`})))}function Gn(e){let t=e.command(`db`).description(`Database commands (kickjs-db)`);t.command(`generate <name>`).description(`Generate a new migration from schema diff`).option(`-c, --config <path>`,`Path to kick.config.ts`,`kick.config.ts`).option(`-e, --empty`,`Skip schema diff and create an empty migration shell (data migration, seed, freeform SQL)`).action(async(e,t)=>{let n=process.cwd(),r=await Ie({name:e,config:await Q(t),cwd:n,empty:t.empty});if(r.status===`no-changes`){console.log(`No schema changes detected.`);return}if(r.empty){console.log(`Created empty migration ${r.migrationDir} (author up.sql + down.sql).`);return}let i=r.changeCount===1?``:`s`;console.log(`Created migration ${r.migrationDir} (${r.changeCount} change${i}).`)});let n=t.command(`migrate`).description(`Migration runner subcommands`);n.command(`latest`).description(`Apply all pending migrations in a new batch`).option(`-c, --config <path>`,`Path to kick.config.ts`,`kick.config.ts`).option(`--confirm-enum-drop`,"Allow migrations carrying the `-- KICK ENUM REMOVE` header to apply",!1).action(async e=>{let t=await Q(e),{adapter:n,cleanup:r}=await $(t);try{let r=await Re({adapter:n,migrationsDir:t.migrationsDir,confirmEnumDrop:e.confirmEnumDrop});r.applied.length===0?console.log(`No pending migrations.`):console.log(`Applied batch ${r.batch}: ${r.applied.join(`, `)}`)}finally{await r()}}),n.command(`up`).description(`Apply the next single pending migration`).option(`-c, --config <path>`,`Path to kick.config.ts`,`kick.config.ts`).option(`--confirm-enum-drop`,"Allow migrations carrying the `-- KICK ENUM REMOVE` header to apply",!1).action(async e=>{let t=await Q(e),{adapter:n,cleanup:r}=await $(t);try{let r=await Ve({adapter:n,migrationsDir:t.migrationsDir,confirmEnumDrop:e.confirmEnumDrop});r.applied.length===0?console.log(`No pending migrations.`):console.log(`Applied ${r.applied[0]} (batch ${r.batch})`)}finally{await r()}}),n.command(`down`).description(`Reverse the most recent applied migration`).option(`-c, --config <path>`,`Path to kick.config.ts`,`kick.config.ts`).action(async e=>{let t=await Q(e),{adapter:n,cleanup:r}=await $(t);try{let e=await Le({adapter:n,migrationsDir:t.migrationsDir});e.reversed?console.log(`Reversed ${e.reversed}.`):console.log(`Nothing to reverse.`)}finally{await r()}}),n.command(`rollback`).description(`Reverse the entire last batch as a single unit`).option(`-c, --config <path>`,`Path to kick.config.ts`,`kick.config.ts`).action(async e=>{let t=await Q(e),{adapter:n,cleanup:r}=await $(t);try{let e=await ze({adapter:n,migrationsDir:t.migrationsDir});e.reversed.length===0?console.log(`Nothing to roll back.`):console.log(`Rolled back batch ${e.batch}: ${e.reversed.join(`, `)}`)}finally{await r()}}),n.command(`status`).description(`Print applied + pending migrations`).option(`-c, --config <path>`,`Path to kick.config.ts`,`kick.config.ts`).action(async e=>{let t=await Q(e),{adapter:n,cleanup:r}=await $(t);try{Wn(await Be({adapter:n,migrationsDir:t.migrationsDir}))}finally{await r()}}),t.command(`introspect`).description(`Generate a TypeScript schema file from a live database`).option(`-c, --config <path>`,`Path to kick.config.ts`,`kick.config.ts`).option(`--out <path>`,`Output file (defaults to db.schemaPath from config)`).option(`--json`,`Print the raw SchemaSnapshot JSON to stdout instead of writing TS source`).action(async e=>{let t=await Q(e),{adapter:n,cleanup:r}=await $(t);try{let r=await n.introspect();if(e.json){console.log(JSON.stringify(r,null,2));return}let i=e.out??t.schemaPath;await L(i,He(r),`utf8`);let a=Object.keys(r.tables).length;console.log(`Wrote ${i} (${a} table${a===1?``:`s`}).`)}finally{await r()}})}const Kn=[`src/db/schema.ts`,`src/db/schema/index.ts`,`src/db/schema`],qn=()=>({id:`kick/db`,inputs:[`src/db/schema.ts`,`src/db/schema/**/*.ts`],async generate(e){let t=Jn(e.cwd);if(!t)return null;let n=D.resolve(e.cwd,`.kickjs/types`);return[`import type { SchemaToTypes, SchemaToRelationsRegister, KickDbClient } from '@forinda/kickjs-db'`,`import type * as appSchema from '${Yn(D.relative(n,t)).replace(/\.ts$/,``).replace(/\/index$/,``)}'`,``,`declare global {`,` interface KickDbSchema extends SchemaToTypes<typeof appSchema> {}`,`}`,``,`declare module '@forinda/kickjs-db' {`,` interface KickDbRegister {`,` db: KickDbClient<KickDbSchema>`,` }`,``,` interface KickDbRelationsRegister {`,` db: SchemaToRelationsRegister<typeof appSchema>`,` }`,`}`].join(`
1007
1007
  `)}});function Jn(e){for(let t of Kn){let n=D.resolve(e,t);if(t.endsWith(`.ts`)){if(N(n))return n}else{let e=D.join(n,`index.ts`);if(N(e))return e}}return null}function Yn(e){return e.replace(/\\/g,`/`)}const Xn=()=>({id:`kick/assets`,inputs:[`kick.config.ts`,`kick.config.js`,`kick.config.mjs`],async generate(e){if(!N(D.resolve(e.cwd,`kick.config.ts`)))return null;let t=await S(e.cwd);if(!t?.assetMap)return null;let n=pe(t.assetMap,e.cwd);return n.count===0?null:he(n)}}),Zn="/* eslint-disable */\n// AUTO-GENERATED by `kick typegen`. DO NOT EDIT.\n// Re-run with `kick typegen` or rely on `kick dev` to refresh.\n";function Qn(e,t,n){if(e.length===0)return`${Zn}
1008
1008
  // (no routes discovered yet — annotate a controller method with
1009
1009
  // @Get/@Post/@Put/@Delete/@Patch and re-run \`kick typegen\`)
@@ -1063,4 +1063,4 @@ declare global {
1063
1063
 
1064
1064
  export {}
1065
1065
  `}const cr=()=>({id:`kick/env`,outExtension:`.ts`,inputs:[`src/env.ts`,`src/**/env.ts`,`src/**/*.env.ts`],async generate(e){let t=ur(e);if(t===!1)return null;let n=await e.getScanResult({root:lr(e),cwd:e.cwd,envFile:t});if(!n.env)return null;let r=D.resolve(e.cwd,`.kickjs/types/kick__env.ts`);return sr(n.env,r)}});function lr(e){return D.resolve(e.cwd,e.config?.typegen?.srcDir??`src`)}function ur(e){return e.config?.typegen?.envFile}const dr=[w({name:`kick/init`,register:$e}),w({name:`kick/generate`,register:Pt}),w({name:`kick/run`,register:Kt}),w({name:`kick/info`,register:qt}),w({name:`kick/inspect`,register:tn}),w({name:`kick/add`,register:Ze}),w({name:`kick/list`,register:Xe}),w({name:`kick/explain`,register:dn}),w({name:`kick/mcp`,register:bn}),w({name:`kick/tinker`,register:wn}),w({name:`kick/remove`,register:On}),w({name:`kick/typegen`,register:jn}),w({name:`kick/check`,register:Un}),w({name:`kick/db`,register:Gn,typegens:[qn()]}),w({name:`kick/assets`,typegens:[Xn()]}),w({name:`kick/routes`,typegens:[ir()]}),w({name:`kick/env`,typegens:[cr()]})];export{dr as builtinCliPlugins,Rt as n,U as t};
1066
- //# sourceMappingURL=builtins-Du70nybS.mjs.map
1066
+ //# sourceMappingURL=builtins-B1iai4Mu.mjs.map