@vaiftech/cli 1.0.0 → 1.0.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.
- package/README.md +11 -11
- package/dist/{chunk-IQB6LKJ7.js → chunk-7YZZOG47.js} +1 -1
- package/dist/cli.cjs +31 -19
- package/dist/cli.js +13 -1
- package/dist/index.cjs +2 -2
- package/dist/index.d.cts +3 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.js +2 -2
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
# @
|
|
1
|
+
# @vaiftech/cli
|
|
2
2
|
|
|
3
3
|
Command-line tools for VAIF Studio - a Backend-as-a-Service platform.
|
|
4
4
|
|
|
5
5
|
## Installation
|
|
6
6
|
|
|
7
7
|
```bash
|
|
8
|
-
npm install -D @
|
|
8
|
+
npm install -D @vaiftech/cli
|
|
9
9
|
# or
|
|
10
|
-
pnpm add -D @
|
|
10
|
+
pnpm add -D @vaiftech/cli
|
|
11
11
|
# or
|
|
12
|
-
yarn add -D @
|
|
12
|
+
yarn add -D @vaiftech/cli
|
|
13
13
|
```
|
|
14
14
|
|
|
15
15
|
## Features
|
|
@@ -33,7 +33,7 @@ npx vaif types generate --project <project-id> --output ./src/types/database.ts
|
|
|
33
33
|
#### Example Output
|
|
34
34
|
|
|
35
35
|
```typescript
|
|
36
|
-
// Generated by @
|
|
36
|
+
// Generated by @vaiftech/cli
|
|
37
37
|
|
|
38
38
|
export interface User {
|
|
39
39
|
id: string;
|
|
@@ -63,7 +63,7 @@ export interface Database {
|
|
|
63
63
|
### Programmatic Usage
|
|
64
64
|
|
|
65
65
|
```typescript
|
|
66
|
-
import { generateTypes } from '@
|
|
66
|
+
import { generateTypes } from '@vaiftech/cli';
|
|
67
67
|
|
|
68
68
|
const types = await generateTypes({
|
|
69
69
|
projectId: 'proj-123',
|
|
@@ -92,12 +92,12 @@ Then run without flags:
|
|
|
92
92
|
npx vaif types generate
|
|
93
93
|
```
|
|
94
94
|
|
|
95
|
-
## Usage with @
|
|
95
|
+
## Usage with @vaiftech/client
|
|
96
96
|
|
|
97
97
|
Use generated types with the client SDK:
|
|
98
98
|
|
|
99
99
|
```typescript
|
|
100
|
-
import { createVaifClient } from '@
|
|
100
|
+
import { createVaifClient } from '@vaiftech/client';
|
|
101
101
|
import type { User, Post, Database } from './types/vaif';
|
|
102
102
|
|
|
103
103
|
const vaif = createVaifClient({
|
|
@@ -112,9 +112,9 @@ const post = await vaif.from<Post>('posts').eq('id', 'post-123').single();
|
|
|
112
112
|
|
|
113
113
|
## Related Packages
|
|
114
114
|
|
|
115
|
-
- [@
|
|
116
|
-
- [@
|
|
117
|
-
- [@
|
|
115
|
+
- [@vaiftech/client](https://www.npmjs.com/package/@vaiftech/client) - Core client SDK
|
|
116
|
+
- [@vaiftech/react](https://www.npmjs.com/package/@vaiftech/react) - React hooks
|
|
117
|
+
- [@vaiftech/sdk-expo](https://www.npmjs.com/package/@vaiftech/sdk-expo) - React Native/Expo SDK
|
|
118
118
|
|
|
119
119
|
## License
|
|
120
120
|
|
|
@@ -55,7 +55,7 @@ ${s.join(`
|
|
|
55
55
|
}`,l=`export interface ${e}Update {
|
|
56
56
|
${a.join(`
|
|
57
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 @
|
|
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
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
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
61
|
Error: ${o.message}`)),o.message.includes("ECONNREFUSED")&&console.log(u.yellow(`
|
package/dist/cli.cjs
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
'use strict';var commander=require('commander'),
|
|
2
|
+
'use strict';var commander=require('commander'),v=require('fs'),E=require('path'),H=require('pg'),D=require('ora'),c=require('chalk'),Q=require('prettier'),q=require('dotenv'),ie=require('os'),re=require('readline');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var v__default=/*#__PURE__*/_interopDefault(v);var E__default=/*#__PURE__*/_interopDefault(E);var H__default=/*#__PURE__*/_interopDefault(H);var D__default=/*#__PURE__*/_interopDefault(D);var c__default=/*#__PURE__*/_interopDefault(c);var Q__default=/*#__PURE__*/_interopDefault(Q);var q__default=/*#__PURE__*/_interopDefault(q);var ie__default=/*#__PURE__*/_interopDefault(ie);var re__default=/*#__PURE__*/_interopDefault(re);q__default.default.config();async function I(n){let e=E__default.default.resolve(n);if(!v__default.default.existsSync(e))return null;try{let t=v__default.default.readFileSync(e,"utf-8"),o=JSON.parse(t);return o.database?.url&&(o.database.url=k(o.database.url)),o.api?.apiKey&&(o.api.apiKey=k(o.api.apiKey)),o}catch{throw new Error(`Failed to parse config file: ${n}`)}}function k(n){return n.replace(/\$\{([^}]+)\}/g,(e,t)=>process.env[t]||e)}async function X(n,e){let t=await n.query(`
|
|
3
3
|
SELECT table_name, table_type
|
|
4
4
|
FROM information_schema.tables
|
|
5
5
|
WHERE table_schema = $1
|
|
6
6
|
AND table_type = 'BASE TABLE'
|
|
7
7
|
ORDER BY table_name
|
|
8
|
-
`,[
|
|
8
|
+
`,[e]),o=await n.query(`
|
|
9
9
|
SELECT
|
|
10
10
|
table_name,
|
|
11
11
|
column_name,
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
FROM information_schema.columns
|
|
21
21
|
WHERE table_schema = $1
|
|
22
22
|
ORDER BY table_name, ordinal_position
|
|
23
|
-
`,[
|
|
23
|
+
`,[e]),s=await n.query(`
|
|
24
24
|
SELECT
|
|
25
25
|
tc.constraint_name,
|
|
26
26
|
tc.table_name,
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
AND ccu.table_schema = tc.table_schema
|
|
37
37
|
WHERE tc.constraint_type = 'FOREIGN KEY'
|
|
38
38
|
AND tc.table_schema = $1
|
|
39
|
-
`,[
|
|
39
|
+
`,[e]),r=await n.query(`
|
|
40
40
|
SELECT
|
|
41
41
|
t.typname as enum_name,
|
|
42
42
|
e.enumlabel as enum_value
|
|
@@ -45,24 +45,36 @@
|
|
|
45
45
|
JOIN pg_namespace n ON n.oid = t.typnamespace
|
|
46
46
|
WHERE n.nspname = $1
|
|
47
47
|
ORDER BY t.typname, e.enumsortorder
|
|
48
|
-
`,[
|
|
49
|
-
`);return `export type ${
|
|
50
|
-
${
|
|
51
|
-
${
|
|
48
|
+
`,[e]),a=new Map;for(let i of t.rows)a.set(i.table_name,[]);for(let i of o.rows){let p=a.get(i.table_name);p&&p.push(i);}let l=new Map;for(let i of r.rows){let p=l.get(i.enum_name)||[];p.push(i.enum_value),l.set(i.enum_name,p);}return {tables:a,enums:l,foreignKeys:s.rows}}var x={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 Z(n,e){let{data_type:t,udt_name:o,is_nullable:s}=n;if(e.has(o)){let l=e.get(o).map(i=>`"${i}"`).join(" | ");return s==="YES"?`(${l}) | null`:l}if(t==="ARRAY"){let a=o.replace(/^_/,"");if(e.has(a)){let p=e.get(a).map(u=>`"${u}"`).join(" | ");return s==="YES"?`(${p})[] | null`:`(${p})[]`}let l=x[a]||"unknown";return s==="YES"?`${l}[] | null`:`${l}[]`}let r=x[t]||x[o]||"unknown";return s==="YES"&&(r=`${r} | null`),r}function j(n){return n.split(/[_\-\s]+/).map(e=>e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()).join("")}function ee(n,e){let t=j(n),o=e.map(s=>` | "${s}"`).join(`
|
|
49
|
+
`);return `export type ${t} =
|
|
50
|
+
${o};`}function oe(n,e,t){let o=j(n),s=[],r=[],a=[];for(let u of e){let d=Z(u,t),b=u.column_name,K=u.column_default!==null||u.is_identity==="YES",G=u.is_nullable==="YES";s.push(` ${b}: ${d};`),K||u.column_name==="id"?r.push(` ${b}?: ${d.replace(" | null","")} | null;`):G?r.push(` ${b}?: ${d};`):r.push(` ${b}: ${d.replace(" | null","")};`),a.push(` ${b}?: ${d.replace(" | null","")} | null;`);}let l=`export interface ${o} {
|
|
51
|
+
${s.join(`
|
|
52
52
|
`)}
|
|
53
|
-
}`,i=`export interface ${
|
|
54
|
-
${
|
|
53
|
+
}`,i=`export interface ${o}Insert {
|
|
54
|
+
${r.join(`
|
|
55
55
|
`)}
|
|
56
|
-
}`,
|
|
56
|
+
}`,p=`export interface ${o}Update {
|
|
57
57
|
${a.join(`
|
|
58
58
|
`)}
|
|
59
|
-
}`;return {base:
|
|
60
|
-
`)}async function
|
|
61
|
-
Provide a connection string via:`)),console.log(
|
|
62
|
-
Error: ${
|
|
63
|
-
Make sure your database is running and accessible.`))),process.exit(1);}}var
|
|
64
|
-
Use --force to overwrite existing configuration.`)),process.exit(1));try{
|
|
59
|
+
}`;return {base:l,insert:i,update:p}}function ne(n,e,t){let o=["/**"," * 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(e.size>0){o.push("// ============ ENUMS ============"),o.push("");for(let[r,a]of e)o.push(ee(r,a)),o.push("");}o.push("// ============ TABLES ============"),o.push("");let s=[];for(let[r,a]of n){let{base:l,insert:i,update:p}=oe(r,a,e);s.push(r),o.push(l),o.push(""),o.push(i),o.push(""),o.push(p),o.push("");}o.push("// ============ DATABASE SCHEMA ============"),o.push(""),o.push("export interface Database {");for(let r of s){let a=j(r);o.push(` ${r}: {`),o.push(` Row: ${a};`),o.push(` Insert: ${a}Insert;`),o.push(` Update: ${a}Update;`),o.push(" };");}return o.push("}"),o.push(""),o.push("export type TableName = keyof Database;"),o.push(""),o.push("// ============ HELPER TYPES ============"),o.push(""),o.push('export type Row<T extends TableName> = Database[T]["Row"];'),o.push('export type Insert<T extends TableName> = Database[T]["Insert"];'),o.push('export type Update<T extends TableName> = Database[T]["Update"];'),o.push(""),o.join(`
|
|
60
|
+
`)}async function F(n){let e=D__default.default("Loading configuration...").start();try{let t=await I(n.config),o=n.connection||t?.database?.url||process.env.DATABASE_URL;o||(e.fail("No database connection string provided"),console.log(c__default.default.yellow(`
|
|
61
|
+
Provide a connection string via:`)),console.log(c__default.default.gray(" --connection <url>")),console.log(c__default.default.gray(" DATABASE_URL environment variable")),console.log(c__default.default.gray(" vaif.config.json database.url")),process.exit(1)),e.text="Connecting to database...";let s=new H__default.default.Client({connectionString:o});await s.connect(),e.text="Introspecting schema...";let{tables:r,enums:a,foreignKeys:l}=await X(s,n.schema);if(await s.end(),r.size===0){e.warn(`No tables found in schema "${n.schema}"`);return}e.text=`Generating types for ${r.size} tables...`;let i=ne(r,a,l),p=await Q__default.default.format(i,{parser:"typescript",semi:!0,singleQuote:!1,trailingComma:"es5",printWidth:100});if(n.dryRun){e.succeed("Generated types (dry run):"),console.log(""),console.log(c__default.default.gray("\u2500".repeat(60))),console.log(p),console.log(c__default.default.gray("\u2500".repeat(60)));return}let u=E__default.default.resolve(n.output),d=E__default.default.dirname(u);v__default.default.existsSync(d)||v__default.default.mkdirSync(d,{recursive:!0}),v__default.default.writeFileSync(u,p,"utf-8"),e.succeed(`Generated types for ${r.size} tables \u2192 ${c__default.default.cyan(n.output)}`),console.log(""),console.log(c__default.default.green("Generated:")),console.log(c__default.default.gray(` Tables: ${r.size}`)),console.log(c__default.default.gray(` Enums: ${a.size}`)),console.log(""),console.log(c__default.default.gray("Import in your code:")),console.log(c__default.default.cyan(` import type { Database, Row, Insert, Update } from "${n.output.replace(/\.ts$/,"")}";`));}catch(t){e.fail("Failed to generate types"),t instanceof Error&&(console.error(c__default.default.red(`
|
|
62
|
+
Error: ${t.message}`)),t.message.includes("ECONNREFUSED")&&console.log(c__default.default.yellow(`
|
|
63
|
+
Make sure your database is running and accessible.`))),process.exit(1);}}var se={$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 N(n){let e=D__default.default("Initializing VAIF configuration...").start(),t=E__default.default.resolve("vaif.config.json");v__default.default.existsSync(t)&&!n.force&&(e.fail("vaif.config.json already exists"),console.log(c__default.default.yellow(`
|
|
64
|
+
Use --force to overwrite existing configuration.`)),process.exit(1));try{v__default.default.writeFileSync(t,JSON.stringify(se,null,2),"utf-8"),e.succeed("Created vaif.config.json");let o=E__default.default.resolve(".env.example");if(v__default.default.existsSync(o)||(v__default.default.writeFileSync(o,`# VAIF Configuration
|
|
65
65
|
DATABASE_URL=postgresql://user:password@localhost:5432/database
|
|
66
66
|
VAIF_API_KEY=your-api-key
|
|
67
|
-
`,"utf-8"),console.log(
|
|
68
|
-
Error: ${
|
|
67
|
+
`,"utf-8"),console.log(c__default.default.gray("Created .env.example"))),n.typescript){let s=E__default.default.resolve("src/types");v__default.default.existsSync(s)||(v__default.default.mkdirSync(s,{recursive:!0}),console.log(c__default.default.gray("Created src/types directory")));}console.log(""),console.log(c__default.default.green("VAIF initialized successfully!")),console.log(""),console.log(c__default.default.gray("Next steps:")),console.log(c__default.default.gray(" 1. Update vaif.config.json with your project ID")),console.log(c__default.default.gray(" 2. Set DATABASE_URL in your environment")),console.log(c__default.default.gray(" 3. Run: npx vaif generate")),console.log("");}catch(o){e.fail("Failed to initialize"),o instanceof Error&&console.error(c__default.default.red(`
|
|
68
|
+
Error: ${o.message}`)),process.exit(1);}}var C=E__default.default.join(ie__default.default.homedir(),".vaif"),w=E__default.default.join(C,"auth.json"),ae=process.env.VAIF_API_URL||"https://api.vaif.studio";function ce(){v__default.default.existsSync(C)||v__default.default.mkdirSync(C,{recursive:true});}function le(n){ce(),v__default.default.writeFileSync(w,JSON.stringify(n,null,2),"utf-8"),v__default.default.chmodSync(w,384);}function A(){if(!v__default.default.existsSync(w))return null;try{let n=v__default.default.readFileSync(w,"utf-8");return JSON.parse(n)}catch{return null}}function ge(n){let e=re__default.default.createInterface({input:process.stdin,output:process.stdout});return new Promise(t=>{e.question(n,o=>{e.close(),t(o);});})}async function O(n){try{let e=await fetch(`${ae}/v1/auth/me`,{headers:{Authorization:`Bearer ${n}`}});return e.ok?{valid:!0,email:(await e.json()).email}:{valid:!1}}catch{return {valid:false}}}async function L(n){let e=D__default.default();console.log(""),console.log(c__default.default.bold("Welcome to VAIF CLI")),console.log(c__default.default.gray("Authenticate to access your VAIF projects")),console.log("");let t=n.token;t||(console.log(c__default.default.gray("To get your API token:")),console.log(c__default.default.gray(" 1. Go to https://vaif.studio/settings/api-keys")),console.log(c__default.default.gray(" 2. Create a new API key or copy an existing one")),console.log(""),t=await ge(c__default.default.cyan("Enter your API token: ")),(!t||t.trim()==="")&&(console.log(c__default.default.red(`
|
|
69
|
+
No token provided. Login cancelled.`)),process.exit(1))),e.start("Validating token...");let{valid:o,email:s}=await O(t.trim());o||(e.fail("Invalid token"),console.log(c__default.default.red(`
|
|
70
|
+
The provided token is invalid or expired.`)),console.log(c__default.default.gray("Please check your token and try again.")),process.exit(1));let r={token:t.trim(),email:s,projectId:n.projectId,expiresAt:new Date(Date.now()+720*60*60*1e3).toISOString()};le(r),e.succeed("Logged in successfully"),console.log(""),s&&console.log(c__default.default.green(` Authenticated as: ${s}`)),console.log(c__default.default.gray(` Config saved to: ${w}`)),console.log(""),console.log(c__default.default.gray("You can now use VAIF CLI commands like:")),console.log(c__default.default.gray(" vaif pull - Pull remote schema")),console.log(c__default.default.gray(" vaif push - Push schema changes")),console.log(c__default.default.gray(" vaif generate - Generate TypeScript types")),console.log("");}async function V(){v__default.default.existsSync(w)?(v__default.default.unlinkSync(w),console.log(c__default.default.green("Logged out successfully"))):console.log(c__default.default.yellow("Not currently logged in"));}async function U(){let n=A();(!n||!n.token)&&(console.log(c__default.default.yellow("Not logged in")),console.log(c__default.default.gray("Run `vaif login` to authenticate")),process.exit(1));let e=D__default.default("Checking authentication...").start(),{valid:t,email:o}=await O(n.token);t||(e.fail("Session expired"),console.log(c__default.default.yellow(`
|
|
71
|
+
Your session has expired. Please login again.`)),process.exit(1)),e.succeed("Authenticated"),console.log(""),console.log(c__default.default.green(` Email: ${o||n.email||"Unknown"}`)),n.projectId&&console.log(c__default.default.green(` Project: ${n.projectId}`)),console.log("");}var fe=process.env.VAIF_API_URL||"https://api.vaif.studio";async function de(n,e,t="public"){let o=await fetch(`${fe}/v1/projects/${e}/schema?schema=${t}`,{headers:{Authorization:`Bearer ${n}`,"Content-Type":"application/json"}});if(!o.ok){let s=await o.text();throw new Error(`Failed to fetch schema: ${s}`)}return o.json()}async function z(n){let e=D__default.default(),t=A();(!t||!t.token)&&(console.log(c__default.default.red("Not logged in")),console.log(c__default.default.gray("Run `vaif login` first to authenticate")),process.exit(1));let o=n.config||"vaif.config.json",s=null;e.start("Loading configuration...");try{s=await I(o);}catch(a){e.fail("Failed to load config"),console.log(c__default.default.red(`
|
|
72
|
+
Error: ${a}`)),process.exit(1);}s||(e.fail("No configuration found"),console.log(c__default.default.yellow("\nRun `vaif init` to create a configuration file.")),process.exit(1));let r=n.projectId||s.projectId||t.projectId;r||(e.fail("No project ID specified"),console.log(c__default.default.yellow(`
|
|
73
|
+
Set projectId in vaif.config.json or use --project-id flag.`)),process.exit(1)),e.text="Fetching remote schema...";try{let a=n.schema||s.database?.schema||"public",l=await de(t.token,r,a);e.succeed("Schema fetched successfully");let i=n.output||E__default.default.resolve("vaif.schema.json"),p={$schema:"https://vaif.studio/schemas/schema.json",projectId:r,schema:a,pulledAt:new Date().toISOString(),...l};v__default.default.writeFileSync(i,JSON.stringify(p,null,2),"utf-8"),console.log(""),console.log(c__default.default.green(`Schema saved to: ${i}`)),console.log(""),console.log(c__default.default.gray("Schema summary:")),console.log(c__default.default.gray(` Tables: ${(l.tables||[]).length}`)),console.log(c__default.default.gray(` Enums: ${(l.enums||[]).length}`)),console.log(c__default.default.gray(` Functions: ${(l.functions||[]).length}`)),console.log(""),console.log(c__default.default.gray("Next steps:")),console.log(c__default.default.gray(" - Run `vaif generate` to generate TypeScript types")),console.log(c__default.default.gray(" - Edit the schema and run `vaif push` to deploy changes")),console.log("");}catch(a){e.fail("Failed to fetch schema"),a instanceof Error&&console.log(c__default.default.red(`
|
|
74
|
+
Error: ${a.message}`)),process.exit(1);}}var Y=process.env.VAIF_API_URL||"https://api.vaif.studio";function ve(n){let e=re__default.default.createInterface({input:process.stdin,output:process.stdout});return new Promise(t=>{e.question(n,o=>{e.close(),t(o);});})}async function we(n,e,t){let o=await fetch(`${Y}/v1/projects/${e}/schema/preview`,{method:"POST",headers:{Authorization:`Bearer ${n}`,"Content-Type":"application/json"},body:JSON.stringify({schema:t})});if(!o.ok){let s=await o.text();throw new Error(`Failed to preview changes: ${s}`)}return o.json()}async function _e(n,e,t){let o=await fetch(`${Y}/v1/projects/${e}/schema/apply`,{method:"POST",headers:{Authorization:`Bearer ${n}`,"Content-Type":"application/json"},body:JSON.stringify({schema:t})});if(!o.ok){let s=await o.text();throw new Error(`Failed to apply changes: ${s}`)}return o.json()}function Ie(n){if(console.log(""),console.log(c__default.default.bold("Schema Changes:")),console.log(""),n.added.length===0&&n.modified.length===0&&n.removed.length===0){console.log(c__default.default.gray(" No changes detected. Schema is up to date."));return}if(n.added.length>0){console.log(c__default.default.green.bold(" + Added:"));for(let e of n.added)console.log(c__default.default.green(` + ${e.type}: ${e.name}`));console.log("");}if(n.modified.length>0){console.log(c__default.default.yellow.bold(" ~ Modified:"));for(let e of n.modified){console.log(c__default.default.yellow(` ~ ${e.type}: ${e.name}`));for(let t of e.changes)console.log(c__default.default.gray(` ${t}`));}console.log("");}if(n.removed.length>0){console.log(c__default.default.red.bold(" - Removed:"));for(let e of n.removed)console.log(c__default.default.red(` - ${e.type}: ${e.name}`));console.log("");}}async function B(n){let e=D__default.default(),t=A();(!t||!t.token)&&(console.log(c__default.default.red("Not logged in")),console.log(c__default.default.gray("Run `vaif login` first to authenticate")),process.exit(1));let o=n.config||"vaif.config.json",s=null;e.start("Loading configuration...");try{s=await I(o);}catch(i){e.fail("Failed to load config"),console.log(c__default.default.red(`
|
|
75
|
+
Error: ${i}`)),process.exit(1);}s||(e.fail("No configuration found"),console.log(c__default.default.yellow("\nRun `vaif init` to create a configuration file.")),process.exit(1));let r=n.projectId||s.projectId||t.projectId;r||(e.fail("No project ID specified"),console.log(c__default.default.yellow(`
|
|
76
|
+
Set projectId in vaif.config.json or use --project-id flag.`)),process.exit(1));let a=n.schema||E__default.default.resolve("vaif.schema.json");v__default.default.existsSync(a)||(e.fail("No local schema found"),console.log(c__default.default.yellow(`
|
|
77
|
+
Expected schema file at: ${a}`)),console.log(c__default.default.gray("Run `vaif pull` first to fetch the current schema.")),process.exit(1));let l;try{let i=v__default.default.readFileSync(a,"utf-8");l=JSON.parse(i);}catch(i){e.fail("Failed to parse schema file"),i instanceof Error&&console.log(c__default.default.red(`
|
|
78
|
+
Error: ${i.message}`)),process.exit(1);}e.text="Calculating schema changes...";try{let{diff:i,sql:p}=await we(t.token,r,l);if(e.stop(),Ie(i),i.added.length===0&&i.modified.length===0&&i.removed.length===0){console.log("");return}if(p.length>0){console.log(c__default.default.bold("SQL Migrations:")),console.log("");for(let d of p)console.log(c__default.default.gray(` ${d}`));console.log("");}if(n.dryRun){console.log(c__default.default.yellow("Dry run mode - no changes applied.")),console.log(c__default.default.gray("Remove --dry-run to apply these changes."));return}if(!n.force){i.removed.length>0&&(console.log(c__default.default.red.bold("\u26A0\uFE0F Warning: This will remove tables/columns from your database.")),console.log(c__default.default.red(" This action cannot be undone!")),console.log(""));let b=await ve(c__default.default.cyan("Apply these changes? [y/N] "));if(b.toLowerCase()!=="y"&&b.toLowerCase()!=="yes"){console.log(c__default.default.yellow(`
|
|
79
|
+
Cancelled. No changes applied.`));return}}e.start("Applying schema changes...");let u=await _e(t.token,r,l);if(u.success){if(e.succeed("Schema changes applied successfully"),console.log(""),u.migrations.length>0){console.log(c__default.default.gray("Migrations applied:"));for(let d of u.migrations)console.log(c__default.default.gray(` - ${d}`));console.log("");}console.log(c__default.default.green("Your database schema is now up to date.")),console.log(c__default.default.gray("Run `vaif generate` to update your TypeScript types.")),console.log("");}else e.fail("Failed to apply some changes");}catch(i){e.fail("Failed to push schema changes"),i instanceof Error&&console.log(c__default.default.red(`
|
|
80
|
+
Error: ${i.message}`)),process.exit(1);}}commander.program.name("vaif").description("VAIF CLI - Type generation and development tools").version("1.0.1");commander.program.command("login").description("Authenticate with VAIF").option("-t, --token <token>","API token (will prompt if not provided)").option("-p, --project-id <id>","Default project ID").action(L);commander.program.command("logout").description("Log out and remove stored credentials").action(V);commander.program.command("whoami").description("Show current authenticated user").action(U);commander.program.command("init").description("Initialize VAIF configuration in your project").option("--typescript","Setup for TypeScript project").option("-f, --force","Overwrite existing config").action(N);commander.program.command("pull").description("Pull database schema from your VAIF project").option("-c, --config <path>","Config file path","vaif.config.json").option("-o, --output <path>","Output file path","vaif.schema.json").option("-s, --schema <name>","Schema name","public").option("-p, --project-id <id>","Project ID (overrides config)").action(z);commander.program.command("push").description("Push local schema changes to your VAIF project").option("-c, --config <path>","Config file path","vaif.config.json").option("-s, --schema <path>","Schema file path","vaif.schema.json").option("-p, --project-id <id>","Project ID (overrides config)").option("--dry-run","Preview changes without applying").option("-f, --force","Apply changes without confirmation").action(B);commander.program.command("generate").alias("gen").description("Generate TypeScript types from your database schema").option("-c, --connection <url>","Database connection string").option("-o, --output <path>","Output file path","./src/types/database.ts").option("--schema <name>","Schema name","public").option("--config <path>","Config file path","vaif.config.json").option("--dry-run","Preview generated types without writing").action(F);commander.program.parse(process.argv);process.argv.slice(2).length||commander.program.outputHelp();
|
package/dist/cli.js
CHANGED
|
@@ -1,2 +1,14 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {b,
|
|
2
|
+
import {c,b as b$1,a}from'./chunk-7YZZOG47.js';import {program}from'commander';import d from'fs';import x from'path';import D from'os';import $ from'ora';import t from'chalk';import T from'readline';var I=x.join(D.homedir(),".vaif"),u=x.join(I,"auth.json"),E=process.env.VAIF_API_URL||"https://api.vaif.studio";function _(){d.existsSync(I)||d.mkdirSync(I,{recursive:true});}function U(e){_(),d.writeFileSync(u,JSON.stringify(e,null,2),"utf-8"),d.chmodSync(u,384);}function m(){if(!d.existsSync(u))return null;try{let e=d.readFileSync(u,"utf-8");return JSON.parse(e)}catch{return null}}function J(e){let o=T.createInterface({input:process.stdin,output:process.stdout});return new Promise(n=>{o.question(e,i=>{o.close(),n(i);});})}async function C(e){try{let o=await fetch(`${E}/v1/auth/me`,{headers:{Authorization:`Bearer ${e}`}});return o.ok?{valid:!0,email:(await o.json()).email}:{valid:!1}}catch{return {valid:false}}}async function F(e){let o=$();console.log(""),console.log(t.bold("Welcome to VAIF CLI")),console.log(t.gray("Authenticate to access your VAIF projects")),console.log("");let n=e.token;n||(console.log(t.gray("To get your API token:")),console.log(t.gray(" 1. Go to https://vaif.studio/settings/api-keys")),console.log(t.gray(" 2. Create a new API key or copy an existing one")),console.log(""),n=await J(t.cyan("Enter your API token: ")),(!n||n.trim()==="")&&(console.log(t.red(`
|
|
3
|
+
No token provided. Login cancelled.`)),process.exit(1))),o.start("Validating token...");let{valid:i,email:r}=await C(n.trim());i||(o.fail("Invalid token"),console.log(t.red(`
|
|
4
|
+
The provided token is invalid or expired.`)),console.log(t.gray("Please check your token and try again.")),process.exit(1));let p={token:n.trim(),email:r,projectId:e.projectId,expiresAt:new Date(Date.now()+720*60*60*1e3).toISOString()};U(p),o.succeed("Logged in successfully"),console.log(""),r&&console.log(t.green(` Authenticated as: ${r}`)),console.log(t.gray(` Config saved to: ${u}`)),console.log(""),console.log(t.gray("You can now use VAIF CLI commands like:")),console.log(t.gray(" vaif pull - Pull remote schema")),console.log(t.gray(" vaif push - Push schema changes")),console.log(t.gray(" vaif generate - Generate TypeScript types")),console.log("");}async function b(){d.existsSync(u)?(d.unlinkSync(u),console.log(t.green("Logged out successfully"))):console.log(t.yellow("Not currently logged in"));}async function N(){let e=m();(!e||!e.token)&&(console.log(t.yellow("Not logged in")),console.log(t.gray("Run `vaif login` to authenticate")),process.exit(1));let o=$("Checking authentication...").start(),{valid:n,email:i}=await C(e.token);n||(o.fail("Session expired"),console.log(t.yellow(`
|
|
5
|
+
Your session has expired. Please login again.`)),process.exit(1)),o.succeed("Authenticated"),console.log(""),console.log(t.green(` Email: ${i||e.email||"Unknown"}`)),e.projectId&&console.log(t.green(` Project: ${e.projectId}`)),console.log("");}var G=process.env.VAIF_API_URL||"https://api.vaif.studio";async function M(e,o,n="public"){let i=await fetch(`${G}/v1/projects/${o}/schema?schema=${n}`,{headers:{Authorization:`Bearer ${e}`,"Content-Type":"application/json"}});if(!i.ok){let r=await i.text();throw new Error(`Failed to fetch schema: ${r}`)}return i.json()}async function L(e){let o=$(),n=m();(!n||!n.token)&&(console.log(t.red("Not logged in")),console.log(t.gray("Run `vaif login` first to authenticate")),process.exit(1));let i=e.config||"vaif.config.json",r=null;o.start("Loading configuration...");try{r=await a(i);}catch(l){o.fail("Failed to load config"),console.log(t.red(`
|
|
6
|
+
Error: ${l}`)),process.exit(1);}r||(o.fail("No configuration found"),console.log(t.yellow("\nRun `vaif init` to create a configuration file.")),process.exit(1));let p=e.projectId||r.projectId||n.projectId;p||(o.fail("No project ID specified"),console.log(t.yellow(`
|
|
7
|
+
Set projectId in vaif.config.json or use --project-id flag.`)),process.exit(1)),o.text="Fetching remote schema...";try{let l=e.schema||r.database?.schema||"public",f=await M(n.token,p,l);o.succeed("Schema fetched successfully");let a=e.output||x.resolve("vaif.schema.json"),h={$schema:"https://vaif.studio/schemas/schema.json",projectId:p,schema:l,pulledAt:new Date().toISOString(),...f};d.writeFileSync(a,JSON.stringify(h,null,2),"utf-8"),console.log(""),console.log(t.green(`Schema saved to: ${a}`)),console.log(""),console.log(t.gray("Schema summary:")),console.log(t.gray(` Tables: ${(f.tables||[]).length}`)),console.log(t.gray(` Enums: ${(f.enums||[]).length}`)),console.log(t.gray(` Functions: ${(f.functions||[]).length}`)),console.log(""),console.log(t.gray("Next steps:")),console.log(t.gray(" - Run `vaif generate` to generate TypeScript types")),console.log(t.gray(" - Edit the schema and run `vaif push` to deploy changes")),console.log("");}catch(l){o.fail("Failed to fetch schema"),l instanceof Error&&console.log(t.red(`
|
|
8
|
+
Error: ${l.message}`)),process.exit(1);}}var O=process.env.VAIF_API_URL||"https://api.vaif.studio";function Q(e){let o=T.createInterface({input:process.stdin,output:process.stdout});return new Promise(n=>{o.question(e,i=>{o.close(),n(i);});})}async function K(e,o,n){let i=await fetch(`${O}/v1/projects/${o}/schema/preview`,{method:"POST",headers:{Authorization:`Bearer ${e}`,"Content-Type":"application/json"},body:JSON.stringify({schema:n})});if(!i.ok){let r=await i.text();throw new Error(`Failed to preview changes: ${r}`)}return i.json()}async function X(e,o,n){let i=await fetch(`${O}/v1/projects/${o}/schema/apply`,{method:"POST",headers:{Authorization:`Bearer ${e}`,"Content-Type":"application/json"},body:JSON.stringify({schema:n})});if(!i.ok){let r=await i.text();throw new Error(`Failed to apply changes: ${r}`)}return i.json()}function Z(e){if(console.log(""),console.log(t.bold("Schema Changes:")),console.log(""),e.added.length===0&&e.modified.length===0&&e.removed.length===0){console.log(t.gray(" No changes detected. Schema is up to date."));return}if(e.added.length>0){console.log(t.green.bold(" + Added:"));for(let o of e.added)console.log(t.green(` + ${o.type}: ${o.name}`));console.log("");}if(e.modified.length>0){console.log(t.yellow.bold(" ~ Modified:"));for(let o of e.modified){console.log(t.yellow(` ~ ${o.type}: ${o.name}`));for(let n of o.changes)console.log(t.gray(` ${n}`));}console.log("");}if(e.removed.length>0){console.log(t.red.bold(" - Removed:"));for(let o of e.removed)console.log(t.red(` - ${o.type}: ${o.name}`));console.log("");}}async function R(e){let o=$(),n=m();(!n||!n.token)&&(console.log(t.red("Not logged in")),console.log(t.gray("Run `vaif login` first to authenticate")),process.exit(1));let i=e.config||"vaif.config.json",r=null;o.start("Loading configuration...");try{r=await a(i);}catch(a){o.fail("Failed to load config"),console.log(t.red(`
|
|
9
|
+
Error: ${a}`)),process.exit(1);}r||(o.fail("No configuration found"),console.log(t.yellow("\nRun `vaif init` to create a configuration file.")),process.exit(1));let p=e.projectId||r.projectId||n.projectId;p||(o.fail("No project ID specified"),console.log(t.yellow(`
|
|
10
|
+
Set projectId in vaif.config.json or use --project-id flag.`)),process.exit(1));let l=e.schema||x.resolve("vaif.schema.json");d.existsSync(l)||(o.fail("No local schema found"),console.log(t.yellow(`
|
|
11
|
+
Expected schema file at: ${l}`)),console.log(t.gray("Run `vaif pull` first to fetch the current schema.")),process.exit(1));let f;try{let a=d.readFileSync(l,"utf-8");f=JSON.parse(a);}catch(a){o.fail("Failed to parse schema file"),a instanceof Error&&console.log(t.red(`
|
|
12
|
+
Error: ${a.message}`)),process.exit(1);}o.text="Calculating schema changes...";try{let{diff:a,sql:h}=await K(n.token,p,f);if(o.stop(),Z(a),a.added.length===0&&a.modified.length===0&&a.removed.length===0){console.log("");return}if(h.length>0){console.log(t.bold("SQL Migrations:")),console.log("");for(let y of h)console.log(t.gray(` ${y}`));console.log("");}if(e.dryRun){console.log(t.yellow("Dry run mode - no changes applied.")),console.log(t.gray("Remove --dry-run to apply these changes."));return}if(!e.force){a.removed.length>0&&(console.log(t.red.bold("\u26A0\uFE0F Warning: This will remove tables/columns from your database.")),console.log(t.red(" This action cannot be undone!")),console.log(""));let S=await Q(t.cyan("Apply these changes? [y/N] "));if(S.toLowerCase()!=="y"&&S.toLowerCase()!=="yes"){console.log(t.yellow(`
|
|
13
|
+
Cancelled. No changes applied.`));return}}o.start("Applying schema changes...");let w=await X(n.token,p,f);if(w.success){if(o.succeed("Schema changes applied successfully"),console.log(""),w.migrations.length>0){console.log(t.gray("Migrations applied:"));for(let y of w.migrations)console.log(t.gray(` - ${y}`));console.log("");}console.log(t.green("Your database schema is now up to date.")),console.log(t.gray("Run `vaif generate` to update your TypeScript types.")),console.log("");}else o.fail("Failed to apply some changes");}catch(a){o.fail("Failed to push schema changes"),a instanceof Error&&console.log(t.red(`
|
|
14
|
+
Error: ${a.message}`)),process.exit(1);}}program.name("vaif").description("VAIF CLI - Type generation and development tools").version("1.0.1");program.command("login").description("Authenticate with VAIF").option("-t, --token <token>","API token (will prompt if not provided)").option("-p, --project-id <id>","Default project ID").action(F);program.command("logout").description("Log out and remove stored credentials").action(b);program.command("whoami").description("Show current authenticated user").action(N);program.command("init").description("Initialize VAIF configuration in your project").option("--typescript","Setup for TypeScript project").option("-f, --force","Overwrite existing config").action(c);program.command("pull").description("Pull database schema from your VAIF project").option("-c, --config <path>","Config file path","vaif.config.json").option("-o, --output <path>","Output file path","vaif.schema.json").option("-s, --schema <name>","Schema name","public").option("-p, --project-id <id>","Project ID (overrides config)").action(L);program.command("push").description("Push local schema changes to your VAIF project").option("-c, --config <path>","Config file path","vaif.config.json").option("-s, --schema <path>","Schema file path","vaif.schema.json").option("-p, --project-id <id>","Project ID (overrides config)").option("--dry-run","Preview changes without applying").option("-f, --force","Apply changes without confirmation").action(R);program.command("generate").alias("gen").description("Generate TypeScript types from your database schema").option("-c, --connection <url>","Database connection string").option("-o, --output <path>","Output file path","./src/types/database.ts").option("--schema <name>","Schema name","public").option("--config <path>","Config file path","vaif.config.json").option("--dry-run","Preview generated types without writing").action(b$1);program.parse(process.argv);process.argv.slice(2).length||program.outputHelp();
|
package/dist/index.cjs
CHANGED
|
@@ -55,7 +55,7 @@ ${a.join(`
|
|
|
55
55
|
}`,u=`export interface ${e}Update {
|
|
56
56
|
${o.join(`
|
|
57
57
|
`)}
|
|
58
|
-
}`;return {base:l,insert:i,update:u}}function U(s,t,n){let e=["/**"," * Auto-generated TypeScript types from database schema"," * Generated by @
|
|
58
|
+
}`;return {base:l,insert:i,update:u}}function U(s,t,n){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(t.size>0){e.push("// ============ ENUMS ============"),e.push("");for(let[a,o]of t)e.push(M(a,o)),e.push("");}e.push("// ============ TABLES ============"),e.push("");let r=[];for(let[a,o]of s){let{base:l,insert:i,update:u}=Y(a,o,t);r.push(a),e.push(l),e.push(""),e.push(i),e.push(""),e.push(u),e.push("");}e.push("// ============ DATABASE SCHEMA ============"),e.push(""),e.push("export interface Database {");for(let a of r){let o=T(a);e.push(` ${a}: {`),e.push(` Row: ${o};`),e.push(` Insert: ${o}Insert;`),e.push(` Update: ${o}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
59
|
`)}async function k(s){let t=D__default.default("Loading configuration...").start();try{let n=await _(s.config),e=s.connection||n?.database?.url||process.env.DATABASE_URL;e||(t.fail("No database connection string provided"),console.log(m__default.default.yellow(`
|
|
60
60
|
Provide a connection string via:`)),console.log(m__default.default.gray(" --connection <url>")),console.log(m__default.default.gray(" DATABASE_URL environment variable")),console.log(m__default.default.gray(" vaif.config.json database.url")),process.exit(1)),t.text="Connecting to database...";let r=new C__default.default.Client({connectionString:e});await r.connect(),t.text="Introspecting schema...";let{tables:a,enums:o,foreignKeys:l}=await F(r,s.schema);if(await r.end(),a.size===0){t.warn(`No tables found in schema "${s.schema}"`);return}t.text=`Generating types for ${a.size} tables...`;let i=U(a,o,l),u=await O__default.default.format(i,{parser:"typescript",semi:!0,singleQuote:!1,trailingComma:"es5",printWidth:100});if(s.dryRun){t.succeed("Generated types (dry run):"),console.log(""),console.log(m__default.default.gray("\u2500".repeat(60))),console.log(u),console.log(m__default.default.gray("\u2500".repeat(60)));return}let c=w__default.default.resolve(s.output),p=w__default.default.dirname(c);b__default.default.existsSync(p)||b__default.default.mkdirSync(p,{recursive:!0}),b__default.default.writeFileSync(c,u,"utf-8"),t.succeed(`Generated types for ${a.size} tables \u2192 ${m__default.default.cyan(s.output)}`),console.log(""),console.log(m__default.default.green("Generated:")),console.log(m__default.default.gray(` Tables: ${a.size}`)),console.log(m__default.default.gray(` Enums: ${o.size}`)),console.log(""),console.log(m__default.default.gray("Import in your code:")),console.log(m__default.default.cyan(` import type { Database, Row, Insert, Update } from "${s.output.replace(/\.ts$/,"")}";`));}catch(n){t.fail("Failed to generate types"),n instanceof Error&&(console.error(m__default.default.red(`
|
|
61
61
|
Error: ${n.message}`)),n.message.includes("ECONNREFUSED")&&console.log(m__default.default.yellow(`
|
|
@@ -94,7 +94,7 @@ Error: ${e.message}`)),process.exit(1);}}async function be(s){let{connectionStri
|
|
|
94
94
|
JOIN pg_namespace n ON n.oid = t.typnamespace
|
|
95
95
|
WHERE n.nspname = $1
|
|
96
96
|
ORDER BY t.typname, e.enumsortorder
|
|
97
|
-
`,[n]),l=new Map;for(let c of r.rows)l.set(c.table_name,[]);for(let c of a.rows){let p=l.get(c.table_name);p&&p.push(c);}let i=new Map;for(let c of o.rows){let p=i.get(c.enum_name)||[];p.push(c.enum_value),i.set(c.enum_name,p);}let u=G(l,i);return O__default.default.format(u,{parser:"typescript",semi:!0,singleQuote:!1,trailingComma:"es5",printWidth:100})}finally{await e.end();}}var x={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",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",point:"{ x: number; y: number }",ARRAY:"unknown[]"};function K(s,t){let{data_type:n,udt_name:e,is_nullable:r}=s;if(t.has(e)){let l=t.get(e).map(i=>`"${i}"`).join(" | ");return r==="YES"?`(${l}) | null`:l}if(n==="ARRAY"){let o=e.replace(/^_/,"");if(t.has(o)){let u=t.get(o).map(c=>`"${c}"`).join(" | ");return r==="YES"?`(${u})[] | null`:`(${u})[]`}let l=x[o]||"unknown";return r==="YES"?`${l}[] | null`:`${l}[]`}let a=x[n]||x[e]||"unknown";return r==="YES"&&(a=`${a} | null`),a}function S(s){return s.split(/[_\-\s]+/).map(t=>t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join("")}function G(s,t){let n=["/**"," * Auto-generated TypeScript types from database schema"," * Generated by @
|
|
97
|
+
`,[n]),l=new Map;for(let c of r.rows)l.set(c.table_name,[]);for(let c of a.rows){let p=l.get(c.table_name);p&&p.push(c);}let i=new Map;for(let c of o.rows){let p=i.get(c.enum_name)||[];p.push(c.enum_value),i.set(c.enum_name,p);}let u=G(l,i);return O__default.default.format(u,{parser:"typescript",semi:!0,singleQuote:!1,trailingComma:"es5",printWidth:100})}finally{await e.end();}}var x={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",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",point:"{ x: number; y: number }",ARRAY:"unknown[]"};function K(s,t){let{data_type:n,udt_name:e,is_nullable:r}=s;if(t.has(e)){let l=t.get(e).map(i=>`"${i}"`).join(" | ");return r==="YES"?`(${l}) | null`:l}if(n==="ARRAY"){let o=e.replace(/^_/,"");if(t.has(o)){let u=t.get(o).map(c=>`"${c}"`).join(" | ");return r==="YES"?`(${u})[] | null`:`(${u})[]`}let l=x[o]||"unknown";return r==="YES"?`${l}[] | null`:`${l}[]`}let a=x[n]||x[e]||"unknown";return r==="YES"&&(a=`${a} | null`),a}function S(s){return s.split(/[_\-\s]+/).map(t=>t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join("")}function G(s,t){let n=["/**"," * 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(t.size>0){n.push("// ============ ENUMS ============"),n.push("");for(let[r,a]of t){let o=S(r),l=a.map(i=>` | "${i}"`).join(`
|
|
98
98
|
`);n.push(`export type ${o} =
|
|
99
99
|
${l};`),n.push("");}}n.push("// ============ TABLES ============"),n.push("");let e=[];for(let[r,a]of s){e.push(r);let o=S(r),l=[],i=[],u=[];for(let c of a){let p=K(c,t),g=c.column_name,y=c.column_default!==null||c.is_identity==="YES",d=c.is_nullable==="YES";l.push(` ${g}: ${p};`),y||c.column_name==="id"?i.push(` ${g}?: ${p.replace(" | null","")} | null;`):d?i.push(` ${g}?: ${p};`):i.push(` ${g}: ${p.replace(" | null","")};`),u.push(` ${g}?: ${p.replace(" | null","")} | null;`);}n.push(`export interface ${o} {
|
|
100
100
|
${l.join(`
|
package/dist/index.d.cts
CHANGED
|
@@ -30,7 +30,7 @@ interface InitOptions {
|
|
|
30
30
|
declare function initConfig(options: InitOptions): Promise<void>;
|
|
31
31
|
|
|
32
32
|
/**
|
|
33
|
-
* @
|
|
33
|
+
* @vaiftech/cli - VAIF CLI and Type Generation
|
|
34
34
|
*
|
|
35
35
|
* CLI tool for generating TypeScript types from database schemas.
|
|
36
36
|
*
|
|
@@ -51,7 +51,7 @@ declare function initConfig(options: InitOptions): Promise<void>;
|
|
|
51
51
|
*
|
|
52
52
|
* @example Programmatic Usage
|
|
53
53
|
* ```typescript
|
|
54
|
-
* import { generateTypesFromConnection } from '@
|
|
54
|
+
* import { generateTypesFromConnection } from '@vaiftech/cli';
|
|
55
55
|
*
|
|
56
56
|
* const types = await generateTypesFromConnection({
|
|
57
57
|
* connectionString: process.env.DATABASE_URL,
|
|
@@ -84,7 +84,7 @@ interface ColumnInfo {
|
|
|
84
84
|
*
|
|
85
85
|
* @example
|
|
86
86
|
* ```typescript
|
|
87
|
-
* import { generateTypesFromConnection } from '@
|
|
87
|
+
* import { generateTypesFromConnection } from '@vaiftech/cli';
|
|
88
88
|
*
|
|
89
89
|
* const types = await generateTypesFromConnection({
|
|
90
90
|
* connectionString: 'postgres://user:pass@localhost:5432/mydb',
|
package/dist/index.d.ts
CHANGED
|
@@ -30,7 +30,7 @@ interface InitOptions {
|
|
|
30
30
|
declare function initConfig(options: InitOptions): Promise<void>;
|
|
31
31
|
|
|
32
32
|
/**
|
|
33
|
-
* @
|
|
33
|
+
* @vaiftech/cli - VAIF CLI and Type Generation
|
|
34
34
|
*
|
|
35
35
|
* CLI tool for generating TypeScript types from database schemas.
|
|
36
36
|
*
|
|
@@ -51,7 +51,7 @@ declare function initConfig(options: InitOptions): Promise<void>;
|
|
|
51
51
|
*
|
|
52
52
|
* @example Programmatic Usage
|
|
53
53
|
* ```typescript
|
|
54
|
-
* import { generateTypesFromConnection } from '@
|
|
54
|
+
* import { generateTypesFromConnection } from '@vaiftech/cli';
|
|
55
55
|
*
|
|
56
56
|
* const types = await generateTypesFromConnection({
|
|
57
57
|
* connectionString: process.env.DATABASE_URL,
|
|
@@ -84,7 +84,7 @@ interface ColumnInfo {
|
|
|
84
84
|
*
|
|
85
85
|
* @example
|
|
86
86
|
* ```typescript
|
|
87
|
-
* import { generateTypesFromConnection } from '@
|
|
87
|
+
* import { generateTypesFromConnection } from '@vaiftech/cli';
|
|
88
88
|
*
|
|
89
89
|
* const types = await generateTypesFromConnection({
|
|
90
90
|
* connectionString: 'postgres://user:pass@localhost:5432/mydb',
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export{b as generateTypes,c as initConfig,a as loadConfig}from'./chunk-
|
|
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(`
|
|
2
2
|
SELECT table_name, table_type
|
|
3
3
|
FROM information_schema.tables
|
|
4
4
|
WHERE table_schema = $1
|
|
@@ -28,7 +28,7 @@ export{b as generateTypes,c as initConfig,a as loadConfig}from'./chunk-IQB6LKJ7.
|
|
|
28
28
|
JOIN pg_namespace n ON n.oid = t.typnamespace
|
|
29
29
|
WHERE n.nspname = $1
|
|
30
30
|
ORDER BY t.typname, e.enumsortorder
|
|
31
|
-
`,[e]),s=new Map;for(let n of t.rows)s.set(n.table_name,[]);for(let n of i.rows){let l=s.get(n.table_name);l&&l.push(n);}let o=new Map;for(let n of u.rows){let l=o.get(n.enum_name)||[];l.push(n.enum_value),o.set(n.enum_name,l);}let m=w(s,o);return $.format(m,{parser:"typescript",semi:!0,singleQuote:!1,trailingComma:"es5",printWidth:100})}finally{await r.end();}}var g={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",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",point:"{ x: number; y: number }",ARRAY:"unknown[]"};function E(p,a){let{data_type:e,udt_name:r,is_nullable:t}=p;if(a.has(r)){let s=a.get(r).map(o=>`"${o}"`).join(" | ");return t==="YES"?`(${s}) | null`:s}if(e==="ARRAY"){let u=r.replace(/^_/,"");if(a.has(u)){let m=a.get(u).map(n=>`"${n}"`).join(" | ");return t==="YES"?`(${m})[] | null`:`(${m})[]`}let s=g[u]||"unknown";return t==="YES"?`${s}[] | null`:`${s}[]`}let i=g[e]||g[r]||"unknown";return t==="YES"&&(i=`${i} | null`),i}function f(p){return p.split(/[_\-\s]+/).map(a=>a.charAt(0).toUpperCase()+a.slice(1).toLowerCase()).join("")}function w(p,a){let e=["/**"," * Auto-generated TypeScript types from database schema"," * Generated by @
|
|
31
|
+
`,[e]),s=new Map;for(let n of t.rows)s.set(n.table_name,[]);for(let n of i.rows){let l=s.get(n.table_name);l&&l.push(n);}let o=new Map;for(let n of u.rows){let l=o.get(n.enum_name)||[];l.push(n.enum_value),o.set(n.enum_name,l);}let m=w(s,o);return $.format(m,{parser:"typescript",semi:!0,singleQuote:!1,trailingComma:"es5",printWidth:100})}finally{await r.end();}}var g={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",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",point:"{ x: number; y: number }",ARRAY:"unknown[]"};function E(p,a){let{data_type:e,udt_name:r,is_nullable:t}=p;if(a.has(r)){let s=a.get(r).map(o=>`"${o}"`).join(" | ");return t==="YES"?`(${s}) | null`:s}if(e==="ARRAY"){let u=r.replace(/^_/,"");if(a.has(u)){let m=a.get(u).map(n=>`"${n}"`).join(" | ");return t==="YES"?`(${m})[] | null`:`(${m})[]`}let s=g[u]||"unknown";return t==="YES"?`${s}[] | null`:`${s}[]`}let i=g[e]||g[r]||"unknown";return t==="YES"&&(i=`${i} | null`),i}function f(p){return p.split(/[_\-\s]+/).map(a=>a.charAt(0).toUpperCase()+a.slice(1).toLowerCase()).join("")}function w(p,a){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(a.size>0){e.push("// ============ ENUMS ============"),e.push("");for(let[t,i]of a){let u=f(t),s=i.map(o=>` | "${o}"`).join(`
|
|
32
32
|
`);e.push(`export type ${u} =
|
|
33
33
|
${s};`),e.push("");}}e.push("// ============ TABLES ============"),e.push("");let r=[];for(let[t,i]of p){r.push(t);let u=f(t),s=[],o=[],m=[];for(let n of i){let l=E(n,a),c=n.column_name,b=n.column_default!==null||n.is_identity==="YES",h=n.is_nullable==="YES";s.push(` ${c}: ${l};`),b||n.column_name==="id"?o.push(` ${c}?: ${l.replace(" | null","")} | null;`):h?o.push(` ${c}?: ${l};`):o.push(` ${c}: ${l.replace(" | null","")};`),m.push(` ${c}?: ${l.replace(" | null","")} | null;`);}e.push(`export interface ${u} {
|
|
34
34
|
${s.join(`
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vaiftech/cli",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.1",
|
|
4
4
|
"description": "VAIF CLI - Type generation and development tools",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
"typescript": ">=5.0.0"
|
|
37
37
|
},
|
|
38
38
|
"engines": {
|
|
39
|
-
"node": ">=
|
|
39
|
+
"node": ">=19.0.0"
|
|
40
40
|
},
|
|
41
41
|
"keywords": [
|
|
42
42
|
"vaif",
|