@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 CHANGED
@@ -1,15 +1,15 @@
1
- # @vaif/cli
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 @vaif/cli
8
+ npm install -D @vaiftech/cli
9
9
  # or
10
- pnpm add -D @vaif/cli
10
+ pnpm add -D @vaiftech/cli
11
11
  # or
12
- yarn add -D @vaif/cli
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 @vaif/cli
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 '@vaif/cli';
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 @vaif/client
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 '@vaif/client';
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
- - [@vaif/client](https://www.npmjs.com/package/@vaif/client) - Core client SDK
116
- - [@vaif/react](https://www.npmjs.com/package/@vaif/react) - React hooks
117
- - [@vaif/sdk-expo](https://www.npmjs.com/package/@vaif/sdk-expo) - React Native/Expo SDK
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 @vaif/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(`
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'),f=require('fs'),v=require('path'),D=require('pg'),O=require('ora'),u=require('chalk'),F=require('prettier'),N=require('dotenv');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var f__default=/*#__PURE__*/_interopDefault(f);var v__default=/*#__PURE__*/_interopDefault(v);var D__default=/*#__PURE__*/_interopDefault(D);var O__default=/*#__PURE__*/_interopDefault(O);var u__default=/*#__PURE__*/_interopDefault(u);var F__default=/*#__PURE__*/_interopDefault(F);var N__default=/*#__PURE__*/_interopDefault(N);N__default.default.config();async function $(t){let n=v__default.default.resolve(t);if(!f__default.default.existsSync(n))return null;try{let s=f__default.default.readFileSync(n,"utf-8"),e=JSON.parse(s);return e.database?.url&&(e.database.url=S(e.database.url)),e.api?.apiKey&&(e.api.apiKey=S(e.api.apiKey)),e}catch{throw new Error(`Failed to parse config file: ${t}`)}}function S(t){return t.replace(/\$\{([^}]+)\}/g,(n,s)=>process.env[s]||n)}async function j(t,n){let s=await t.query(`
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
- `,[n]),e=await t.query(`
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
- `,[n]),r=await t.query(`
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
- `,[n]),o=await t.query(`
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
- `,[n]),a=new Map;for(let i of s.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 o.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 _={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 k(t,n){let{data_type:s,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(s==="ARRAY"){let a=e.replace(/^_/,"");if(n.has(a)){let l=n.get(a).map(p=>`"${p}"`).join(" | ");return r==="YES"?`(${l})[] | null`:`(${l})[]`}let c=_[a]||"unknown";return r==="YES"?`${c}[] | null`:`${c}[]`}let o=_[s]||_[e]||"unknown";return r==="YES"&&(o=`${o} | null`),o}function E(t){return t.split(/[_\-\s]+/).map(n=>n.charAt(0).toUpperCase()+n.slice(1).toLowerCase()).join("")}function U(t,n){let s=E(t),e=n.map(r=>` | "${r}"`).join(`
49
- `);return `export type ${s} =
50
- ${e};`}function L(t,n,s){let e=E(t),r=[],o=[],a=[];for(let p of n){let g=k(p,s),y=p.column_name,I=p.column_default!==null||p.is_identity==="YES",R=p.is_nullable==="YES";r.push(` ${y}: ${g};`),I||p.column_name==="id"?o.push(` ${y}?: ${g.replace(" | null","")} | null;`):R?o.push(` ${y}?: ${g};`):o.push(` ${y}: ${g.replace(" | null","")};`),a.push(` ${y}?: ${g.replace(" | null","")} | null;`);}let c=`export interface ${e} {
51
- ${r.join(`
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 ${e}Insert {
54
- ${o.join(`
53
+ }`,i=`export interface ${o}Insert {
54
+ ${r.join(`
55
55
  `)}
56
- }`,l=`export interface ${e}Update {
56
+ }`,p=`export interface ${o}Update {
57
57
  ${a.join(`
58
58
  `)}
59
- }`;return {base:c,insert:i,update:l}}function M(t,n,s){let e=["/**"," * Auto-generated TypeScript types from database schema"," * Generated by @vaif/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[o,a]of n)e.push(U(o,a)),e.push("");}e.push("// ============ TABLES ============"),e.push("");let r=[];for(let[o,a]of t){let{base:c,insert:i,update:l}=L(o,a,n);r.push(o),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 o of r){let a=E(o);e.push(` ${o}: {`),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(`
60
- `)}async function x(t){let n=O__default.default("Loading configuration...").start();try{let s=await $(t.config),e=t.connection||s?.database?.url||process.env.DATABASE_URL;e||(n.fail("No database connection string provided"),console.log(u__default.default.yellow(`
61
- Provide a connection string via:`)),console.log(u__default.default.gray(" --connection <url>")),console.log(u__default.default.gray(" DATABASE_URL environment variable")),console.log(u__default.default.gray(" vaif.config.json database.url")),process.exit(1)),n.text="Connecting to database...";let r=new D__default.default.Client({connectionString:e});await r.connect(),n.text="Introspecting schema...";let{tables:o,enums:a,foreignKeys:c}=await j(r,t.schema);if(await r.end(),o.size===0){n.warn(`No tables found in schema "${t.schema}"`);return}n.text=`Generating types for ${o.size} tables...`;let i=M(o,a,c),l=await F__default.default.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__default.default.gray("\u2500".repeat(60))),console.log(l),console.log(u__default.default.gray("\u2500".repeat(60)));return}let p=v__default.default.resolve(t.output),g=v__default.default.dirname(p);f__default.default.existsSync(g)||f__default.default.mkdirSync(g,{recursive:!0}),f__default.default.writeFileSync(p,l,"utf-8"),n.succeed(`Generated types for ${o.size} tables \u2192 ${u__default.default.cyan(t.output)}`),console.log(""),console.log(u__default.default.green("Generated:")),console.log(u__default.default.gray(` Tables: ${o.size}`)),console.log(u__default.default.gray(` Enums: ${a.size}`)),console.log(""),console.log(u__default.default.gray("Import in your code:")),console.log(u__default.default.cyan(` import type { Database, Row, Insert, Update } from "${t.output.replace(/\.ts$/,"")}";`));}catch(s){n.fail("Failed to generate types"),s instanceof Error&&(console.error(u__default.default.red(`
62
- Error: ${s.message}`)),s.message.includes("ECONNREFUSED")&&console.log(u__default.default.yellow(`
63
- Make sure your database is running and accessible.`))),process.exit(1);}}var V={$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 A(t){let n=O__default.default("Initializing VAIF configuration...").start(),s=v__default.default.resolve("vaif.config.json");f__default.default.existsSync(s)&&!t.force&&(n.fail("vaif.config.json already exists"),console.log(u__default.default.yellow(`
64
- Use --force to overwrite existing configuration.`)),process.exit(1));try{f__default.default.writeFileSync(s,JSON.stringify(V,null,2),"utf-8"),n.succeed("Created vaif.config.json");let e=v__default.default.resolve(".env.example");if(f__default.default.existsSync(e)||(f__default.default.writeFileSync(e,`# VAIF Configuration
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(u__default.default.gray("Created .env.example"))),t.typescript){let r=v__default.default.resolve("src/types");f__default.default.existsSync(r)||(f__default.default.mkdirSync(r,{recursive:!0}),console.log(u__default.default.gray("Created src/types directory")));}console.log(""),console.log(u__default.default.green("VAIF initialized successfully!")),console.log(""),console.log(u__default.default.gray("Next steps:")),console.log(u__default.default.gray(" 1. Update vaif.config.json with your project ID")),console.log(u__default.default.gray(" 2. Set DATABASE_URL in your environment")),console.log(u__default.default.gray(" 3. Run: npx vaif generate")),console.log("");}catch(e){n.fail("Failed to initialize"),e instanceof Error&&console.error(u__default.default.red(`
68
- Error: ${e.message}`)),process.exit(1);}}commander.program.name("vaif").description("VAIF CLI - Type generation and development tools").version("0.1.0");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(x);commander.program.command("init").description("Initialize VAIF configuration in your project").option("--typescript","Setup for TypeScript project").option("-f, --force","Overwrite existing config").action(A);commander.program.parse(process.argv);process.argv.slice(2).length||commander.program.outputHelp();
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,c}from'./chunk-IQB6LKJ7.js';import {program}from'commander';program.name("vaif").description("VAIF CLI - Type generation and development tools").version("0.1.0");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);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.parse(process.argv);process.argv.slice(2).length||program.outputHelp();
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 @vaif/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(`
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 @vaif/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(`
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
- * @vaif/cli - VAIF CLI and Type Generation
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 '@vaif/cli';
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 '@vaif/cli';
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
- * @vaif/cli - VAIF CLI and Type Generation
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 '@vaif/cli';
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 '@vaif/cli';
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-IQB6LKJ7.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,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 @vaif/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(`
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.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": ">=18.0.0"
39
+ "node": ">=19.0.0"
40
40
  },
41
41
  "keywords": [
42
42
  "vaif",