@supabase/lite 0.9.0 → 0.9.1-next.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/FEATURES.md +176 -0
- package/LIMITATIONS.md +1 -0
- package/README.md +1 -0
- package/STATUS.md +7 -1
- package/dist/cli/index.js +86 -86
- package/dist/db/postgres/pglite/PgliteConnection.js +17 -17
- package/dist/index.d.ts +26 -2
- package/dist/index.js +55 -55
- package/dist/vite/index.d.ts +26 -2
- package/docs/auth/email.mdx +214 -0
- package/docs/auth/not-supported.mdx +57 -0
- package/docs/auth/overview.mdx +52 -0
- package/docs/auth/supported-flows.mdx +120 -0
- package/docs/cli/overview.mdx +112 -0
- package/docs/cli/telemetry.mdx +34 -0
- package/docs/compatibility.mdx +115 -0
- package/docs/database/backends.mdx +118 -0
- package/docs/database/data-api.mdx +90 -0
- package/docs/database/functions-triggers.mdx +93 -0
- package/docs/database/migrations.mdx +93 -0
- package/docs/database/overview.mdx +66 -0
- package/docs/database/postgres-sqlite-translation.mdx +130 -0
- package/docs/database/rls.mdx +159 -0
- package/docs/database/schemas.mdx +58 -0
- package/docs/index.mdx +49 -0
- package/docs/integrations/embedded.mdx +83 -0
- package/docs/integrations/frameworks.mdx +83 -0
- package/docs/integrations/vite.mdx +85 -0
- package/docs/llms.txt +52 -0
- package/docs/other/edge-functions.mdx +34 -0
- package/docs/other/realtime.mdx +22 -0
- package/docs/quickstart.mdx +150 -0
- package/docs/running.mdx +117 -0
- package/docs/storage/adapters.mdx +75 -0
- package/docs/storage/limitations.mdx +30 -0
- package/docs/storage/overview.mdx +82 -0
- package/docs/upgrade.mdx +108 -0
- package/package.json +4 -1
- package/skills/supalite/SKILL.md +5 -3
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {PGlite}from'@electric-sql/pglite';export{PGlite}from'@electric-sql/pglite';import
|
|
1
|
+
import {PGlite}from'@electric-sql/pglite';export{PGlite}from'@electric-sql/pglite';import {Kysely,sql,PostgresQueryCompiler,PostgresIntrospector,PostgresAdapter,CompiledQuery}from'kysely';import {Connection,invariant,RelationNotFoundError,DataLossError}from'@supabase/lite';import {isn}from'@electric-sql/pglite/contrib/isn';import {ltree}from'@electric-sql/pglite/contrib/ltree';import {file_fdw}from'@electric-sql/pglite/contrib/file_fdw';import {pgcrypto}from'@electric-sql/pglite/contrib/pgcrypto';try {
|
|
2
2
|
/**
|
|
3
3
|
* Adding this to avoid warnings from node:sqlite being experimental
|
|
4
4
|
*/
|
|
@@ -8,13 +8,13 @@ import {PGlite}from'@electric-sql/pglite';export{PGlite}from'@electric-sql/pglit
|
|
|
8
8
|
return emitWarning(warning, ...args);
|
|
9
9
|
};
|
|
10
10
|
} catch {}
|
|
11
|
-
var B=class{#e;#t;constructor(e,t){this.#e=e,this.#t=t;}async acquireConnection(){return new D(this.#e)}async beginTransaction(e,t){await e.executeQuery(CompiledQuery.raw("BEGIN"));}async commitTransaction(e){await e.executeQuery(CompiledQuery.raw("COMMIT"));}async rollbackTransaction(e){await e.executeQuery(CompiledQuery.raw("ROLLBACK"));}async destroy(){this.#t&&await this.#e.close();}async init(){}async releaseConnection(e){}},D=class{#e;constructor(e){this.#e=e;}async executeQuery(e){let t=await this.#e.query(e.sql,[...e.parameters]),s=t.affectedRows;return {rows:t.rows,numAffectedRows:typeof s=="number"?BigInt(s):void 0}}async*streamQuery(){throw new Error("PGlite does not support streaming.")}},T=class{client;#e=true;constructor(e,t){let s={...t};if(typeof e=="object"&&e instanceof PGlite){this.client=e,this.#e=false;return}typeof e=="string"?s={dataDir:e,...s}:s=e??{},this.client=new PGlite(s);}dialect={createAdapter:()=>new PostgresAdapter,createDriver:()=>new B(this.client,this.#e),createIntrospector:e=>new PostgresIntrospector(e),createQueryCompiler:()=>new PostgresQueryCompiler}};var O=["anon","authenticated","service_role"];function
|
|
11
|
+
var B=class{#e;#t;constructor(e,t){this.#e=e,this.#t=t;}async acquireConnection(){return new D(this.#e)}async beginTransaction(e,t){await e.executeQuery(CompiledQuery.raw("BEGIN"));}async commitTransaction(e){await e.executeQuery(CompiledQuery.raw("COMMIT"));}async rollbackTransaction(e){await e.executeQuery(CompiledQuery.raw("ROLLBACK"));}async destroy(){this.#t&&await this.#e.close();}async init(){}async releaseConnection(e){}},D=class{#e;constructor(e){this.#e=e;}async executeQuery(e){let t=await this.#e.query(e.sql,[...e.parameters]),s=t.affectedRows;return {rows:t.rows,numAffectedRows:typeof s=="number"?BigInt(s):void 0}}async*streamQuery(){throw new Error("PGlite does not support streaming.")}},T=class{client;#e=true;constructor(e,t){let s={...t};if(typeof e=="object"&&e instanceof PGlite){this.client=e,this.#e=false;return}typeof e=="string"?s={dataDir:e,...s}:s=e??{},this.client=new PGlite(s);}dialect={createAdapter:()=>new PostgresAdapter,createDriver:()=>new B(this.client,this.#e),createIntrospector:e=>new PostgresIntrospector(e),createQueryCompiler:()=>new PostgresQueryCompiler}};var O=["anon","authenticated","service_role"];function Te(n){return n==="service_role"?"NOLOGIN BYPASSRLS":"NOLOGIN"}function C(n){return n.size===0?"":`DO $$ BEGIN${[...n].map(t=>`
|
|
12
12
|
IF NOT EXISTS (SELECT FROM pg_roles WHERE rolname = '${t}') THEN
|
|
13
|
-
CREATE ROLE ${t} ${
|
|
13
|
+
CREATE ROLE ${t} ${Te(t)};
|
|
14
14
|
END IF;`).join("")}
|
|
15
15
|
END $$;
|
|
16
|
-
`}var Q=C(new Set(O));function Y(n,e){return n?n.quoted?n.value===e:n.value.toLowerCase()===e:false}function h(n){return n?.quoted?n.value:n?.value.toLowerCase()}function
|
|
17
|
-
`;)t++;continue}if(s==="/"&&o==="*"){for(t+=2;t<n.length&&!(n[t]==="*"&&n[t+1]==="/");)t++;t=t<n.length?t+2:t;continue}if(s==="'"){t=
|
|
16
|
+
`}var Q=C(new Set(O));function Y(n,e){return n?n.quoted?n.value===e:n.value.toLowerCase()===e:false}function h(n){return n?.quoted?n.value:n?.value.toLowerCase()}function Oe(n,e){let t="",s=e+1;for(;s<n.length;){if(n[s]==='"'&&n[s+1]==='"'){t+='"',s+=2;continue}if(n[s]==='"')return {token:{value:t,quoted:true},end:s+1};t+=n[s],s++;}return {token:{value:t,quoted:true},end:s}}function Ce(n,e){let t=e+1;for(;t<n.length;){if(n[t]==="'"&&n[t+1]==="'"){t+=2;continue}if(n[t]==="'")return t+1;t++;}return t}function Le(n,e){let t=/^\$[A-Za-z_][A-Za-z0-9_]*\$|^\$\$/.exec(n.slice(e))?.[0];if(!t)return;let s=e+t.length,o=n.indexOf(t,s);return o===-1?n.length:o+t.length}function V(n){let e=[],t=0;for(;t<n.length;){let s=n[t],o=n[t+1];if(/\s/.test(s)){t++;continue}if(s==="-"&&o==="-"){for(t+=2;t<n.length&&n[t]!==`
|
|
17
|
+
`;)t++;continue}if(s==="/"&&o==="*"){for(t+=2;t<n.length&&!(n[t]==="*"&&n[t+1]==="/");)t++;t=t<n.length?t+2:t;continue}if(s==="'"){t=Ce(n,t);continue}if(s==="$"){let a=Le(n,t);if(a!==void 0){t=a;continue}}if(s==='"'){let{token:a,end:c}=Oe(n,t);e.push(a),t=c;continue}if(s===","||s===";"){e.push({value:s,quoted:false}),t++;continue}if(/[A-Za-z_]/.test(s)){let a=t;for(t++;t<n.length&&/[A-Za-z0-9_$]/.test(n[t]);)t++;e.push({value:n.slice(a,t).toLowerCase(),quoted:false});continue}t++;}return e}function xe(n,e){let t=h(n[e]),s=h(n[e+1]);if((t==="create"||t==="alter")&&(s==="role"||s==="user"||s==="group"))return n[e+2]}function L(n){let e=new Set,t=V(n);for(let s=0;s<t.length;s++){if(h(t[s])!=="create")continue;let o=xe(t,s);for(let a of O)Y(o,a)&&e.add(a);}return e}function v(n,e,t){let s=new Set([";","as","by","check","for","granted","in","on","option","using","where","with"]);for(let o=e;o<n.length;o++){let a=h(n[o]);if(!a||s.has(a))return;for(let c of O)Y(n[o],c)&&t.add(c);}}function Ie(n){let e=[],t=[];for(let s of n){if(h(s)===";"){t.length>0&&e.push(t),t=[];continue}t.push(s);}return t.length>0&&e.push(t),e}function j(n,e){return n.some(t=>h(t)===e)}function ke(n){let e=new Set,t=Ie(V(n));for(let s of t){let o=h(s[0]);for(let r=0;r<s.length;r++){let l=h(s[r]);l==="to"&&(j(s,"grant")||j(s,"policy")||h(s[r-1])==="owner")&&v(s,r+1,e),l==="from"&&o==="revoke"&&v(s,r+1,e);}let a=s.findIndex(r=>h(r)==="to"),c=s.findIndex(r=>h(r)==="on");o==="grant"&&a>1&&(c===-1||a<c)&&v(s,1,e);}return e}function $(n){let e=L(n);return new Set([...ke(n)].filter(t=>!e.has(t)))}function z(n){let e=L(n);return new Set(O.filter(t=>!e.has(t)))}function F(n){let e=n.trim();return e.startsWith('"')&&e.endsWith('"')||e.startsWith("`")&&e.endsWith("`")||e.startsWith("[")&&e.endsWith("]")?e.slice(1,-1):e}function Pe(n){let e=[],t="",s=0,o=null;for(let a=0;a<n.length;a++){let c=n[a];if(o){t+=c,c===o&&(o=null);continue}if(c==='"'||c==="`"||c==="'"){o=c,t+=c;continue}if(c==="("?s++:c===")"&&s>0&&s--,c===","&&s===0){e.push(t.trim()),t="";continue}t+=c;}return t.trim()&&e.push(t.trim()),e}function Be(n){let e=n.match(/^(.*?)\s+as\s+(.+)$/i),t=e?e[1].trim():n.trim(),s=e?e[2].trim():void 0;if(!s){let c=n.match(/^(.+?)\s+((?:"[^"]+"|`[^`]+`|\[[^\]]+\]|\w+))$/);c&&!/[()]/.test(c[1])&&(t=c[1].trim(),s=c[2].trim());}let o=t.split(".").map(F);if(o.length>2)return null;let a=o.at(-1);return !a||!/^[A-Za-z_][\w$]*$/.test(a)?null:{baseColumn:a,viewColumn:s?F(s):a}}function X(n){return !!(n&&/[A-Za-z0-9_$]/.test(n))}function De(n){let e=/\bselect\b/i.exec(n);if(!e)return null;let t=0,s=null;for(let o=e.index+e[0].length;o<n.length;o++){let a=n[o];if(s){a===s&&(s=null);continue}if(a==='"'||a==="`"||a==="'"){s=a;continue}if(a==="("){t++;continue}if(a===")"&&t>0){t--;continue}if(t===0&&n.slice(o,o+4).toLowerCase()==="from"&&!X(n[o-1])&&!X(n[o+4]))return {selectList:n.slice(e.index+e[0].length,o).trim(),fromRest:n.slice(o+4).trim()}}return null}function ve(n){let e=0,t=[];for(;e<n.length;){for(;/\s/.test(n[e]??"");)e++;let s=n[e],o="";if(s==='"'||s==="`"){let r=n.indexOf(s,e+1);if(r===-1)return null;o=n.slice(e,r+1),e=r+1;}else if(s==="["){let r=n.indexOf("]",e+1);if(r===-1)return null;o=n.slice(e,r+1),e=r+1;}else {let r=/^[A-Za-z_][\w$]*/.exec(n.slice(e));if(!r)return null;o=r[0],e+=o.length;}t.push(o);let a=n.slice(e),c=/^\s*\./.exec(a);if(!c)break;e+=c[0].length;}return t.length===0?null:{raw:t.join("."),rest:n.slice(e).trim()}}function Z(n,e,t){let s=n.get(e)??[];s.includes(t)||s.push(t),n.set(e,s);}function $e(n,e){if(!n)return null;let t=De(n);if(!t)return null;let s=ve(t.fromRest);if(!s)return null;let{raw:o,rest:a}=s;if(/\b(join|union|intersect|except)\b/i.test(a))return null;let c=o.split(".").map(F).at(-1);if(!c)return null;let r=new Map,l=e.get(c)??new Set;for(let f of Pe(t.selectList)){let m=f.trim();if(m==="*"||m.endsWith(".*")){for(let g of l)Z(r,g,g);continue}let p=Be(f);p&&Z(r,p.baseColumn,p.viewColumn);}return r.size===0?null:{baseTable:c,columns:r}}function Fe(n,e){let t=new Map;for(let[s,o]of e){let a=[];for(let c of o){let r=n.get(c);if(r)for(let l of r)a.includes(l)||a.push(l);}a.length>0&&t.set(s,a);}return t}function Me(n){let e=new Map,t=new Map;for(let r of n.columns??[]){let l=t.get(r.table)??new Set;l.add(r.name),t.set(r.table,l);}let s=(r,l)=>{let f=e.get(r)??[];f.some(m=>m.name===l.name&&m.schema===l.schema)||f.push(l),e.set(r,f);};for(let r of n.tables??[]){if(r.type!=="table")continue;let l=t.get(r.name);l&&s(r.name,{name:r.name,schema:r.schema,columnByBaseColumn:new Map([...l].map(f=>[f,[f]]))});}let o=new Map;for(let r of n.views??[]){let l=$e(r.sql,t);if(!l)continue;let f=t.get(r.name);if(!f)continue;let m=new Map;for(let[g,y]of l.columns){let d=y.filter(_=>f.has(_));d.length>0&&m.set(g,d);}if(m.size===0)continue;let p={name:r.name,schema:r.schema,columnByBaseColumn:m,fromRelation:l.baseTable};o.set(r.name,p);}let a=16;function c(r,l,f){if(l>a)return null;let m=r.fromRelation;if(e.has(m))return {physicalBase:m,columnByBaseColumn:r.columnByBaseColumn};let p=o.get(m);if(!p||f.has(m))return null;f.add(m);let g=c(p,l+1,f);if(f.delete(m),!g)return null;let y=Fe(r.columnByBaseColumn,g.columnByBaseColumn);return y.size===0?null:{physicalBase:g.physicalBase,columnByBaseColumn:y}}for(let r of o.values()){let l=c(r,0,new Set([r.name]));l&&s(l.physicalBase,{name:r.name,schema:r.schema,columnByBaseColumn:l.columnByBaseColumn});}return e}function ee(n){return `${n.foreign_key_group??""}:${n.table}.${n.column}->${n.ref_table}.${n.ref_column}`}function He(n){let e=new Map;for(let t of n){let s=`${t.schema}.${t.table}.${t.foreign_key_name}.${t.ref_schema??""}.${t.ref_table}`,o=e.get(s);o?o.push(t):e.set(s,[t]);}return [...e.values()]}function Ue(n){let e=[[]];for(let t of n){let s=[];for(let o of e)for(let a of t)s.push([...o,a]);e=s;}return e}function We(n,e,t,s){let o=s.map(c=>c.childColumn).join(","),a=s.map(c=>c.parentColumn).join(",");return `${t}:${n.name}(${o})->${e.name}(${a})`}function te(n){if(!n.foreign_keys?.length||!n.views?.length)return n;let e=Me(n),t=new Set(n.foreign_keys.map(ee)),s=[];for(let o of He(n.foreign_keys)){let a=o[0],c=e.get(a.table)??[],r=e.get(a.ref_table)??[];for(let l of c)for(let f of r){if(l.schema!==f.schema)continue;let m=[];for(let p of o){let g=l.columnByBaseColumn.get(p.column)??[],y=f.columnByBaseColumn.get(p.ref_column)??[],d=g.flatMap(_=>y.map(S=>({fk:p,childColumn:_,parentColumn:S})));if(d.length===0){m.length=0;break}m.push(d);}for(let p of Ue(m)){let y=l.name===a.table&&f.name===a.ref_table&&p.every(d=>d.childColumn===d.fk.column&&d.parentColumn===d.fk.ref_column)?void 0:We(l,f,a.foreign_key_name,p);for(let d of p){let _={...d.fk,table:l.name,column:d.childColumn,schema:l.schema,ref_table:f.name,ref_column:d.parentColumn,ref_schema:f.schema,foreign_key_group:y},S=ee(_);t.has(S)||(t.add(S),s.push(_));}}}}return s.length?{...n,foreign_keys:[...n.foreign_keys,...s]}:n}var A="anon, authenticated, service_role",Ge=new Set(["anon","authenticated","service_role"]);function ne(n){return `"${n.replace(/"/g,'""')}"`}var N=class extends Error{constructor(t){super("Force rollback");this.result=t;}},x=class extends Connection{dialect="postgres";harnessHoldingOuterTx=false;constructor(e){super({...e,baseSchema:`
|
|
18
18
|
${e.baseSchema??""}
|
|
19
19
|
|
|
20
20
|
CREATE SCHEMA IF NOT EXISTS auth;
|
|
@@ -223,7 +223,7 @@ END $$;
|
|
|
223
223
|
FROM pg_views views
|
|
224
224
|
WHERE views.schemaname NOT IN ('information_schema', 'pg_catalog')
|
|
225
225
|
ORDER BY views.schemaname, views.viewname
|
|
226
|
-
`.execute(this.kysely)).rows.map(i=>({name:i.name,schema:i.schema,sql:i.sql??""}));for(let i of a.rows)q.push({name:i.name,schema:i.schema,sql:i.sql??""});let
|
|
226
|
+
`.execute(this.kysely)).rows.map(i=>({name:i.name,schema:i.schema,sql:i.sql??""}));for(let i of a.rows)q.push({name:i.name,schema:i.schema,sql:i.sql??""});let me=(await sql`
|
|
227
227
|
SELECT
|
|
228
228
|
n.nspname AS "schema",
|
|
229
229
|
cl.relname AS "table",
|
|
@@ -235,7 +235,7 @@ END $$;
|
|
|
235
235
|
c.contype = 'c'
|
|
236
236
|
AND n.nspname NOT IN ('information_schema', 'pg_catalog')
|
|
237
237
|
ORDER BY n.nspname, cl.relname
|
|
238
|
-
`.execute(this.kysely)).rows.map(i=>({schema:i.schema,table:i.table,expression:i.expression??""})),
|
|
238
|
+
`.execute(this.kysely)).rows.map(i=>({schema:i.schema,table:i.table,expression:i.expression??""})),pe=(await sql`
|
|
239
239
|
SELECT
|
|
240
240
|
n.nspname AS "schema",
|
|
241
241
|
cl.relname AS "table",
|
|
@@ -250,7 +250,7 @@ END $$;
|
|
|
250
250
|
c.contype = 'u'
|
|
251
251
|
AND n.nspname NOT IN ('information_schema', 'pg_catalog')
|
|
252
252
|
GROUP BY n.nspname, cl.relname, c.conname, c.oid
|
|
253
|
-
`.execute(this.kysely)).rows.map(i=>({schema:i.schema,table:i.table,name:i.name,columns:i.columns})),
|
|
253
|
+
`.execute(this.kysely)).rows.map(i=>({schema:i.schema,table:i.table,name:i.name,columns:i.columns})),fe=(await sql`
|
|
254
254
|
SELECT
|
|
255
255
|
n.nspname AS "schema",
|
|
256
256
|
cl.relname AS "table",
|
|
@@ -265,7 +265,7 @@ END $$;
|
|
|
265
265
|
n.nspname NOT IN ('information_schema', 'pg_catalog')
|
|
266
266
|
AND cl.relkind IN ('r', 'v', 'm', 'f', 'p')
|
|
267
267
|
AND d.description IS NOT NULL
|
|
268
|
-
`.execute(this.kysely)).rows.map(i=>({schema:i.schema,table:i.table,column:i.column??void 0,text:i.text})),
|
|
268
|
+
`.execute(this.kysely)).rows.map(i=>({schema:i.schema,table:i.table,column:i.column??void 0,text:i.text})),ge=await sql`
|
|
269
269
|
SELECT
|
|
270
270
|
n.nspname AS "schema",
|
|
271
271
|
t.typname AS "type",
|
|
@@ -276,7 +276,7 @@ END $$;
|
|
|
276
276
|
JOIN pg_namespace n ON n.oid = t.typnamespace
|
|
277
277
|
WHERE n.nspname NOT IN ('pg_catalog', 'information_schema')
|
|
278
278
|
GROUP BY n.nspname, t.typname
|
|
279
|
-
`.execute(this.kysely),
|
|
279
|
+
`.execute(this.kysely),de=await sql`
|
|
280
280
|
SELECT
|
|
281
281
|
n.nspname AS "schema",
|
|
282
282
|
t.typname AS "type",
|
|
@@ -298,7 +298,7 @@ END $$;
|
|
|
298
298
|
AND NOT a.attisdropped
|
|
299
299
|
AND n.nspname NOT IN ('pg_catalog', 'information_schema')
|
|
300
300
|
GROUP BY n.nspname, t.typname
|
|
301
|
-
`.execute(this.kysely),
|
|
301
|
+
`.execute(this.kysely),ye=[...ge.rows.map(i=>({schema:i.schema,type:i.type,kind:"enum",values:i.values})),...de.rows.map(i=>({schema:i.schema,type:i.type,kind:"composite",fields:i.fields}))],he=(await sql`
|
|
302
302
|
SELECT
|
|
303
303
|
n.nspname AS "schema",
|
|
304
304
|
p.proname AS "name",
|
|
@@ -321,7 +321,7 @@ END $$;
|
|
|
321
321
|
WHERE n.nspname NOT IN ('pg_catalog', 'information_schema')
|
|
322
322
|
AND p.prokind = 'f'
|
|
323
323
|
ORDER BY n.nspname, p.proname
|
|
324
|
-
`.execute(this.kysely)).rows.map(i=>{let w=i.arg_names_raw??[],E=i.arg_modes_raw??null,
|
|
324
|
+
`.execute(this.kysely)).rows.map(i=>{let w=i.arg_names_raw??[],E=i.arg_modes_raw??null,Ne=E&&E.length===w.length?w.filter((R,k)=>E[k]==="i"||E[k]==="b"||E[k]==="v"):w,we=!!E?.some(R=>R==="o"||R==="b"||R==="t");return {schema:i.schema,name:i.name,arg_names:Ne,arg_types:i.arg_types_raw??[],arg_defaults:Number(i.arg_defaults??0),has_variadic:i.has_variadic===!0,volatility:i.volatility??"v",return_type:i.return_type??"",return_is_setof:i.return_is_setof===!0,return_rows:Number(i.return_rows??0),return_typtype:i.return_typtype??"",return_base_type:i.return_base_type??void 0,has_out_args:we}}),_e=(await sql`
|
|
325
325
|
SELECT
|
|
326
326
|
c.relname AS "name",
|
|
327
327
|
n.nspname AS "schema",
|
|
@@ -331,13 +331,13 @@ END $$;
|
|
|
331
331
|
JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
|
|
332
332
|
JOIN pg_catalog.pg_class p ON p.oid = i.inhparent
|
|
333
333
|
WHERE n.nspname NOT IN ('information_schema', 'pg_catalog')
|
|
334
|
-
`.execute(this.kysely)).rows.map(i=>({name:i.name,schema:i.schema,parent:i.parent})),
|
|
334
|
+
`.execute(this.kysely)).rows.map(i=>({name:i.name,schema:i.schema,parent:i.parent})),Se=(await sql`SELECT name FROM pg_catalog.pg_timezone_names`.execute(this.kysely)).rows.map(i=>i.name),Ee=(await sql`SELECT current_database() AS "name"`.execute(this.kysely)).rows[0]?.name??"postgres",G=te({tables:r,columns:f,indexes:S,foreign_keys:p,primary_keys:y,views:q,triggers:[],functions:he,check_constraints:me,unique_constraints:pe,comments:fe,custom_types:ye,partitions:_e,database_name:Ee,version:"",default_schema:this.config?.translation?.schemas?.defaultSchema??"public",timezones:Se});return await this.writeCachedIntrospection(G,{useDriver:t}),G}catch(o){return console.error("Introspection failed:",o),{tables:[],columns:[],indexes:[],foreign_keys:[],primary_keys:[],views:[],triggers:[],check_constraints:[],unique_constraints:[],comments:[],custom_types:[],database_name:"postgres",version:""}}}rlsState="unknown";async ensureRlsContext(){if(this.rlsState!=="unknown")return this.rlsState==="active";let e=await sql`
|
|
335
335
|
SELECT count(*) ::text as count FROM pg_class WHERE relrowsecurity = true
|
|
336
336
|
`.execute(this.kysely);if(!(Number(e.rows[0]?.count??0)>0))return this.rlsState="inactive",false;this.rlsState="active",await sql.raw(Q).execute(this.kysely);let s=await sql`
|
|
337
337
|
SELECT DISTINCT n.nspname FROM pg_class c
|
|
338
338
|
JOIN pg_namespace n ON n.oid = c.relnamespace
|
|
339
339
|
WHERE c.relrowsecurity = true
|
|
340
|
-
`.execute(this.kysely);for(let{nspname:o}of s.rows){let a=ne(o);await sql.raw(`GRANT USAGE ON SCHEMA ${a} TO ${A}`).execute(this.kysely),await sql.raw(`GRANT ALL ON ALL TABLES IN SCHEMA ${a} TO ${A}`).execute(this.kysely),await sql.raw(`GRANT ALL ON ALL SEQUENCES IN SCHEMA ${a} TO ${A}`).execute(this.kysely),await sql.raw(`ALTER DEFAULT PRIVILEGES IN SCHEMA ${a} GRANT ALL ON TABLES TO ${A}`).execute(this.kysely),await sql.raw(`ALTER DEFAULT PRIVILEGES IN SCHEMA ${a} GRANT ALL ON SEQUENCES TO ${A}`).execute(this.kysely);}return true}async postgresTransactionActive(e){try{return await sql`SAVEPOINT __supalite_outer_tx_check`.execute(e),await sql`RELEASE SAVEPOINT __supalite_outer_tx_check`.execute(e),!0}catch{return false}}async applyJwtSessionContext(e,t,s){let o=t.auth,a=o?.role||"anon",c=String(o?.uid??""),r=o?.jwt;await sql`SELECT set_config('role', ${a}, true)`.execute(e),await sql`SELECT set_config('request.jwt.claim.sub', ${c}, true)`.execute(e),await sql`SELECT set_config('request.jwt.claim.role', ${a}, true)`.execute(e),s&&await sql.raw(`SET LOCAL ROLE ${ne(a)}`).execute(e),r&&typeof r=="object"&&await sql`SELECT set_config('request.jwt.claims', ${JSON.stringify(r)}, true)`.execute(e);}async applyRpcRequestGucs(e,t){await sql`SELECT set_config('response.status', '', true)`.execute(e),await sql`SELECT set_config('response.headers', '', true)`.execute(e),await sql`SELECT set_config('request.method', ${t.method}, true)`.execute(e),await sql`SELECT set_config('request.path', ${t.path}, true)`.execute(e),await sql`SELECT set_config('request.headers', ${JSON.stringify(t.requestHeaders??{})}, true)`.execute(e);}async withContext(e,t,s){let o=s?.forceRollback===true;if(!o&&!e)return t(this.kysely);let a=e?await this.ensureRlsContext():false,r=e?.auth?.role||"anon",l=typeof r=="string"&&/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(r)&&!
|
|
340
|
+
`.execute(this.kysely);for(let{nspname:o}of s.rows){let a=ne(o);await sql.raw(`GRANT USAGE ON SCHEMA ${a} TO ${A}`).execute(this.kysely),await sql.raw(`GRANT ALL ON ALL TABLES IN SCHEMA ${a} TO ${A}`).execute(this.kysely),await sql.raw(`GRANT ALL ON ALL SEQUENCES IN SCHEMA ${a} TO ${A}`).execute(this.kysely),await sql.raw(`ALTER DEFAULT PRIVILEGES IN SCHEMA ${a} GRANT ALL ON TABLES TO ${A}`).execute(this.kysely),await sql.raw(`ALTER DEFAULT PRIVILEGES IN SCHEMA ${a} GRANT ALL ON SEQUENCES TO ${A}`).execute(this.kysely);}return true}async postgresTransactionActive(e){try{return await sql`SAVEPOINT __supalite_outer_tx_check`.execute(e),await sql`RELEASE SAVEPOINT __supalite_outer_tx_check`.execute(e),!0}catch{return false}}async applyJwtSessionContext(e,t,s){let o=t.auth,a=o?.role||"anon",c=String(o?.uid??""),r=o?.jwt;await sql`SELECT set_config('role', ${a}, true)`.execute(e),await sql`SELECT set_config('request.jwt.claim.sub', ${c}, true)`.execute(e),await sql`SELECT set_config('request.jwt.claim.role', ${a}, true)`.execute(e),s&&await sql.raw(`SET LOCAL ROLE ${ne(a)}`).execute(e),r&&typeof r=="object"&&await sql`SELECT set_config('request.jwt.claims', ${JSON.stringify(r)}, true)`.execute(e);}async applyRpcRequestGucs(e,t){await sql`SELECT set_config('response.status', '', true)`.execute(e),await sql`SELECT set_config('response.headers', '', true)`.execute(e),await sql`SELECT set_config('request.method', ${t.method}, true)`.execute(e),await sql`SELECT set_config('request.path', ${t.path}, true)`.execute(e),await sql`SELECT set_config('request.headers', ${JSON.stringify(t.requestHeaders??{})}, true)`.execute(e);}async withContext(e,t,s){let o=s?.forceRollback===true;if(!o&&!e)return t(this.kysely);let a=e?await this.ensureRlsContext():false,r=e?.auth?.role||"anon",l=typeof r=="string"&&/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(r)&&!Ge.has(r),f=s?.rpc;if(f){let m=async p=>{e&&(a||l)&&await this.applyJwtSessionContext(p,e,l),await this.applyRpcRequestGucs(p,f),f.readOnly&&await sql`SET LOCAL transaction_read_only = on`.execute(p);};if(this.harnessHoldingOuterTx)return invariant(await this.postgresTransactionActive(this.kysely),"harnessHoldingOuterTx is set but the connection has no open PostgreSQL transaction; wrap REST requests in BEGIN/ROLLBACK in the spec harness"),await m(this.kysely),t(this.kysely);try{return await this.kysely.transaction().execute(async p=>{await m(p);let g=await t(p);if(o)throw new N(g);return g})}catch(p){if(p instanceof N)return p.result;throw p}}if(!o&&!a&&!l)return t(this.kysely);if(!o&&l)return this.harnessHoldingOuterTx?(invariant(await this.postgresTransactionActive(this.kysely),"harnessHoldingOuterTx is set but the connection has no open PostgreSQL transaction; wrap REST requests in BEGIN/ROLLBACK in the spec harness"),await this.applyJwtSessionContext(this.kysely,e,true),t(this.kysely)):this.kysely.transaction().execute(async m=>(await this.applyJwtSessionContext(m,e,true),t(m)));if(!o&&a&&!l)return this.kysely.transaction().execute(async m=>(await this.applyJwtSessionContext(m,e,true),t(m)));try{return await this.kysely.transaction().execute(async m=>{e&&(a||l)&&await this.applyJwtSessionContext(m,e,l);let p=await t(m);if(o)throw new N(p);return p})}catch(m){if(m instanceof N)return m.result;throw m}}async onPostgrestAST(e){if(!e.from)return e;let t=e.schema??"public",s=e.from,o=await this.introspect({useCache:true});if(!o.tables.some(a=>a.name===s&&a.schema===t)&&!o.views.some(a=>a.name===s&&a.schema===t))throw new RelationNotFoundError(t,s);return e}async transaction(e,t){await this.exec("BEGIN");try{for(let s of e)await this.exec(s);await this.exec("COMMIT");}catch(s){throw await this.exec("ROLLBACK"),s}finally{t?.intent==="migration"&&await this.clearSchemaCache();}}get supportsRpc(){return true}async viewOptionsMetadata(e,t){let{rows:s}=await sql`
|
|
341
341
|
select is_insertable_into, is_updatable,
|
|
342
342
|
is_trigger_insertable_into, is_trigger_updatable, is_trigger_deletable
|
|
343
343
|
from information_schema.views
|
|
@@ -345,9 +345,9 @@ END $$;
|
|
|
345
345
|
`.execute(this.kysely),o=s[0],a=r=>r==="YES",{rows:c}=await sql`
|
|
346
346
|
select table_schema, table_name from information_schema.view_table_usage
|
|
347
347
|
where view_schema = ${t} and view_name = ${e}
|
|
348
|
-
`.execute(this.kysely);return {canInsert:a(o?.is_insertable_into)||a(o?.is_trigger_insertable_into),canUpdate:a(o?.is_updatable)||a(o?.is_trigger_updatable),canDelete:a(o?.is_updatable)||a(o?.is_trigger_deletable),baseTables:c.map(r=>({schema:r.table_schema,name:r.table_name}))}}};var se=(n,e=t=>t)=>{if(!n||n==="{}")return [];let t=n.slice(1,-1);if(t==="")return [];let s=[],o="",a=false,c=0;for(let r=0;r<t.length;r++){let l=t[r];l==='"'&&t[r-1]!=="\\"?(a=!a,o+=l):l==="{"&&!a?(c++,o+=l):l==="}"&&!a?(c--,o+=l):l===","&&!a&&c===0?(s.push(e(o)),o=""):o+=l;}return o!==""&&s.push(e(o)),s},
|
|
348
|
+
`.execute(this.kysely);return {canInsert:a(o?.is_insertable_into)||a(o?.is_trigger_insertable_into),canUpdate:a(o?.is_updatable)||a(o?.is_trigger_updatable),canDelete:a(o?.is_updatable)||a(o?.is_trigger_deletable),baseTables:c.map(r=>({schema:r.table_schema,name:r.table_name}))}}};var se=(n,e=t=>t)=>{if(!n||n==="{}")return [];let t=n.slice(1,-1);if(t==="")return [];let s=[],o="",a=false,c=0;for(let r=0;r<t.length;r++){let l=t[r];l==='"'&&t[r-1]!=="\\"?(a=!a,o+=l):l==="{"&&!a?(c++,o+=l):l==="}"&&!a?(c--,o+=l):l===","&&!a&&c===0?(s.push(e(o)),o=""):o+=l;}return o!==""&&s.push(e(o)),s},Ke=n=>n==="NULL"?null:n.startsWith('"')&&n.endsWith('"')?n.slice(1,-1).replace(/\\(.)/g,"$1"):n,je=n=>n==="NULL"?null:Number.parseInt(n,10);function Qe(n,e){if(n==null)return n;switch(e){case 20:return typeof n=="bigint"?n:BigInt(n);case 22:return Array.isArray(n)?n:typeof n=="string"?n.split(" ").map(Number).filter(t=>!Number.isNaN(t)):n;case 1002:case 1009:case 1015:return typeof n=="string"?se(n,Ke):n;case 1005:case 1007:case 1016:return typeof n=="string"?se(n,je):n;default:return n}}function H(n){let e=async(t,s)=>{let o=await n.driver.query(t,s?[...s]:[]);return {rows:o.rows.map(c=>Object.fromEntries(o.fields.map(r=>[r.name,Qe(c[r.name],r.dataTypeID)])))}};return {query:e,connect:async()=>({query:e,release:()=>{}}),end:async()=>{}}}async function oe(){try{let[{extract:n},{plan:e},{segmentActions:t}]=await Promise.all([import('@supabase/pg-delta/extract'),import('@supabase/pg-delta/plan'),import('@supabase/pg-delta/apply')]);return {extract:n,plan:e,segmentActions:t}}catch(n){throw new Error("Postgres schema diffing requires pg-delta to be available.",{cause:n})}}function W(n){let e=[...n.assumedRoles??[]],t=[{match:{all:[{kind:"acl"},{idField:{field:"grantee",glob:"postgres"}}]},action:"exclude"},{match:{all:[{verb:["link","unlink"]},{edgeTo:{edgeKind:"owner"}}]},action:"exclude"}];return e.length>0&&t.push({match:{all:[{kind:"role"},{name:e}]},action:"exclude"}),n.only?t.push({match:{not:{any:ae(n.only)}},action:"exclude"}):n.exclude?.length&&t.push({match:{any:ae(n.exclude)},action:"exclude"}),{id:"supabase-lite",filter:t,assumedRoles:["postgres",...e]}}function ae(n){let e=[...n];return [{all:[{kind:"schema"},{name:e}]},{schema:e},{target:{schema:e}}]}function ie(n,e){return n.segmentActions(e.actions).map(t=>({transactional:t.transactional,statements:e.actions.slice(t.start,t.end).map(s=>s.sql)}))}function re(n){let e=[];for(let t of n){let s=!t.nonTransactional,o=e[e.length-1];!o||t.newTransaction||o.transactional!==s?e.push({statements:[t.sql],transactional:s}):o.statements.push(t.sql);}return e}function ce(n){return n.preamble.filter(e=>e.name!=="search_path").map(e=>`SET LOCAL ${e.name} = ${Ye(e.value)}`)}function Ye(n){return `'${n.replace(/'/g,"''")}'`}function le(n){let e=[];for(let t of n.actions)t.dataLoss==="destructive"&&e.push(Ve(t));return e}function Ve(n){for(let e of n.destroys)if(e.kind==="table")return {table:U(e.schema,e.name),reason:"drop table"};for(let e of n.destroys)if(e.kind==="column")return {table:U(e.schema,e.table),reason:`drop column ${e.name}`};for(let e of n.destroys)if(e.kind==="sequence")return {table:U(e.schema,e.name),reason:"drop sequence"};return {table:"unknown",reason:n.sql}}function U(n,e){return n==="public"?e:`${n}.${e}`}var ze=new Set(["public","supabase_migrations"]),Xe=/\bCREATE\s+SCHEMA\b(?:\s+IF\s+NOT\s+EXISTS)?\s+"?([\w$]+)"?/gi;function Ze(n,e){let t=e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),s=new RegExp(`(?<![\\w$])"?${t}"?\\.`);return n.some(o=>s.test(o))}function ue(n,e){let t=new Set;for(let s of e)for(let o of s.matchAll(Xe))t.add(o[1]);return n.facts().filter(s=>s.id.kind==="schema").map(s=>s.id.name).filter(s=>!ze.has(s)&&!t.has(s)&&Ze(e,s)).map(s=>`CREATE SCHEMA IF NOT EXISTS "${s}";`)}var tt=["supabase_migrations"],I=class{constructor(e,t){this.from=e;this.desiredSchema=t;}#e;async#t(e){if(this.#e)return this.#e;let t=new this.from.constructor;try{let s=C($(this.desiredSchema));s&&await t.exec(s),await t.exec(this.desiredSchema);let{factBase:o}=await e.extract(H(t));return this.#e=o,o}finally{await t.close();}}async diff(e){let t=await oe(),s=await this.#t(t),{factBase:o}=await t.extract(H(this.from)),a=z(this.desiredSchema),c=e?.schemas?W({only:e.schemas,assumedRoles:a}):W({exclude:tt,assumedRoles:a}),r=t.plan(o,s,{policy:c});if(r.actions.length===0)return {diff:"",plan:{steps:[],warnings:[],unsafe:false}};let l=ie(t,r),f=ue(s,l.flatMap(g=>g.statements));f.length>0&&l[0]&&(l[0]={...l[0],statements:[...f,...l[0].statements]});let m=ce(r),p=[];for(let[g,y]of l.entries()){let d=y.transactional?[...m,...y.statements]:y.statements;for(let[_,S]of d.entries()){let b={sql:S};g>0&&_===0&&(b.newTransaction=true),y.transactional||(b.nonTransactional=true),p.push(b);}}return {diff:p.map(g=>g.sql).join(`
|
|
349
349
|
|
|
350
350
|
`),plan:{steps:p,warnings:le(r),unsafe:r.safetyReport.destructiveActions>0}}}async migratePlan(e,t){if(e.steps.length===0)return;if(e.unsafe&&!t?.force)throw new DataLossError(e.warnings??[]);let s=e.steps.map(r=>r.sql).join(`
|
|
351
|
-
`),o=L(s),a=new Set(e.steps.flatMap(r=>[...$(r.sql)]).filter(r=>!o.has(r))),c=C(a);c&&await this.from.exec(c);for(let r of re(e.steps)){if(r.transactional){await this.from.transaction(r.statements,{intent:"migration"});continue}for(let l of r.statements)await this.from.exec(l);}}async migrate(e){let t=await this.diff({schemas:e?.schemas});return await this.migratePlan(t.plan,e),t}safeSortPlanSteps(e){return e}};var J=class extends x{driver;dialect="postgres";#e=false;constructor(e={}){let t=e.url;t&&!t.includes("://")&&!
|
|
351
|
+
`),o=L(s),a=new Set(e.steps.flatMap(r=>[...$(r.sql)]).filter(r=>!o.has(r))),c=C(a);c&&await this.from.exec(c);for(let r of re(e.steps)){if(r.transactional){await this.from.transaction(r.statements,{intent:"migration"});continue}for(let l of r.statements)await this.from.exec(l);}}async migrate(e){let t=await this.diff({schemas:e?.schemas});return await this.migratePlan(t.plan,e),t}safeSortPlanSteps(e){return e}};var J=class extends x{driver;dialect="postgres";#e=false;constructor(e={}){let t=e.url;if(t&&!t.includes("://")){let a=globalThis.process?.getBuiltinModule?.("node:fs");a&&!a.existsSync(t)&&a.mkdirSync(t,{recursive:true});}let s=new PGlite({...e.pgliteOptions,dataDir:e.url??void 0,extensions:{...e.pgliteOptions?.extensions,isn:isn,ltree:ltree,file_fdw:file_fdw,pgcrypto:pgcrypto},parsers:{20:a=>{let c=Number(a);return Number.isSafeInteger(c)?c:BigInt(a)},114:a=>JSON.parse(a),3802:a=>JSON.parse(a),1700:a=>{let c=Number(a);return Number.isFinite(c)&&String(c)===a?c:a},1082:a=>a,1083:a=>a,1114:a=>a,1184:a=>a,1266:a=>a,...e.pgliteOptions?.parsers}}),{dialect:o}=new T(s);super(e),this.driver=s,this.kysely=new Kysely({dialect:o});}async exec(e,...t){try{if(t.length>0){let{rows:o}=await sql(e,...t??[]).execute(this.kysely);return {rows:o}}return {rows:(await this.driver.exec(e))[0].rows}}catch(s){throw console.error(s),new Error(`Failed to execute query: ${e}`)}}async close(){this.#e||(this.#e=true,await this.clearSchemaCache(),await this.kysely.destroy(),await this.driver.close());}createMigrator(e){let t=[this.config.baseSchema,e].filter(Boolean).join(`
|
|
352
352
|
|
|
353
|
-
`);return new I(this,t)}};async function
|
|
353
|
+
`);return new I(this,t)}};async function Gt(n={}){return new J(n)}export{J as PgliteConnection,Gt as createPgliteConnection};
|
package/dist/index.d.ts
CHANGED
|
@@ -1565,7 +1565,18 @@ declare function createServer(app: App, options?: ServerOptions): hono_hono_base
|
|
|
1565
1565
|
status: hono_utils_http_status.StatusCode;
|
|
1566
1566
|
};
|
|
1567
1567
|
};
|
|
1568
|
-
}, "/rest/v1"> | hono_types.MergeSchemaPath<hono_types.BlankSchema | hono_types.MergeSchemaPath<{
|
|
1568
|
+
}, "/rest/v1"> | hono_types.MergeSchemaPath<(hono_types.BlankSchema | hono_types.MergeSchemaPath<{
|
|
1569
|
+
"/status": {
|
|
1570
|
+
$get: {
|
|
1571
|
+
input: {};
|
|
1572
|
+
output: {
|
|
1573
|
+
status: string;
|
|
1574
|
+
};
|
|
1575
|
+
outputFormat: "json";
|
|
1576
|
+
status: 200;
|
|
1577
|
+
};
|
|
1578
|
+
};
|
|
1579
|
+
} & {
|
|
1569
1580
|
"/object/public/:bucketId/*": {
|
|
1570
1581
|
$get: {
|
|
1571
1582
|
input: {
|
|
@@ -2023,7 +2034,20 @@ declare function createServer(app: App, options?: ServerOptions): hono_hono_base
|
|
|
2023
2034
|
status: 404;
|
|
2024
2035
|
};
|
|
2025
2036
|
};
|
|
2026
|
-
}, "/"
|
|
2037
|
+
}, "/">) & {
|
|
2038
|
+
"*": {
|
|
2039
|
+
$all: {
|
|
2040
|
+
input: {};
|
|
2041
|
+
output: {
|
|
2042
|
+
message: string;
|
|
2043
|
+
error: string;
|
|
2044
|
+
statusCode: number;
|
|
2045
|
+
};
|
|
2046
|
+
outputFormat: "json";
|
|
2047
|
+
status: 404;
|
|
2048
|
+
};
|
|
2049
|
+
};
|
|
2050
|
+
}, "/storage/v1"> | hono_types.MergeSchemaPath<{
|
|
2027
2051
|
"/ping": {
|
|
2028
2052
|
$get: {
|
|
2029
2053
|
input: {};
|