@supabase/lite 0.9.1-next.1 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/FEATURES.md +6 -6
- package/LIMITATIONS.md +8 -6
- package/PATTERNS.md +66 -6
- package/README.md +15 -8
- package/STATUS.md +26 -19
- package/dist/{Connection-ZWTDByQ5.d.ts → Connection-f_d5HhQ0.d.ts} +301 -293
- package/dist/cli/index.js +127 -124
- package/dist/cli/lib.d.ts +1 -12
- package/dist/cli/lib.js +44 -39
- package/dist/db/fallback.d.ts +1 -1
- package/dist/db/postgres/PostgresConnection.js +18 -18
- package/dist/db/postgres/pglite/PgliteConnection.js +4 -4
- package/dist/index.d.ts +90 -38
- package/dist/index.js +181 -73
- package/dist/static/.vite/manifest.json +34 -2
- package/dist/static/assets/InterVariable-Dx4kXJAl.woff2 +0 -0
- package/dist/static/assets/InterVariable-Italic-DpCbqKDY.woff2 +0 -0
- package/dist/static/assets/SourceCodePro-Variable-BP8Zz55n.woff2 +0 -0
- package/dist/static/assets/SourceCodePro-Variable-Italic-eALmlzX7.woff2 +0 -0
- package/dist/static/assets/main-BY4iigay.css +1 -0
- package/dist/static/assets/main-BnQ-v4V9.js +199 -0
- package/dist/static/assets/manrope-latin-ext-wght-normal-Ch3YOpNY.woff2 +0 -0
- package/dist/static/assets/manrope-latin-wght-normal-DHIcAJRg.woff2 +0 -0
- package/dist/vite/index.d.ts +601 -29
- package/dist/vite/index.js +2 -2
- package/docs/auth/overview.mdx +1 -1
- package/docs/auth/supported-flows.mdx +4 -4
- package/docs/compatibility.mdx +4 -4
- package/docs/database/migrations.mdx +2 -0
- package/docs/database/rls.mdx +7 -5
- package/docs/database/schemas.mdx +1 -1
- package/docs/integrations/embedded.mdx +20 -3
- package/docs/integrations/frameworks.mdx +1 -1
- package/docs/integrations/vite.mdx +4 -2
- package/docs/llms.txt +2 -2
- package/docs/quickstart.mdx +2 -2
- package/docs/running.mdx +20 -10
- package/docs/storage/limitations.mdx +2 -11
- package/docs/storage/overview.mdx +8 -2
- package/package.json +2 -1
- package/skills/supalite/SKILL.md +1 -1
- package/dist/static/assets/main-1bwWb_1q.js +0 -40996
- package/dist/static/assets/main-BDsRycsc.css +0 -4045
- package/dist/static/fonts/CustomFont-Black.woff2 +0 -0
- package/dist/static/fonts/CustomFont-BlackItalic.woff2 +0 -0
- package/dist/static/fonts/CustomFont-Bold.woff2 +0 -0
- package/dist/static/fonts/CustomFont-BoldItalic.woff2 +0 -0
- package/dist/static/fonts/CustomFont-Book.woff2 +0 -0
- package/dist/static/fonts/CustomFont-BookItalic.woff2 +0 -0
- package/dist/static/fonts/CustomFont-Medium.woff2 +0 -0
package/dist/db/fallback.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { I as IConnectionConfig, C as Connection } from '../Connection-
|
|
1
|
+
import { I as IConnectionConfig, C as Connection } from '../Connection-f_d5HhQ0.js';
|
|
2
2
|
import 'kysely';
|
|
3
3
|
|
|
4
4
|
declare function createConnection<E extends IConnectionConfig = IConnectionConfig>(_config?: E): Promise<Connection>;
|
|
@@ -13,7 +13,7 @@ var Y=["anon","authenticated","service_role"];function V(a){return a==="service_
|
|
|
13
13
|
CREATE ROLE ${s} ${V(s)};
|
|
14
14
|
END IF;`).join("")}
|
|
15
15
|
END $$;
|
|
16
|
-
`}var k=Q(new Set(Y));function T(a){let e=a.trim();return e.startsWith('"')&&e.endsWith('"')||e.startsWith("`")&&e.endsWith("`")||e.startsWith("[")&&e.endsWith("]")?e.slice(1,-1):e}function Z(a){let e=[],s="",i=0,
|
|
16
|
+
`}var k=Q(new Set(Y));function T(a){let e=a.trim();return e.startsWith('"')&&e.endsWith('"')||e.startsWith("`")&&e.endsWith("`")||e.startsWith("[")&&e.endsWith("]")?e.slice(1,-1):e}function Z(a){let e=[],s="",i=0,t=null;for(let o=0;o<a.length;o++){let l=a[o];if(t){s+=l,l===t&&(t=null);continue}if(l==='"'||l==="`"||l==="'"){t=l,s+=l;continue}if(l==="("?i++:l===")"&&i>0&&i--,l===","&&i===0){e.push(s.trim()),s="";continue}s+=l;}return s.trim()&&e.push(s.trim()),e}function X(a){let e=a.match(/^(.*?)\s+as\s+(.+)$/i),s=e?e[1].trim():a.trim(),i=e?e[2].trim():void 0;if(!i){let l=a.match(/^(.+?)\s+((?:"[^"]+"|`[^`]+`|\[[^\]]+\]|\w+))$/);l&&!/[()]/.test(l[1])&&(s=l[1].trim(),i=l[2].trim());}let t=s.split(".").map(T);if(t.length>2)return null;let o=t.at(-1);return !o||!/^[A-Za-z_][\w$]*$/.test(o)?null:{baseColumn:o,viewColumn:i?T(i):o}}function x(a){return !!(a&&/[A-Za-z0-9_$]/.test(a))}function ee(a){let e=/\bselect\b/i.exec(a);if(!e)return null;let s=0,i=null;for(let t=e.index+e[0].length;t<a.length;t++){let o=a[t];if(i){o===i&&(i=null);continue}if(o==='"'||o==="`"||o==="'"){i=o;continue}if(o==="("){s++;continue}if(o===")"&&s>0){s--;continue}if(s===0&&a.slice(t,t+4).toLowerCase()==="from"&&!x(a[t-1])&&!x(a[t+4]))return {selectList:a.slice(e.index+e[0].length,t).trim(),fromRest:a.slice(t+4).trim()}}return null}function te(a){let e=0,s=[];for(;e<a.length;){for(;/\s/.test(a[e]??"");)e++;let i=a[e],t="";if(i==='"'||i==="`"){let r=a.indexOf(i,e+1);if(r===-1)return null;t=a.slice(e,r+1),e=r+1;}else if(i==="["){let r=a.indexOf("]",e+1);if(r===-1)return null;t=a.slice(e,r+1),e=r+1;}else {let r=/^[A-Za-z_][\w$]*/.exec(a.slice(e));if(!r)return null;t=r[0],e+=t.length;}s.push(t);let o=a.slice(e),l=/^\s*\./.exec(o);if(!l)break;e+=l[0].length;}return s.length===0?null:{raw:s.join("."),rest:a.slice(e).trim()}}function v(a,e,s){let i=a.get(e)??[];i.includes(s)||i.push(s),a.set(e,i);}function ne(a,e){if(!a)return null;let s=ee(a);if(!s)return null;let i=te(s.fromRest);if(!i)return null;let{raw:t,rest:o}=i;if(/\b(join|union|intersect|except)\b/i.test(o))return null;let l=t.split(".").map(T).at(-1);if(!l)return null;let r=new Map,c=e.get(l)??new Set;for(let p of Z(s.selectList)){let m=p.trim();if(m==="*"||m.endsWith(".*")){for(let d of c)v(r,d,d);continue}let g=X(p);g&&v(r,g.baseColumn,g.viewColumn);}return r.size===0?null:{baseTable:l,columns:r}}function se(a,e){let s=new Map;for(let[i,t]of e){let o=[];for(let l of t){let r=a.get(l);if(r)for(let c of r)o.includes(c)||o.push(c);}o.length>0&&s.set(i,o);}return s}function ae(a){let e=new Map,s=new Map;for(let r of a.columns??[]){let c=s.get(r.table)??new Set;c.add(r.name),s.set(r.table,c);}let i=(r,c)=>{let p=e.get(r)??[];p.some(m=>m.name===c.name&&m.schema===c.schema)||p.push(c),e.set(r,p);};for(let r of a.tables??[]){if(r.type!=="table")continue;let c=s.get(r.name);c&&i(r.name,{name:r.name,schema:r.schema,columnByBaseColumn:new Map([...c].map(p=>[p,[p]]))});}let t=new Map;for(let r of a.views??[]){let c=ne(r.sql,s);if(!c)continue;let p=s.get(r.name);if(!p)continue;let m=new Map;for(let[d,_]of c.columns){let f=_.filter(h=>p.has(h));f.length>0&&m.set(d,f);}if(m.size===0)continue;let g={name:r.name,schema:r.schema,columnByBaseColumn:m,fromRelation:c.baseTable};t.set(r.name,g);}let o=16;function l(r,c,p){if(c>o)return null;let m=r.fromRelation;if(e.has(m))return {physicalBase:m,columnByBaseColumn:r.columnByBaseColumn};let g=t.get(m);if(!g||p.has(m))return null;p.add(m);let d=l(g,c+1,p);if(p.delete(m),!d)return null;let _=se(r.columnByBaseColumn,d.columnByBaseColumn);return _.size===0?null:{physicalBase:d.physicalBase,columnByBaseColumn:_}}for(let r of t.values()){let c=l(r,0,new Set([r.name]));c&&i(c.physicalBase,{name:r.name,schema:r.schema,columnByBaseColumn:c.columnByBaseColumn});}return e}function B(a){return `${a.foreign_key_group??""}:${a.table}.${a.column}->${a.ref_table}.${a.ref_column}`}function oe(a){let e=new Map;for(let s of a){let i=`${s.schema}.${s.table}.${s.foreign_key_name}.${s.ref_schema??""}.${s.ref_table}`,t=e.get(i);t?t.push(s):e.set(i,[s]);}return [...e.values()]}function ie(a){let e=[[]];for(let s of a){let i=[];for(let t of e)for(let o of s)i.push([...t,o]);e=i;}return e}function re(a,e,s,i){let t=i.map(l=>l.childColumn).join(","),o=i.map(l=>l.parentColumn).join(",");return `${s}:${a.name}(${t})->${e.name}(${o})`}function $(a){if(!a.foreign_keys?.length||!a.views?.length)return a;let e=ae(a),s=new Set(a.foreign_keys.map(B)),i=[];for(let t of oe(a.foreign_keys)){let o=t[0],l=e.get(o.table)??[],r=e.get(o.ref_table)??[];for(let c of l)for(let p of r){if(c.schema!==p.schema)continue;let m=[];for(let g of t){let d=c.columnByBaseColumn.get(g.column)??[],_=p.columnByBaseColumn.get(g.ref_column)??[],f=d.flatMap(h=>_.map(y=>({fk:g,childColumn:h,parentColumn:y})));if(f.length===0){m.length=0;break}m.push(f);}for(let g of ie(m)){let _=c.name===o.table&&p.name===o.ref_table&&g.every(f=>f.childColumn===f.fk.column&&f.parentColumn===f.fk.ref_column)?void 0:re(c,p,o.foreign_key_name,g);for(let f of g){let h={...f.fk,table:c.name,column:f.childColumn,schema:c.schema,ref_table:p.name,ref_column:f.parentColumn,ref_schema:p.schema,foreign_key_group:_},y=B(h);s.has(y)||(s.add(y),i.push(h));}}}}return i.length?{...a,foreign_keys:[...a.foreign_keys,...i]}:a}var A="anon, authenticated, service_role",ue=new Set(["anon","authenticated","service_role"]);function F(a){return `"${a.replace(/"/g,'""')}"`}var S=class extends Error{constructor(s){super("Force rollback");this.result=s;}},O=class extends Connection{dialect="postgres";harnessHoldingOuterTx=false;constructor(e){super({...e,baseSchema:`
|
|
17
17
|
${e.baseSchema??""}
|
|
18
18
|
|
|
19
19
|
CREATE SCHEMA IF NOT EXISTS auth;
|
|
@@ -40,7 +40,7 @@ END $$;
|
|
|
40
40
|
'{}'
|
|
41
41
|
)::jsonb;
|
|
42
42
|
$$ LANGUAGE SQL STABLE;
|
|
43
|
-
`});}async introspect(e){invariant(typeof e=="object"||e===void 0,"options must be an object");let s=e?.useCache??false,i=await this.readCachedIntrospection({useCache:s});if(i)return i;try{let
|
|
43
|
+
`});}async introspect(e){invariant(typeof e=="object"||e===void 0,"options must be an object");let s=e?.useCache??false,i=await this.readCachedIntrospection({useCache:s});if(i)return i;try{let t=await sql`
|
|
44
44
|
SELECT
|
|
45
45
|
tbls.table_name AS "name",
|
|
46
46
|
tbls.table_schema AS "schema",
|
|
@@ -72,7 +72,7 @@ END $$;
|
|
|
72
72
|
FROM pg_catalog.pg_matviews mv
|
|
73
73
|
WHERE mv.schemaname NOT IN ('information_schema', 'pg_catalog')
|
|
74
74
|
ORDER BY mv.schemaname, mv.matviewname
|
|
75
|
-
`.execute(this.kysely),
|
|
75
|
+
`.execute(this.kysely),l=await sql`
|
|
76
76
|
SELECT
|
|
77
77
|
n.nspname AS "schema",
|
|
78
78
|
c.relname AS "table",
|
|
@@ -92,7 +92,7 @@ END $$;
|
|
|
92
92
|
AND a.attnum > 0
|
|
93
93
|
AND NOT a.attisdropped
|
|
94
94
|
ORDER BY n.nspname, c.relname, a.attnum
|
|
95
|
-
`.execute(this.kysely),r=
|
|
95
|
+
`.execute(this.kysely),r=t.rows.map(n=>({name:n.name,schema:n.schema,type:"table",rows:Number(n.rows),sql:"",engine:"",collation:""}));for(let n of o.rows)r.push({name:n.name,schema:n.schema,type:"table",rows:0,sql:"",engine:"",collation:""});let p=(await sql`
|
|
96
96
|
SELECT
|
|
97
97
|
cols.table_name AS "table",
|
|
98
98
|
cols.table_schema AS "schema",
|
|
@@ -146,7 +146,7 @@ END $$;
|
|
|
146
146
|
LEFT JOIN pg_catalog.pg_type pt ON pt.oid = attr.atttypid
|
|
147
147
|
WHERE cols.table_schema NOT IN ('information_schema', 'pg_catalog')
|
|
148
148
|
ORDER BY cols.table_schema, cols.table_name, cols.ordinal_position
|
|
149
|
-
`.execute(this.kysely)).rows.map(
|
|
149
|
+
`.execute(this.kysely)).rows.map(n=>({table:n.table,schema:n.schema,name:n.name,type:n.type,nullable:n.nullable,default_value:n.default_value,is_primary_key:!1,ordinal_position:Number(n.ordinal_position),character_maximum_length:n.character_maximum_length??null,precision:n.precision??null,is_identity:n.is_identity,collation:n.collation,pg_type:n.domain_type??n.udt_name??void 0,udt_schema:n.udt_schema??void 0,is_generated:n.is_generated??!1}));for(let n of l.rows)p.push({table:n.table,schema:n.schema,name:n.name,type:n.type??"",nullable:n.nullable??!0,default_value:n.default_value??null,is_primary_key:!1,ordinal_position:Number(n.ordinal_position),character_maximum_length:null,precision:null,is_identity:!1,collation:"",pg_type:void 0,udt_schema:void 0,is_generated:!1});let g=(await sql`
|
|
150
150
|
SELECT
|
|
151
151
|
ns.nspname AS "schema",
|
|
152
152
|
cl.relname AS "table",
|
|
@@ -176,7 +176,7 @@ END $$;
|
|
|
176
176
|
AND NOT cl.relispartition
|
|
177
177
|
AND NOT ref_cl.relispartition
|
|
178
178
|
ORDER BY ns.nspname, cl.relname, con.conname, cols.ord
|
|
179
|
-
`.execute(this.kysely)).rows.map(
|
|
179
|
+
`.execute(this.kysely)).rows.map(n=>({table:n.table,column:n.column,schema:n.schema,ref_table:n.ref_table,ref_column:n.ref_column,foreign_key_name:n.foreign_key_name,fk_def:n.fk_def,on_update:"",on_delete:""})),_=(await sql`
|
|
180
180
|
SELECT
|
|
181
181
|
ns.nspname AS "schema",
|
|
182
182
|
cl.relname AS "table",
|
|
@@ -193,7 +193,7 @@ END $$;
|
|
|
193
193
|
'information_schema'
|
|
194
194
|
, 'pg_catalog')
|
|
195
195
|
GROUP BY ns.nspname, cl.relname, con.oid
|
|
196
|
-
`.execute(this.kysely)).rows.map(
|
|
196
|
+
`.execute(this.kysely)).rows.map(n=>({table:n.table,columns:n.columns,schema:n.schema,field_count:n.columns.length})),f=new Set(_.flatMap(n=>n.columns.map(N=>`${n.schema}.${n.table}.${N}`)));for(let n of p)n.is_primary_key=f.has(`${n.schema}.${n.table}.${n.name}`);let y=(await sql`
|
|
197
197
|
SELECT
|
|
198
198
|
tnsp.nspname AS "schema",
|
|
199
199
|
cl.relname AS "table",
|
|
@@ -214,7 +214,7 @@ END $$;
|
|
|
214
214
|
'information_schema'
|
|
215
215
|
, 'pg_catalog')
|
|
216
216
|
GROUP BY tnsp.nspname, cl.relname, ic.relname, idx.indisunique
|
|
217
|
-
`.execute(this.kysely)).rows.map(
|
|
217
|
+
`.execute(this.kysely)).rows.map(n=>({table:n.table,name:n.name,unique:n.unique,columns:n.columns,schema:n.schema})),C=(await sql`
|
|
218
218
|
SELECT
|
|
219
219
|
views.schemaname AS "schema",
|
|
220
220
|
views.viewname AS "name",
|
|
@@ -222,7 +222,7 @@ END $$;
|
|
|
222
222
|
FROM pg_views views
|
|
223
223
|
WHERE views.schemaname NOT IN ('information_schema', 'pg_catalog')
|
|
224
224
|
ORDER BY views.schemaname, views.viewname
|
|
225
|
-
`.execute(this.kysely)).rows.map(
|
|
225
|
+
`.execute(this.kysely)).rows.map(n=>({name:n.name,schema:n.schema,sql:n.sql??""}));for(let n of o.rows)C.push({name:n.name,schema:n.schema,sql:n.sql??""});let D=(await sql`
|
|
226
226
|
SELECT
|
|
227
227
|
n.nspname AS "schema",
|
|
228
228
|
cl.relname AS "table",
|
|
@@ -234,7 +234,7 @@ END $$;
|
|
|
234
234
|
c.contype = 'c'
|
|
235
235
|
AND n.nspname NOT IN ('information_schema', 'pg_catalog')
|
|
236
236
|
ORDER BY n.nspname, cl.relname
|
|
237
|
-
`.execute(this.kysely)).rows.map(
|
|
237
|
+
`.execute(this.kysely)).rows.map(n=>({schema:n.schema,table:n.table,expression:n.expression??""})),H=(await sql`
|
|
238
238
|
SELECT
|
|
239
239
|
n.nspname AS "schema",
|
|
240
240
|
cl.relname AS "table",
|
|
@@ -249,7 +249,7 @@ END $$;
|
|
|
249
249
|
c.contype = 'u'
|
|
250
250
|
AND n.nspname NOT IN ('information_schema', 'pg_catalog')
|
|
251
251
|
GROUP BY n.nspname, cl.relname, c.conname, c.oid
|
|
252
|
-
`.execute(this.kysely)).rows.map(
|
|
252
|
+
`.execute(this.kysely)).rows.map(n=>({schema:n.schema,table:n.table,name:n.name,columns:n.columns})),J=(await sql`
|
|
253
253
|
SELECT
|
|
254
254
|
n.nspname AS "schema",
|
|
255
255
|
cl.relname AS "table",
|
|
@@ -264,7 +264,7 @@ END $$;
|
|
|
264
264
|
n.nspname NOT IN ('information_schema', 'pg_catalog')
|
|
265
265
|
AND cl.relkind IN ('r', 'v', 'm', 'f', 'p')
|
|
266
266
|
AND d.description IS NOT NULL
|
|
267
|
-
`.execute(this.kysely)).rows.map(
|
|
267
|
+
`.execute(this.kysely)).rows.map(n=>({schema:n.schema,table:n.table,column:n.column??void 0,text:n.text})),M=await sql`
|
|
268
268
|
SELECT
|
|
269
269
|
n.nspname AS "schema",
|
|
270
270
|
t.typname AS "type",
|
|
@@ -297,7 +297,7 @@ END $$;
|
|
|
297
297
|
AND NOT a.attisdropped
|
|
298
298
|
AND n.nspname NOT IN ('pg_catalog', 'information_schema')
|
|
299
299
|
GROUP BY n.nspname, t.typname
|
|
300
|
-
`.execute(this.kysely),P=[...M.rows.map(
|
|
300
|
+
`.execute(this.kysely),P=[...M.rows.map(n=>({schema:n.schema,type:n.type,kind:"enum",values:n.values})),...U.rows.map(n=>({schema:n.schema,type:n.type,kind:"composite",fields:n.fields}))],W=(await sql`
|
|
301
301
|
SELECT
|
|
302
302
|
n.nspname AS "schema",
|
|
303
303
|
p.proname AS "name",
|
|
@@ -320,7 +320,7 @@ END $$;
|
|
|
320
320
|
WHERE n.nspname NOT IN ('pg_catalog', 'information_schema')
|
|
321
321
|
AND p.prokind = 'f'
|
|
322
322
|
ORDER BY n.nspname, p.proname
|
|
323
|
-
`.execute(this.kysely)).rows.map(
|
|
323
|
+
`.execute(this.kysely)).rows.map(n=>{let N=n.arg_names_raw??[],E=n.arg_modes_raw??null,q=E&&E.length===N.length?N.filter((R,w)=>E[w]==="i"||E[w]==="b"||E[w]==="v"):N,z=!!E?.some(R=>R==="o"||R==="b"||R==="t");return {schema:n.schema,name:n.name,arg_names:q,arg_types:n.arg_types_raw??[],arg_defaults:Number(n.arg_defaults??0),has_variadic:n.has_variadic===!0,volatility:n.volatility??"v",return_type:n.return_type??"",return_is_setof:n.return_is_setof===!0,return_rows:Number(n.return_rows??0),return_typtype:n.return_typtype??"",return_base_type:n.return_base_type??void 0,has_out_args:z}}),G=(await sql`
|
|
324
324
|
SELECT
|
|
325
325
|
c.relname AS "name",
|
|
326
326
|
n.nspname AS "schema",
|
|
@@ -330,18 +330,18 @@ END $$;
|
|
|
330
330
|
JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
|
|
331
331
|
JOIN pg_catalog.pg_class p ON p.oid = i.inhparent
|
|
332
332
|
WHERE n.nspname NOT IN ('information_schema', 'pg_catalog')
|
|
333
|
-
`.execute(this.kysely)).rows.map(
|
|
333
|
+
`.execute(this.kysely)).rows.map(n=>({name:n.name,schema:n.schema,parent:n.parent})),j=(await sql`SELECT name FROM pg_catalog.pg_timezone_names`.execute(this.kysely)).rows.map(n=>n.name),K=(await sql`SELECT current_database() AS "name"`.execute(this.kysely)).rows[0]?.name??"postgres",I=$({tables:r,columns:p,indexes:y,foreign_keys:g,primary_keys:_,views:C,triggers:[],functions:W,check_constraints:D,unique_constraints:H,comments:J,custom_types:P,partitions:G,database_name:K,version:"",default_schema:this.config?.translation?.schemas?.defaultSchema??"public",timezones:j});return await this.writeCachedIntrospection(I,{useDriver:s}),I}catch(t){return console.error("Introspection failed:",t),{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`
|
|
334
334
|
SELECT count(*) ::text as count FROM pg_class WHERE relrowsecurity = true
|
|
335
335
|
`.execute(this.kysely);if(!(Number(e.rows[0]?.count??0)>0))return this.rlsState="inactive",false;this.rlsState="active",await sql.raw(k).execute(this.kysely);let i=await sql`
|
|
336
336
|
SELECT DISTINCT n.nspname FROM pg_class c
|
|
337
337
|
JOIN pg_namespace n ON n.oid = c.relnamespace
|
|
338
338
|
WHERE c.relrowsecurity = true
|
|
339
|
-
`.execute(this.kysely);for(let{nspname:
|
|
339
|
+
`.execute(this.kysely);for(let{nspname:t}of i.rows){let o=F(t);await sql.raw(`GRANT USAGE ON SCHEMA ${o} TO ${A}`).execute(this.kysely),await sql.raw(`GRANT ALL ON ALL TABLES IN SCHEMA ${o} TO ${A}`).execute(this.kysely),await sql.raw(`GRANT ALL ON ALL SEQUENCES IN SCHEMA ${o} TO ${A}`).execute(this.kysely),await sql.raw(`ALTER DEFAULT PRIVILEGES IN SCHEMA ${o} GRANT ALL ON TABLES TO ${A}`).execute(this.kysely),await sql.raw(`ALTER DEFAULT PRIVILEGES IN SCHEMA ${o} 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,s,i){let t=s.auth,o=t?.role||"anon",l=String(t?.uid??""),r=t?.jwt,c=s.storage?.operation;await sql`SELECT set_config('role', ${o}, true)`.execute(e),await sql`SELECT set_config('request.jwt.claim.sub', ${l}, true)`.execute(e),await sql`SELECT set_config('request.jwt.claim.role', ${o}, true)`.execute(e),await sql`SELECT set_config('storage.operation', ${String(c??"")}, true)`.execute(e),i&&await sql.raw(`SET LOCAL ROLE ${F(o)}`).execute(e),r&&typeof r=="object"&&await sql`SELECT set_config('request.jwt.claims', ${JSON.stringify(r)}, true)`.execute(e);}async applyRpcRequestGucs(e,s){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', ${s.method}, true)`.execute(e),await sql`SELECT set_config('request.path', ${s.path}, true)`.execute(e),await sql`SELECT set_config('request.headers', ${JSON.stringify(s.requestHeaders??{})}, true)`.execute(e);}async withContext(e,s,i){let t=i?.forceRollback===true;if(!t&&!e)return s(this.kysely);let o=e?await this.ensureRlsContext():false,r=e?.auth?.role||"anon",c=typeof r=="string"&&/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(r)&&!ue.has(r);if(i?.transaction){if(t)throw new Error("Cannot force rollback an existing transaction");return e&&(o||c)&&await this.applyJwtSessionContext(i.transaction,e,c),s(i.transaction)}let p=i?.rpc;if(p){let m=async g=>{e&&(o||c)&&await this.applyJwtSessionContext(g,e,c),await this.applyRpcRequestGucs(g,p),p.readOnly&&await sql`SET LOCAL transaction_read_only = on`.execute(g);};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),s(this.kysely);try{return await this.kysely.transaction().execute(async g=>{await m(g);let d=await s(g);if(t)throw new S(d);return d})}catch(g){if(g instanceof S)return g.result;throw g}}if(!t&&!o&&!c)return s(this.kysely);if(!t&&c)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),s(this.kysely)):this.kysely.transaction().execute(async m=>(await this.applyJwtSessionContext(m,e,true),s(m)));if(!t&&o&&!c)return this.kysely.transaction().execute(async m=>(await this.applyJwtSessionContext(m,e,true),s(m)));try{return await this.kysely.transaction().execute(async m=>{e&&(o||c)&&await this.applyJwtSessionContext(m,e,c);let g=await s(m);if(t)throw new S(g);return g})}catch(m){if(m instanceof S)return m.result;throw m}}async onPostgrestAST(e){if(!e.from)return e;let s=e.schema??"public",i=e.from,t=await this.introspect({useCache:true});if(!t.tables.some(o=>o.name===i&&o.schema===s)&&!t.views.some(o=>o.name===i&&o.schema===s))throw new RelationNotFoundError(s,i);return e}async transaction(e,s){await this.exec("BEGIN");try{for(let i of e)await this.exec(i);await this.exec("COMMIT");}catch(i){throw await this.exec("ROLLBACK"),i}finally{s?.intent==="migration"&&await this.clearSchemaCache();}}get supportsRpc(){return true}async viewOptionsMetadata(e,s){let{rows:i}=await sql`
|
|
340
340
|
select is_insertable_into, is_updatable,
|
|
341
341
|
is_trigger_insertable_into, is_trigger_updatable, is_trigger_deletable
|
|
342
342
|
from information_schema.views
|
|
343
343
|
where table_schema = ${s} and table_name = ${e}
|
|
344
|
-
`.execute(this.kysely),
|
|
344
|
+
`.execute(this.kysely),t=i[0],o=r=>r==="YES",{rows:l}=await sql`
|
|
345
345
|
select table_schema, table_name from information_schema.view_table_usage
|
|
346
346
|
where view_schema = ${s} and view_name = ${e}
|
|
347
|
-
`.execute(this.kysely);return {canInsert:o(
|
|
347
|
+
`.execute(this.kysely);return {canInsert:o(t?.is_insertable_into)||o(t?.is_trigger_insertable_into),canUpdate:o(t?.is_updatable)||o(t?.is_trigger_updatable),canDelete:o(t?.is_updatable)||o(t?.is_trigger_deletable),baseTables:l.map(r=>({schema:r.table_schema,name:r.table_name}))}}};var L=class extends O{driver;dialect="postgres";constructor(e){super(e);let{postgresOptions:s}=e;this.driver=me(e.url??"",{...s,connection:{TimeZone:"UTC",...s?.connection},types:{bigint:{to:20,from:[20],serialize:t=>t.toString(),parse:t=>{let o=Number(t);return Number.isSafeInteger(o)?o:BigInt(t)}},json:{to:114,from:[114],serialize:t=>JSON.stringify(t),parse:t=>JSON.parse(t)},jsonb:{to:3802,from:[3802],serialize:t=>JSON.stringify(t),parse:t=>JSON.parse(t)},numeric:{to:1700,from:[1700],serialize:t=>String(t),parse:t=>{let o=Number(t);return Number.isFinite(o)&&String(o)===t?o:t}},date:{to:1082,from:[1082],serialize:t=>t,parse:t=>t},time:{to:1083,from:[1083],serialize:t=>t,parse:t=>t},timestamp:{to:1114,from:[1114],serialize:t=>t,parse:t=>t},timestamptz:{to:1184,from:[1184],serialize:t=>t,parse:t=>t},timetz:{to:1266,from:[1266],serialize:t=>t,parse:t=>t},...s?.types}});let i=new PostgresJSDialect({postgres:this.driver});this.kysely=new Kysely({dialect:i});}async close(){await this.driver.end();}};function ve(a){return new L(a)}export{L as PostgresConnection,ve as createPostgresConnection};
|
|
@@ -14,7 +14,7 @@ var B=class{#e;#t;constructor(e,t){this.#e=e,this.#t=t;}async acquireConnection(
|
|
|
14
14
|
END IF;`).join("")}
|
|
15
15
|
END $$;
|
|
16
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
|
|
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 $(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")&&$(s,r+1,e),l==="from"&&o==="revoke"&&$(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)&&$(s,1,e);}return e}function v(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 $e(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 ve(n,e){if(!n)return null;let t=De(n);if(!t)return null;let s=$e(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=ve(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;
|
|
@@ -337,7 +337,7 @@ END $$;
|
|
|
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)&&!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`
|
|
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,l=t.storage?.operation;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),await sql`SELECT set_config('storage.operation', ${String(l??"")}, 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);if(s?.transaction){if(o)throw new Error("Cannot force rollback an existing transaction");return e&&(a||l)&&await this.applyJwtSessionContext(s.transaction,e,l),t(s.transaction)}let 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},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(
|
|
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(v(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=>[
|
|
351
|
+
`),o=L(s),a=new Set(e.steps.flatMap(r=>[...v(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
353
|
`);return new I(this,t)}};async function Gt(n={}){return new J(n)}export{J as PgliteConnection,Gt as createPgliteConnection};
|