@lunora/do 1.0.0-alpha.51 → 1.0.0-alpha.53

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.
Files changed (28) hide show
  1. package/dist/index.d.mts +136 -40
  2. package/dist/index.d.ts +136 -40
  3. package/dist/index.mjs +1 -1
  4. package/dist/packem_shared/ADMIN_FUNCTIONS-CjgwJp2Q.mjs +1 -0
  5. package/dist/packem_shared/DEFAULT_EXPLAIN_ISSUE_MODEL-Dicm4iLF.mjs +3 -0
  6. package/dist/packem_shared/{DEFAULT_MAX_RELATION_KEYS-BRdmX7WW.mjs → DEFAULT_MAX_RELATION_KEYS-BcW3nUKL.mjs} +1 -1
  7. package/dist/packem_shared/NotUniqueError-BDYkMtJP.mjs +1 -0
  8. package/dist/packem_shared/{ROOT_DO_SIZE_WARN_BYTES-oZjI_5uF.mjs → ROOT_DO_SIZE_WARN_BYTES-jp8WQaE9.mjs} +16 -16
  9. package/dist/packem_shared/{applyOnDelete-BvQN7pDL.mjs → applyOnDelete-CafQWSqu.mjs} +1 -1
  10. package/dist/packem_shared/applySelect-B0CF8T7y.mjs +1 -0
  11. package/dist/packem_shared/backfillAggregateIndexes-DUrhkmiz.mjs +1 -0
  12. package/dist/packem_shared/ctx-db-backfill-C4rAzsQo.mjs +1 -0
  13. package/dist/packem_shared/ctx-db-shapes-CHC2cS0g.mjs +1 -0
  14. package/dist/packem_shared/do-sql-x0AjZhaN.mjs +1 -0
  15. package/dist/packem_shared/{isSoftDeleted-BvhQov04.mjs → isSoftDeleted-juJOq515.mjs} +1 -1
  16. package/dist/packem_shared/{materializeExternalRows-BFmT9gsw.mjs → materializeExternalRows-BUmj_9WO.mjs} +1 -1
  17. package/dist/packem_shared/runShardMigrations-CcSFXtXZ.mjs +5 -0
  18. package/dist/packem_shared/{selectExpiredIds-BGVP3d8-.mjs → selectExpiredIds-BXJDiUtz.mjs} +1 -1
  19. package/dist/packem_shared/{serveRelationFanout-Ct5D2Tbk.mjs → serveRelationFanout-CK8xbCFx.mjs} +1 -1
  20. package/package.json +4 -3
  21. package/dist/packem_shared/ADMIN_FUNCTIONS-PxZ8Lr9e.mjs +0 -1
  22. package/dist/packem_shared/NotUniqueError-GI79LNJB.mjs +0 -1
  23. package/dist/packem_shared/applySelect-Bq2KOrkL.mjs +0 -1
  24. package/dist/packem_shared/backfillAggregateIndexes-BAQ3Fwwh.mjs +0 -1
  25. package/dist/packem_shared/buildFtsMatch-CV0Z7PWv.mjs +0 -1
  26. package/dist/packem_shared/ctx-db-shapes-DzX_H5q8.mjs +0 -1
  27. package/dist/packem_shared/do-sql-BYIQTG3z.mjs +0 -1
  28. package/dist/packem_shared/runShardMigrations-bxOHpfID.mjs +0 -5
