@vaiftech/cli 1.1.0 → 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/README.md +154 -74
- package/dist/chunk-VD3KS4ZK.js +1156 -0
- package/dist/cli.cjs +1131 -42
- package/dist/cli.js +19 -19
- package/dist/index.cjs +1119 -30
- package/dist/index.d.cts +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-7YZZOG47.js +0 -67
package/dist/index.d.cts
CHANGED
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export{b as generateTypes,
|
|
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
package/dist/chunk-7YZZOG47.js
DELETED
|
@@ -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};
|