kinetic-sql 1.2.0 → 1.2.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.
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- "use strict";var N=Object.create;var y=Object.defineProperty;var S=Object.getOwnPropertyDescriptor;var M=Object.getOwnPropertyNames;var O=Object.getPrototypeOf,T=Object.prototype.hasOwnProperty;var A=(e,n,t,s)=>{if(n&&typeof n=="object"||typeof n=="function")for(let r of M(n))!T.call(e,r)&&r!==t&&y(e,r,{get:()=>n[r],enumerable:!(s=S(n,r))||s.enumerable});return e};var u=(e,n,t)=>(t=e!=null?N(O(e)):{},A(n||!e||!e.__esModule?y(t,"default",{value:e,enumerable:!0}):t,e));var w=()=>typeof document>"u"?new URL(`file:${__filename}`).href:document.currentScript&&document.currentScript.tagName.toUpperCase()==="SCRIPT"?document.currentScript.src:new URL("main.js",document.baseURI).href,g=w();var f=u(require("postgres"),1),_=u(require("mysql2/promise"),1),E=u(require("better-sqlite3"),1),p=u(require("fs"),1),l=u(require("path"),1),R=require("url"),$=(0,R.fileURLToPath)(g),L={text:"string",varchar:"string",char:"string",uuid:"string",int2:"number",int4:"number",int8:"number",float4:"number",float8:"number",numeric:"number",bool:"boolean",json:"any",jsonb:"any",date:"string",timestamp:"string",timestamptz:"string",bytea:"Buffer",_text:"string[]",_int4:"number[]"},I={varchar:"string",char:"string",text:"string",longtext:"string",int:"number",tinyint:"number",smallint:"number",mediumint:"number",bigint:"number",float:"number",double:"number",decimal:"number",datetime:"string",date:"string",timestamp:"string",json:"any",blob:"Buffer",longblob:"Buffer",tinyint1:"boolean"},P={integer:"number",int:"number",smallint:"number",bigint:"number",text:"string",varchar:"string",char:"string",clob:"string",blob:"Buffer",real:"number",double:"number",float:"number",numeric:"number",boolean:"boolean",bool:"boolean"};function C(){let e=process.argv.slice(2),n={type:"pg"};for(let t=0;t<e.length;t++){let s=e[t];if(s.startsWith("--")){let r=s.replace(/^--/,"");if(r.includes("=")){let[o,i]=r.split("=");n[o]=i}else e[t+1]&&!e[t+1].startsWith("--")&&(n[r]=e[t+1],t++)}}return n}function x(e){let n=e;for(;n!==l.default.parse(n).root;){if(p.default.existsSync(l.default.join(n,"package.json")))return n;n=l.default.dirname(n)}return e}async function U(e){let n;e.connection?n=(0,f.default)(e.connection,{max:1}):n=(0,f.default)({host:e.host||"localhost",port:Number(e.port)||5432,user:e.user||"postgres",password:e.password||"",database:e.db||"postgres",max:1});try{let t=await n`
2
+ 'use strict';var d=require('postgres'),_=require('mysql2/promise'),E=require('better-sqlite3'),p=require('fs'),m=require('path'),url=require('url');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var d__default=/*#__PURE__*/_interopDefault(d);var ___default=/*#__PURE__*/_interopDefault(_);var E__default=/*#__PURE__*/_interopDefault(E);var p__default=/*#__PURE__*/_interopDefault(p);var m__default=/*#__PURE__*/_interopDefault(m);var g=()=>typeof document>"u"?new URL(`file:${__filename}`).href:document.currentScript&&document.currentScript.tagName.toUpperCase()==="SCRIPT"?document.currentScript.src:new URL("main.js",document.baseURI).href,f=g();url.fileURLToPath(f);var h={text:"string",varchar:"string",char:"string",uuid:"string",int2:"number",int4:"number",int8:"number",float4:"number",float8:"number",numeric:"number",bool:"boolean",json:"any",jsonb:"any",date:"string",timestamp:"string",timestamptz:"string",bytea:"Buffer",_text:"string[]",_int4:"number[]"},N={varchar:"string",char:"string",text:"string",longtext:"string",int:"number",tinyint:"number",smallint:"number",mediumint:"number",bigint:"number",float:"number",double:"number",decimal:"number",datetime:"string",date:"string",timestamp:"string",json:"any",blob:"Buffer",longblob:"Buffer",tinyint1:"boolean"},S={integer:"number",int:"number",smallint:"number",bigint:"number",text:"string",varchar:"string",char:"string",clob:"string",blob:"Buffer",real:"number",double:"number",float:"number",numeric:"number",boolean:"boolean",bool:"boolean"};function M(){let e=process.argv.slice(2),n={type:"pg"};for(let t=0;t<e.length;t++){let s=e[t];if(s.startsWith("--")){let i=s.replace(/^--/,"");if(i.includes("=")){let[a,o]=i.split("=");n[a]=o;}else e[t+1]&&!e[t+1].startsWith("--")&&(n[i]=e[t+1],t++);}}return n}function O(e){let n=e;for(;n!==m__default.default.parse(n).root;){if(p__default.default.existsSync(m__default.default.join(n,"package.json")))return n;n=m__default.default.dirname(n);}return e}async function T(e){let n;e.connection?n=d__default.default(e.connection,{max:1}):n=d__default.default({host:e.host||"localhost",port:Number(e.port)||5432,user:e.user||"postgres",password:e.password||"",database:e.db||"postgres",max:1});try{let t=await n`
3
3
  SELECT table_name, column_name, udt_name, is_nullable
4
4
  FROM information_schema.columns
5
5
  WHERE table_schema = 'public'
@@ -10,7 +10,7 @@
10
10
  FROM pg_proc p
11
11
  JOIN pg_type t ON p.prorettype = t.oid
12
12
  JOIN pg_namespace n ON p.pronamespace = n.oid
13
- WHERE n.nspname = 'public';`;return{columns:t,functions:s,typeMap:L}}finally{await n.end()}}async function q(e){let n=await _.default.createConnection({host:e.host||"localhost",user:e.user||"root",password:e.password||"",database:e.db,port:Number(e.port)||3306});try{let[t]=await n.execute(`
13
+ WHERE n.nspname = 'public';`;return {columns:t,functions:s,typeMap:h}}finally{await n.end();}}async function A(e){let n=await ___default.default.createConnection({host:e.host||"localhost",user:e.user||"root",password:e.password||"",database:e.db,port:Number(e.port)||3306});try{let[t]=await n.execute(`
14
14
  SELECT TABLE_NAME as table_name, COLUMN_NAME as column_name, DATA_TYPE as udt_name, IS_NULLABLE as is_nullable
15
15
  FROM INFORMATION_SCHEMA.COLUMNS
16
16
  WHERE TABLE_SCHEMA = ?
@@ -18,7 +18,7 @@
18
18
  SELECT ROUTINE_NAME as function_name
19
19
  FROM INFORMATION_SCHEMA.ROUTINES
20
20
  WHERE ROUTINE_SCHEMA = ?
21
- AND ROUTINE_TYPE = 'PROCEDURE'`,[e.db]);return{columns:t,functions:s,typeMap:I}}finally{await n.end()}}async function j(e){let n=e.db||e.filename||e.connection;if(!n)throw new Error("\u274C Missing SQLite file path. Usage: k-sql gen --type=sqlite --db=./dev.db");let t=new E.default(n,{readonly:!0});try{let s=t.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%'").all(),r=[];for(let o of s){let i=t.prepare(`PRAGMA table_info('${o.name}')`).all();for(let c of i){let m=(c.type||"text").split("(")[0].toLowerCase().trim();r.push({table_name:o.name,column_name:c.name,udt_name:m,is_nullable:c.notnull===1?"NO":"YES"})}}return{columns:r,functions:[],typeMap:P}}finally{t.close()}}async function v(){let e=C();console.log(`\u{1F52E} Kinetic SQL: Introspecting ${e.type||"pg"}...`);try{let n;e.type==="mysql"?n=await q(e):e.type==="sqlite"?n=await j(e):n=await U(e);let{columns:t,functions:s,typeMap:r}=n,o={};for(let a of t){o[a.table_name]||(o[a.table_name]=[]);let b=r[a.udt_name]||"any";e.type==="mysql"&&a.udt_name==="tinyint"&&(b="number");let h=a.is_nullable==="YES"?"| null":"";o[a.table_name].push(` ${a.column_name}: ${b}${h};`)}let i=`// Auto-generated by Kinetic SQL \u26A0\uFE0F Do NOT import this file manually.
21
+ AND ROUTINE_TYPE = 'PROCEDURE'`,[e.db]);return {columns:t,functions:s,typeMap:N}}finally{await n.end();}}async function w(e){let n=e.db||e.filename||e.connection;if(!n)throw new Error("\u274C Missing SQLite file path. Usage: k-sql gen --type=sqlite --db=./dev.db");let t=new E__default.default(n,{readonly:true});try{let s=t.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%'").all(),i=[];for(let a of s){let o=t.prepare(`PRAGMA table_info('${a.name}')`).all();for(let l of o){let c=(l.type||"text").split("(")[0].toLowerCase().trim();i.push({table_name:a.name,column_name:l.name,udt_name:c,is_nullable:l.notnull===1?"NO":"YES"});}}return {columns:i,functions:[],typeMap:S}}finally{t.close();}}async function L(){let e=M();console.log(`\u{1F52E} Kinetic SQL: Introspecting ${e.type||"pg"}...`);try{let n;e.type==="mysql"?n=await A(e):e.type==="sqlite"?n=await w(e):n=await T(e);let{columns:t,functions:s,typeMap:i}=n,a={};for(let r of t){a[r.table_name]||(a[r.table_name]=[]);let u=i[r.udt_name]||"any";e.type==="mysql"&&r.udt_name==="tinyint"&&(u="number");let y=r.is_nullable==="YES"?"| null":"";a[r.table_name].push(` ${r.column_name}: ${u}${y};`);}let o=`// Auto-generated by Kinetic SQL \u26A0\uFE0F Do NOT import this file manually.
22
22
 
23
23
  import 'kinetic-sql';
24
24
 
@@ -26,18 +26,18 @@ declare module 'kinetic-sql' {
26
26
  export interface Register {
27
27
  schema: {
28
28
  tables: {
29
- `;for(let[a,b]of Object.entries(o))i+=` ${a}: {
30
- ${b.join(`
29
+ `;for(let[r,u]of Object.entries(a))o+=` ${r}: {
30
+ ${u.join(`
31
31
  `)}
32
32
  };
33
- `;i+=` };
33
+ `;o+=` };
34
34
  functions: {
35
- `;for(let a of s)i+=` ${a.function_name}: {
35
+ `;for(let r of s)o+=` ${r.function_name}: {
36
36
  args: Record<string, any>;
37
37
  returns: any;
38
38
  };
39
- `;i+=` };
39
+ `;o+=` };
40
40
  };
41
41
  }
42
42
  }
43
- `;let c=x(process.cwd()),m=l.default.resolve(c,"kinetic-schema","kinetic-env.d.ts"),d=l.default.dirname(m);p.default.existsSync(d)||p.default.mkdirSync(d,{recursive:!0}),p.default.writeFileSync(m,i),console.log(`\u2705 Generated types at: ${m}`)}catch(n){console.error("\u274C Generation failed:",n),process.exit(1)}}v().then(()=>console.log("Auto-complete types generated successfully \u2728"));
43
+ `;let l=O(process.cwd()),c=m__default.default.resolve(l,"kinetic-schema","kinetic-env.d.ts"),b=m__default.default.dirname(c);p__default.default.existsSync(b)||p__default.default.mkdirSync(b,{recursive:!0}),p__default.default.writeFileSync(c,o),console.log(`\u2705 Generated types at: ${c}`);}catch(n){console.error("\u274C Generation failed:",n),process.exit(1);}}L().then(()=>console.log("Auto-complete types generated successfully \u2728"));
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import y from"postgres";import g from"mysql2/promise";import _ from"better-sqlite3";import p from"fs";import m from"path";import{fileURLToPath as d}from"url";var v=d(import.meta.url),E={text:"string",varchar:"string",char:"string",uuid:"string",int2:"number",int4:"number",int8:"number",float4:"number",float8:"number",numeric:"number",bool:"boolean",json:"any",jsonb:"any",date:"string",timestamp:"string",timestamptz:"string",bytea:"Buffer",_text:"string[]",_int4:"number[]"},R={varchar:"string",char:"string",text:"string",longtext:"string",int:"number",tinyint:"number",smallint:"number",mediumint:"number",bigint:"number",float:"number",double:"number",decimal:"number",datetime:"string",date:"string",timestamp:"string",json:"any",blob:"Buffer",longblob:"Buffer",tinyint1:"boolean"},h={integer:"number",int:"number",smallint:"number",bigint:"number",text:"string",varchar:"string",char:"string",clob:"string",blob:"Buffer",real:"number",double:"number",float:"number",numeric:"number",boolean:"boolean",bool:"boolean"};function N(){let n=process.argv.slice(2),t={type:"pg"};for(let e=0;e<n.length;e++){let s=n[e];if(s.startsWith("--")){let i=s.replace(/^--/,"");if(i.includes("=")){let[a,o]=i.split("=");t[a]=o}else n[e+1]&&!n[e+1].startsWith("--")&&(t[i]=n[e+1],e++)}}return t}function O(n){let t=n;for(;t!==m.parse(t).root;){if(p.existsSync(m.join(t,"package.json")))return t;t=m.dirname(t)}return n}async function M(n){let t;n.connection?t=y(n.connection,{max:1}):t=y({host:n.host||"localhost",port:Number(n.port)||5432,user:n.user||"postgres",password:n.password||"",database:n.db||"postgres",max:1});try{let e=await t`
2
+ import y from'postgres';import g from'mysql2/promise';import _ from'better-sqlite3';import p from'fs';import m from'path';import {fileURLToPath}from'url';fileURLToPath(import.meta.url);var E={text:"string",varchar:"string",char:"string",uuid:"string",int2:"number",int4:"number",int8:"number",float4:"number",float8:"number",numeric:"number",bool:"boolean",json:"any",jsonb:"any",date:"string",timestamp:"string",timestamptz:"string",bytea:"Buffer",_text:"string[]",_int4:"number[]"},R={varchar:"string",char:"string",text:"string",longtext:"string",int:"number",tinyint:"number",smallint:"number",mediumint:"number",bigint:"number",float:"number",double:"number",decimal:"number",datetime:"string",date:"string",timestamp:"string",json:"any",blob:"Buffer",longblob:"Buffer",tinyint1:"boolean"},h={integer:"number",int:"number",smallint:"number",bigint:"number",text:"string",varchar:"string",char:"string",clob:"string",blob:"Buffer",real:"number",double:"number",float:"number",numeric:"number",boolean:"boolean",bool:"boolean"};function N(){let n=process.argv.slice(2),t={type:"pg"};for(let e=0;e<n.length;e++){let s=n[e];if(s.startsWith("--")){let i=s.replace(/^--/,"");if(i.includes("=")){let[a,o]=i.split("=");t[a]=o;}else n[e+1]&&!n[e+1].startsWith("--")&&(t[i]=n[e+1],e++);}}return t}function O(n){let t=n;for(;t!==m.parse(t).root;){if(p.existsSync(m.join(t,"package.json")))return t;t=m.dirname(t);}return n}async function M(n){let t;n.connection?t=y(n.connection,{max:1}):t=y({host:n.host||"localhost",port:Number(n.port)||5432,user:n.user||"postgres",password:n.password||"",database:n.db||"postgres",max:1});try{let e=await t`
3
3
  SELECT table_name, column_name, udt_name, is_nullable
4
4
  FROM information_schema.columns
5
5
  WHERE table_schema = 'public'
@@ -10,7 +10,7 @@ import y from"postgres";import g from"mysql2/promise";import _ from"better-sqlit
10
10
  FROM pg_proc p
11
11
  JOIN pg_type t ON p.prorettype = t.oid
12
12
  JOIN pg_namespace n ON p.pronamespace = n.oid
13
- WHERE n.nspname = 'public';`;return{columns:e,functions:s,typeMap:E}}finally{await t.end()}}async function A(n){let t=await g.createConnection({host:n.host||"localhost",user:n.user||"root",password:n.password||"",database:n.db,port:Number(n.port)||3306});try{let[e]=await t.execute(`
13
+ WHERE n.nspname = 'public';`;return {columns:e,functions:s,typeMap:E}}finally{await t.end();}}async function A(n){let t=await g.createConnection({host:n.host||"localhost",user:n.user||"root",password:n.password||"",database:n.db,port:Number(n.port)||3306});try{let[e]=await t.execute(`
14
14
  SELECT TABLE_NAME as table_name, COLUMN_NAME as column_name, DATA_TYPE as udt_name, IS_NULLABLE as is_nullable
15
15
  FROM INFORMATION_SCHEMA.COLUMNS
16
16
  WHERE TABLE_SCHEMA = ?
@@ -18,7 +18,7 @@ import y from"postgres";import g from"mysql2/promise";import _ from"better-sqlit
18
18
  SELECT ROUTINE_NAME as function_name
19
19
  FROM INFORMATION_SCHEMA.ROUTINES
20
20
  WHERE ROUTINE_SCHEMA = ?
21
- AND ROUTINE_TYPE = 'PROCEDURE'`,[n.db]);return{columns:e,functions:s,typeMap:R}}finally{await t.end()}}async function T(n){let t=n.db||n.filename||n.connection;if(!t)throw new Error("\u274C Missing SQLite file path. Usage: k-sql gen --type=sqlite --db=./dev.db");let e=new _(t,{readonly:!0});try{let s=e.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%'").all(),i=[];for(let a of s){let o=e.prepare(`PRAGMA table_info('${a.name}')`).all();for(let l of o){let c=(l.type||"text").split("(")[0].toLowerCase().trim();i.push({table_name:a.name,column_name:l.name,udt_name:c,is_nullable:l.notnull===1?"NO":"YES"})}}return{columns:i,functions:[],typeMap:h}}finally{e.close()}}async function S(){let n=N();console.log(`\u{1F52E} Kinetic SQL: Introspecting ${n.type||"pg"}...`);try{let t;n.type==="mysql"?t=await A(n):n.type==="sqlite"?t=await T(n):t=await M(n);let{columns:e,functions:s,typeMap:i}=t,a={};for(let r of e){a[r.table_name]||(a[r.table_name]=[]);let u=i[r.udt_name]||"any";n.type==="mysql"&&r.udt_name==="tinyint"&&(u="number");let f=r.is_nullable==="YES"?"| null":"";a[r.table_name].push(` ${r.column_name}: ${u}${f};`)}let o=`// Auto-generated by Kinetic SQL \u26A0\uFE0F Do NOT import this file manually.
21
+ AND ROUTINE_TYPE = 'PROCEDURE'`,[n.db]);return {columns:e,functions:s,typeMap:R}}finally{await t.end();}}async function T(n){let t=n.db||n.filename||n.connection;if(!t)throw new Error("\u274C Missing SQLite file path. Usage: k-sql gen --type=sqlite --db=./dev.db");let e=new _(t,{readonly:true});try{let s=e.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%'").all(),i=[];for(let a of s){let o=e.prepare(`PRAGMA table_info('${a.name}')`).all();for(let l of o){let c=(l.type||"text").split("(")[0].toLowerCase().trim();i.push({table_name:a.name,column_name:l.name,udt_name:c,is_nullable:l.notnull===1?"NO":"YES"});}}return {columns:i,functions:[],typeMap:h}}finally{e.close();}}async function S(){let n=N();console.log(`\u{1F52E} Kinetic SQL: Introspecting ${n.type||"pg"}...`);try{let t;n.type==="mysql"?t=await A(n):n.type==="sqlite"?t=await T(n):t=await M(n);let{columns:e,functions:s,typeMap:i}=t,a={};for(let r of e){a[r.table_name]||(a[r.table_name]=[]);let u=i[r.udt_name]||"any";n.type==="mysql"&&r.udt_name==="tinyint"&&(u="number");let f=r.is_nullable==="YES"?"| null":"";a[r.table_name].push(` ${r.column_name}: ${u}${f};`);}let o=`// Auto-generated by Kinetic SQL \u26A0\uFE0F Do NOT import this file manually.
22
22
 
23
23
  import 'kinetic-sql';
24
24
 
@@ -40,4 +40,4 @@ ${u.join(`
40
40
  };
41
41
  }
42
42
  }
43
- `;let l=O(process.cwd()),c=m.resolve(l,"kinetic-schema","kinetic-env.d.ts"),b=m.dirname(c);p.existsSync(b)||p.mkdirSync(b,{recursive:!0}),p.writeFileSync(c,o),console.log(`\u2705 Generated types at: ${c}`)}catch(t){console.error("\u274C Generation failed:",t),process.exit(1)}}S().then(()=>console.log("Auto-complete types generated successfully \u2728"));
43
+ `;let l=O(process.cwd()),c=m.resolve(l,"kinetic-schema","kinetic-env.d.ts"),b=m.dirname(c);p.existsSync(b)||p.mkdirSync(b,{recursive:!0}),p.writeFileSync(c,o),console.log(`\u2705 Generated types at: ${c}`);}catch(t){console.error("\u274C Generation failed:",t),process.exit(1);}}S().then(()=>console.log("Auto-complete types generated successfully \u2728"));
package/dist/index.cjs CHANGED
@@ -1,4 +1,4 @@
1
- "use strict";var w=Object.create;var d=Object.defineProperty;var I=Object.getOwnPropertyDescriptor;var C=Object.getOwnPropertyNames;var D=Object.getPrototypeOf,L=Object.prototype.hasOwnProperty;var _=(s,e)=>{for(var t in e)d(s,t,{get:e[t],enumerable:!0})},R=(s,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of C(e))!L.call(s,i)&&i!==t&&d(s,i,{get:()=>e[i],enumerable:!(r=I(e,i))||r.enumerable});return s};var u=(s,e,t)=>(t=s!=null?w(D(s)):{},R(e||!s||!s.__esModule?d(t,"default",{value:s,enumerable:!0}):t,s)),$=s=>R(d({},"__esModule",{value:!0}),s);var A={};_(A,{KineticClient:()=>g,KineticError:()=>o,and:()=>a.and,asc:()=>a.asc,desc:()=>a.desc,eq:()=>a.eq,or:()=>a.or,sql:()=>a.sql});module.exports=$(A);var o=class s extends Error{code;details;constructor(e,t,r){super(t),this.name="KineticError",this.code=e,this.details=r,Object.setPrototypeOf(this,s.prototype)}};var f=u(require("better-sqlite3"),1),y=class{db;subscribers=new Map;constructor(e){let t=":memory:";typeof e.connectionString=="string"?t=e.connectionString.replace(/^sqlite:\/\//,""):e.filename&&(t=e.filename),this.db=new f.default(t,e.options||{})}get raw(){return this.db}async init(){this.db.function("kinetic_bridge",(e,t,r)=>{this.handleEvent(e,t,r)})}handleEvent(e,t,r){let i=this.subscribers.get(e);if(!(!i||i.length===0))try{if(t==="DELETE"){let n={action:t,data:{rowid:r}};i.forEach(c=>c(n));return}setImmediate(()=>{try{let n=this.db.prepare(`SELECT * FROM ${e} WHERE rowid = ?`).get(r);if(n){let c={action:t,data:n};i.forEach(p=>p(c))}}catch(n){console.error(`\u26A0\uFE0F Kinetic SQLite: Async fetch failed for ${e}`,n)}})}catch(n){console.error(`\u26A0\uFE0F Kinetic SQLite: Failed to bridge event for ${e}`,n)}}async subscribe(e,t){return this.subscribers.has(e)||(this.subscribers.set(e,[]),this.attachTriggers(e)),this.subscribers.get(e).push(t),{unsubscribe:()=>{let r=this.subscribers.get(e);if(r){let i=r.indexOf(t);i>-1&&r.splice(i,1)}}}}attachTriggers(e){try{this.db.exec(`
1
+ 'use strict';var S=require('better-sqlite3'),T=require('mysql2/promise'),b=require('@rodrigogs/mysql-events'),h=require('postgres'),drizzleOrm=require('drizzle-orm');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var S__default=/*#__PURE__*/_interopDefault(S);var T__default=/*#__PURE__*/_interopDefault(T);var b__default=/*#__PURE__*/_interopDefault(b);var h__default=/*#__PURE__*/_interopDefault(h);var o=class n extends Error{code;details;constructor(e,r,t){super(r),this.name="KineticError",this.code=e,this.details=t,Object.setPrototypeOf(this,n.prototype);}};var a=class{debug;prefix;constructor(e=false,r="Kinetic"){this.debug=e,this.prefix=r;}info(e,...r){this.debug&&console.log(`\x1B[34m[${this.prefix}]\x1B[0m ${e}`,...r);}warn(e,...r){this.debug&&console.warn(`\x1B[33m[${this.prefix}]\x1B[0m \u26A0\uFE0F ${e}`,...r);}error(e,...r){console.error(`\x1B[31m[${this.prefix}]\x1B[0m \u274C ${e}`,...r);}};var p=class{logger;db;subscribers=new Map;constructor(e){let r=":memory:";if(typeof e.connectionString=="string"?r=e.connectionString.replace(/^sqlite:\/\//,""):e.filename&&(r=e.filename),this.logger=new a(e.debug,"Kinetic:SQLite"),e.type!=="sqlite")throw new Error("Invalid config");this.db=new S__default.default(r,e.options||{});}get raw(){return this.db}async init(){this.db.function("kinetic_bridge",(e,r,t)=>{this.handleEvent(e,r,t);}),this.logger.info("Bridge Registered successfully");}handleEvent(e,r,t){this.logger.info("\u{1F7E2} Bridge called for:",e,r,t);let i=this.subscribers.get(e);if(!i||i.length===0){this.logger.warn(`\u{1F534} No subscribers for table ${e}`);return}try{if(r==="DELETE"){let s={action:r,data:{rowid:t}};i.forEach(c=>c(s));return}setImmediate(()=>{this.logger.info(`\u{1F7E2} Fetching fresh row for ${e} with rowid ${t}`);try{let s=this.db.prepare(`SELECT * FROM ${e} WHERE rowid = ?`).get(t);if(s){let c={action:r,data:s};i.forEach(g=>g(c));}}catch(s){this.logger.error(`\u26A0\uFE0F Kinetic SQLite: Async fetch failed for ${e}`,s);}});}catch(s){this.logger.error(`\u26A0\uFE0F Kinetic SQLite: Failed to bridge event for ${e}`,s);}}async subscribe(e,r){return this.subscribers.has(e)||(this.subscribers.set(e,[]),this.attachTriggers(e)),this.subscribers.get(e).push(r),{unsubscribe:()=>{let t=this.subscribers.get(e);if(t){let i=t.indexOf(r);i>-1&&t.splice(i,1);}}}}attachTriggers(e){try{this.db.exec(`
2
2
  CREATE TRIGGER IF NOT EXISTS kinetic_${e}_insert AFTER INSERT ON ${e}
3
3
  BEGIN
4
4
  SELECT kinetic_bridge('${e}', 'INSERT', NEW.rowid);
@@ -13,7 +13,7 @@
13
13
  BEGIN
14
14
  SELECT kinetic_bridge('${e}', 'DELETE', OLD.rowid);
15
15
  END;
16
- `)}catch(t){console.warn(`\u26A0\uFE0F Kinetic SQLite: Could not attach triggers to ${e}. Ensure table exists.`,t)}}async rpc(e,t){try{let i=Object.keys(t||{}).map(()=>"?").join(","),n=Object.values(t||{});return{data:this.db.prepare(`SELECT ${e}(${i})`).all(...n),error:null}}catch(r){return{data:null,error:r}}}async end(){this.db.close()}};var S=u(require("mysql2/promise"),1),b=u(require("@rodrigogs/mysql-events"),1);var h=class{pool;instance=null;subscribers=new Map;config;constructor(e){this.config=e,this.pool=S.default.createPool({host:e.host,user:e.user,password:e.password,database:e.database,port:e.port||3306,waitForConnections:!0,connectionLimit:e.poolSize||10,queueLimit:0})}get raw(){return this.pool}async init(){if(!this.config.realtimeEnabled)return;let e={host:this.config.host,user:this.config.user,password:this.config.password,port:this.config.port||3306};this.instance=new b.default(e,{startAtEnd:!0,excludedSchemas:{mysql:!0,sys:!0,information_schema:!0,performance_schema:!0}}),await this.instance.start(),this.instance.addTrigger({name:"KINETIC_EVENTS",expression:"*",statement:b.default.STATEMENTS.ALL,onEvent:t=>{if(t.schema===this.config.database&&this.subscribers.has(t.table)){let r=this.subscribers.get(t.table);r&&t.rows.forEach(i=>{r({action:t.type,data:i})})}}}),this.instance.on("error",t=>console.error("MySQL Realtime Error:",t))}async subscribe(e,t){if(!this.config.realtimeEnabled)throw new o("CONFIG_ERROR","Realtime is disabled. Set { realtimeEnabled: true } in config.");return this.subscribers.set(e,t),{unsubscribe:()=>{this.subscribers.delete(e)}}}async rpc(e,t){try{let r=Object.values(t||{}),i=r.map(()=>"?").join(", "),[n]=await this.pool.execute(`CALL ${e}(${i})`,r);return{data:n,error:null}}catch(r){return{data:null,error:new o("RPC_ERROR",`MySQL RPC Failed: ${e}`,r)}}}async end(){this.instance&&await this.instance.stop(),await this.pool.end()}};var E=u(require("postgres"),1);var T=`
16
+ `);}catch(r){this.logger.warn(`\u26A0\uFE0F Kinetic SQLite: Could not attach triggers to ${e}. Ensure table exists.`,r);}}async rpc(e,r){try{let i=Object.keys(r||{}).map(()=>"?").join(","),s=Object.values(r||{});return {data:this.db.prepare(`SELECT ${e}(${i})`).all(...s),error:null}}catch(t){return {data:null,error:t}}}async end(){this.db.close();}};var d=class{logger;pool;instance=null;subscribers=new Map;config;constructor(e){this.config=e,this.pool=T__default.default.createPool({host:e.host,user:e.user,password:e.password,database:e.database,port:e.port||3306,waitForConnections:true,connectionLimit:e.poolSize||10,queueLimit:0}),this.logger=new a(e.debug,"Kinetic:MySQL");}get raw(){return this.pool}async init(){if(!this.config.realtimeEnabled)return;let e={host:this.config.host,user:this.config.user,password:this.config.password,port:this.config.port||3306};this.instance=new b__default.default(e,{startAtEnd:true,excludedSchemas:{mysql:true,sys:true,information_schema:true,performance_schema:true}}),await this.instance.start(),this.instance.addTrigger({name:"KINETIC_EVENTS",expression:"*",statement:b__default.default.STATEMENTS.ALL,onEvent:r=>{if(r.schema===this.config.database&&this.subscribers.has(r.table)){let t=this.subscribers.get(r.table);t&&r.rows.forEach(i=>{t({action:r.type,data:i});});}}}),this.logger.info("Setup for realtime Broadcast of changes ready \u{1F514}"),this.instance.on("error",r=>this.logger.error("MySQL Realtime Error:",r));}async subscribe(e,r){if(!this.config.realtimeEnabled)throw this.logger.error(`Cannot add table ${e} to realtime subscriptions. Set { realtimeEnabled: true } in config. \u274C`),new o("CONFIG_ERROR","Realtime is disabled. Set { realtimeEnabled: true } in config.");return this.subscribers.set(e,r),this.logger.info(`Table: ${e} configured for broadcasting changes in realtime \u{1F514}`),{unsubscribe:()=>{this.subscribers.delete(e);}}}async rpc(e,r){try{let t=Object.values(r||{}),i=t.map(()=>"?").join(", "),[s]=await this.pool.execute(`CALL ${e}(${i})`,t);return this.logger.info(`Calling RPC: ${e}(${t.join(", ")})`),{data:s,error:null}}catch(t){return {data:null,error:new o("RPC_ERROR",`MySQL RPC Failed: ${e}`,t)}}}async end(){this.instance&&await this.instance.stop(),await this.pool.end();}};var m=`
17
17
  CREATE OR REPLACE FUNCTION notify_changes() RETURNS TRIGGER AS $$
18
18
  DECLARE
19
19
  payload json;
@@ -26,13 +26,13 @@ BEGIN
26
26
  PERFORM pg_notify('table_events', payload::text);
27
27
  RETURN NEW;
28
28
  END;
29
- $$ LANGUAGE plpgsql;`,v=s=>`
29
+ $$ LANGUAGE plpgsql;`,y=n=>`
30
30
  DO $$
31
31
  BEGIN
32
- IF NOT EXISTS (SELECT 1 FROM pg_trigger WHERE tgname = 'watch_${s}') THEN
33
- CREATE TRIGGER watch_${s}
34
- AFTER INSERT OR UPDATE OR DELETE ON "${s}"
32
+ IF NOT EXISTS (SELECT 1 FROM pg_trigger WHERE tgname = 'watch_${n}') THEN
33
+ CREATE TRIGGER watch_${n}
34
+ AFTER INSERT OR UPDATE OR DELETE ON "${n}"
35
35
  FOR EACH ROW EXECUTE FUNCTION notify_changes();
36
36
  END IF;
37
37
  END
38
- $$;`;var m=class{sql;config;realtimeEnabled;constructor(e){if(this.config=e,this.realtimeEnabled=e.realtimeEnabled||!1,typeof e.connectionString=="string")this.sql=(0,E.default)(e.connectionString,{max:e.poolSize||10});else{let{type:t,realtimeEnabled:r,poolSize:i,...n}=e;this.sql=(0,E.default)({...n,max:i||10})}}get raw(){return this.sql}async init(){if(this.realtimeEnabled)try{await this.sql.unsafe(T)}catch(e){console.warn("\u26A0\uFE0F Kinetic Driver: Failed to install generic broadcast function.",e)}}async rpc(e,t){try{let r=Object.values(t||{}),n=Object.keys(t||{}).map((O,N)=>`${O} := $${N+1}`).join(", "),c=`SELECT * FROM "${e}"(${n})`;return{data:await this.sql.unsafe(c,r),error:null}}catch(r){return{data:null,error:new o("RPC_ERROR",`Failed to execute function: ${e}`,r)}}}async subscribe(e,t){if(!this.realtimeEnabled)throw new o("CONFIG_ERROR","Realtime is disabled in config.");try{await this.sql.unsafe(v(e))}catch(i){console.error(`Failed to attach trigger to ${e}`,i)}let r;if(typeof this.config.connectionString=="string")r=(0,E.default)(this.config.connectionString,{max:1});else{let{type:i,realtimeEnabled:n,poolSize:c,...p}=this.config;r=(0,E.default)({...p,max:1})}return r.listen("table_events",i=>{let n=JSON.parse(i);n.table===e&&t(n)}).catch(i=>console.error("Listener error:",i)),{unsubscribe:async()=>{await r.end()}}}async end(){await this.sql.end()}};var g=class s{constructor(e){this.config=e;if(e.type==="pg")this.driver=new m(e);else if(e.type==="mysql")this.driver=new h(e);else if(e.type==="sqlite")this.driver=new y(e);else throw new o("CONFIG_ERROR",`Unsupported DB type: ${e.type}`)}driver;static async create(e){let t=new s(e);return await t.init(),t}async init(){await this.driver.init()}async rpc(e,t){return this.driver.rpc(e,t)}async subscribe(e,t){return this.driver.subscribe(e,t)}get raw(){return this.driver.raw}};var a=require("drizzle-orm");0&&(module.exports={KineticClient,KineticError,and,asc,desc,eq,or,sql});
38
+ $$;`;var E=class{logger;sql;config;realtimeEnabled;constructor(e){if(this.config=e,this.realtimeEnabled=e.realtimeEnabled||false,typeof e.connectionString=="string")this.sql=h__default.default(e.connectionString,{max:e.poolSize||10});else {let{type:r,realtimeEnabled:t,poolSize:i,...s}=e;this.sql=h__default.default({...s,max:i||10});}this.logger=new a(e.debug,"Kinetic:Postgres");}get raw(){return this.sql}async init(){if(this.realtimeEnabled)try{await this.sql.unsafe(m),this.logger.info("Setup for realtime Broadcast of changes ready \u{1F514}");}catch(e){this.logger.warn("\u26A0\uFE0F Kinetic Driver: Failed to install generic broadcast function.",e);}}async rpc(e,r){try{let t=Object.values(r||{}),s=Object.keys(r||{}).map((f,R)=>`${f} := $${R+1}`).join(", "),c=`SELECT * FROM "${e}"(${s})`,g=await this.sql.unsafe(c,t);return this.logger.info(`Calling RPC: ${e} with params: (${s})`),{data:g,error:null}}catch(t){return {data:null,error:new o("RPC_ERROR",`Failed to execute function: ${e}`,t)}}}async subscribe(e,r){if(!this.realtimeEnabled)throw this.logger.error(`Cannot add table ${e} to realtime subscriptions. Set { realtimeEnabled: true } in config. \u274C`),new o("CONFIG_ERROR","Realtime is disabled in config.");try{await this.sql.unsafe(y(e)),this.logger.info(`Table: ${e} configured for broadcasting changes in realtime \u{1F514}`);}catch(i){this.logger.error(`Failed to attach trigger to ${e}`,i);}let t;if(typeof this.config.connectionString=="string")t=h__default.default(this.config.connectionString,{max:1});else {let{type:i,realtimeEnabled:s,poolSize:c,...g}=this.config;t=h__default.default({...g,max:1});}return t.listen("table_events",i=>{let s=JSON.parse(i);s.table===e&&r(s);}).catch(i=>this.logger.error("Listener error:",i)),{unsubscribe:async()=>{await t.end();}}}async end(){await this.sql.end();}};var u=class n{constructor(e){this.config=e;if(e.type==="pg")this.driver=new E(e);else if(e.type==="mysql")this.driver=new d(e);else if(e.type==="sqlite")this.driver=new p(e);else throw new o("CONFIG_ERROR",`Unsupported DB type: ${e.type}`)}driver;static async create(e){let r=new n(e);return await r.init(),r}async init(){await this.driver.init();}async rpc(e,r){return this.driver.rpc(e,r)}async subscribe(e,r){return this.driver.subscribe(e,r)}get raw(){return this.driver.raw}};Object.defineProperty(exports,"and",{enumerable:true,get:function(){return drizzleOrm.and}});Object.defineProperty(exports,"asc",{enumerable:true,get:function(){return drizzleOrm.asc}});Object.defineProperty(exports,"desc",{enumerable:true,get:function(){return drizzleOrm.desc}});Object.defineProperty(exports,"eq",{enumerable:true,get:function(){return drizzleOrm.eq}});Object.defineProperty(exports,"or",{enumerable:true,get:function(){return drizzleOrm.or}});Object.defineProperty(exports,"sql",{enumerable:true,get:function(){return drizzleOrm.sql}});exports.KineticClient=u;
package/dist/index.d.cts CHANGED
@@ -14,11 +14,13 @@ type ResolvedDB = Register extends {
14
14
  } ? S : KineticSchema;
15
15
  type KineticConfig = {
16
16
  type: 'pg';
17
+ debug?: boolean;
17
18
  connectionString: string;
18
19
  poolSize?: number;
19
20
  realtimeEnabled?: boolean;
20
21
  } | {
21
22
  type: 'pg';
23
+ debug?: boolean;
22
24
  host: string;
23
25
  port: number;
24
26
  user: string;
@@ -29,6 +31,7 @@ type KineticConfig = {
29
31
  realtimeEnabled?: boolean;
30
32
  } | {
31
33
  type: 'mysql';
34
+ debug?: boolean;
32
35
  host: string;
33
36
  user: string;
34
37
  password?: string;
@@ -38,6 +41,7 @@ type KineticConfig = {
38
41
  realtimeEnabled?: boolean;
39
42
  } | {
40
43
  type: 'sqlite';
44
+ debug?: boolean;
41
45
  connectionString?: string;
42
46
  filename?: string;
43
47
  options?: any;
@@ -61,11 +65,4 @@ declare class KineticClient<Schema extends KineticSchema = ResolvedDB> {
61
65
  get raw(): any;
62
66
  }
63
67
 
64
- type KineticErrorCode = 'CONFIG_ERROR' | 'CONNECTION_FAILED' | 'QUERY_FAILED' | 'RPC_ERROR' | 'REALTIME_ERROR' | 'INTERNAL_ERROR';
65
- declare class KineticError extends Error {
66
- readonly code: KineticErrorCode;
67
- readonly details?: any;
68
- constructor(code: KineticErrorCode, message: string, originalError?: any);
69
- }
70
-
71
- export { KineticClient, type KineticConfig, KineticError, type KineticErrorCode, type KineticSchema, type Register, type ResolvedDB };
68
+ export { KineticClient, type KineticConfig, type KineticSchema, type Register };
package/dist/index.d.ts CHANGED
@@ -14,11 +14,13 @@ type ResolvedDB = Register extends {
14
14
  } ? S : KineticSchema;
15
15
  type KineticConfig = {
16
16
  type: 'pg';
17
+ debug?: boolean;
17
18
  connectionString: string;
18
19
  poolSize?: number;
19
20
  realtimeEnabled?: boolean;
20
21
  } | {
21
22
  type: 'pg';
23
+ debug?: boolean;
22
24
  host: string;
23
25
  port: number;
24
26
  user: string;
@@ -29,6 +31,7 @@ type KineticConfig = {
29
31
  realtimeEnabled?: boolean;
30
32
  } | {
31
33
  type: 'mysql';
34
+ debug?: boolean;
32
35
  host: string;
33
36
  user: string;
34
37
  password?: string;
@@ -38,6 +41,7 @@ type KineticConfig = {
38
41
  realtimeEnabled?: boolean;
39
42
  } | {
40
43
  type: 'sqlite';
44
+ debug?: boolean;
41
45
  connectionString?: string;
42
46
  filename?: string;
43
47
  options?: any;
@@ -61,11 +65,4 @@ declare class KineticClient<Schema extends KineticSchema = ResolvedDB> {
61
65
  get raw(): any;
62
66
  }
63
67
 
64
- type KineticErrorCode = 'CONFIG_ERROR' | 'CONNECTION_FAILED' | 'QUERY_FAILED' | 'RPC_ERROR' | 'REALTIME_ERROR' | 'INTERNAL_ERROR';
65
- declare class KineticError extends Error {
66
- readonly code: KineticErrorCode;
67
- readonly details?: any;
68
- constructor(code: KineticErrorCode, message: string, originalError?: any);
69
- }
70
-
71
- export { KineticClient, type KineticConfig, KineticError, type KineticErrorCode, type KineticSchema, type Register, type ResolvedDB };
68
+ export { KineticClient, type KineticConfig, type KineticSchema, type Register };
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- var a=class n extends Error{code;details;constructor(e,t,r){super(t),this.name="KineticError",this.code=e,this.details=r,Object.setPrototypeOf(this,n.prototype)}};import S from"better-sqlite3";var E=class{db;subscribers=new Map;constructor(e){let t=":memory:";typeof e.connectionString=="string"?t=e.connectionString.replace(/^sqlite:\/\//,""):e.filename&&(t=e.filename),this.db=new S(t,e.options||{})}get raw(){return this.db}async init(){this.db.function("kinetic_bridge",(e,t,r)=>{this.handleEvent(e,t,r)})}handleEvent(e,t,r){let i=this.subscribers.get(e);if(!(!i||i.length===0))try{if(t==="DELETE"){let s={action:t,data:{rowid:r}};i.forEach(o=>o(s));return}setImmediate(()=>{try{let s=this.db.prepare(`SELECT * FROM ${e} WHERE rowid = ?`).get(r);if(s){let o={action:t,data:s};i.forEach(p=>p(o))}}catch(s){console.error(`\u26A0\uFE0F Kinetic SQLite: Async fetch failed for ${e}`,s)}})}catch(s){console.error(`\u26A0\uFE0F Kinetic SQLite: Failed to bridge event for ${e}`,s)}}async subscribe(e,t){return this.subscribers.has(e)||(this.subscribers.set(e,[]),this.attachTriggers(e)),this.subscribers.get(e).push(t),{unsubscribe:()=>{let r=this.subscribers.get(e);if(r){let i=r.indexOf(t);i>-1&&r.splice(i,1)}}}}attachTriggers(e){try{this.db.exec(`
1
+ import T from'better-sqlite3';import v from'mysql2/promise';import m from'@rodrigogs/mysql-events';import E from'postgres';export{and,asc,desc,eq,or,sql}from'drizzle-orm';var o=class n extends Error{code;details;constructor(e,r,t){super(r),this.name="KineticError",this.code=e,this.details=t,Object.setPrototypeOf(this,n.prototype);}};var a=class{debug;prefix;constructor(e=false,r="Kinetic"){this.debug=e,this.prefix=r;}info(e,...r){this.debug&&console.log(`\x1B[34m[${this.prefix}]\x1B[0m ${e}`,...r);}warn(e,...r){this.debug&&console.warn(`\x1B[33m[${this.prefix}]\x1B[0m \u26A0\uFE0F ${e}`,...r);}error(e,...r){console.error(`\x1B[31m[${this.prefix}]\x1B[0m \u274C ${e}`,...r);}};var d=class{logger;db;subscribers=new Map;constructor(e){let r=":memory:";if(typeof e.connectionString=="string"?r=e.connectionString.replace(/^sqlite:\/\//,""):e.filename&&(r=e.filename),this.logger=new a(e.debug,"Kinetic:SQLite"),e.type!=="sqlite")throw new Error("Invalid config");this.db=new T(r,e.options||{});}get raw(){return this.db}async init(){this.db.function("kinetic_bridge",(e,r,t)=>{this.handleEvent(e,r,t);}),this.logger.info("Bridge Registered successfully");}handleEvent(e,r,t){this.logger.info("\u{1F7E2} Bridge called for:",e,r,t);let i=this.subscribers.get(e);if(!i||i.length===0){this.logger.warn(`\u{1F534} No subscribers for table ${e}`);return}try{if(r==="DELETE"){let s={action:r,data:{rowid:t}};i.forEach(c=>c(s));return}setImmediate(()=>{this.logger.info(`\u{1F7E2} Fetching fresh row for ${e} with rowid ${t}`);try{let s=this.db.prepare(`SELECT * FROM ${e} WHERE rowid = ?`).get(t);if(s){let c={action:r,data:s};i.forEach(p=>p(c));}}catch(s){this.logger.error(`\u26A0\uFE0F Kinetic SQLite: Async fetch failed for ${e}`,s);}});}catch(s){this.logger.error(`\u26A0\uFE0F Kinetic SQLite: Failed to bridge event for ${e}`,s);}}async subscribe(e,r){return this.subscribers.has(e)||(this.subscribers.set(e,[]),this.attachTriggers(e)),this.subscribers.get(e).push(r),{unsubscribe:()=>{let t=this.subscribers.get(e);if(t){let i=t.indexOf(r);i>-1&&t.splice(i,1);}}}}attachTriggers(e){try{this.db.exec(`
2
2
  CREATE TRIGGER IF NOT EXISTS kinetic_${e}_insert AFTER INSERT ON ${e}
3
3
  BEGIN
4
4
  SELECT kinetic_bridge('${e}', 'INSERT', NEW.rowid);
@@ -13,7 +13,7 @@ var a=class n extends Error{code;details;constructor(e,t,r){super(t),this.name="
13
13
  BEGIN
14
14
  SELECT kinetic_bridge('${e}', 'DELETE', OLD.rowid);
15
15
  END;
16
- `)}catch(t){console.warn(`\u26A0\uFE0F Kinetic SQLite: Could not attach triggers to ${e}. Ensure table exists.`,t)}}async rpc(e,t){try{let i=Object.keys(t||{}).map(()=>"?").join(","),s=Object.values(t||{});return{data:this.db.prepare(`SELECT ${e}(${i})`).all(...s),error:null}}catch(r){return{data:null,error:r}}}async end(){this.db.close()}};import T from"mysql2/promise";import h from"@rodrigogs/mysql-events";var d=class{pool;instance=null;subscribers=new Map;config;constructor(e){this.config=e,this.pool=T.createPool({host:e.host,user:e.user,password:e.password,database:e.database,port:e.port||3306,waitForConnections:!0,connectionLimit:e.poolSize||10,queueLimit:0})}get raw(){return this.pool}async init(){if(!this.config.realtimeEnabled)return;let e={host:this.config.host,user:this.config.user,password:this.config.password,port:this.config.port||3306};this.instance=new h(e,{startAtEnd:!0,excludedSchemas:{mysql:!0,sys:!0,information_schema:!0,performance_schema:!0}}),await this.instance.start(),this.instance.addTrigger({name:"KINETIC_EVENTS",expression:"*",statement:h.STATEMENTS.ALL,onEvent:t=>{if(t.schema===this.config.database&&this.subscribers.has(t.table)){let r=this.subscribers.get(t.table);r&&t.rows.forEach(i=>{r({action:t.type,data:i})})}}}),this.instance.on("error",t=>console.error("MySQL Realtime Error:",t))}async subscribe(e,t){if(!this.config.realtimeEnabled)throw new a("CONFIG_ERROR","Realtime is disabled. Set { realtimeEnabled: true } in config.");return this.subscribers.set(e,t),{unsubscribe:()=>{this.subscribers.delete(e)}}}async rpc(e,t){try{let r=Object.values(t||{}),i=r.map(()=>"?").join(", "),[s]=await this.pool.execute(`CALL ${e}(${i})`,r);return{data:s,error:null}}catch(r){return{data:null,error:new a("RPC_ERROR",`MySQL RPC Failed: ${e}`,r)}}}async end(){this.instance&&await this.instance.stop(),await this.pool.end()}};import u from"postgres";var m=`
16
+ `);}catch(r){this.logger.warn(`\u26A0\uFE0F Kinetic SQLite: Could not attach triggers to ${e}. Ensure table exists.`,r);}}async rpc(e,r){try{let i=Object.keys(r||{}).map(()=>"?").join(","),s=Object.values(r||{});return {data:this.db.prepare(`SELECT ${e}(${i})`).all(...s),error:null}}catch(t){return {data:null,error:t}}}async end(){this.db.close();}};var h=class{logger;pool;instance=null;subscribers=new Map;config;constructor(e){this.config=e,this.pool=v.createPool({host:e.host,user:e.user,password:e.password,database:e.database,port:e.port||3306,waitForConnections:true,connectionLimit:e.poolSize||10,queueLimit:0}),this.logger=new a(e.debug,"Kinetic:MySQL");}get raw(){return this.pool}async init(){if(!this.config.realtimeEnabled)return;let e={host:this.config.host,user:this.config.user,password:this.config.password,port:this.config.port||3306};this.instance=new m(e,{startAtEnd:true,excludedSchemas:{mysql:true,sys:true,information_schema:true,performance_schema:true}}),await this.instance.start(),this.instance.addTrigger({name:"KINETIC_EVENTS",expression:"*",statement:m.STATEMENTS.ALL,onEvent:r=>{if(r.schema===this.config.database&&this.subscribers.has(r.table)){let t=this.subscribers.get(r.table);t&&r.rows.forEach(i=>{t({action:r.type,data:i});});}}}),this.logger.info("Setup for realtime Broadcast of changes ready \u{1F514}"),this.instance.on("error",r=>this.logger.error("MySQL Realtime Error:",r));}async subscribe(e,r){if(!this.config.realtimeEnabled)throw this.logger.error(`Cannot add table ${e} to realtime subscriptions. Set { realtimeEnabled: true } in config. \u274C`),new o("CONFIG_ERROR","Realtime is disabled. Set { realtimeEnabled: true } in config.");return this.subscribers.set(e,r),this.logger.info(`Table: ${e} configured for broadcasting changes in realtime \u{1F514}`),{unsubscribe:()=>{this.subscribers.delete(e);}}}async rpc(e,r){try{let t=Object.values(r||{}),i=t.map(()=>"?").join(", "),[s]=await this.pool.execute(`CALL ${e}(${i})`,t);return this.logger.info(`Calling RPC: ${e}(${t.join(", ")})`),{data:s,error:null}}catch(t){return {data:null,error:new o("RPC_ERROR",`MySQL RPC Failed: ${e}`,t)}}}async end(){this.instance&&await this.instance.stop(),await this.pool.end();}};var y=`
17
17
  CREATE OR REPLACE FUNCTION notify_changes() RETURNS TRIGGER AS $$
18
18
  DECLARE
19
19
  payload json;
@@ -26,7 +26,7 @@ BEGIN
26
26
  PERFORM pg_notify('table_events', payload::text);
27
27
  RETURN NEW;
28
28
  END;
29
- $$ LANGUAGE plpgsql;`,b=n=>`
29
+ $$ LANGUAGE plpgsql;`,f=n=>`
30
30
  DO $$
31
31
  BEGIN
32
32
  IF NOT EXISTS (SELECT 1 FROM pg_trigger WHERE tgname = 'watch_${n}') THEN
@@ -35,4 +35,4 @@ BEGIN
35
35
  FOR EACH ROW EXECUTE FUNCTION notify_changes();
36
36
  END IF;
37
37
  END
38
- $$;`;var y=class{sql;config;realtimeEnabled;constructor(e){if(this.config=e,this.realtimeEnabled=e.realtimeEnabled||!1,typeof e.connectionString=="string")this.sql=u(e.connectionString,{max:e.poolSize||10});else{let{type:t,realtimeEnabled:r,poolSize:i,...s}=e;this.sql=u({...s,max:i||10})}}get raw(){return this.sql}async init(){if(this.realtimeEnabled)try{await this.sql.unsafe(m)}catch(e){console.warn("\u26A0\uFE0F Kinetic Driver: Failed to install generic broadcast function.",e)}}async rpc(e,t){try{let r=Object.values(t||{}),s=Object.keys(t||{}).map((R,f)=>`${R} := $${f+1}`).join(", "),o=`SELECT * FROM "${e}"(${s})`;return{data:await this.sql.unsafe(o,r),error:null}}catch(r){return{data:null,error:new a("RPC_ERROR",`Failed to execute function: ${e}`,r)}}}async subscribe(e,t){if(!this.realtimeEnabled)throw new a("CONFIG_ERROR","Realtime is disabled in config.");try{await this.sql.unsafe(b(e))}catch(i){console.error(`Failed to attach trigger to ${e}`,i)}let r;if(typeof this.config.connectionString=="string")r=u(this.config.connectionString,{max:1});else{let{type:i,realtimeEnabled:s,poolSize:o,...p}=this.config;r=u({...p,max:1})}return r.listen("table_events",i=>{let s=JSON.parse(i);s.table===e&&t(s)}).catch(i=>console.error("Listener error:",i)),{unsubscribe:async()=>{await r.end()}}}async end(){await this.sql.end()}};var g=class n{constructor(e){this.config=e;if(e.type==="pg")this.driver=new y(e);else if(e.type==="mysql")this.driver=new d(e);else if(e.type==="sqlite")this.driver=new E(e);else throw new a("CONFIG_ERROR",`Unsupported DB type: ${e.type}`)}driver;static async create(e){let t=new n(e);return await t.init(),t}async init(){await this.driver.init()}async rpc(e,t){return this.driver.rpc(e,t)}async subscribe(e,t){return this.driver.subscribe(e,t)}get raw(){return this.driver.raw}};import{sql as V,eq as Y,desc as Z,asc as ee,and as te,or as re}from"drizzle-orm";export{g as KineticClient,a as KineticError,te as and,ee as asc,Z as desc,Y as eq,re as or,V as sql};
38
+ $$;`;var u=class{logger;sql;config;realtimeEnabled;constructor(e){if(this.config=e,this.realtimeEnabled=e.realtimeEnabled||false,typeof e.connectionString=="string")this.sql=E(e.connectionString,{max:e.poolSize||10});else {let{type:r,realtimeEnabled:t,poolSize:i,...s}=e;this.sql=E({...s,max:i||10});}this.logger=new a(e.debug,"Kinetic:Postgres");}get raw(){return this.sql}async init(){if(this.realtimeEnabled)try{await this.sql.unsafe(y),this.logger.info("Setup for realtime Broadcast of changes ready \u{1F514}");}catch(e){this.logger.warn("\u26A0\uFE0F Kinetic Driver: Failed to install generic broadcast function.",e);}}async rpc(e,r){try{let t=Object.values(r||{}),s=Object.keys(r||{}).map((R,S)=>`${R} := $${S+1}`).join(", "),c=`SELECT * FROM "${e}"(${s})`,p=await this.sql.unsafe(c,t);return this.logger.info(`Calling RPC: ${e} with params: (${s})`),{data:p,error:null}}catch(t){return {data:null,error:new o("RPC_ERROR",`Failed to execute function: ${e}`,t)}}}async subscribe(e,r){if(!this.realtimeEnabled)throw this.logger.error(`Cannot add table ${e} to realtime subscriptions. Set { realtimeEnabled: true } in config. \u274C`),new o("CONFIG_ERROR","Realtime is disabled in config.");try{await this.sql.unsafe(f(e)),this.logger.info(`Table: ${e} configured for broadcasting changes in realtime \u{1F514}`);}catch(i){this.logger.error(`Failed to attach trigger to ${e}`,i);}let t;if(typeof this.config.connectionString=="string")t=E(this.config.connectionString,{max:1});else {let{type:i,realtimeEnabled:s,poolSize:c,...p}=this.config;t=E({...p,max:1});}return t.listen("table_events",i=>{let s=JSON.parse(i);s.table===e&&r(s);}).catch(i=>this.logger.error("Listener error:",i)),{unsubscribe:async()=>{await t.end();}}}async end(){await this.sql.end();}};var b=class n{constructor(e){this.config=e;if(e.type==="pg")this.driver=new u(e);else if(e.type==="mysql")this.driver=new h(e);else if(e.type==="sqlite")this.driver=new d(e);else throw new o("CONFIG_ERROR",`Unsupported DB type: ${e.type}`)}driver;static async create(e){let r=new n(e);return await r.init(),r}async init(){await this.driver.init();}async rpc(e,r){return this.driver.rpc(e,r)}async subscribe(e,r){return this.driver.subscribe(e,r)}get raw(){return this.driver.raw}};export{b as KineticClient};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kinetic-sql",
3
- "version": "1.2.0",
3
+ "version": "1.2.1",
4
4
  "description": "Zero-config, type-safe Postgres & MySQL client with Realtime subscriptions.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",