@@ -1 +1 @@
1
- import{LunoraError as D}from"@lunora/errors";import{applySelect as A}from"./applySelect-Bq2KOrkL.mjs";const v=(r,o)=>o.select?A(r,o.select,o.with):r,_=async(r,o,t,a,s)=>{const w=await Promise.all(a.map(async l=>{const m=s?{AND:[{[t]:l},s]}:{[t]:l};return[l,await r(o,m)]}));return new Map(w)},W=(r,o)=>{const t=new Set;for(const a of r){const s=a[o];s!=null&&t.add(s)}return[...t]},C=async r=>{const{groupedCounter:o,fetcher:t,parents:a,relationBaseWhere:s,schema:w,tableName:l,with:m}=r;if(a.length===0)return;const k=w.tables[l];if(!k)throw new D("INTERNAL",`unknown table: ${l}`);const O=k.relationMap??{},g=c=>{const e=O[c];if(!e)throw new D("INTERNAL",`unknown relation "${c}" on table "${l}"`);return e},M=async(c,e,n)=>{const u=W(a,e.field);if(u.length===0){for(const i of a)i[c]=null;return}const{page:p}=await t(e.table,{baseWhere:s?.(e.table),relationBaseWhere:s,where:{[e.references]:{in:u}},with:n.with}),b=new Map;for(const i of p)b.set(i[e.references],i);for(const i of a){const d=b.get(i[e.field]);i[c]=d?v([d],n)[0]??null:null}},R=async(c,e,n)=>{const u=W(a,e.references);if(u.length===0){for(const f of a)f[c]=[];return}const p={[e.field]:{in:u}},b=n.where?{AND:[n.where,p]}:p,{page:i}=await t(e.table,{baseWhere:s?.(e.table),orderBy:n.orderBy,relationBaseWhere:s,where:b,with:n.with}),d=new Map;for(const f of i){const h=f[e.field],$=d.get(h);$?$.push(f):d.set(h,[f])}const y=typeof n.limit=="number"?Math.max(0,Math.floor(n.limit)):void 0;for(const f of a){const h=d.get(f[e.references])??[];f[c]=v(y===void 0?h:h.slice(0,y),n)}},N=async c=>{for(const e of Object.keys(c)){const n=g(e),[u,p]=n.kind==="many"?[n.field,n.references]:[n.references,n.field],b=s?.(n.table),i=W(a,p),d=i.length===0?new Map:await o(n.table,u,i,b);for(const y of a){const f=y._count??{},h=y[p];f[e]=h==null?0:d.get(h)??0,y._count=f}}};for(const[c,e]of Object.entries(m)){if(e===void 0||e===!1)continue;if(c==="_count"){await N(e);continue}const n=g(c),u=e===!0?{}:e;await(n.kind==="one"?M(c,n,u):R(c,n,u))}},B=async(r,o,t)=>{const{deletedId:a,deletedReference:s,findHolders:w,onCascade:l,onRestrict:m,onSetNull:k,tableName:O}=r,g=t.references==="_id"?a:s(t.references);if(g==null)return;const M=await w(o,t.field,g);if(M.length!==0){t.onDelete==="restrict"&&m(`cannot delete "${O}" row: "${o}.${t.field}" still references it`);for(const R of M){const N=R._id;typeof N=="string"&&await(t.onDelete==="cascade"?l(o,N):k(o,N,t.field))}}},E=async r=>{const{schema:o,tableName:t}=r;if(!o.tables[t])throw new D("INTERNAL",`unknown table: ${t}`);for(const[a,s]of Object.entries(o.tables)){const w=s.relationMap;if(w)for(const l of Object.values(w))l.kind!=="one"||l.table!==t||!l.onDelete||await B(r,a,l)}},I=(r,o)=>{for(const[t,a]of Object.entries(r.shape))t in o&&typeof a.parse=="function"&&a.parse(o[t])};export{E as applyOnDelete,W as distinctValues,_ as fanOutScalarCounts,C as resolveWith,I as runRowValidators};
1
+ import{LunoraError as D}from"@lunora/errors";import{applySelect as A}from"./applySelect-B0CF8T7y.mjs";const v=(r,o)=>o.select?A(r,o.select,o.with):r,_=async(r,o,t,a,s)=>{const w=await Promise.all(a.map(async l=>{const m=s?{AND:[{[t]:l},s]}:{[t]:l};return[l,await r(o,m)]}));return new Map(w)},W=(r,o)=>{const t=new Set;for(const a of r){const s=a[o];s!=null&&t.add(s)}return[...t]},C=async r=>{const{groupedCounter:o,fetcher:t,parents:a,relationBaseWhere:s,schema:w,tableName:l,with:m}=r;if(a.length===0)return;const k=w.tables[l];if(!k)throw new D("INTERNAL",`unknown table: ${l}`);const O=k.relationMap??{},g=c=>{const e=O[c];if(!e)throw new D("INTERNAL",`unknown relation "${c}" on table "${l}"`);return e},M=async(c,e,n)=>{const u=W(a,e.field);if(u.length===0){for(const i of a)i[c]=null;return}const{page:p}=await t(e.table,{baseWhere:s?.(e.table),relationBaseWhere:s,where:{[e.references]:{in:u}},with:n.with}),b=new Map;for(const i of p)b.set(i[e.references],i);for(const i of a){const d=b.get(i[e.field]);i[c]=d?v([d],n)[0]??null:null}},R=async(c,e,n)=>{const u=W(a,e.references);if(u.length===0){for(const f of a)f[c]=[];return}const p={[e.field]:{in:u}},b=n.where?{AND:[n.where,p]}:p,{page:i}=await t(e.table,{baseWhere:s?.(e.table),orderBy:n.orderBy,relationBaseWhere:s,where:b,with:n.with}),d=new Map;for(const f of i){const h=f[e.field],$=d.get(h);$?$.push(f):d.set(h,[f])}const y=typeof n.limit=="number"?Math.max(0,Math.floor(n.limit)):void 0;for(const f of a){const h=d.get(f[e.references])??[];f[c]=v(y===void 0?h:h.slice(0,y),n)}},N=async c=>{for(const e of Object.keys(c)){const n=g(e),[u,p]=n.kind==="many"?[n.field,n.references]:[n.references,n.field],b=s?.(n.table),i=W(a,p),d=i.length===0?new Map:await o(n.table,u,i,b);for(const y of a){const f=y._count??{},h=y[p];f[e]=h==null?0:d.get(h)??0,y._count=f}}};for(const[c,e]of Object.entries(m)){if(e===void 0||e===!1)continue;if(c==="_count"){await N(e);continue}const n=g(c),u=e===!0?{}:e;await(n.kind==="one"?M(c,n,u):R(c,n,u))}},B=async(r,o,t)=>{const{deletedId:a,deletedReference:s,findHolders:w,onCascade:l,onRestrict:m,onSetNull:k,tableName:O}=r,g=t.references==="_id"?a:s(t.references);if(g==null)return;const M=await w(o,t.field,g);if(M.length!==0){t.onDelete==="restrict"&&m(`cannot delete "${O}" row: "${o}.${t.field}" still references it`);for(const R of M){const N=R._id;typeof N=="string"&&await(t.onDelete==="cascade"?l(o,N):k(o,N,t.field))}}},E=async r=>{const{schema:o,tableName:t}=r;if(!o.tables[t])throw new D("INTERNAL",`unknown table: ${t}`);for(const[a,s]of Object.entries(o.tables)){const w=s.relationMap;if(w)for(const l of Object.values(w))l.kind!=="one"||l.table!==t||!l.onDelete||await B(r,a,l)}},I=(r,o)=>{for(const[t,a]of Object.entries(r.shape))t in o&&typeof a.parse=="function"&&a.parse(o[t])};export{E as applyOnDelete,W as distinctValues,_ as fanOutScalarCounts,C as resolveWith,I as runRowValidators};
@@ -0,0 +1 @@
1
+ import{LunoraError as m}from"@lunora/errors";const u="id",h=new Set(["_id","id"]),b=t=>{const e=[];for(const r of t??[])for(const[o,s]of Object.entries(r))e.push({direction:s,field:o});return e.length===0?[{direction:"asc",field:"_creationTime"}]:e},S=t=>{const e=new TextEncoder().encode(t);let r="";for(const o of e)r+=String.fromCodePoint(o);return btoa(r)},g=t=>{const e=atob(t),r=Uint8Array.from(e,o=>o.codePointAt(0)??0);return new TextDecoder().decode(r)},A=(t,e)=>{const r=e.map(o=>t[o.field]);return r.push(t._id),S(JSON.stringify(r))},l=()=>new m("BAD_REQUEST","invalid cursor"),D=t=>{let e;try{e=JSON.parse(g(t))}catch{throw l()}if(!Array.isArray(e))throw l();return e},_=(t,e)=>{const r=t.some(s=>h.has(s.field))?t:[...t,{direction:"asc",field:u}],o=[];for(const[s,n]of r.entries()){const i=[];for(const[d,a]of r.slice(0,s).entries())i.push({[a.field]:{eq:e[d]}});const f=n.direction==="desc"?"lt":"gt";i.push({[n.field]:{[f]:e[s]}});const[c]=i;o.push(i.length===1&&c!==void 0?c:{AND:i})}return{OR:o}},y=(t,e)=>t==="desc"?e?"gte":"gt":e?"lte":"lt",v=(t,e)=>{const r=t.some(s=>h.has(s.field))?t:[...t,{direction:"asc",field:u}],o=[];for(const[s,n]of r.entries()){const i=[];for(const[a,p]of r.slice(0,s).entries())i.push({[p.field]:{eq:e[a]}});const f=s===r.length-1,c=y(n.direction,f);i.push({[n.field]:{[c]:e[s]}});const[d]=i;o.push(i.length===1&&d!==void 0?d:{AND:i})}return{OR:o}},w=["_id","_creationTime"],E=(t,e,r)=>{if(!e)return t;const o=new Set([...e,...w,...r?Object.keys(r):[]]);return t.map(s=>{const n={};for(const i of o)i in s&&(n[i]=s[i]);return n})},N=(t,e)=>t&&e!==!0?{[t.field]:{isNull:!0}}:void 0;export{E as applySelect,v as buildSeekBeforeWhere,_ as buildSeekWhere,D as decodeCursor,A as encodeCursor,g as fromBase64,l as invalidCursor,b as normalizeOrderKeys,N as softDeleteScope,S as toBase64};
@@ -0,0 +1 @@
1
+ import"@lunora/search-core";import"drizzle-orm";import"./AGGREGATE_SQL_FUNCTION-QYaiuty4.mjs";import"./aggregateTableName-G-eXyjcz.mjs";import{H as b,P as f,X as k,Y as n}from"./ctx-db-backfill-C4rAzsQo.mjs";import"./do-exec-BLe9lLrN.mjs";import"./do-sql-x0AjZhaN.mjs";import"./renderSql-B5lF5Jd9.mjs";import"./RANK_TIEBREAK-DtX8zQyc.mjs";import"./serialize-sql-DiRzL7A4.mjs";export{b as backfillAggregateIndexes,f as backfillRankIndexes,k as backfillSearchIndexes,n as backfillSearchIndexesForTable};
@@ -0,0 +1 @@
1
+ import{ftsTableName as I,createSearchAnalyzer as L,planSearchBackfillPass as N,FTS_ID_COLUMN as p,FTS_TEXT_COLUMN as A,analyzedSearchText as _}from"@lunora/search-core";import{sql as e}from"drizzle-orm";import{matchesStaticWhere as h}from"./AGGREGATE_SQL_FUNCTION-QYaiuty4.mjs";import{encodeAggregateKey as M,foldAggregateTally as C,aggregateTableName as y}from"./aggregateTableName-G-eXyjcz.mjs";import{r as f}from"./do-exec-BLe9lLrN.mjs";import{b as g,s as m,g as O,a as F,_ as b,m as x,N as D}from"./do-sql-x0AjZhaN.mjs";import{param as U}from"./renderSql-B5lF5Jd9.mjs";import{sortColumnName as k,matchesRankStaticWhere as w,encodePartitionKey as B,rankTableName as X}from"./RANK_TIEBREAK-DtX8zQyc.mjs";import{t as v}from"./serialize-sql-DiRzL7A4.mjs";const u="__lunora_search_state",W=i=>{const n=()=>{try{f(i,e`ALTER TABLE ${e.identifier(u)} ADD COLUMN ${e.identifier("profile")} TEXT`)}catch{}};f(i,e`CREATE TABLE IF NOT EXISTS ${e.identifier(u)} (${e.identifier("companion")} TEXT PRIMARY KEY, ${e.identifier("cursor")} TEXT, ${e.identifier("done")} INTEGER NOT NULL DEFAULT 0, ${e.identifier("profile")} TEXT)`),n()},j=i=>i===1||i===!0||i==="1",z=(i,n)=>{const r=f(i,e`SELECT ${e.identifier("cursor")}, ${e.identifier("done")}, ${e.identifier("profile")} FROM ${e.identifier(u)} WHERE ${e.identifier("companion")} = ${n}`).toArray()[0];return r?{cursor:r.cursor??void 0,done:j(r.done),profile:r.profile??void 0}:{cursor:void 0,done:!1,profile:void 0}},H=(i,n,r,o,d)=>{const a=r??null;f(i,e`INSERT INTO ${e.identifier(u)} (${e.identifier("companion")}, ${e.identifier("cursor")}, ${e.identifier("done")}, ${e.identifier("profile")}) VALUES (${n}, ${a}, ${o?1:0}, ${d}) ON CONFLICT (${e.identifier("companion")}) DO UPDATE SET ${e.identifier("cursor")} = excluded.${e.identifier("cursor")}, ${e.identifier("done")} = excluded.${e.identifier("done")}, ${e.identifier("profile")} = excluded.${e.identifier("profile")}`)},P=(i,n,r)=>{const o=y(n,r.name);if(f(i,e`SELECT COUNT(*) AS count FROM ${e.identifier(o)}`).one().count>0)return;const d=r.by??[],a=new Map,c=f(i,e`SELECT id, _creationTime, ${e.identifier(m)} FROM ${e.identifier(n)}`).toArray();for(const s of c){const t=O(s);if(!t||r.where&&!h(t,r.where))continue;const E=M(d,t);C(a,E,r,t)}for(const[s,t]of a)f(i,e`INSERT INTO ${e.identifier(o)} (${F}, ${b}, ${x}) VALUES (${s}, ${t.value}, ${t.count})`)},re=(i,n)=>{for(const[r,o]of Object.entries(n.tables))if(!(o.shardMode?.kind==="global"||!o.aggregateIndexes))for(const d of o.aggregateIndexes)P(i,r,d)},Y=(i,n,r)=>{const o=X(n,r.name);if(f(i,e`SELECT COUNT(*) AS count FROM ${e.identifier(o)}`).one().count>0)return;const d=r.sortBy.map((s,t)=>k(t)),a=e.join(["__id__","__partition__",...d].map(s=>e.identifier(s)),e`, `),c=f(i,e`SELECT id, _creationTime, ${e.identifier(m)} FROM ${e.identifier(n)}`).toArray();for(const s of c){const t=O(s);if(!t||r.where&&!w(t,r.where))continue;const E=B(r.partitionBy??[],t),l=r.sortBy.map(T=>v(t[T.field]??null)),$=e.join([t._id,E,...l].map(T=>U(T)),e`, `);f(i,e`INSERT INTO ${e.identifier(o)} (${a}) VALUES (${$})`)}},oe=(i,n)=>{for(const[r,o]of Object.entries(n.tables))if(!(o.shardMode?.kind==="global"||!o.rankIndexes))for(const d of o.rankIndexes)Y(i,r,d)},S=500,R=(i,n,r)=>{const o=I(n,r.name),{profile:d}=L(r.language),a=N(z(i,o),d);if(a.finished)return!0;a.wipe&&f(i,e`DELETE FROM ${e.identifier(o)}`);const{cursor:c}=a,s=f(i,c===void 0?e`SELECT id, _creationTime, ${e.identifier(m)} FROM ${e.identifier(n)} ORDER BY id ASC LIMIT ${e.raw(String(S))}`:e`SELECT id, _creationTime, ${e.identifier(m)} FROM ${e.identifier(n)} WHERE id > ${c} ORDER BY id ASC LIMIT ${e.raw(String(S))}`).toArray();let t=c;for(const l of s){const{id:$}=l;if(typeof $!="string")continue;t=$;const T=D(l);if(!T){f(i,e`DELETE FROM ${e.identifier(o)} WHERE ${e.identifier(p)} = ${$}`);continue}f(i,e`DELETE FROM ${e.identifier(o)} WHERE ${e.identifier(p)} = ${$}`),f(i,e`INSERT INTO ${e.identifier(o)} (${e.identifier(A)}, ${e.identifier(p)}) VALUES (${_(T,r)}, ${$})`)}const E=s.length<S;return H(i,o,t,E,d),E},ne=(i,n,r)=>{if(g(i))for(const o of r.searchIndexes??[])o.staged||R(i,n,o)},te=(i,n)=>{if(g(i)){W(i);for(const[r,o]of Object.entries(n.tables))if(!(o.shardMode?.kind==="global"||!o.searchIndexes))for(const d of o.searchIndexes){let a=!1;for(;!a;)a=R(i,r,d)}}};export{re as H,oe as P,te as X,ne as Y,W as l,u as o};
@@ -0,0 +1 @@
1
+ import{sql as e}from"drizzle-orm";import{r as m}from"./do-exec-BLe9lLrN.mjs";import{s as c,g as l,$}from"./do-sql-x0AjZhaN.mjs";import{compileWhereSql as h}from"./compileWhereSql-BLcfs4QW.mjs";import{t as u}from"./serialize-sql-DiRzL7A4.mjs";const g={fieldRef:$,serialize:u},S=i=>{if(i.length!==0)return e`id IN (${e.join(i.map(r=>e`${r}`),e`, `)})`},a=(i,r)=>{const t=[];r&&t.push(r);const o=h(i,g);return o&&t.push(o),t.length===0?e``:e` WHERE ${e.join(t,e` AND `)}`},A=(i,r,t)=>{const o=a(t,void 0),d=m(i,e`SELECT id, _creationTime, ${e.identifier(c)} FROM ${e.identifier(r)}${o}`).toArray(),n=[];for(const s of d){const f=l(s),{id:p}=s;f!==void 0&&typeof p=="string"&&n.push({doc:f,id:p})}return n},M=(i,r,t,o)=>{if(o.length===0)return new Set;const d=a(t,S(o)),n=m(i,e`SELECT id FROM ${e.identifier(r)}${d}`).toArray();return new Set(n.map(s=>s.id))};export{M as a,A as s};
@@ -0,0 +1 @@
1
+ import{sql as i}from"drizzle-orm";import{r as c}from"./do-exec-BLe9lLrN.mjs";const n="__doc__",m=(e,t)=>`${e}__geo_${t}`,s=e=>`"${e.replaceAll('"','""')}"`,f=e=>e==="_id"||e==="id"?"id":e==="_creationTime"?"_creationTime":`json_extract(${n}, '$.${e.replaceAll("'","''")}')`,I=e=>i.raw(f(e)),T=(e,t)=>{const r=s(e);return t==="_id"||t==="id"?`${r}.id`:t==="_creationTime"?`${r}._creationTime`:`json_extract(${r}.${n}, '$.${t.replaceAll("'","''")}')`},N=(e,t)=>i.raw(T(e,t)),S=(e,t,r,o)=>i`CREATE ${o?i`UNIQUE `:i``}INDEX IF NOT EXISTS ${i.identifier(e)} ON ${i.identifier(t)} (${r})`,a=i.identifier("__key__"),l=i.identifier("__value__"),d=i.identifier("__count__"),A=(e,t,r,o,_)=>i`INSERT INTO ${i.identifier(e)} (${a}, ${l}, ${d}) VALUES (${t}, ${r}, ${o}) ON CONFLICT(${a}) DO UPDATE SET ${_}`,O=e=>{const t=[];for(const[r,o]of Object.entries(e.shape)){const _=o._meta?.column;_&&t.push([r,_])}return t},u=e=>{if(!e)return;const t=e[n];let r;typeof t=="string"?r=JSON.parse(t):t&&typeof t=="object"?r=t:r={};const{id:o}=e;typeof o=="string"&&(r._id=o);const _=e._creationTime;return typeof _=="number"&&(r._creationTime=_),r},y=e=>{try{return u(e)}catch{return}},$=new WeakMap,b=e=>{const t=$.get(e);if(t!==void 0)return t;let r;try{c(e,i`CREATE VIRTUAL TABLE IF NOT EXISTS ${i.identifier("__lunora_fts_probe")} USING fts5(x)`),r=!0}catch{r=!1}finally{try{c(e,i`DROP TABLE IF EXISTS ${i.identifier("__lunora_fts_probe")}`)}catch{}}return $.set(e,r),r};export{I as $,A as E,O as L,y as N,N as S,m as T,l as _,a,b,u as g,s as l,d as m,S as p,n as s};
@@ -1,4 +1,4 @@
1
- import{LunoraError as f}from"@lunora/errors";import{sql as m}from"drizzle-orm";import{r as T}from"./do-exec-BLe9lLrN.mjs";import{runExternalSourceTick as v,materializeExternalRowsIncremental as A}from"./materializeExternalRows-BFmT9gsw.mjs";const h="__lunora_source_cursor",D=e=>e instanceof Date?`d:${e.toISOString()}`:typeof e=="bigint"?`b:${e.toString()}`:typeof e=="number"?`n:${e.toString()}`:`s:${e}`,O=e=>{const t=e.slice(2);switch(e[0]){case"b":return BigInt(t);case"d":return new Date(t);case"n":return Number(t);default:return t}},N=/^-?\d+$/,I=/^-?\d+(?:\.\d+)?$/,M=(e,t)=>e instanceof Date&&t instanceof Date?e.getTime()>t.getTime():typeof e=="bigint"&&typeof t=="bigint"||typeof e=="number"&&typeof t=="number"?e>t:typeof e=="string"&&typeof t=="string"&&I.test(e)&&I.test(t)?N.test(e)&&N.test(t)?BigInt(e)>BigInt(t):Number(e)>Number(t):String(e)>String(t),q=(e,t,o)=>{let r=o===null?void 0:O(o);for(const n of e){const s=n[t];if(s==null)continue;const c=s;(r===void 0||M(c,r))&&(r=c)}return r===void 0?null:D(r)},C=e=>{T(e,m`CREATE TABLE IF NOT EXISTS ${m.identifier(h)} (
1
+ import{LunoraError as f}from"@lunora/errors";import{sql as m}from"drizzle-orm";import{r as T}from"./do-exec-BLe9lLrN.mjs";import{runExternalSourceTick as v,materializeExternalRowsIncremental as A}from"./materializeExternalRows-BUmj_9WO.mjs";const h="__lunora_source_cursor",D=e=>e instanceof Date?`d:${e.toISOString()}`:typeof e=="bigint"?`b:${e.toString()}`:typeof e=="number"?`n:${e.toString()}`:`s:${e}`,O=e=>{const t=e.slice(2);switch(e[0]){case"b":return BigInt(t);case"d":return new Date(t);case"n":return Number(t);default:return t}},N=/^-?\d+$/,I=/^-?\d+(?:\.\d+)?$/,M=(e,t)=>e instanceof Date&&t instanceof Date?e.getTime()>t.getTime():typeof e=="bigint"&&typeof t=="bigint"||typeof e=="number"&&typeof t=="number"?e>t:typeof e=="string"&&typeof t=="string"&&I.test(e)&&I.test(t)?N.test(e)&&N.test(t)?BigInt(e)>BigInt(t):Number(e)>Number(t):String(e)>String(t),q=(e,t,o)=>{let r=o===null?void 0:O(o);for(const n of e){const s=n[t];if(s==null)continue;const c=s;(r===void 0||M(c,r))&&(r=c)}return r===void 0?null:D(r)},C=e=>{T(e,m`CREATE TABLE IF NOT EXISTS ${m.identifier(h)} (
2
2
  table_name TEXT NOT NULL,
3
3
  shard_key TEXT NOT NULL,
4
4
  watermark TEXT,
@@ -1 +1 @@
1
- import{applyCdcChanges as m}from"./CDC_LOG_TABLE-E_J5LPoK.mjs";import{s as f}from"./ctx-db-shapes-DzX_H5q8.mjs";import{diffExternalSource as g,projectExternalSourceRow as c}from"./diffExternalSource-DMpkJta1.mjs";import{stableStringify as p}from"./stableStringify-BjLh4gvA.mjs";const x=async(t,s,r,e)=>{const{changes:n,nextBaseline:a}=g(s,r,e);return await m(t,n),{applied:n.length,nextBaseline:a}},E=async(t,s,r)=>{const{columns:e,deletedIds:n,table:a}=r,i=[];for(const u of s){const l=c(u,e),o=String(l._id);if(n?.has(o)){await t.get(o,a)&&i.push({id:o,op:"delete",seq:0,table:a,ts:0});continue}const d=await t.get(o,a);d&&p(c({...d,_id:o},e))===p(l)||i.push({doc:l,id:o,op:"insert",seq:0,table:a,ts:0})}return await m(t,i),{applied:i.length}},w=(t,s,r)=>{const e=new Map;for(const{doc:n,id:a}of f(t,s,void 0))e.set(a,p(c({...n,_id:a},r)));return e},R=async(t,s,r,e)=>{const n=w(t,e.table,e.columns);return x(s,r,n,e)};export{x as materializeExternalRows,E as materializeExternalRowsIncremental,w as readExternalSourceBaseline,R as runExternalSourceTick};
1
+ import{applyCdcChanges as m}from"./CDC_LOG_TABLE-E_J5LPoK.mjs";import{s as f}from"./ctx-db-shapes-CHC2cS0g.mjs";import{diffExternalSource as g,projectExternalSourceRow as c}from"./diffExternalSource-DMpkJta1.mjs";import{stableStringify as p}from"./stableStringify-BjLh4gvA.mjs";const x=async(t,s,r,e)=>{const{changes:n,nextBaseline:a}=g(s,r,e);return await m(t,n),{applied:n.length,nextBaseline:a}},E=async(t,s,r)=>{const{columns:e,deletedIds:n,table:a}=r,i=[];for(const u of s){const l=c(u,e),o=String(l._id);if(n?.has(o)){await t.get(o,a)&&i.push({id:o,op:"delete",seq:0,table:a,ts:0});continue}const d=await t.get(o,a);d&&p(c({...d,_id:o},e))===p(l)||i.push({doc:l,id:o,op:"insert",seq:0,table:a,ts:0})}return await m(t,i),{applied:i.length}},w=(t,s,r)=>{const e=new Map;for(const{doc:n,id:a}of f(t,s,void 0))e.set(a,p(c({...n,_id:a},r)));return e},R=async(t,s,r,e)=>{const n=w(t,e.table,e.columns);return x(s,r,n,e)};export{x as materializeExternalRows,E as materializeExternalRowsIncremental,w as readExternalSourceBaseline,R as runExternalSourceTick};
@@ -0,0 +1,5 @@
1
+ import{ftsTableName as N,FTS_TEXT_COLUMN as I,FTS_ID_COLUMN as g}from"@lunora/search-core";import{sql as e}from"drizzle-orm";import{aggregateTableName as R}from"./aggregateTableName-G-eXyjcz.mjs";import{l as S,Y as l}from"./ctx-db-backfill-C4rAzsQo.mjs";import{migrateCdcLog as O,migrateCdcMeta as p}from"./CDC_LOG_TABLE-E_J5LPoK.mjs";import{_ as C,E as U,a as u}from"./ctx-db-idempotency-wiVoGnpQ.mjs";import{r as _}from"./do-exec-BLe9lLrN.mjs";import{s as X,$,p as f,L as h,b,a as B,_ as M,m,T as x}from"./do-sql-x0AjZhaN.mjs";import{sortColumnName as Y,rankTableName as F}from"./RANK_TIEBREAK-DtX8zQyc.mjs";const D=(i,o,t)=>{for(const n of t.indexes){const r=`${o}_${n.name}`,a=e.join(n.fields.map(s=>$(s)),e`, `);_(i,f(r,o,a,n.unique??!1))}for(const[n,r]of h(t)){if(!r.unique)continue;const a=`${o}_unique_${n}`;_(i,f(a,o,$(n),!0))}},k=(i,o,t)=>{if(!(!t.searchIndexes||t.searchIndexes.length===0||!b(i))){for(const n of t.searchIndexes){const r=N(o,n.name);_(i,e`CREATE VIRTUAL TABLE IF NOT EXISTS ${e.identifier(r)} USING fts5(${e.identifier(I)}, ${e.identifier(g)} UNINDEXED)`),_(i,e`CREATE VIRTUAL TABLE IF NOT EXISTS ${e.identifier(`${r}__vocab`)} USING fts5vocab(${e.identifier(r)}, ${e.raw("instance")})`)}l(i,o,t)}},y=(i,o,t)=>{if(t.geoIndexes)for(const n of t.geoIndexes){const r=x(o,n.name);_(i,e`CREATE TABLE IF NOT EXISTS ${e.identifier(r)} (${e.identifier("__id__")} TEXT PRIMARY KEY, ${e.identifier("__geohash__")} TEXT NOT NULL, ${e.identifier("__lat__")} REAL NOT NULL, ${e.identifier("__lng__")} REAL NOT NULL)`);const a=`${o}__geo_${n.name}__btree`;_(i,f(a,r,e`${e.identifier("__geohash__")} ASC, ${e.identifier("__id__")} ASC`,!1))}},G=(i,o,t)=>{if(t.aggregateIndexes)for(const n of t.aggregateIndexes){const r=R(o,n.name);_(i,e`CREATE TABLE IF NOT EXISTS ${e.identifier(r)} (${B} TEXT PRIMARY KEY, ${M} REAL, ${m} INTEGER NOT NULL DEFAULT 0)`),_(i,e`PRAGMA table_info(${e.identifier(r)})`).toArray().some(a=>a.name==="__count__")||_(i,e`ALTER TABLE ${e.identifier(r)} ADD COLUMN ${m} INTEGER NOT NULL DEFAULT 0`)}},P=(i,o,t)=>{if(t.rankIndexes)for(const n of t.rankIndexes){const r=F(o,n.name),a=n.sortBy.map((T,E)=>Y(E)),s=a.map(T=>e`${e.identifier(T)} BLOB`),L=s.length>0?e`, ${e.join(s,e`, `)}`:e``;_(i,e`CREATE TABLE IF NOT EXISTS ${e.identifier(r)} (${e.identifier("__id__")} TEXT PRIMARY KEY, ${e.identifier("__partition__")} TEXT NOT NULL${L})`);const d=[e`${e.identifier("__partition__")} ASC`];for(const[T,E]of a.entries()){const A=n.sortBy[T]?.direction;d.push(e`${e.identifier(E)} ${e.raw(A==="desc"?"DESC":"ASC")}`)}d.push(e`${e.identifier("__id__")} ASC`);const c=`${o}__rank_${n.name}__btree`;_(i,f(c,r,e.join(d,e`, `),!1))}},Q=(i,o,t={})=>{S(i);for(const[n,r]of Object.entries(o.tables))r.shardMode?.kind!=="global"&&(_(i,e`CREATE TABLE IF NOT EXISTS ${e.identifier(n)} (
2
+ id TEXT PRIMARY KEY,
3
+ _creationTime REAL NOT NULL,
4
+ ${e.identifier(X)} TEXT NOT NULL
5
+ )`),D(i,n,r),k(i,n,r),y(i,n,r),G(i,n,r),P(i,n,r));t.cdc&&(O(i),p(i),C(i)),U(i),u(i)};export{Q as runShardMigrations};
@@ -1 +1 @@
1
- import{sql as e}from"drizzle-orm";import{r as $}from"./do-exec-BLe9lLrN.mjs";import{T as o}from"./do-sql-BYIQTG3z.mjs";const E=(s,i,d,r)=>{const a=d-(i.after??0),t=[e`${o(i.field)} IS NOT NULL`,e`${o(i.field)} < ${a}`];i.softDeleteField!==void 0&&t.push(e`${o(i.softDeleteField)} IS NULL`);const f=e`SELECT id FROM ${e.identifier(i.table)} WHERE ${e.join(t,e` AND `)} LIMIT ${e.raw(String(Math.max(0,Math.floor(r))+1))}`,l=$(s,f).toArray(),n=l.length>r,m=l.slice(0,r).map(p=>p.id);return{hasMore:n,ids:m}};export{E as selectExpiredIds};
1
+ import{sql as e}from"drizzle-orm";import{r as p}from"./do-exec-BLe9lLrN.mjs";import{$ as o}from"./do-sql-x0AjZhaN.mjs";const E=(s,i,d,r)=>{const a=d-(i.after??0),t=[e`${o(i.field)} IS NOT NULL`,e`${o(i.field)} < ${a}`];i.softDeleteField!==void 0&&t.push(e`${o(i.softDeleteField)} IS NULL`);const f=e`SELECT id FROM ${e.identifier(i.table)} WHERE ${e.join(t,e` AND `)} LIMIT ${e.raw(String(Math.max(0,Math.floor(r))+1))}`,l=p(s,f).toArray(),n=l.length>r,m=l.slice(0,r).map($=>$.id);return{hasMore:n,ids:m}};export{E as selectExpiredIds};
@@ -1 +1 @@
1
- import{LunoraError as i}from"@lunora/errors";import{RELATION_FUNCTION_PREFIX as r}from"./ADMIN_FUNCTIONS-PxZ8Lr9e.mjs";const h=async(s,n,l,t)=>{const o=typeof t.table=="string"?t.table:"",a=s.tables[o];if(!a)throw new i("UNKNOWN_TABLE",`${r} unknown table "${o}"`,{status:404});if(a.shardMode?.kind==="global")throw new i("BAD_REQUEST",`${r} table "${o}" is global, not shard-local`);const e=t.where??void 0;return l===`${r}count`?n.count(o,e):(await n.findMany(o,{orderBy:t.orderBy,where:e,with:t.with})).page};export{h as serveRelationFanout};
1
+ import{LunoraError as i}from"@lunora/errors";import{RELATION_FUNCTION_PREFIX as r}from"./ADMIN_FUNCTIONS-CjgwJp2Q.mjs";const h=async(s,n,l,t)=>{const o=typeof t.table=="string"?t.table:"",a=s.tables[o];if(!a)throw new i("UNKNOWN_TABLE",`${r} unknown table "${o}"`,{status:404});if(a.shardMode?.kind==="global")throw new i("BAD_REQUEST",`${r} table "${o}" is global, not shard-local`);const e=t.where??void 0;return l===`${r}count`?n.count(o,e):(await n.findMany(o,{orderBy:t.orderBy,where:e,with:t.with})).page};export{h as serveRelationFanout};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lunora/do",
3
- "version": "1.0.0-alpha.51",
3
+ "version": "1.0.0-alpha.53",
4
4
  "description": "Lunora Durable Objects: ShardDO (SQLite, OCC, hibernated WebSocket subscriptions) and SessionDO",
5
5
  "keywords": [
6
6
  "cloudflare",
@@ -46,10 +46,11 @@
46
46
  "access": "public"
47
47
  },
48
48
  "dependencies": {
49
- "@lunora/errors": "1.0.0-alpha.8",
49
+ "@lunora/errors": "1.0.0-alpha.9",
50
50
  "@lunora/fingerprint": "1.0.0-alpha.4",
51
51
  "@visulima/redact": "3.0.0",
52
- "drizzle-orm": "^0.45.2"
52
+ "drizzle-orm": "^0.45.2",
53
+ "@lunora/search-core": "1.0.0-alpha.0"
53
54
  },
54
55
  "engines": {
55
56
  "node": "^22.15.0 || >=24.11.0"
@@ -1 +0,0 @@
1
- import{LunoraError as S}from"@lunora/errors";const m=e=>`"${e.replaceAll('"','""')}"`,Q="__lunora_admin__:",H="__lunora_relation__:",G="__lunora_flags__:",K={applyCdc:"__lunora_admin__:applyCdc",assignIssue:"__lunora_admin__:assignIssue",cdcSync:"__lunora_admin__:cdcSync",clearCapturedMail:"__lunora_admin__:clearCapturedMail",clearQueueMessages:"__lunora_admin__:clearQueueMessages",clearTable:"__lunora_admin__:clearTable",createWorkflowInstance:"__lunora_admin__:createWorkflowInstance",deleteRows:"__lunora_admin__:deleteRows",describeTable:"__lunora_admin__:describeTable",describeTables:"__lunora_admin__:describeTables",exportShard:"__lunora_admin__:exportShard",facetColumn:"__lunora_admin__:facetColumn",getAdvisories:"__lunora_admin__:getAdvisories",getAuditLog:"__lunora_admin__:getAuditLog",getAuthMetrics:"__lunora_admin__:getAuthMetrics",getCapturedMail:"__lunora_admin__:getCapturedMail",getFanoutMetrics:"__lunora_admin__:getFanoutMetrics",getFunctionStats:"__lunora_admin__:getFunctionStats",getIssues:"__lunora_admin__:getIssues",getMetricHistory:"__lunora_admin__:getMetricHistory",getMetricSeries:"__lunora_admin__:getMetricSeries",listSubscriptions:"__lunora_admin__:listSubscriptions",listTableIndexes:"__lunora_admin__:listTableIndexes",getLogs:"__lunora_admin__:getLogs",getMetrics:"__lunora_admin__:getMetrics",getPitrBookmark:"__lunora_admin__:getPitrBookmark",getQueueMessages:"__lunora_admin__:getQueueMessages",getRequestLog:"__lunora_admin__:getRequestLog",getSecurityAudit:"__lunora_admin__:getSecurityAudit",getSettings:"__lunora_admin__:getSettings",getTraces:"__lunora_admin__:getTraces",getWorkflowInstanceStatus:"__lunora_admin__:getWorkflowInstanceStatus",ignoreIssue:"__lunora_admin__:ignoreIssue",importShard:"__lunora_admin__:importShard",listFlags:"__lunora_admin__:listFlags",listQueues:"__lunora_admin__:listQueues",listTables:"__lunora_admin__:listTables",listWorkflows:"__lunora_admin__:listWorkflows",maskPolicies:"__lunora_admin__:maskPolicies",migrationStatus:"__lunora_admin__:migrationStatus",pitrRestore:"__lunora_admin__:pitrRestore",rankBefore:"__lunora_admin__:rankBefore",rankPage:"__lunora_admin__:rankPage",readTablePage:"__lunora_admin__:readTablePage",recordAuthEvent:"__lunora_admin__:recordAuthEvent",recordContainerEvent:"__lunora_admin__:recordContainerEvent",recordMail:"__lunora_admin__:recordMail",recordQueueMessage:"__lunora_admin__:recordQueueMessage",replayQueueMessage:"__lunora_admin__:replayQueueMessage",resolveIssue:"__lunora_admin__:resolveIssue",rlsPolicies:"__lunora_admin__:rlsPolicies",runAs:"__lunora_admin__:runAs",runMigration:"__lunora_admin__:runMigration",runSql:"__lunora_admin__:runSql",sendQueueMessage:"__lunora_admin__:sendQueueMessage",sendTestMail:"__lunora_admin__:sendTestMail",setIssueSeverity:"__lunora_admin__:setIssueSeverity",storageOrphans:"__lunora_admin__:storageOrphans",storageReferences:"__lunora_admin__:storageReferences",storageRules:"__lunora_admin__:storageRules",studioFeatures:"__lunora_admin__:studioFeatures",writeRow:"__lunora_admin__:writeRow"},N=50,b=500,x=30,L=200,d="__doc__",R=e=>{try{const t=JSON.parse(e);return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:void 0}catch{return}},F=(e,t)=>{if(!e.includes(d))return{columns:e,rows:t};const r=[];for(const s of t){const _=s[d],c=typeof _=="string"?R(_):void 0;if(c===void 0)return{columns:e,rows:t};const i=Object.fromEntries(Object.entries(s).filter(([u])=>u!==d));r.push({...i,...c})}const a=e.filter(s=>s!==d),o=[],n=new Set(a);for(const s of r)for(const _ of Object.keys(s))n.has(_)||(n.add(_),o.push(_));return{columns:[...a,...o],rows:r}},k=e=>e.replaceAll(/[\\%_]/g,t=>`\\${t}`),h=e=>e.startsWith("sqlite_")||e.startsWith("_cf_")||e.startsWith("__miniflare")||e.startsWith("__lunora")||e.includes("__fts_"),C=(e,t,r)=>Math.min(Math.max(e,t),r),v=(e,t)=>{const r=e.exec(`SELECT COUNT(*) AS c FROM ${t}`).one();return Number(r.c)},X=e=>{const t=e.exec("SELECT name FROM sqlite_master WHERE type = 'table' ORDER BY name").toArray(),r=[];for(const{name:a}of t)h(a)||r.push({name:a,rowCount:v(e,m(a))});return r},A=(e,t)=>e.exec("SELECT name FROM sqlite_master WHERE type = 'table' AND name = ? LIMIT 1",t).toArray().length>0,P={eq:"=",gt:">",gte:">=",lt:"<",lte:"<=",ne:"<>"},W=e=>typeof e=="string"?e:typeof e=="number"||typeof e=="boolean"?String(e):"",E=(e,t)=>{const r=t.includes(e),a=t.includes(d);if(!(!r&&!a))return r?{expression:m(e),params:[]}:{expression:`json_extract(${m(d)}, ?)`,params:[`$."${e.replaceAll('"','""')}"`]}},U=(e,t)=>{const r=E(e.column,t);if(r===void 0)return;const{expression:a,params:o}=r;return e.operator==="contains"?{params:[...o,`%${k(W(e.value))}%`],sql:String.raw`CAST(${a} AS TEXT) LIKE ? ESCAPE '\'`}:{params:[...o,e.value],sql:`${a} ${P[e.operator]} ?`}},$=(e,t,r)=>{const a=[],o=[];if(t!==""&&e.length>0){const n=`%${k(t)}%`;a.push(`(${e.map(s=>String.raw`CAST(${m(s)} AS TEXT) LIKE ? ESCAPE '\'`).join(" OR ")})`),o.push(...e.map(()=>n))}for(const n of r??[]){const s=U(n,e);s!==void 0&&(a.push(`(${s.sql})`),o.push(...s.params))}return a.length===0?void 0:{parameters:o,where:a.join(" AND ")}},q=(e,t)=>{if(e===void 0)return;const r=E(e.column,t);if(r===void 0)return;const a=e.direction==="desc"?"DESC":"ASC";return{params:r.params,sql:`${r.expression} ${a}`}},Y=(e,t)=>{const{table:r}=t;if(h(r)||!A(e,r))throw new S("UNKNOWN_TABLE",`unknown table: ${r}`,{status:404});const a=C(Math.trunc(t.limit??N),1,b),o=Math.max(0,Math.trunc(t.offset??0)),n=m(r),s=e.exec(`PRAGMA table_info(${n})`).toArray().map(M=>M.name),_=t.search?.trim()??"",c=M=>{if(t.refs===void 0)return M;const I={};for(const w of M.columns){const O=t.refs[w];O!==void 0&&(I[w]=O)}return Object.keys(I).length>0?{...M,refs:I}:M},i=$(s,_,t.filters),u=q(t.orderBy,s),l=i===void 0?"":` WHERE ${i.where}`,g=u===void 0?"":` ORDER BY ${u.sql}`,p=i?.parameters??[],T=u?.params??[];let f;t.skipCount||(f=i===void 0?v(e,n):Number(e.exec(`SELECT COUNT(*) AS c FROM ${n}${l}`,...p).one().c));const y=e.exec(`SELECT * FROM ${n}${l}${g} LIMIT ? OFFSET ?`,...p,...T,a,o).toArray();return c({...F(s,y),total:f})},z=(e,t)=>{const{table:r}=t;if(h(r)||!A(e,r))throw new S("UNKNOWN_TABLE",`unknown table: ${r}`,{status:404});const a=C(Math.trunc(t.limit??b),1,b),o=m(r),n=e.exec(`PRAGMA table_info(${o})`).toArray().map(l=>l.name),s=t.search?.trim()??"",_=$(n,s,t.filters),c=_===void 0?e.exec(`SELECT id FROM ${o} LIMIT ?`,a+1).toArray():e.exec(`SELECT id FROM ${o} WHERE ${_.where} LIMIT ?`,..._.parameters,a+1).toArray(),i=c.length>a,u=(i?c.slice(0,a):c).map(l=>l.id);return{hasMore:i,ids:u}},j=(e,t,r)=>{const a=new Set(r.filter(n=>n!==d));if(!r.includes(d))return a;const o=e.exec(`SELECT ${m(d)} AS doc FROM ${t} LIMIT ?`,b).toArray();for(const{doc:n}of o){const s=typeof n=="string"?R(n):void 0;if(s!==void 0)for(const _ of Object.keys(s))a.add(_)}return a},J=(e,t)=>{const{column:r,table:a}=t;if(h(a)||!A(e,a))throw new S("UNKNOWN_TABLE",`unknown table: ${a}`,{status:404});const o=m(a),n=e.exec(`PRAGMA table_info(${o})`).toArray().map(f=>f.name);if(!j(e,o,n).has(r))throw new S("UNKNOWN_COLUMN",`unknown column: ${r}`,{status:404});const s=E(r,n);if(s===void 0)throw new S("UNKNOWN_COLUMN",`unknown column: ${r}`,{status:404});const _=C(Math.trunc(t.limit??x),1,L),c=t.search?.trim()??"",i=$(n,c,t.filters),u=i===void 0?"":` WHERE ${i.where}`,l=i?.parameters??[],g=e.exec(`SELECT ${s.expression} AS value, COUNT(*) AS count FROM ${o}${u} GROUP BY ${s.expression} ORDER BY count DESC LIMIT ?`,...s.params,...l,...s.params,_+1).toArray(),p=g.length>_,T=p?g.slice(0,_):g;return{truncated:p,values:T.map(f=>({count:Number(f.count),value:f.value}))}},Z=(e,t,r)=>{const a={},o=r.slice(0,b);for(const s of o)a[s]=[];if(o.length===0)return{references:a,storageColumns:t};const n=o.map(()=>"?").join(", ");for(const[s,_]of Object.entries(t)){if(h(s)||!A(e,s))continue;const c=m(s),i=e.exec(`PRAGMA table_info(${c})`).toArray().map(u=>u.name);for(const u of _){const l=E(u,i);if(l===void 0)continue;const g=e.exec(`SELECT id, ${l.expression} AS ref FROM ${c} WHERE ${l.expression} IN (${n})`,...l.params,...l.params,...o).toArray();for(const p of g)a[p.ref]?.push({column:u,id:p.id,table:s})}}return{references:a,storageColumns:t}},V=e=>{const t=e.map((a,o)=>{const n=Object.values(a.subs??{}).map(s=>({args:s.args,functionPath:s.functionPath,table:s.table}));return{admin:a.admin===!0,id:o,subscriptions:n}}),r=t.reduce((a,o)=>a+o.subscriptions.length,0);return{connections:t,totalConnections:t.length,totalSubscriptions:r}},D=20,ee=()=>({maxMs:0,passes:0,peakSocketsIterated:0,socketsDelivered:0,socketsIterated:0,totalMs:0}),te=(e,t,r,a)=>({maxMs:Math.max(e.maxMs,a),passes:e.passes+1,peakSocketsIterated:Math.max(e.peakSocketsIterated,t),socketsDelivered:e.socketsDelivered+r,socketsIterated:e.socketsIterated+t,totalMs:e.totalMs+a}),ae=(e,t=D)=>{const r=new Map,a=new Map;for(const n of e){for(const s of Object.values(n.shapes??{})){const _=s.name??"(unknown shape)";r.set(_,(r.get(_)??0)+1)}for(const s of n.whispers??[])a.set(s,(a.get(s)??0)+1)}const o=[...[...r].map(([n,s])=>({kind:"shape",subscribers:s,topic:n})),...[...a].map(([n,s])=>({kind:"whisper",subscribers:s,topic:n}))];return o.sort((n,s)=>s.subscribers-n.subscribers||n.topic.localeCompare(s.topic)),{peakSubscribers:o[0]?.subscribers??0,topics:o.slice(0,t),totalConnections:e.length}};export{K as ADMIN_FUNCTIONS,Q as ADMIN_FUNCTION_PREFIX,D as DEFAULT_FANOUT_TOPIC_LIMIT,G as FLAGS_FUNCTION_PREFIX,b as MAX_PAGE_SIZE,H as RELATION_FUNCTION_PREFIX,ee as createFanoutCounters,J as facetColumn,Z as findStorageReferences,X as listTables,Y as readTablePage,te as recordFanoutPass,z as selectMatchingIds,ae as summarizeFanoutTopics,V as summarizeSubscriptions};
@@ -1 +0,0 @@
1
- import{LunoraError as N}from"@lunora/errors";import{sql as t}from"drizzle-orm";import{matchesStaticWhere as Be,aggregateSqlFunction as Ne,normalizeCountArgument as bt,throwingScheduler as yt}from"./AGGREGATE_SQL_FUNCTION-QYaiuty4.mjs";import{encodeAggregateKey as de,foldAggregateTally as _t,aggregateTableName as Te,coerceAggregateNumber as Fe,readAggregateValue as qe}from"./aggregateTableName-G-eXyjcz.mjs";import{mergeWhere as oe,CountRlsUnsupportedError as Ue,selectIndexForGroupBy as Nt,selectIndexForCount as Tt,selectIndexForAggregate as Rt}from"./CountRlsUnsupportedError-Cl8XpYDL.mjs";import{appendCdcChange as St}from"./CDC_LOG_TABLE-E_J5LPoK.mjs";import{CDC_LOG_TABLE as Qn,applyCdcChanges as Xn,bumpCdcEpoch as Zn,minCdcSeq as er,readCdcChanges as tr,readCdcCursor as nr,readCdcEpoch as rr,trimCdcChanges as ir}from"./CDC_LOG_TABLE-E_J5LPoK.mjs";import{r as v}from"./do-exec-BLe9lLrN.mjs";import{N as st,s as X,L as fe,a as ce,d as te,m as Q,g as lt,p as Le,T as ee,u as At,E as dt,$ as Ye}from"./do-sql-BYIQTG3z.mjs";import{param as Ke}from"./renderSql-B5lF5Jd9.mjs";import{encodeGeohash as It,GEO_DEFAULT_PRECISION as vt,coveringGeohashes as kt,boundingBoxGeohashes as Mt,pointInBoundingBox as Lt,haversineMeters as xt}from"./GEO_DEFAULT_PRECISION-okRCkZ6r.mjs";import{sortColumnName as Se,matchesRankStaticWhere as ct,encodePartitionKey as De,rankTableName as Ae,resolveRankPartition as ft,RANK_TIEBREAK as we}from"./RANK_TIEBREAK-DtX8zQyc.mjs";import{stringifySearchText as ut,ftsTableName as ht,tokenizeSearch as $t,buildFtsMatch as Ct,scoreDocument as Dt}from"./buildFtsMatch-CV0Z7PWv.mjs";import{t as ue}from"./serialize-sql-DiRzL7A4.mjs";import{SCAN_DEP as Y}from"./SCAN_DEP-D_yR9EeV.mjs";import{decodeCursor as Ce,normalizeOrderKeys as Ot,buildSeekWhere as pt,applySelect as Qe,encodeCursor as Pe,softDeleteScope as Ee,buildSeekBeforeWhere as Wt}from"./applySelect-Bq2KOrkL.mjs";import Bt from"./NotFoundError-J3tjf4Uo.mjs";import{assertFlatPredicate as je,resolveRelationPredicates as Xe}from"./DEFAULT_MAX_RELATION_KEYS-BRdmX7WW.mjs";import{runRowValidators as He,resolveWith as Ze,applyOnDelete as Ft,fanOutScalarCounts as qt}from"./applyOnDelete-BvQN7pDL.mjs";import{guardWriter as Ut}from"./RLS_UNWRAP_SYMBOL-C6_WX3dG.mjs";import{createSystemReader as jt}from"./createSystemReader-DcDcrtM3.mjs";import{ConflictError as Re}from"./ConflictError-C8GtJmjS.mjs";import{runTriggers as Ht}from"./hasTrigger-_rexbWMO.mjs";import{compileWhereSql as he}from"./compileWhereSql-BLcfs4QW.mjs";import{backfillAggregateIndexes as ar,backfillRankIndexes as sr}from"./backfillAggregateIndexes-BAQ3Fwwh.mjs";import{e as dr,t as cr,r as fr,o as ur,l as hr,p as $r,_ as pr,a as wr,b as mr,d as gr,m as Er,u as br,S as yr,T as _r}from"./ctx-db-idempotency-wiVoGnpQ.mjs";import{runShardMigrations as Tr}from"./runShardMigrations-bxOHpfID.mjs";import{a as Sr,s as Ar}from"./ctx-db-shapes-DzX_H5q8.mjs";const Pt=(i,o,n)=>[...i.partitionBy??[],...i.sortBy.map(s=>s.field),...i.where?Object.keys(i.where):[]].every(s=>o[s]===n[s]),Gt=(i,o,n,s,l,c)=>{if(l&&c&&Pt(n,l,c))return;const E=Ae(o,n.name);if(l&&v(i,t`DELETE FROM ${t.identifier(E)} WHERE ${t.identifier("__id__")} = ${s}`),!c||n.where&&!ct(c,n.where))return;const w=n.sortBy.map((u,S)=>Se(S)),_=t.join(["__id__","__partition__",...w].map(u=>t.identifier(u)),t`, `),T=De(n.partitionBy??[],c),k=n.sortBy.map(u=>ue(c[u.field]??null)),b=t.join([s,T,...k].map(u=>Ke(u)),t`, `);v(i,t`INSERT INTO ${t.identifier(E)} (${_}) VALUES (${b})`)},Kt=i=>{const{broadcast:o,invalidateCache:n,recordCdc:s,schema:l,sql:c}=i,E=new Set,w=new Set,_=(A,m)=>{const I=`${A}::${m.name}`;if(E.has(I))return;const F=Te(A,m.name),W=m.by??[],H=new Map,j=v(c,t`SELECT id, _creationTime, ${t.identifier(X)} FROM ${t.identifier(A)}`).toArray();for(const q of j){const L=fe(q);if(!L||m.where&&!Be(L,m.where))continue;const P=de(W,L);_t(H,P,m,L)}v(c,t`DELETE FROM ${t.identifier(F)}`);const G=32,B=[...H];for(let q=0;q<B.length;q+=G){const L=B.slice(q,q+G),P=t.join(L.map(([U,V])=>t`(${U}, ${V.value}, ${V.count})`),t`, `);v(c,t`INSERT INTO ${t.identifier(F)} (${ce}, ${te}, ${Q}) VALUES ${P}`)}E.add(I)},T=(A,m,I)=>{const F=m.by??[],W=Ne(m.op),H=m.field??"",j=[];for(const q of F){const L=ue(I[q]??null);L===null?j.push(t`${ee(q)} IS NULL`):j.push(t`${ee(q)} = ${L}`)}for(const[q,L]of Object.entries(m.where??{})){const P=L!==null&&typeof L=="object"&&!Array.isArray(L)?L.eq:L,U=ue(P);U===null?j.push(t`${ee(q)} IS NULL`):j.push(t`${ee(q)} = ${U}`)}const G=j.length>0?t` WHERE ${t.join(j,t` AND `)}`:t``,B=ee(H);return{value:v(c,t`SELECT ${t.raw(W)}(${B}) AS value FROM ${t.identifier(A)}${G}`).one().value??null}},k=(A,m,I,F)=>{const W=Te(A,m.name),{op:H}=m,j=m.field??"",G=L=>{v(c,t`DELETE FROM ${t.identifier(W)} WHERE ${ce} = ${L} AND ${Q} <= 0`)},B=I&&(!m.where||Be(I,m.where))?I:void 0,q=F&&(!m.where||Be(F,m.where))?F:void 0;if(!(!B&&!q)){if(H==="count"){for(const[L,P]of[[B,-1],[q,1]]){if(!L)continue;const U=de(m.by??[],L);v(c,Le(W,U,P,P,t`${te} = ${te} + excluded.${te}, ${Q} = ${Q} + excluded.${Q}`))}B&&G(de(m.by??[],B));return}if(H==="sum"||H==="avg"){for(const[L,P]of[[B,-1],[q,1]]){if(!L)continue;const U=Fe(L[j]);if(U===void 0)continue;const V=de(m.by??[],L);v(c,Le(W,V,P*U,P,t`${te} = COALESCE(${te}, 0) + excluded.${te}, ${Q} = ${Q} + excluded.${Q}`))}B&&G(de(m.by??[],B));return}if(B){const L=de(m.by??[],B),P=Fe(B[j]),U=v(c,t`SELECT ${te} AS value, ${Q} AS count FROM ${t.identifier(W)} WHERE ${ce} = ${L}`).toArray()[0],V=(U?.count??0)-1;if(V<=0)v(c,t`DELETE FROM ${t.identifier(W)} WHERE ${ce} = ${L}`);else if(U&&P!==void 0&&U.value!==null&&P===U.value){const re=T(A,m,B);v(c,t`UPDATE ${t.identifier(W)} SET ${te} = ${re.value}, ${Q} = ${V} WHERE ${ce} = ${L}`)}else v(c,t`UPDATE ${t.identifier(W)} SET ${Q} = ${Q} - 1 WHERE ${ce} = ${L}`)}if(q){const L=de(m.by??[],q),P=Fe(q[j]);if(P===void 0)v(c,Le(W,L,null,1,t`${Q} = ${Q} + 1`));else{const U=H==="min"?"MIN":"MAX";v(c,Le(W,L,P,1,t`${te} = ${t.raw(U)}(COALESCE(${te}, excluded.${te}), excluded.${te}), ${Q} = ${Q} + 1`))}}}},b=A=>{const m=l.tables[A]?.aggregateIndexes;if(!(!m||m.length===0))for(const I of m)_(A,I)},u=(A,m,I)=>{const F=l.tables[A]?.aggregateIndexes;if(!(!F||F.length===0))for(const W of F)k(A,W,m,I)},S=(A,m)=>{const I=`${A}::rank::${m.name}`;if(w.has(I))return;const F=Ae(A,m.name),W=v(c,t`SELECT id, _creationTime, ${t.identifier(X)} FROM ${t.identifier(A)}`).toArray();v(c,t`DELETE FROM ${t.identifier(F)}`);const H=m.sortBy.map((G,B)=>Se(B)),j=t.join(["__id__","__partition__",...H].map(G=>t.identifier(G)),t`, `);for(const G of W){const B=fe(G);if(!B||m.where&&!ct(B,m.where))continue;const q=De(m.partitionBy??[],B),L=m.sortBy.map(U=>ue(B[U.field]??null)),P=t.join([B._id,q,...L].map(U=>Ke(U)),t`, `);v(c,t`INSERT INTO ${t.identifier(F)} (${j}) VALUES (${P})`)}w.add(I)},M=A=>{const m=l.tables[A]?.rankIndexes;if(!(!m||m.length===0))for(const I of m)S(A,I)},D=(A,m,I,F)=>{const W=l.tables[A]?.rankIndexes;if(!(!W||W.length===0))for(const H of W)Gt(c,A,H,m,I,F)},O=(A,m,I)=>{const F=l.tables[A]?.searchIndexes;if(!(!F||F.length===0||!st(c)))for(const W of F){const H=ht(A,W.name);v(c,t`DELETE FROM ${t.identifier(H)} WHERE ${t.identifier("__id__")} = ${m}`),I&&v(c,t`INSERT INTO ${t.identifier(H)} (${t.identifier("__text__")}, ${t.identifier("__id__")}) VALUES (${ut(I[W.field])}, ${m})`)}},Z=(A,m,I)=>{const F=l.tables[A]?.geoIndexes;if(!(!F||F.length===0))for(const W of F){const H=lt(A,W.name);v(c,t`DELETE FROM ${t.identifier(H)} WHERE ${t.identifier("__id__")} = ${m}`);const j=I?.[W.field];if(j!==null&&typeof j=="object"&&typeof j.lat=="number"&&typeof j.lng=="number"){const{lat:G,lng:B}=j,q=It({lat:G,lng:B},W.precision??vt);v(c,t`INSERT INTO ${t.identifier(H)} (${t.identifier("__id__")}, ${t.identifier("__geohash__")}, ${t.identifier("__lat__")}, ${t.identifier("__lng__")}) VALUES (${m}, ${q}, ${G}, ${B})`)}}};return{ensureBackfilledForTable:b,ensureBackfilledIndex:_,ensureRankBackfilled:S,ensureRankBackfilledForTable:M,syncAggregates:u,syncCompanionsForInsert:(A,m,I)=>{O(A,m,I),Z(A,m,I),u(A,void 0,I),D(A,m,void 0,I),n(A,m),s(A,m,"insert",I),o({key:m,op:"insert",row:I,table:A})},syncGeo:Z,syncRanks:D,syncSearch:O}},Vt="__doc__",Jt=i=>{const o=JSON.stringify(i),n=new TextEncoder().encode(o);let s="";for(const l of n)s+=String.fromCodePoint(l);return btoa(s)},zt=i=>i.after?[i.after.partitionKey,...i.after.sortValues,i.after.rowId]:i.cursor?Ce(i.cursor):void 0,Yt=(i,o,n)=>{if(i?.length!==1+o.length+1)return;const s=[{column:"__partition__",direction:"asc"}];for(const[c,E]of o.entries())s.push({column:E,direction:n[c]?.direction??"asc"});s.push({column:we,direction:"asc"});const l=[];for(const[c,E]of s.entries()){const w=[];for(const[T,k]of s.slice(0,c).entries())w.push(t`${t.identifier(k.column)} IS ${i[T]}`);w.push(t`${t.identifier(E.column)} ${t.raw(E.direction==="desc"?"<":">")} ${i[c]}`);const[_]=w;l.push(w.length===1&&_!==void 0?_:t`(${t.join(w,t` AND `)})`)}return t`(${t.join(l,t` OR `)})`},wt=null,Qt=(i,o)=>{if(i===void 0)return wt;const n=[i.__partition__,...o.map(s=>i[s]),i[we]];return Jt(n)},Xt=(i,o,n)=>{const s=[];for(const l of i){const c=l[we];if(typeof c!="string")continue;const E=o.get(c);if(!E)continue;const w=typeof l.__partition__=="string"?l.__partition__:"",_=n.map(T=>l[T]??null);s.push({doc:E,key:{partitionKey:w,rowId:c,sortValues:_}})}return s},Zt=(i,o,n)=>{const{rowToDocument:s}=i,l=new Map;if(n.length===0)return l;const c=t.join(n.map(w=>Ke(w)),t`, `),E=v(i.sql,t`SELECT id, _creationTime, ${t.identifier(Vt)} FROM ${t.identifier(o)} WHERE id IN (${c})`).toArray();for(const w of E){const _=s(w),T=w.id;_&&typeof T=="string"&&l.set(T,_)}return l},et=(i,o,n,s)=>{const{assertRankPartitionLocal:l,ensureRankBackfilled:c,onRead:E,schema:w}=i,_=w.tables[o];if(!_)throw new N("INTERNAL",`unknown table: ${o}`);const T=_.rankIndexes?.find(V=>V.name===n);if(!T)throw new N("INTERNAL",`unknown rankIndex "${n}" on table "${o}"`);l(o,_,T),E(o,Y),c(o,T);const k=Ae(o,T.name),b=T.sortBy.map((V,re)=>Se(re)),u=Math.max(1,Math.min(1e3,Math.floor(s.take??100))),S=oe(s.baseWhere,s.where),M=ft(T,S),D=[t`${t.identifier("__partition__")} ASC`];for(const[V,re]of b.entries()){const se=T.sortBy[V]?.direction;D.push(t`${t.identifier(re)} ${t.raw(se==="desc"?"DESC":"ASC")}`)}D.push(t`${t.identifier(we)} ASC`);const O=[];typeof s.partitionKey=="string"?O.push(t`${t.identifier("__partition__")} = ${s.partitionKey}`):M&&O.push(t`${t.identifier("__partition__")} = ${De(T.partitionBy??[],M)}`);const Z=zt(s),A=Yt(Z,b,T.sortBy);A&&O.push(A);const m=t.identifier(we),I=t.identifier("__partition__"),F=O.length>0?t` WHERE ${t.join(O,t` AND `)}`:t``,W=b.length>0?t`${m}, ${I}, ${t.join(b.map(V=>t.identifier(V)),t`, `)}`:t`${m}, ${I}`,H=t`SELECT ${W} FROM ${t.identifier(k)}${F} ORDER BY ${t.join(D,t`, `)} LIMIT ${t.raw(String(u+1))}`,j=v(i.sql,H).toArray(),G=j.length>u,B=G?j.slice(0,u):j,q=B.map(V=>V[we]),L=Xt(B,Zt(i,o,q),b),P=G?Qt(B.at(-1),b):wt,U=T.sortBy.map(V=>V.direction==="desc"?"desc":"asc");return{continueCursor:P,directions:U,hasMore:G,rows:L}},en=/^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/iu,tn=i=>{if(!en.test(i))throw new N("INTERNAL",`invalid clientId ${JSON.stringify(i)}: a client-supplied row id must be a UUID`)},tt=50,mt=500,ge=(i,o,n)=>{const s=o??mt;if(i>s)throw new N("BATCH_LIMIT_EXCEEDED",`${n}: batch of ${String(i)} exceeds the limit of ${String(s)} (raise options.limit or chunk the call)`,{status:400})},nn=i=>{const o={eq:(n,s)=>(i.sqlConditions.push({comparator:"=",field:n,value:s}),o),gt:(n,s)=>(i.sqlConditions.push({comparator:">",field:n,value:s}),o),gte:(n,s)=>(i.sqlConditions.push({comparator:">=",field:n,value:s}),o),lt:(n,s)=>(i.sqlConditions.push({comparator:"<",field:n,value:s}),o),lte:(n,s)=>(i.sqlConditions.push({comparator:"<=",field:n,value:s}),o)};return o},rn=(i,o)=>{const n={eq:(s,l)=>{if(!i.definition.filterFields?.includes(s))throw new N("INTERNAL",`field "${s}" is not a filter field of search index "${i.indexName}" on table "${o}"`);return i.filters.push({field:s,value:l}),n},search:(s,l)=>{if(s!==i.definition.field)throw new N("INTERNAL",`search index "${i.indexName}" on table "${o}" indexes "${i.definition.field}", not "${s}"`);const c=i;return c.field=s,c.query=l,c.hasQuery=!0,n}};return n},on=(i,o,n,s,l)=>{const c=$t(n.query);if(c.length===0)return[];const E=ht(o,n.indexName),w=[t`f.${t.identifier("__text__")} MATCH ${Ct(c)}`];for(const b of n.filters)w.push(t`${ee(b.field)} = ${ue(b.value)}`);l&&w.push(l);let _=t`SELECT m.id, m._creationTime, m.${t.identifier(X)} FROM ${t.identifier(E)} f JOIN ${t.identifier(o)} m ON m.id = f.${t.identifier("__id__")} WHERE ${t.join(w,t` AND `)} ORDER BY f.rank, m._creationTime DESC`;typeof s=="number"&&(_=t`${_} LIMIT ${t.raw(String(Math.max(0,Math.floor(s))))}`);const T=v(i,_).toArray(),k=[];for(const b of T){const u=fe(b);u&&k.push(u)}return k},an=(i,o,n,s,l)=>{const c=$t(n.query);if(c.length===0)return[];const E=[];for(const b of n.filters)E.push(t`${ee(b.field)} = ${ue(b.value)}`);l&&E.push(l);let w=t`SELECT id, _creationTime, ${t.identifier(X)} FROM ${t.identifier(o)}`;E.length>0&&(w=t`${w} WHERE ${t.join(E,t` AND `)}`);const _=v(i,w).toArray(),T=[];for(const b of _){const u=fe(b);if(!u)continue;const S=Dt(ut(u[n.field]),c);S>0&&T.push({creationTime:typeof u._creationTime=="number"?u._creationTime:0,doc:u,score:S})}T.sort((b,u)=>u.score-b.score||u.creationTime-b.creationTime);const k=T.map(b=>b.doc);return typeof s=="number"?k.slice(0,Math.max(0,Math.floor(s))):k},sn=(i,o)=>{const n=i,s={near:(l,c)=>{if(n.within)throw new N("INTERNAL",`geo index "${n.indexName}" on table "${o}": call .near() or .within(), not both`);return n.near={point:{lat:l.lat,lng:l.lng},radiusMeters:c},s},within:l=>{if(n.near)throw new N("INTERNAL",`geo index "${n.indexName}" on table "${o}": call .near() or .within(), not both`);return n.within={ne:{lat:l.ne.lat,lng:l.ne.lng},sw:{lat:l.sw.lat,lng:l.sw.lng}},s}};return s},ln=(i,o)=>{const n=i[o];if(n===null||typeof n!="object")return;const{lat:s,lng:l}=n;return typeof s=="number"&&typeof l=="number"?{lat:s,lng:l}:void 0},dn=(i,o)=>{const n=ln(i,o.definition.field);if(!n)return;const s=typeof i._creationTime=="number"?i._creationTime:0;if(o.near){const l=xt(o.near.point,n);return l<=o.near.radiusMeters?{creationTime:s,distance:l}:void 0}return Lt(n,o.within)?{creationTime:s,distance:0}:void 0},cn=(i,o,n,s,l)=>{if(!n.near&&!n.within)throw new N("INTERNAL",`geo index "${n.indexName}" on table "${o}": call .near(point, radius) or .within(box)`);const c=n.near?kt(n.near.point,n.near.radiusMeters):Mt(n.within),E=lt(o,n.indexName),w=c.map(S=>t`(g.${t.identifier("__geohash__")} >= ${S} AND g.${t.identifier("__geohash__")} < ${`${S}{`})`),_=[t`(${t.join(w,t` OR `)})`];l&&_.push(l);const T=t`SELECT m.id, m._creationTime, m.${t.identifier(X)} FROM ${t.identifier(E)} g JOIN ${t.identifier(o)} m ON m.id = g.${t.identifier("__id__")} WHERE ${t.join(_,t` AND `)}`,k=v(i,T).toArray(),b=[];for(const S of k){const M=fe(S),D=M?dn(M,n):void 0;M&&D&&b.push({creationTime:D.creationTime,distance:D.distance,doc:M})}b.sort((S,M)=>S.distance-M.distance||M.creationTime-S.creationTime);const u=b.map(S=>S.doc);return typeof s=="number"?u.slice(0,Math.max(0,Math.floor(s))):u},fn=(i,o,n,s,l)=>{const{geo:c}=n;if(!c)throw new N("INTERNAL","runGeoTerminal called without a staged geo query");const E=n.inMemoryFilters.length>0,w=cn(i,o,c,E?void 0:l,s);if(!E)return w;const _=[];for(const T of w)if(n.inMemoryFilters.every(k=>k(T))&&(_.push(T),typeof l=="number"&&_.length>=l))break;return _},un=(i,o,n,s,l,c)=>{const E=[];for(const k of n.sqlConditions)E.push(t`${ee(k.field)} ${t.raw(k.comparator)} ${ue(k.value)}`);s&&E.push(s);let w=t`SELECT id, _creationTime, ${t.identifier(X)} FROM ${t.identifier(o)}`;E.length>0&&(w=t`${w} WHERE ${t.join(E,t` AND `)}`),w=t`${w} ORDER BY ${l}`,typeof c=="number"&&n.inMemoryFilters.length===0&&(w=t`${w} LIMIT ${t.raw(String(Math.max(0,Math.floor(c))))}`);const _=v(i,w).toArray(),T=[];for(const k of _){const b=fe(k);if(b&&n.inMemoryFilters.every(u=>u(b))&&(T.push(b),typeof c=="number"&&T.length>=c))break}return T},pe={fieldRef:ee,serialize:ue},hn=i=>{let o=0;const n=[],s={fieldRef:ee,relationExists:l=>{const{childWhere:c,negated:E,parentTable:w,relation:_}=l,T=`__rel_${String(o)}`,k=n.at(-1)??w;o+=1,i(_.table,Y);const b=_.kind==="one"?_.field:_.references,u=_.kind==="one"?_.references:_.field,S=t`${Ye(T,u)} = ${Ye(k,b)}`;n.push(T);const M=he(c,s);n.pop();const D=M?t`${S} AND ${M}`:S,O=t`EXISTS (SELECT 1 FROM ${t.identifier(_.table)} AS ${t.identifier(T)} WHERE ${D})`;return E?t`NOT ${O}`:O},serialize:ue};return s},gt=i=>{const o=i.map(n=>t`${ee(n.field)} ${t.raw(n.direction==="desc"?"DESC":"ASC")}`);return i.some(n=>n.field==="_id"||n.field==="id")||o.push(t`${ee("id")} ASC`),t.join(o,t`, `)},$n={"<":"lt","<=":"lte","=":"eq",">":"gt",">=":"gte"},pn=i=>{const o=i.order;return i.indexFields.length>0?i.indexFields.map(n=>({direction:o,field:n})):[{direction:o,field:"_creationTime"}]},wn=(i,o,n,s)=>{const l=i.sqlConditions.map(c=>({[c.field]:{[$n[c.comparator]??"eq"]:c.value}}));if(n&&l.push(pt(o,Ce(n))),s&&l.push(Wt(o,Ce(s))),l.length!==0)return l.length===1?l[0]:{AND:l}},mn=(i,o,n)=>{const s=[];for(const l of i){const c=fe(l);if(c&&o.every(E=>E(c))&&(s.push(c),n!==void 0&&s.length>n))break}return s},gn=(i,o,n,s,l)=>{const c=Math.max(0,Math.floor(s.numItems)),E=pn(n),w=typeof s.endCursor=="string",_=he(wn(n,E,s.cursor,s.endCursor),pe),T=l&&_?t`${_} AND ${l}`:l??_;let k=t`SELECT id, _creationTime, ${t.identifier(X)} FROM ${t.identifier(o)}`;T&&(k=t`${k} WHERE ${T}`),k=t`${k} ORDER BY ${gt(E)}`;const b=n.inMemoryFilters.length>0;!b&&!w&&(k=t`${k} LIMIT ${t.raw(String(c+1))}`);const u=v(i,k).toArray(),S=mn(u,n.inMemoryFilters,b||w?void 0:c);if(w){const Z=S.length>=2?S[Math.floor(S.length/2)-1]:void 0;return{continueCursor:s.endCursor??null,isDone:!0,page:S,splitCursor:Z?Pe(Z,E):null}}const M=S.length>c,D=M?S.slice(0,c):S,O=D.at(-1);return{continueCursor:M&&O?Pe(O,E):null,isDone:!M,page:D}};class En extends N{constructor(o="unique() found more than one matching document"){super("NOT_UNIQUE",o,{name:"NotUniqueError"})}}const bn=/\s/u,yn=String.fromCodePoint(0),nt=(i,o,n)=>{if(!i.tables[o])throw new N("INTERNAL",`unknown table: ${o}`);return typeof n!="string"||n.length===0||bn.test(n)||n.includes(yn)?null:n},_n=(i,o,n,s=()=>{})=>{const l=o.tables[n];if(!l)throw new N("INTERNAL",`unknown table: ${n}`);const c=Ee(l.softDeleteMode,void 0),E=c?he(c,pe):void 0,w={indexFields:[],indexName:void 0,inMemoryFilters:[],order:"asc",sqlConditions:[]},_=u=>{const{search:S}=w;if(!S)throw new N("INTERNAL","runSearchFetch called without a staged search");const M=w.inMemoryFilters.length>0,D=M?void 0:u,O=st(i)?on(i,n,S,D,E):an(i,n,S,D,E);if(!M)return O;const Z=[];for(const A of O)if(w.inMemoryFilters.every(m=>m(A))&&(Z.push(A),typeof u=="number"&&Z.length>=u))break;return Z},T=()=>{const u=w.indexFields.length>0?w.indexFields:["_creationTime"],S=w.order==="desc"?"DESC":"ASC";return t.join(u.map(M=>t`${ee(M)} ${t.raw(S)}`),t`, `)},k=u=>w.search?_(u):w.geo?fn(i,n,w,E,u):un(i,n,w,E,T(),u),b={async collect(){return k(void 0)},filter(u){return w.inMemoryFilters.push(u),b},async first(){return k(w.inMemoryFilters.length>0?void 0:1)[0]??null},order(u){return w.order=u==="desc"?"desc":"asc",b},async paginate(u){if(w.search)throw new N("INTERNAL","pagination is not supported on search queries; use .take(n) or .collect()");if(w.geo)throw new N("INTERNAL","pagination is not supported on geo queries; use .take(n) or .collect()");return gn(i,n,w,u,E)},async take(u){return k(u)},async unique(){const u=k(w.inMemoryFilters.length>0?void 0:2);if(u.length>1)throw new En(`unique() on table "${n}" matched ${String(u.length)} documents; expected at most one`);return u[0]??null},withGeoIndex(u,S){const M=(l.geoIndexes??[]).find(O=>O.name===u);if(!M)throw new N("INTERNAL",`unknown geo index "${u}" on table "${n}"`);s(n,u,"geo");const D={definition:M,indexName:u};if(w.geo=D,S(sn(D,n)),!D.near&&!D.within)throw new N("INTERNAL",`geo index "${u}" on table "${n}" requires a .near(point, radius) or .within(box) call`);return b},withIndex(u,S){const M=l.indexes.find(D=>D.name===u);if(!M)throw new N("INTERNAL",`unknown index "${u}" on table "${n}"`);return s(n,u,"index"),w.indexName=u,w.indexFields=M.fields,S&&S(nn(w)),b},withSearchIndex(u,S){const M=(l.searchIndexes??[]).find(O=>O.name===u);if(!M)throw new N("INTERNAL",`unknown search index "${u}" on table "${n}"`);s(n,u,"search");const D={definition:M,field:M.field,filters:[],hasQuery:!1,indexName:u,query:""};if(w.search=D,S(rn(D,n)),!D.hasQuery)throw new N("INTERNAL",`search index "${u}" on table "${n}" requires a .search(field, query) call`);return b}};return b},rt=(i,o,n)=>{const s={...o};for(const[l,c]of dt(i)){if(c.serverDefault){s[l]=c.serverDefault({auth:n});continue}s[l]===void 0&&(c.defaultFn?s[l]=c.defaultFn():"defaultValue"in c&&(s[l]=c.defaultValue))}return s},it=(i,o,n,s)=>{const l=n;for(const[c,E]of dt(i)){if(E.serverDefault){c in o&&(l[c]=E.serverDefault({auth:s}));continue}E.onUpdateFn&&!(c in o)&&(l[c]=E.onUpdateFn())}},ot=(i,o)=>{for(const n of Object.keys(o))if(o[n]===void 0)throw new N("INTERNAL",`Cannot ${i} field '${n}' to undefined — use null to clear a nullable field, or omit the key to leave it unchanged.`)},Nn=/unique constraint failed/i,Tn=i=>i instanceof Error&&Nn.test(i.message),Ge=(i,o,n)=>{try{v(i,n)}catch(s){throw Tn(s)?new Re(`unique constraint violation on "${o}"`,"unique"):s}},xe=(i,o,n)=>{if(Ge(i,o,n),v(i,t`SELECT changes() AS changed`).one().changed===0)throw new Re(`optimistic concurrency conflict on "${o}" — the row changed during this mutation; refetch and retry`,"occ")},at=(i,o,n,s,l,c,E)=>{const w=[];for(let b=0;b<n.length+1;b+=1){const u=[];for(let O=0;O<b;O+=1)u.push(t`${t.identifier(n[O])} IS ${c[O]}`);const S=n[b],M=s[b];if(S!==void 0&&M!==void 0){const O=M.direction==="desc"?">":"<";u.push(t`${t.identifier(S)} ${t.raw(O)} ${c[b]}`)}else u.push(t`${t.identifier(we)} < ${E}`);const[D]=u;w.push(u.length===1&&D!==void 0?D:t`(${t.join(u,t` AND `)})`)}const _=t.join(w,t` OR `),T=v(i,t`SELECT COUNT(*) AS c FROM ${t.identifier(o)} WHERE ${t.identifier("__partition__")} = ${l} AND (${_})`).one(),k=v(i,t`SELECT COUNT(*) AS c FROM ${t.identifier(o)} WHERE ${t.identifier("__partition__")} = ${l}`).one();return{before:T.c,total:k.c}},Jn=i=>{const{sql:o}=i,{schema:n}=i,s=i.broadcast??(()=>{}),l=i.onRead??(()=>{}),c=i.onIndexUse??(()=>{}),E=i.onWrite??(()=>{}),{cache:w}=i,_=i.clock??(()=>Date.now()),T=i.idGenerator??(()=>crypto.randomUUID()),k=i.scheduler??yt,{globalDb:b}=i,u=i.auth??{identity:null,userId:null},S=i.cdc??!1,M=k,D=jt({scheduler:typeof M.list=="function"&&typeof M.get=="function"?M:void 0,storage:i.storage}),O=(e,r,a,p)=>{S&&St(o,_(),e,r,a,p)},Z=e=>n.tables[e]?.shardMode?.kind==="global",A=(e,r)=>{if(Z(e)){if(!b)throw new N("INTERNAL",`cross-backend ${r} for global table '${e}' requires a globalDb writer — pass one to createShardCtxDb({ globalDb })`);return b}return J},m=e=>A(e,"cascade"),I=(e,r)=>{if(Z(e)){if(!b)throw new N("INTERNAL",`${r} on global table '${e}' requires a globalDb writer — pass one to createShardCtxDb({ globalDb })`);return b}},F=()=>b,W=(e,r)=>A(e,"relation load").findMany(e,r),H=(e,r)=>(Z(e)&&l(e,Y),W(e,r)),j=e=>!Z(e.table),G=i.relationExistsPushDown??"auto",B=G!=="never",{maxRelationKeys:q}=i,L=(e,r,a)=>Xe(e,{fetcher:H,maxRelationKeys:q,relationBaseWhere:a,schema:n,tableName:r}),P=async(e,r,a,p)=>{const $=I(e,"relation grouped count");if($)return l(e,Y),qt((C,ie)=>$.count(C,ie),e,r,a,p);const h=n.tables[e];if(!h)throw new N("INTERNAL",`unknown table: ${e}`);l(e,Y);const d=Ee(h.softDeleteMode,void 0),f={[r]:{in:a}},g=oe(oe(f,p),d),R=await L(g,e,void 0),y=he(R,pe),x=ee(r);let z=t`SELECT ${x} AS __fk__, COUNT(*) AS count FROM ${t.identifier(e)}`;y&&(z=t`${z} WHERE ${y}`),z=t`${z} GROUP BY ${x}`;const K=v(o,z).toArray();return new Map(K.map(C=>[C.__fk__,C.count]))};let U=0;const V=new Set;for(const[e,r]of Object.entries(n.tables))for(const a of Object.values(r.triggerMap??{}))V.add(`${e} ${a.timing} ${a.op}`);const re=(e,r,a)=>V.has(`${e} ${r} ${a}`),se=async(e,r,a)=>{if(U+=1,U>tt)throw U-=1,new Re(`trigger recursion exceeded ${String(tt)} levels on "${a.table}" — check for a self-triggering write`,"trigger");try{await Ht({ctx:Et,event:a,op:r,schema:n,tableName:a.table,timing:e})}finally{U-=1}},{ensureBackfilledForTable:be,ensureBackfilledIndex:Oe,ensureRankBackfilled:We,ensureRankBackfilledForTable:ye,syncAggregates:Ie,syncCompanionsForInsert:Ve,syncGeo:ve,syncRanks:_e,syncSearch:ke}=Kt({broadcast:s,invalidateCache:(e,r)=>w?.invalidate(e,r),recordCdc:O,schema:n,sql:o}),Je=(e,r,a)=>{const{shardMode:p}=r;if(p?.kind==="shardBy"&&!(p.field!==void 0&&(a.partitionBy??[]).includes(p.field)))throw Object.assign(new Error(`rank index "${a.name}" on "${e}" partitions across shards (shard key "${p.field??"?"}" is not in partitionBy) — a shard-local rank()/rankPage() would be wrong; roll it up through the Query Coordinator instead`),{code:"CROSS_SHARD_RANK_UNSUPPORTED",name:"LunoraError",status:400})},$e=(e,r)=>{const a=Object.entries(n.tables).filter(([,R])=>R.shardMode?.kind!=="global").map(([R])=>R).filter(R=>r===void 0||R===r);if(a.length===0)return;const p=a.map(R=>t`SELECT ${t.raw(`'${R.replaceAll("'","''")}'`)} AS __t__, id, _creationTime, ${t.identifier(X)} FROM ${t.identifier(R)} WHERE id = ${e}`),$=t`${t.join(p,t` UNION ALL `)} LIMIT 1`,[h]=v(o,$).toArray();if(!h)return;const d=h.__t__,f=fe(h);if(typeof d!="string"||!f)return;const g=h[X];return{docJson:typeof g=="string"?g:JSON.stringify(g??{}),row:f,tableName:d}},ze={assertRankPartitionLocal:Je,ensureRankBackfilled:We,onRead:l,rowToDocument:fe,schema:n,sql:o},J={system:D,async aggregate(e,r){const a=I(e,"aggregate");if(a)return l(e,Y),a.aggregate(e,r);const p=n.tables[e];if(!p)throw new N("INTERNAL",`unknown table: ${e}`);if(Ne(r.op),r.op==="count")return J.count(e,{baseWhere:r.baseWhere,relationBaseWhere:r.relationBaseWhere,restrictsCounts:r.restrictsCounts,where:r.where});if(!r.field)throw new N("INTERNAL",`aggregate(${e}, { op: "${r.op}" }): "field" is required for non-count reducers`);l(e,Y);const $=Ee(p.softDeleteMode,void 0),h=oe(oe(r.baseWhere,r.where),$),d=await L(h,e,r.relationBaseWhere),f=d!==h;if(p.aggregateIndexes&&!r.baseWhere&&!f&&!$){const K=Rt(p.aggregateIndexes,r.op,r.field,r.where);if(K){Oe(e,K.index);const C=de(K.index.by??[],K.key),ie=Te(e,K.index.name),ae=v(o,t`SELECT ${te} AS value, ${Q} AS count FROM ${t.identifier(ie)} WHERE ${ce} = ${C}`).toArray()[0];return qe(r.op,ae)}}const g=he(d,pe),R=Ne(r.op),y=ee(r.field);let x=t`SELECT ${t.raw(R)}(${y}) AS value FROM ${t.identifier(e)}`;return g&&(x=t`${x} WHERE ${g}`),v(o,x).toArray()[0]?.value??null},asId(e,r){const a=nt(n,e,r);if(a===null)throw new N("BAD_REQUEST",`asId("${e}", …): "${r}" is not a valid id for table "${e}"`,{status:400});return a},async count(e,r){const a=I(e,"count");if(a)return l(e,Y),a.count(e,r);const p=n.tables[e];if(!p)throw new N("INTERNAL",`unknown table: ${e}`);const $=bt(r);if($.restrictsCounts)throw new Ue(e);l(e,Y);const h=Ee(p.softDeleteMode,void 0),d=oe(oe($.baseWhere,$.where),h),f=await L(d,e,$.relationBaseWhere),g=f!==d;if(p.aggregateIndexes&&!$.baseWhere&&!g&&!h){const x=Tt(p.aggregateIndexes,$.where);if(x){Oe(e,x.index);const z=de(x.index.by??[],x.key),K=Te(e,x.index.name),C=v(o,t`SELECT ${te} AS value FROM ${t.identifier(K)} WHERE ${ce} = ${z}`).toArray();return C[0]===void 0?0:C[0].value??0}}const R=he(f,pe);let y=t`SELECT COUNT(*) AS count FROM ${t.identifier(e)}`;return R&&(y=t`${y} WHERE ${R}`),v(o,y).one().count},async delete(e,r,a){const p=$e(e,r);if(!p){const y=r===void 0?F():void 0;y&&await y.delete(e,void 0,a);return}const{docJson:$,row:h,tableName:d}=p,f=n.tables[d],g=a?.hard===!0,R=!g&&f?.softDeleteMode?f.softDeleteMode.field:void 0;if(!(R&&h[R]!==null&&h[R]!==void 0)){if(re(d,"before","delete")&&await se("before","delete",{id:e,op:"delete",previous:h,table:d}),await Ft({deletedId:e,deletedReference:y=>h[y],findHolders:async(y,x,z)=>(await m(y).findMany(y,{includeDeleted:g,where:{[x]:z}})).page,onCascade:(y,x)=>m(y).delete(x,void 0,a),onRestrict:y=>{throw new Re(y,"restrict")},onSetNull:(y,x,z)=>m(y).patch(x,{[z]:null}),schema:n,tableName:d}),be(d),ye(d),R){const y={...h,[R]:_(),_id:e};xe(o,d,t`UPDATE ${t.identifier(d)} SET ${t.identifier(X)} = ${JSON.stringify(y)} WHERE id = ${e} AND ${t.identifier(X)} = ${$}`),ke(d,e,y),ve(d,e,void 0),Ie(d,h,y),_e(d,e,h,void 0),w?.invalidate(d,e),O(d,e,"update",y),s({key:e,op:"update",row:y,table:d}),re(d,"after","delete")&&await se("after","delete",{id:e,op:"delete",previous:h,table:d}),await E({id:e,op:"delete",table:d});return}xe(o,d,t`DELETE FROM ${t.identifier(d)} WHERE id = ${e} AND ${t.identifier(X)} = ${$}`),ke(d,e,void 0),ve(d,e,void 0),Ie(d,h,void 0),_e(d,e,h,void 0),w?.invalidate(d,e),O(d,e,"delete"),s({key:e,op:"delete",table:d}),re(d,"after","delete")&&await se("after","delete",{id:e,op:"delete",previous:h,table:d}),await E({id:e,op:"delete",table:d})}},async deleteAll(e,r){if(!n.tables[e])throw new N("INTERNAL",`unknown table: ${e}`);const a=Math.max(1,r?.chunkSize??mt),p=r?.hard===void 0?void 0:{hard:r.hard},$=Z(e)?void 0:e;let h=0;for(;;){const d=(await J.findMany(e,{limit:a})).page.map(f=>String(f._id));if(d.length===0)break;for(const f of d)await J.delete(f,$,p),h+=1;if(d.length<a)break}return{deleted:h}},async deleteMany(e,r,a){ge(e.length,r?.limit,"deleteMany");for(const p of e)await J.delete(p,a);return{deleted:e.length}},async deleteWhere(e,r,a){const p=I(e,"deleteWhere");let $;if(p)$=(await p.findMany(e,{where:r})).page.map(h=>String(h._id));else{if(!n.tables[e])throw new N("INTERNAL",`unknown table: ${e}`);$=(await J.findMany(e,{where:r})).page.map(h=>String(h._id))}if(ge($.length,a?.limit,"deleteWhere"),J.deleteMany===void 0)throw new N("INTERNAL",`ctx.db.${e}.deleteMany is unavailable: this writer has no batch delete`);return J.deleteMany($,a)},async findFirst(e,r={}){return(await J.findMany(e,{...r,limit:1})).page[0]??null},async findFirstOrThrow(e,r={}){const a=await J.findFirst(e,r);if(a===null)throw new Bt(`findFirstOrThrow: no "${e}" document matched`);return a},async findMany(e,r={}){const a=I(e,"findMany");if(a)return l(e,Y),a.findMany(e,r);const p=n.tables[e];if(!p)throw new N("INTERNAL",`unknown table: ${e}`);const $=!r.where&&!r.baseWhere;$?l(e,Y):l(e);const h=Ot(r.orderBy),d=r.cursor?pt(h,Ce(r.cursor)):void 0;let f=oe(r.baseWhere,r.where);f=oe(f,Ee(p.softDeleteMode,r.includeDeleted)),f=await Xe(f,{canPushExists:B?j:void 0,existsPushMode:G==="always"?"always":"auto",fetcher:H,maxRelationKeys:q,relationBaseWhere:r.relationBaseWhere,schema:n,tableName:e}),d&&(f=f?{AND:[f,d]}:d);const g=B?hn(l):pe,R=he(f,g);let y=t`SELECT id, _creationTime, ${t.identifier(X)} FROM ${t.identifier(e)}`;R&&(y=t`${y} WHERE ${R}`),y=t`${y} ORDER BY ${gt(h)}`;const x=typeof r.limit=="number"?Math.max(0,Math.floor(r.limit)):void 0;x!==void 0&&(y=t`${y} LIMIT ${t.raw(String(x+1))}`);const z=v(o,y).toArray(),K=[];for(const le of z){const ne=fe(le);ne&&(K.push(ne),!$&&typeof ne._id=="string"&&l(e,ne._id))}if(x===void 0)return r.with&&await Ze({groupedCounter:P,fetcher:W,parents:K,relationBaseWhere:r.relationBaseWhere,schema:n,tableName:e,with:r.with}),{continueCursor:null,isDone:!0,page:Qe(K,r.select,r.with)};const C=K.length>x,ie=C?K.slice(0,x):K,ae=ie.at(-1);return r.with&&await Ze({fetcher:W,groupedCounter:P,parents:ie,relationBaseWhere:r.relationBaseWhere,schema:n,tableName:e,with:r.with}),{continueCursor:C&&ae?Pe(ae,h):null,isDone:!C,page:Qe(ie,r.select,r.with)}},async get(e,r){const a=$e(e,r);if(!a){const p=r===void 0?F():void 0;return p?p.get(e):null}return l(a.tableName,e),a.row},async lookupById(e,r){const a=$e(e,r);return a?(l(a.tableName,e),{row:a.row,tableName:a.tableName}):null},async groupBy(e,r){const a=I(e,"groupBy");if(a)return l(e,Y),a.groupBy(e,r);const p=n.tables[e];if(!p)throw new N("INTERNAL",`unknown table: ${e}`);l(e,Y);const $=r.agg??{op:"count"};if(Ne($.op),$.op!=="count"&&!$.field)throw new N("INTERNAL",`groupBy(${e}, { agg: { op: "${$.op}" } }): "field" is required for non-count reducers`);const h=Ee(p.softDeleteMode,void 0),d=oe(oe(r.baseWhere,r.where),h),f=await L(d,e,r.relationBaseWhere),g=f!==d;if(p.aggregateIndexes&&!r.baseWhere&&!g&&!h){const C=Nt(p.aggregateIndexes,$.op,$.field,r.by,r.where);if(C){Oe(e,C.index);const ie=Te(e,C.index.name),ae=Object.keys(C.partial),le=[];if(ae.length===(C.index.by??[]).length&&ae.length>0){const me=de(C.index.by??[],C.partial),Me=v(o,t`SELECT ${te} AS value, ${Q} AS count FROM ${t.identifier(ie)} WHERE ${ce} = ${me}`).toArray();return Me.length>0&&le.push({key:{...C.partial},value:qe($.op,Me[0])}),le}const ne=v(o,t`SELECT ${ce} AS key, ${te} AS value, ${Q} AS count FROM ${t.identifier(ie)}`).toArray();for(const me of ne){const Me=JSON.parse(me.key);le.push({key:Me,value:qe($.op,me)})}return le}}const R=he(f,pe),y=r.by.map(C=>t`${ee(C)} AS ${t.identifier(C)}`);if($.op==="count")y.push(t`COUNT(*) AS value`);else{const{field:C}=$;if(C===void 0)throw new N("INTERNAL",`groupBy(${e}, { agg: { op: "${$.op}" } }): "field" is required for non-count reducers`);y.push(t`${t.raw(Ne($.op))}(${ee(C)}) AS value`)}let x=t`SELECT ${t.join(y,t`, `)} FROM ${t.identifier(e)}`;R&&(x=t`${x} WHERE ${R}`),x=t`${x} GROUP BY ${t.join(r.by.map(C=>ee(C)),t`, `)}`;const z=v(o,x).toArray(),K=[];for(const C of z){const ie={};for(const le of r.by)ie[le]=C[le]??null;const{value:ae}=C;K.push({key:ie,value:ae==null?null:Number(ae)})}return K},async insert(e,r,a){const p=I(e,"insert");if(p){const R=await p.insert(e,r,a);return s({key:R,op:"insert",row:{...r,_id:R},table:e}),R}const $=n.tables[e];if(!$)throw new N("INTERNAL",`unknown table: ${e}`);const h=rt($,r,u);He($,h);let d;a?.clientId!==void 0?(tn(a.clientId),d=a.clientId):a?.allowExplicitId&&typeof h._id=="string"?d=h._id:d=T();const f=a?.allowExplicitId&&typeof h._creationTime=="number"?h._creationTime:_(),g={...h,_creationTime:f,_id:d};return re(e,"before","insert")&&await se("before","insert",{doc:{...g},id:d,op:"insert",table:e}),be(e),ye(e),Ge(o,e,t`INSERT INTO ${t.identifier(e)} (id, _creationTime, ${t.identifier(X)}) VALUES (${d}, ${f}, ${JSON.stringify(g)})`),Ve(e,d,g),re(e,"after","insert")&&await se("after","insert",{doc:g,id:d,op:"insert",table:e}),await E({doc:g,id:d,op:"insert",table:e}),d},async insertManyUnsafe(e,r,a){if(ge(r.length,a?.limit,"insertManyUnsafe"),r.length===0)return[];const p=I(e,"insert");if(p){const f=[];for(const g of r){const R=await p.insert(e,g,{allowExplicitId:a?.allowExplicitId});s({key:R,op:"insert",row:{...g,_id:R},table:e}),f.push(R)}return f}const $=n.tables[e];if(!$)throw new N("INTERNAL",`unknown table: ${e}`);be(e),ye(e);const h=r.map(f=>{const g=rt($,f,u),R=a?.allowExplicitId===!0&&typeof g._id=="string"?g._id:T(),y=a?.allowExplicitId===!0&&typeof g._creationTime=="number"?g._creationTime:_();return{creationTime:y,document:{...g,_creationTime:y,_id:R},id:R}}),d=t.join(h.map(f=>t`(${f.id}, ${f.creationTime}, ${JSON.stringify(f.document)})`),t`, `);Ge(o,e,t`INSERT INTO ${t.identifier(e)} (id, _creationTime, ${t.identifier(X)}) VALUES ${d}`);for(const{document:f,id:g}of h)Ve(e,g,f),await E({doc:f,id:g,op:"insert",table:e});return h.map(f=>f.id)},async insertMany(e,r,a){ge(r.length,a?.limit,"insertMany");const p=a?.skipDuplicates===!0,$=[];for(const h of r)try{$.push(await J.insert(e,h))}catch(d){if(p&&d instanceof Re&&d.kind==="unique")$.push(null);else throw d}return $},normalizeId(e,r){return nt(n,e,r)},async patch(e,r,a){const p=$e(e,a);if(!p){const R=a===void 0?F():void 0;if(R){await R.patch(e,r);return}throw new N("INTERNAL",`document not found: ${e}`)}const{docJson:$,row:h,tableName:d}=p,f=n.tables[d];if(!f)throw new N("INTERNAL",`unknown table: ${d}`);l(d,e),ot("patch",r);const g={...h,...r,_id:e};it(f,r,g,u),He(f,g),re(d,"before","update")&&await se("before","update",{doc:{...g},id:e,op:"update",previous:h,table:d}),be(d),ye(d),xe(o,d,t`UPDATE ${t.identifier(d)} SET ${t.identifier(X)} = ${JSON.stringify(g)} WHERE id = ${e} AND ${t.identifier(X)} = ${$}`),ke(d,e,g),ve(d,e,g),Ie(d,h,g),_e(d,e,h,g),w?.invalidate(d,e),O(d,e,"update",g),s({key:e,op:"update",row:g,table:d}),re(d,"after","update")&&await se("after","update",{doc:g,id:e,op:"update",previous:h,table:d}),await E({doc:g,id:e,op:"update",table:d})},async patchMany(e,r,a){ge(e.length,r?.limit,"patchMany");for(const p of e)await J.patch(p.id,p.patch,a);return{patched:e.length}},async patchWhere(e,r,a){const p=I(e,"patchWhere");let $;if(p)$=(await p.findMany(e,{where:r.where})).page.map(h=>({id:String(h._id),patch:r.patch}));else{if(!n.tables[e])throw new N("INTERNAL",`unknown table: ${e}`);$=(await J.findMany(e,{where:r.where})).page.map(h=>({id:String(h._id),patch:r.patch}))}if(ge($.length,a?.limit,"patchWhere"),J.patchMany===void 0)throw new N("INTERNAL",`ctx.db.${e}.patchMany is unavailable: this writer has no batch patch`);return await J.patchMany($,a),{patched:$.length}},query(e){const r=I(e,"query");return r?(l(e,Y),r.query(e)):(l(e,Y),_n(o,n,e,c))},async rank(e,r,a){const p=I(e,"rank");if(p)return l(e,Y),p.rank(e,r,a);c(e,r,"rank");const $=n.tables[e];if(!$)throw new N("INTERNAL",`unknown table: ${e}`);const h=$.rankIndexes?.find(ne=>ne.name===r);if(!h)throw new N("INTERNAL",`unknown rankIndex "${r}" on table "${e}"`);if(Je(e,$,h),a.restrictsCounts)throw new Ue(e);l(e,Y),We(e,h);const d=typeof a.row=="string"?a.row:a.row._id;if(!d)return null;const f=Ae(e,h.name),g=h.sortBy.map((ne,me)=>Se(me)),R=g.map(ne=>At(ne)).join(", "),y=v(o,t`SELECT ${t.identifier("__partition__")}, ${t.raw(R)} FROM ${t.identifier(f)} WHERE ${t.identifier("__id__")} = ${d}`).toArray(),[x]=y;if(x===void 0)return null;let z=x.__partition__;const K=oe(a.baseWhere,a.where);je(K,n,e,"rank");const C=ft(h,K);if(C){const ne=De(h.partitionBy??[],C);if(ne!==z)return null;z=ne}const ie=g.map(ne=>x[ne]),{before:ae,total:le}=at(o,f,g,h.sortBy,z,ie,d);return{position:ae+1,total:le}},async rankBefore(e,r,a){if(Z(e))throw new N("INTERNAL",`rankBefore is not supported on the global (.global()) table '${e}' — cross-shard rank cursors apply only to sharded tables`);const p=n.tables[e];if(!p)throw new N("INTERNAL",`unknown table: ${e}`);const $=p.rankIndexes?.find(g=>g.name===r);if(!$)throw new N("INTERNAL",`unknown rankIndex "${r}" on table "${e}"`);if(a.restrictsCounts)throw new Ue(e);l(e,Y),We(e,$);const h=Ae(e,$.name),d=$.sortBy.map((g,R)=>Se(R)),f=$.sortBy.map((g,R)=>ue(a.sortValues[R]??null));return at(o,h,d,$.sortBy,a.partitionKey,f,a.rowId)},async rankPage(e,r,a={}){je(oe(a.baseWhere,a.where),n,e,"rankPage");const p=I(e,"rankPage");if(p)return l(e,Y),p.rankPage(e,r,a);c(e,r,"rank");const{continueCursor:$,hasMore:h,rows:d}=et(ze,e,r,a);return{continueCursor:$,isDone:!h,page:d.map(f=>f.doc)}},async rankPageRows(e,r,a={}){je(oe(a.baseWhere,a.where),n,e,"rankPage"),c(e,r,"rank");const{directions:p,hasMore:$,rows:h}=et(ze,e,r,a);return{directions:p,hasMore:$,rows:h}},async restore(e,r){const a=$e(e,r);if(!a){const h=r===void 0?F():void 0;if(h?.restore){await h.restore(e);return}throw new N("INTERNAL",`document not found: ${e}`)}const p=n.tables[a.tableName]?.softDeleteMode?.field;if(!p)throw new N("INTERNAL",`ctx.db.restore: table "${a.tableName}" is not a .softDelete() table`);const $=a.row[p]!==null&&a.row[p]!==void 0;await J.patch(e,{[p]:null},r),$&&_e(a.tableName,e,void 0,a.row)},async replace(e,r,a,p){const $=$e(e,a);if(!$){const x=a===void 0?F():void 0;if(x){await x.replace(e,r,void 0,p);return}throw new N("INTERNAL",`document not found: ${e}`)}const{docJson:h,row:d,tableName:f}=$,g=n.tables[f];if(!g)throw new N("INTERNAL",`unknown table: ${f}`);ot("replace",r);const R=p?.allowExplicitId&&typeof r._creationTime=="number"?r._creationTime:_(),y={...r,_creationTime:R,_id:e};it(g,r,y,u),He(g,y),re(f,"before","update")&&await se("before","update",{doc:{...y},id:e,op:"update",previous:d,table:f}),be(f),ye(f),xe(o,f,t`UPDATE ${t.identifier(f)} SET _creationTime = ${R}, ${t.identifier(X)} = ${JSON.stringify(y)} WHERE id = ${e} AND ${t.identifier(X)} = ${h}`),ke(f,e,y),ve(f,e,y),Ie(f,d,y),_e(f,e,d,y),w?.invalidate(f,e),O(f,e,"update",y),s({key:e,op:"update",row:y,table:f}),re(f,"after","update")&&await se("after","update",{doc:y,id:e,op:"update",previous:d,table:f}),await E({doc:y,id:e,op:"update",table:f})},async wipeShard(e){const r=new Set(e?.exclude),a=e?.tables,p=Object.entries(n.tables).filter(([f,g])=>r.has(f)||a!==void 0&&!a.includes(f)?!1:g.shardMode?.kind!=="global").map(([f])=>f);if(a!==void 0){for(const f of a)if(!n.tables[f])throw new N("INTERNAL",`wipeShard: unknown table: ${f}`)}const $={};let h=0;const{deleteAll:d}=J;if(d===void 0)throw new N("INTERNAL","wipeShard: this writer has no deleteAll");for(const f of p){const g=await d(f,{...e?.chunkSize===void 0?{}:{chunkSize:e.chunkSize},hard:!0});$[f]=g.deleted,h+=g.deleted}return{deleted:h,tables:$}}},Et={db:J,scheduler:k};return i.enforceRls===!0?Ut(J,n,(e,r)=>$e(e,r)?.tableName):J};export{Qn as CDC_LOG_TABLE,dr as CLIENT_WATERMARK_TABLE,cr as GLOBAL_SHAPE_SNAPSHOT_TABLE,fr as IDEMPOTENCY_TABLE,En as NotUniqueError,ur as advanceClientWatermark,Xn as applyCdcChanges,tn as assertValidClientId,ar as backfillAggregateIndexes,sr as backfillRankIndexes,Zn as bumpCdcEpoch,Jn as createShardCtxDb,hr as deleteGlobalShapeSnapshot,$r as deleteGlobalShapeSnapshotsForConnection,pr as migrateClientWatermark,wr as migrateGlobalShapeSnapshot,er as minCdcSeq,nt as normalizeIdStructurally,tr as readCdcChanges,nr as readCdcCursor,rr as readCdcEpoch,mr as readClientWatermark,gr as readGlobalShapeSnapshot,Er as readIdempotent,Tr as runShardMigrations,Sr as selectShapeMemberIds,Ar as selectShapeRows,ir as trimCdcChanges,br as trimIdempotent,yr as writeGlobalShapeSnapshot,_r as writeIdempotent};
@@ -1 +0,0 @@
1
- import{LunoraError as m}from"@lunora/errors";const a="id",h=new Set(["_id","id"]),b=t=>{const e=[];for(const r of t??[])for(const[o,s]of Object.entries(r))e.push({direction:s,field:o});return e.length===0?[{direction:"asc",field:"_creationTime"}]:e},S=t=>{const e=new TextEncoder().encode(t);let r="";for(const o of e)r+=String.fromCodePoint(o);return btoa(r)},g=t=>{const e=atob(t),r=Uint8Array.from(e,o=>o.codePointAt(0)??0);return new TextDecoder().decode(r)},A=(t,e)=>{const r=e.map(o=>t[o.field]);return r.push(t._id),S(JSON.stringify(r))},u=()=>new m("BAD_REQUEST","invalid cursor"),D=t=>{let e;try{e=JSON.parse(g(t))}catch{throw u()}if(!Array.isArray(e))throw u();return e},_=(t,e)=>{const r=t.some(s=>h.has(s.field))?t:[...t,{direction:"asc",field:a}],o=[];for(const[s,n]of r.entries()){const i=[];for(const[d,l]of r.slice(0,s).entries())i.push({[l.field]:{eq:e[d]}});const f=n.direction==="desc"?"lt":"gt";i.push({[n.field]:{[f]:e[s]}});const[c]=i;o.push(i.length===1&&c!==void 0?c:{AND:i})}return{OR:o}},y=(t,e)=>t==="desc"?e?"gte":"gt":e?"lte":"lt",E=(t,e)=>{const r=t.some(s=>h.has(s.field))?t:[...t,{direction:"asc",field:a}],o=[];for(const[s,n]of r.entries()){const i=[];for(const[l,p]of r.slice(0,s).entries())i.push({[p.field]:{eq:e[l]}});const f=s===r.length-1,c=y(n.direction,f);i.push({[n.field]:{[c]:e[s]}});const[d]=i;o.push(i.length===1&&d!==void 0?d:{AND:i})}return{OR:o}},w=["_id","_creationTime"],N=(t,e,r)=>{if(!e)return t;const o=new Set([...e,...w,...r?Object.keys(r):[]]);return t.map(s=>{const n={};for(const i of o)i in s&&(n[i]=s[i]);return n})},T=(t,e)=>t&&e!==!0?{[t.field]:{isNull:!0}}:void 0;export{N as applySelect,E as buildSeekBeforeWhere,_ as buildSeekWhere,D as decodeCursor,A as encodeCursor,b as normalizeOrderKeys,T as softDeleteScope};
@@ -1 +0,0 @@
1
- import{sql as e}from"drizzle-orm";import{matchesStaticWhere as u}from"./AGGREGATE_SQL_FUNCTION-QYaiuty4.mjs";import{encodeAggregateKey as S,foldAggregateTally as E,aggregateTableName as b}from"./aggregateTableName-G-eXyjcz.mjs";import{r as f}from"./do-exec-BLe9lLrN.mjs";import{s as g,L as p,a as _,d as h,m as k}from"./do-sql-BYIQTG3z.mjs";import{param as y}from"./renderSql-B5lF5Jd9.mjs";import{sortColumnName as I,matchesRankStaticWhere as N,encodePartitionKey as O,rankTableName as A}from"./RANK_TIEBREAK-DtX8zQyc.mjs";import{t as R}from"./serialize-sql-DiRzL7A4.mjs";const M=(t,i,o)=>{const r=b(i,o.name);if(f(t,e`SELECT COUNT(*) AS count FROM ${e.identifier(r)}`).one().count>0)return;const s=o.by??[],c=new Map,m=f(t,e`SELECT id, _creationTime, ${e.identifier(g)} FROM ${e.identifier(i)}`).toArray();for(const a of m){const n=p(a);if(!n||o.where&&!u(n,o.where))continue;const d=S(s,n);E(c,d,o,n)}for(const[a,n]of c)f(t,e`INSERT INTO ${e.identifier(r)} (${_}, ${h}, ${k}) VALUES (${a}, ${n.value}, ${n.count})`)},K=(t,i)=>{for(const[o,r]of Object.entries(i.tables))if(!(r.shardMode?.kind==="global"||!r.aggregateIndexes))for(const s of r.aggregateIndexes)M(t,o,s)},x=(t,i,o)=>{const r=A(i,o.name);if(f(t,e`SELECT COUNT(*) AS count FROM ${e.identifier(r)}`).one().count>0)return;const s=o.sortBy.map((a,n)=>I(n)),c=e.join(["__id__","__partition__",...s].map(a=>e.identifier(a)),e`, `),m=f(t,e`SELECT id, _creationTime, ${e.identifier(g)} FROM ${e.identifier(i)}`).toArray();for(const a of m){const n=p(a);if(!n||o.where&&!N(n,o.where))continue;const d=O(o.partitionBy??[],n),T=o.sortBy.map(l=>R(n[l.field]??null)),$=e.join([n._id,d,...T].map(l=>y(l)),e`, `);f(t,e`INSERT INTO ${e.identifier(r)} (${c}) VALUES (${$})`)}},V=(t,i)=>{for(const[o,r]of Object.entries(i.tables))if(!(r.shardMode?.kind==="global"||!r.rankIndexes))for(const s of r.rankIndexes)x(t,o,s)};export{K as backfillAggregateIndexes,V as backfillRankIndexes};
@@ -1 +0,0 @@
1
- const l=(e,t)=>`${e}__fts_${t}`,a=e=>e.toLowerCase().match(/[\p{L}\p{N}]+/gu)??[],g=e=>e.map((t,o)=>o===e.length-1?`"${t}"*`:`"${t}"`).join(" AND "),h=e=>typeof e=="string"?e:e==null?"":typeof e=="number"||typeof e=="bigint"||typeof e=="boolean"?String(e):JSON.stringify(e)??"",p=(e,t)=>{const o=a(e);if(o.length===0)return 0;let r=0;for(const[f,s]of t.entries()){const c=f===t.length-1;let n=0;for(const i of o)(c?i.startsWith(s):i===s)&&(n+=1);if(n===0)return 0;r+=n}return r};export{g as buildFtsMatch,l as ftsTableName,p as scoreDocument,h as stringifySearchText,a as tokenizeSearch};
@@ -1 +0,0 @@
1
- import{sql as e}from"drizzle-orm";import{r as m}from"./do-exec-BLe9lLrN.mjs";import{s as a,L as l,T as h}from"./do-sql-BYIQTG3z.mjs";import{compileWhereSql as u}from"./compileWhereSql-BLcfs4QW.mjs";import{t as $}from"./serialize-sql-DiRzL7A4.mjs";const S={fieldRef:h,serialize:$},E=i=>{if(i.length!==0)return e`id IN (${e.join(i.map(r=>e`${r}`),e`, `)})`},c=(i,r)=>{const t=[];r&&t.push(r);const o=u(i,S);return o&&t.push(o),t.length===0?e``:e` WHERE ${e.join(t,e` AND `)}`},z=(i,r,t)=>{const o=c(t,void 0),d=m(i,e`SELECT id, _creationTime, ${e.identifier(a)} FROM ${e.identifier(r)}${o}`).toArray(),n=[];for(const s of d){const f=l(s),{id:p}=s;f!==void 0&&typeof p=="string"&&n.push({doc:f,id:p})}return n},A=(i,r,t,o)=>{if(o.length===0)return new Set;const d=c(t,E(o)),n=m(i,e`SELECT id FROM ${e.identifier(r)}${d}`).toArray();return new Set(n.map(s=>s.id))};export{A as a,z as s};
@@ -1 +0,0 @@
1
- import{sql as i}from"drizzle-orm";import{r as c}from"./do-exec-BLe9lLrN.mjs";const _="__doc__",E=(t,e)=>`${t}__geo_${e}`,s=t=>`"${t.replaceAll('"','""')}"`,f=t=>t==="_id"||t==="id"?"id":t==="_creationTime"?"_creationTime":`json_extract(${_}, '$.${t.replaceAll("'","''")}')`,m=t=>i.raw(f(t)),T=(t,e)=>{const r=s(t);return e==="_id"||e==="id"?`${r}.id`:e==="_creationTime"?`${r}._creationTime`:`json_extract(${r}.${_}, '$.${e.replaceAll("'","''")}')`},I=(t,e)=>i.raw(T(t,e)),N=(t,e,r,n)=>i`CREATE ${n?i`UNIQUE `:i``}INDEX IF NOT EXISTS ${i.identifier(t)} ON ${i.identifier(e)} (${r})`,$=i.identifier("__key__"),l=i.identifier("__value__"),d=i.identifier("__count__"),S=(t,e,r,n,o)=>i`INSERT INTO ${i.identifier(t)} (${$}, ${l}, ${d}) VALUES (${e}, ${r}, ${n}) ON CONFLICT(${$}) DO UPDATE SET ${o}`,A=t=>{const e=[];for(const[r,n]of Object.entries(t.shape)){const o=n._meta?.column;o&&e.push([r,o])}return e},O=t=>{if(!t)return;const e=t[_];let r;typeof e=="string"?r=JSON.parse(e):e&&typeof e=="object"?r=e:r={};const{id:n}=t;typeof n=="string"&&(r._id=n);const o=t._creationTime;return typeof o=="number"&&(r._creationTime=o),r},a=new WeakMap,y=t=>{const e=a.get(t);if(e!==void 0)return e;let r;try{c(t,i`CREATE VIRTUAL TABLE IF NOT EXISTS ${i.identifier("__lunora_fts_probe")} USING fts5(x)`),r=!0}catch{r=!1}finally{try{c(t,i`DROP TABLE IF EXISTS ${i.identifier("__lunora_fts_probe")}`)}catch{}}return a.set(t,r),r};export{I as $,A as E,O as L,y as N,N as S,m as T,$ as a,l as d,E as g,d as m,S as p,_ as s,s as u};
@@ -1,5 +0,0 @@
1
- import{sql as e}from"drizzle-orm";import{aggregateTableName as N}from"./aggregateTableName-G-eXyjcz.mjs";import{migrateCdcLog as I,migrateCdcMeta as g}from"./CDC_LOG_TABLE-E_J5LPoK.mjs";import{_ as R,E as S,a as l}from"./ctx-db-idempotency-wiVoGnpQ.mjs";import{r as _}from"./do-exec-BLe9lLrN.mjs";import{s as p,T as $,S as T,E as O,N as u,a as C,d as U,m,g as X}from"./do-sql-BYIQTG3z.mjs";import{sortColumnName as h,rankTableName as x}from"./RANK_TIEBREAK-DtX8zQyc.mjs";import{ftsTableName as B}from"./buildFtsMatch-CV0Z7PWv.mjs";const M=(i,o,r)=>{for(const n of r.indexes){const t=`${o}_${n.name}`,s=e.join(n.fields.map(a=>$(a)),e`, `);_(i,T(t,o,s,n.unique??!1))}for(const[n,t]of O(r)){if(!t.unique)continue;const s=`${o}_unique_${n}`;_(i,T(s,o,$(n),!0))}},b=(i,o,r)=>{if(!(!r.searchIndexes||r.searchIndexes.length===0||!u(i)))for(const n of r.searchIndexes){const t=B(o,n.name);_(i,e`CREATE VIRTUAL TABLE IF NOT EXISTS ${e.identifier(t)} USING fts5(${e.identifier("__text__")}, ${e.identifier("__id__")} UNINDEXED)`)}},D=(i,o,r)=>{if(r.geoIndexes)for(const n of r.geoIndexes){const t=X(o,n.name);_(i,e`CREATE TABLE IF NOT EXISTS ${e.identifier(t)} (${e.identifier("__id__")} TEXT PRIMARY KEY, ${e.identifier("__geohash__")} TEXT NOT NULL, ${e.identifier("__lat__")} REAL NOT NULL, ${e.identifier("__lng__")} REAL NOT NULL)`);const s=`${o}__geo_${n.name}__btree`;_(i,T(s,t,e`${e.identifier("__geohash__")} ASC, ${e.identifier("__id__")} ASC`,!1))}},Y=(i,o,r)=>{if(r.aggregateIndexes)for(const n of r.aggregateIndexes){const t=N(o,n.name);_(i,e`CREATE TABLE IF NOT EXISTS ${e.identifier(t)} (${C} TEXT PRIMARY KEY, ${U} REAL, ${m} INTEGER NOT NULL DEFAULT 0)`),_(i,e`PRAGMA table_info(${e.identifier(t)})`).toArray().some(s=>s.name==="__count__")||_(i,e`ALTER TABLE ${e.identifier(t)} ADD COLUMN ${m} INTEGER NOT NULL DEFAULT 0`)}},F=(i,o,r)=>{if(r.rankIndexes)for(const n of r.rankIndexes){const t=x(o,n.name),s=n.sortBy.map((f,E)=>h(E)),a=s.map(f=>e`${e.identifier(f)} BLOB`),c=a.length>0?e`, ${e.join(a,e`, `)}`:e``;_(i,e`CREATE TABLE IF NOT EXISTS ${e.identifier(t)} (${e.identifier("__id__")} TEXT PRIMARY KEY, ${e.identifier("__partition__")} TEXT NOT NULL${c})`);const d=[e`${e.identifier("__partition__")} ASC`];for(const[f,E]of s.entries()){const A=n.sortBy[f]?.direction;d.push(e`${e.identifier(E)} ${e.raw(A==="desc"?"DESC":"ASC")}`)}d.push(e`${e.identifier("__id__")} ASC`);const L=`${o}__rank_${n.name}__btree`;_(i,T(L,t,e.join(d,e`, `),!1))}},w=(i,o,r={})=>{for(const[n,t]of Object.entries(o.tables))t.shardMode?.kind!=="global"&&(_(i,e`CREATE TABLE IF NOT EXISTS ${e.identifier(n)} (
2
- id TEXT PRIMARY KEY,
3
- _creationTime REAL NOT NULL,
4
- ${e.identifier(p)} TEXT NOT NULL
5
- )`),M(i,n,t),b(i,n,t),D(i,n,t),Y(i,n,t),F(i,n,t));r.cdc&&(I(i),g(i),R(i)),S(i),l(i)};export{w as runShardMigrations};