@lunora/do 1.0.0-alpha.52 → 1.0.0-alpha.54

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.
@@ -0,0 +1 @@
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 d=await Promise.all(a.map(async c=>{const m=s?{AND:[{[t]:c},s]}:{[t]:c};return[c,await r(o,m)]}));return new Map(d)},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:d,tableName:c,with:m}=r;if(a.length===0)return;const k=d.tables[c];if(!k)throw new D("INTERNAL",`unknown table: ${c}`);const O=k.relationMap??{},g=l=>{const e=O[l];if(!e)throw new D("INTERNAL",`unknown relation "${l}" on table "${c}"`);return e},M=async(l,e,n)=>{const u=W(a,e.field);if(u.length===0){for(const i of a)i[l]=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 w=b.get(i[e.field]);i[l]=w?v([w],n)[0]??null:null}},R=async(l,e,n)=>{const u=W(a,e.references);if(u.length===0){for(const f of a)f[l]=[];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}),w=new Map;for(const f of i){const h=f[e.field],$=w.get(h);$?$.push(f):w.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=w.get(f[e.references])??[];f[l]=v(y===void 0?h:h.slice(0,y),n)}},N=async l=>{for(const e of Object.keys(l)){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),w=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:w.get(h)??0,y._count=f}}};for(const[l,e]of Object.entries(m)){if(e===void 0||e===!1)continue;if(l==="_count"){await N(e);continue}const n=g(l),u=e===!0?{}:e;await(n.kind==="one"?M(l,n,u):R(l,n,u))}},B=async(r,o,t)=>{const{deletedId:a,deletedReference:s,findHolders:d,onCascade:c,onRestrict:m,onSetNull:k,tableName:O}=r,g=t.references==="_id"?a:s(t.references);if(g==null)return;const M=await d(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"?c(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 d=s.relationMap;if(d)for(const c of Object.values(d))c.kind!=="one"||c.table!==t||!c.onDelete||await B(r,a,c)}},I=(r,o,t=!1)=>{for(const[a,s]of Object.entries(r.shape))a in o&&typeof s.parse=="function"&&(t&&o[a]===null&&s.kind==="optional"||s.parse(o[a]))};export{E as applyOnDelete,W as distinctValues,_ as fanOutScalarCounts,C as resolveWith,I as runRowValidators};
@@ -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.52",
3
+ "version": "1.0.0-alpha.54",
4
4
  "description": "Lunora Durable Objects: ShardDO (SQLite, OCC, hibernated WebSocket subscriptions) and SessionDO",
5
5
  "keywords": [
6
6
  "cloudflare",
@@ -46,7 +46,7 @@
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
52
  "drizzle-orm": "^0.45.2",
@@ -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 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};