@vaiftech/cli 1.0.5 → 1.2.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.
package/dist/index.d.cts CHANGED
@@ -26,6 +26,7 @@ declare function generateTypes(options: GenerateOptions): Promise<void>;
26
26
  interface InitOptions {
27
27
  typescript?: boolean;
28
28
  force?: boolean;
29
+ template?: string;
29
30
  }
30
31
  declare function initConfig(options: InitOptions): Promise<void>;
31
32
 
package/dist/index.d.ts CHANGED
@@ -26,6 +26,7 @@ declare function generateTypes(options: GenerateOptions): Promise<void>;
26
26
  interface InitOptions {
27
27
  typescript?: boolean;
28
28
  force?: boolean;
29
+ template?: string;
29
30
  }
30
31
  declare function initConfig(options: InitOptions): Promise<void>;
31
32
 
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- export{b as generateTypes,c as initConfig,a as loadConfig}from'./chunk-7YZZOG47.js';import T from'pg';import $ from'prettier';async function S(p){let{connectionString:a,schema:e="public"}=p,r=new T.Client({connectionString:a});await r.connect();try{let t=await r.query(`
1
+ export{b as generateTypes,d as initConfig,a as loadConfig}from'./chunk-VD3KS4ZK.js';import T from'pg';import $ from'prettier';async function S(p){let{connectionString:a,schema:e="public"}=p,r=new T.Client({connectionString:a});await r.connect();try{let t=await r.query(`
2
2
  SELECT table_name, table_type
3
3
  FROM information_schema.tables
4
4
  WHERE table_schema = $1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vaiftech/cli",
3
- "version": "1.0.5",
3
+ "version": "1.2.0",
4
4
  "description": "VAIF CLI - Type generation and development tools",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -1,67 +0,0 @@
1
- import f from'fs';import h from'path';import R from'dotenv';import N from'pg';import C from'ora';import u from'chalk';import D from'prettier';R.config();async function x(t){let n=h.resolve(t);if(!f.existsSync(n))return null;try{let o=f.readFileSync(n,"utf-8"),e=JSON.parse(o);return e.database?.url&&(e.database.url=$(e.database.url)),e.api?.apiKey&&(e.api.apiKey=$(e.api.apiKey)),e}catch{throw new Error(`Failed to parse config file: ${t}`)}}function $(t){return t.replace(/\$\{([^}]+)\}/g,(n,o)=>process.env[o]||n)}async function O(t,n){let o=await t.query(`
2
- SELECT table_name, table_type
3
- FROM information_schema.tables
4
- WHERE table_schema = $1
5
- AND table_type = 'BASE TABLE'
6
- ORDER BY table_name
7
- `,[n]),e=await t.query(`
8
- SELECT
9
- table_name,
10
- column_name,
11
- data_type,
12
- is_nullable,
13
- column_default,
14
- udt_name,
15
- is_identity,
16
- character_maximum_length,
17
- numeric_precision,
18
- numeric_scale
19
- FROM information_schema.columns
20
- WHERE table_schema = $1
21
- ORDER BY table_name, ordinal_position
22
- `,[n]),r=await t.query(`
23
- SELECT
24
- tc.constraint_name,
25
- tc.table_name,
26
- kcu.column_name,
27
- ccu.table_name AS foreign_table_name,
28
- ccu.column_name AS foreign_column_name
29
- FROM information_schema.table_constraints AS tc
30
- JOIN information_schema.key_column_usage AS kcu
31
- ON tc.constraint_name = kcu.constraint_name
32
- AND tc.table_schema = kcu.table_schema
33
- JOIN information_schema.constraint_column_usage AS ccu
34
- ON ccu.constraint_name = tc.constraint_name
35
- AND ccu.table_schema = tc.table_schema
36
- WHERE tc.constraint_type = 'FOREIGN KEY'
37
- AND tc.table_schema = $1
38
- `,[n]),s=await t.query(`
39
- SELECT
40
- t.typname as enum_name,
41
- e.enumlabel as enum_value
42
- FROM pg_type t
43
- JOIN pg_enum e ON t.oid = e.enumtypid
44
- JOIN pg_namespace n ON n.oid = t.typnamespace
45
- WHERE n.nspname = $1
46
- ORDER BY t.typname, e.enumsortorder
47
- `,[n]),a=new Map;for(let i of o.rows)a.set(i.table_name,[]);for(let i of e.rows){let l=a.get(i.table_name);l&&l.push(i);}let c=new Map;for(let i of s.rows){let l=c.get(i.enum_name)||[];l.push(i.enum_value),c.set(i.enum_name,l);}return {tables:a,enums:c,foreignKeys:r.rows}}var b={smallint:"number",integer:"number",bigint:"string",int2:"number",int4:"number",int8:"string",decimal:"string",numeric:"string",real:"number",float4:"number",float8:"number","double precision":"number",money:"string",boolean:"boolean",bool:"boolean",text:"string",varchar:"string",char:"string",character:"string","character varying":"string",name:"string",citext:"string",date:"string",time:"string",timetz:"string","time without time zone":"string","time with time zone":"string",timestamp:"string",timestamptz:"string","timestamp without time zone":"string","timestamp with time zone":"string",interval:"string",bytea:"Buffer",uuid:"string",json:"unknown",jsonb:"unknown",inet:"string",cidr:"string",macaddr:"string",macaddr8:"string",point:"{ x: number; y: number }",line:"string",lseg:"string",box:"string",path:"string",polygon:"string",circle:"string",ARRAY:"unknown[]"};function F(t,n){let{data_type:o,udt_name:e,is_nullable:r}=t;if(n.has(e)){let c=n.get(e).map(i=>`"${i}"`).join(" | ");return r==="YES"?`(${c}) | null`:c}if(o==="ARRAY"){let a=e.replace(/^_/,"");if(n.has(a)){let l=n.get(a).map(m=>`"${m}"`).join(" | ");return r==="YES"?`(${l})[] | null`:`(${l})[]`}let c=b[a]||"unknown";return r==="YES"?`${c}[] | null`:`${c}[]`}let s=b[o]||b[e]||"unknown";return r==="YES"&&(s=`${s} | null`),s}function _(t){return t.split(/[_\-\s]+/).map(n=>n.charAt(0).toUpperCase()+n.slice(1).toLowerCase()).join("")}function j(t,n){let o=_(t),e=n.map(r=>` | "${r}"`).join(`
48
- `);return `export type ${o} =
49
- ${e};`}function k(t,n,o){let e=_(t),r=[],s=[],a=[];for(let m of n){let g=F(m,o),y=m.column_name,v=m.column_default!==null||m.is_identity==="YES",A=m.is_nullable==="YES";r.push(` ${y}: ${g};`),v||m.column_name==="id"?s.push(` ${y}?: ${g.replace(" | null","")} | null;`):A?s.push(` ${y}?: ${g};`):s.push(` ${y}: ${g.replace(" | null","")};`),a.push(` ${y}?: ${g.replace(" | null","")} | null;`);}let c=`export interface ${e} {
50
- ${r.join(`
51
- `)}
52
- }`,i=`export interface ${e}Insert {
53
- ${s.join(`
54
- `)}
55
- }`,l=`export interface ${e}Update {
56
- ${a.join(`
57
- `)}
58
- }`;return {base:c,insert:i,update:l}}function U(t,n,o){let e=["/**"," * Auto-generated TypeScript types from database schema"," * Generated by @vaiftech/cli",` * Generated at: ${new Date().toISOString()}`," * "," * DO NOT EDIT MANUALLY - changes will be overwritten"," */",""];if(n.size>0){e.push("// ============ ENUMS ============"),e.push("");for(let[s,a]of n)e.push(j(s,a)),e.push("");}e.push("// ============ TABLES ============"),e.push("");let r=[];for(let[s,a]of t){let{base:c,insert:i,update:l}=k(s,a,n);r.push(s),e.push(c),e.push(""),e.push(i),e.push(""),e.push(l),e.push("");}e.push("// ============ DATABASE SCHEMA ============"),e.push(""),e.push("export interface Database {");for(let s of r){let a=_(s);e.push(` ${s}: {`),e.push(` Row: ${a};`),e.push(` Insert: ${a}Insert;`),e.push(` Update: ${a}Update;`),e.push(" };");}return e.push("}"),e.push(""),e.push("export type TableName = keyof Database;"),e.push(""),e.push("// ============ HELPER TYPES ============"),e.push(""),e.push('export type Row<T extends TableName> = Database[T]["Row"];'),e.push('export type Insert<T extends TableName> = Database[T]["Insert"];'),e.push('export type Update<T extends TableName> = Database[T]["Update"];'),e.push(""),e.join(`
59
- `)}async function X(t){let n=C("Loading configuration...").start();try{let o=await x(t.config),e=t.connection||o?.database?.url||process.env.DATABASE_URL;e||(n.fail("No database connection string provided"),console.log(u.yellow(`
60
- Provide a connection string via:`)),console.log(u.gray(" --connection <url>")),console.log(u.gray(" DATABASE_URL environment variable")),console.log(u.gray(" vaif.config.json database.url")),process.exit(1)),n.text="Connecting to database...";let r=new N.Client({connectionString:e});await r.connect(),n.text="Introspecting schema...";let{tables:s,enums:a,foreignKeys:c}=await O(r,t.schema);if(await r.end(),s.size===0){n.warn(`No tables found in schema "${t.schema}"`);return}n.text=`Generating types for ${s.size} tables...`;let i=U(s,a,c),l=await D.format(i,{parser:"typescript",semi:!0,singleQuote:!1,trailingComma:"es5",printWidth:100});if(t.dryRun){n.succeed("Generated types (dry run):"),console.log(""),console.log(u.gray("\u2500".repeat(60))),console.log(l),console.log(u.gray("\u2500".repeat(60)));return}let m=h.resolve(t.output),g=h.dirname(m);f.existsSync(g)||f.mkdirSync(g,{recursive:!0}),f.writeFileSync(m,l,"utf-8"),n.succeed(`Generated types for ${s.size} tables \u2192 ${u.cyan(t.output)}`),console.log(""),console.log(u.green("Generated:")),console.log(u.gray(` Tables: ${s.size}`)),console.log(u.gray(` Enums: ${a.size}`)),console.log(""),console.log(u.gray("Import in your code:")),console.log(u.cyan(` import type { Database, Row, Insert, Update } from "${t.output.replace(/\.ts$/,"")}";`));}catch(o){n.fail("Failed to generate types"),o instanceof Error&&(console.error(u.red(`
61
- Error: ${o.message}`)),o.message.includes("ECONNREFUSED")&&console.log(u.yellow(`
62
- Make sure your database is running and accessible.`))),process.exit(1);}}var L={$schema:"https://vaif.studio/schemas/config.json",projectId:"",database:{url:"${DATABASE_URL}",schema:"public"},types:{output:"./src/types/database.ts"},api:{baseUrl:"https://api.vaif.studio"}};async function re(t){let n=C("Initializing VAIF configuration...").start(),o=h.resolve("vaif.config.json");f.existsSync(o)&&!t.force&&(n.fail("vaif.config.json already exists"),console.log(u.yellow(`
63
- Use --force to overwrite existing configuration.`)),process.exit(1));try{f.writeFileSync(o,JSON.stringify(L,null,2),"utf-8"),n.succeed("Created vaif.config.json");let e=h.resolve(".env.example");if(f.existsSync(e)||(f.writeFileSync(e,`# VAIF Configuration
64
- DATABASE_URL=postgresql://user:password@localhost:5432/database
65
- VAIF_API_KEY=your-api-key
66
- `,"utf-8"),console.log(u.gray("Created .env.example"))),t.typescript){let r=h.resolve("src/types");f.existsSync(r)||(f.mkdirSync(r,{recursive:!0}),console.log(u.gray("Created src/types directory")));}console.log(""),console.log(u.green("VAIF initialized successfully!")),console.log(""),console.log(u.gray("Next steps:")),console.log(u.gray(" 1. Update vaif.config.json with your project ID")),console.log(u.gray(" 2. Set DATABASE_URL in your environment")),console.log(u.gray(" 3. Run: npx vaif generate")),console.log("");}catch(e){n.fail("Failed to initialize"),e instanceof Error&&console.error(u.red(`
67
- Error: ${e.message}`)),process.exit(1);}}export{x as a,X as b,re as c};