@stacksjs/orm 0.74.18 → 0.74.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +6 -6
- package/dist/routes.js +1 -1
- package/package.json +23 -23
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
var b=import.meta.require;import"@stacksjs/validation";import{log as re}from"@stacksjs/cli";import{db as De}from"@stacksjs/database";async function Rt(e,n={}){let{olderThanDays:t=30,column:r="created_at",query:o}=n;try{if(o){let c=De.deleteFrom(e);c=o(c);let l=await c.execute(),f=Array.isArray(l)?l:[l],d=Number(f[0]?.numDeletedRows??f.length??0);return re.info(`Pruned ${d} records from ${e}`),d}let a=new Date;a.setDate(a.getDate()-t);let s=await De.deleteFrom(e).where(r,"<",a.toISOString()).execute(),i=Array.isArray(s)?s:[s],u=Number(i[0]?.numDeletedRows??i.length??0);return re.info(`Pruned ${u} records from ${e} older than ${t} days`),u}catch(a){throw re.error(`Failed to prune ${e}:`,a),a}}async function Sa(e,n={}){return Rt(e,n)}function Ra(e){if(!e?.prunable)return null;if(typeof e.prunable==="boolean")return{olderThanDays:30,column:"created_at"};return e.prunable}import{createCipheriv as Pt,createDecipheriv as At,createHash as xt,randomBytes as Ot}from"crypto";import{log as H}from"@stacksjs/logging";var ve="enc:",Me="aes-256-gcm",Ct=12,z=null;async function Ee(){if(z)return z;let e=process.env.APP_KEY;if(!e)try{e=(await import("@stacksjs/config").catch(()=>null))?.config?.app?.key}catch{}if(!e)return null;return z=xt("sha256").update(e).digest(),z}function N(e){return typeof e==="string"&&e.startsWith(ve)}async function oe(e){if(e==null)return e;if(N(e))return e;if(typeof e!=="string")return e;let n=await Ee();if(!n)return H.warn("[orm] encrypted attribute: APP_KEY not set - storing value in plaintext"),e;let t=Ot(Ct),r=Pt(Me,n,t),o=Buffer.concat([r.update(e,"utf8"),r.final()]),a=r.getAuthTag();return`${ve}${t.toString("base64")}:${a.toString("base64")}:${o.toString("base64")}`}async function ae(e){if(e==null)return e;if(typeof e!=="string")return e;if(!N(e))return e;try{let n=await Ee();if(!n)return H.warn("[orm] encrypted attribute: APP_KEY not set - cannot decrypt"),null;let[,t,r,o]=e.split(":");if(!t||!r||!o)return H.warn("[orm] encrypted attribute: malformed envelope, returning null"),null;let a=Buffer.from(t,"base64"),s=Buffer.from(r,"base64"),i=Buffer.from(o,"base64"),u=At(Me,n,a);return u.setAuthTag(s),Buffer.concat([u.update(i),u.final()]).toString("utf8")}catch(n){return H.warn("[orm] encrypted attribute: decrypt failed (key rotation? corrupted ciphertext?)",{error:n}),null}}function ie(e){let n=e.attributes;if(!n||typeof n!=="object")return[];let t=[];for(let[r,o]of Object.entries(n))if(o&&typeof o==="object"&&o.encrypted===!0)t.push(r);return t}import{sqlDateTime as Dt}from"@stacksjs/database";import{log as q}from"@stacksjs/logging";var vt=[/^password$/i,/^password_hash$/i,/^api_key$/i,/_token$/i,/_secret$/i,/^remember_token$/i],$e="model_audits",ue=null;function Mt(e){ue=e}async function se(){if(ue!=null)return ue;try{let e=await import("@stacksjs/router").catch(()=>null);if(!e)return null;let n=e.getCurrentRequest;if(typeof n!=="function")return null;let t=n();if(!t)return null;return(t.user??t._user)?.id??null}catch{return null}}function G(e){if(!e||typeof e!=="object")return null;let n={};for(let[t,r]of Object.entries(e)){if(vt.some((o)=>o.test(t)))continue;n[t]=r}return n}function B(e){if(!e||typeof e!=="object")return null;let n=e;if(n._attributes&&typeof n._attributes==="object")return{...n._attributes};return{...e}}function Et(e,n){if(!e||!n)return{old:e,next:n};let t={},r={},o=new Set([...Object.keys(e),...Object.keys(n)]);for(let a of o)if(e[a]!==n[a])t[a]=e[a],r[a]=n[a];return{old:t,next:r}}async function ce(e,n=!1){try{let{db:t}=await import("@stacksjs/database");await t.insertInto($e).values({auditable_type:e.auditable_type,auditable_id:e.auditable_id,event:e.event,old_values:e.old_values?JSON.stringify(e.old_values):null,new_values:e.new_values?JSON.stringify(e.new_values):null,user_id:e.user_id,created_at:Dt()}).executeTakeFirst()}catch(t){if(q.warn(`[orm] audit row write failed for ${e.auditable_type}#${String(e.auditable_id)} (${e.event})`,{error:t}),n)throw t}}function Ie(e){return{async audits(n){try{let{db:t}=await import("@stacksjs/database");return(await t.selectFrom($e).selectAll().where("auditable_type","=",e).where("auditable_id","=",n).orderBy("created_at","desc").execute()??[]).map((o)=>({...o,old_values:typeof o.old_values==="string"?Fe(o.old_values):o.old_values,new_values:typeof o.new_values==="string"?Fe(o.new_values):o.new_values}))}catch(t){return q.warn(`[orm] audits() lookup failed for ${e}#${String(n)}`,{error:t}),[]}}}}function Fe(e){try{return JSON.parse(e)}catch{return e}}function je(e){if(e&&typeof e==="object"&&"transactional"in e)return{transactional:e.transactional===!0};return{transactional:!1}}function Ne(e,n,t="id",r={}){let o=r.transactional===!0,a=e;if(typeof e.audits!=="function")e.audits=Ie(n).audits;let s=async(l)=>{if(!o)return await l();let{db:f}=await import("@stacksjs/database");return await f.transaction(async()=>l())},i=e.create;if(typeof i==="function")e.create=async function(...l){return await s(async()=>{let f=await i.apply(this,l);try{let d=B(f),m=d?.[t];if(m!=null){let p=await se();await ce({auditable_type:n,auditable_id:m,event:"created",old_values:null,new_values:G(d),user_id:p},o)}}catch(d){if(q.warn(`[orm] audit(create) failed for ${n}`,{error:d}),o)throw d}return f})};let u=e.update;if(typeof u==="function")e.update=async function(l,f){return await s(async()=>{let d=a.find,m=typeof d==="function"?B(await d.call(a,l)):null,p=await u.call(this,l,f);try{let g=B(p)??(typeof d==="function"?B(await d.call(a,l)):null),{old:h,next:w}=Et(m,g);if(w&&Object.keys(w).length>0){let k=await se();await ce({auditable_type:n,auditable_id:l,event:"updated",old_values:G(h),new_values:G(w),user_id:k},o)}}catch(g){if(q.warn(`[orm] audit(update) failed for ${n}#${String(l)}`,{error:g}),o)throw g}return p})};let c=(l)=>{let f=e[l];if(typeof f!=="function")return;e[l]=async function(d){return await s(async()=>{let m=a.find,p=typeof m==="function"?B(await m.call(a,d)):null,g=await f.call(this,d);try{if(g!==!1&&p){let h=await se();await ce({auditable_type:n,auditable_id:d,event:"deleted",old_values:G(p),new_values:null,user_id:h},o)}}catch(h){if(q.warn(`[orm] audit(${l}) failed for ${n}#${String(d)}`,{error:h}),o)throw h}return g})}};c("delete"),c("softDelete")}import{db as Ft,sql as $t,sqlDateTime as le}from"@stacksjs/database";function x(e,n){if(typeof e!=="number"||!Number.isFinite(e)||e<=0)throw Error(`[orm/commentable] ${n} requires a positive numeric id (received ${String(e)})`)}var U="commentable_upvotes",L="commentables";function It(e){let n=e;return n.code==="SQLITE_CONSTRAINT_UNIQUE"||n.code==="SQLITE_CONSTRAINT"||n.code==="23505"||n.errno===1062||/unique|duplicate/i.test(n.message??"")}function de(e){let n=Ft;return{async comments(t){return x(t,"comments"),await n.selectFrom("commentables").where("commentables_id","=",t).where("commentables_type","=",e).selectAll().execute()},async commentCount(t){let r=await n.selectFrom("commentables").select($t`count(*) as count`).where("commentables_id","=",t).where("commentables_type","=",e).executeTakeFirst();return Number(r?.count)||0},async addComment(t,r){if(x(t,"addComment"),!r||typeof r.title!=="string"||r.title.trim().length===0)throw Error("[orm/commentable] addComment requires a non-empty comment.title");if(typeof r.body!=="string"||r.body.trim().length===0)throw Error("[orm/commentable] addComment requires a non-empty comment.body");let o=await n.insertInto("commentables").values({...r,commentables_id:t,commentables_type:e,status:"pending",created_at:le(),updated_at:le()}).returningAll().executeTakeFirst();if(o&&typeof o==="object"&&"id"in o)return o;let a=o?.lastInsertRowid;if(a==null)return o;return await n.selectFrom("commentables").where("id","=",Number(a)).selectAll().executeTakeFirst()},async approvedComments(t){return await n.selectFrom("commentables").where("commentables_id","=",t).where("commentables_type","=",e).where("status","=","approved").selectAll().execute()},async pendingComments(t){return await n.selectFrom("commentables").where("commentables_id","=",t).where("commentables_type","=",e).where("status","=","pending").selectAll().execute()},async rejectedComments(t){return await n.selectFrom("commentables").where("commentables_id","=",t).where("commentables_type","=",e).where("status","=","rejected").selectAll().execute()},async upvoteComment(t,r){x(t,"upvoteComment"),x(r,"upvoteComment");let o=()=>n.selectFrom(U).where("upvoteable_id","=",t).where("upvoteable_type","=",L).where("user_id","=",r).selectAll().executeTakeFirst(),a=await o();if(a)return a;try{await n.insertInto(U).values({upvoteable_id:t,upvoteable_type:L,user_id:r,created_at:le()}).execute()}catch(s){if(!It(s))throw s}return await o()},async removeCommentUpvote(t,r){x(t,"removeCommentUpvote"),x(r,"removeCommentUpvote"),await n.deleteFrom(U).where("upvoteable_id","=",t).where("upvoteable_type","=",L).where("user_id","=",r).execute()},async commentUpvoteCount(t){x(t,"commentUpvoteCount");let r=await n.selectFrom(U).select("count(*) as count").where("upvoteable_id","=",t).where("upvoteable_type","=",L).executeTakeFirst();return Number(r?.count)||0},async hasUpvotedComment(t,r){return x(t,"hasUpvotedComment"),x(r,"hasUpvotedComment"),!!await n.selectFrom(U).where("upvoteable_id","=",t).where("upvoteable_type","=",L).where("user_id","=",r).selectAll().executeTakeFirst()}}}import{db as jt,sql as Nt,sqlDateTime as Be}from"@stacksjs/database";function fe(e,n){if(typeof e!=="number"||!Number.isFinite(e)||e<=0)throw Error(`[orm/taggable] ${n} requires a positive numeric id (received ${String(e)})`)}function pe(e){let n=jt;return{async tags(t){return fe(t,"tags"),await n.selectFrom("taggables").where("taggable_id","=",t).where("taggable_type","=",e).selectAll().execute()},async tagCount(t){fe(t,"tagCount");let r=await n.selectFrom("taggables").select(Nt`count(*) as count`).where("taggable_id","=",t).where("taggable_type","=",e).executeTakeFirst();return Number(r?.count)||0},async addTag(t,r){if(fe(t,"addTag"),!r||typeof r.name!=="string"||r.name.trim().length===0)throw Error("[orm/taggable] addTag requires a non-empty tag.name");return await n.insertInto("taggables").values({...r,taggable_id:t,taggable_type:e,slug:r.name.toLowerCase().replace(/[^a-z0-9]+/g,"-"),is_active:!0,created_at:Be(),updated_at:Be()}).execute(),await n.selectFrom("taggables").where("taggable_id","=",t).where("taggable_type","=",e).where("name","=",r.name).selectAll().executeTakeFirst()},async activeTags(t){return await n.selectFrom("taggables").where("taggable_id","=",t).where("taggable_type","=",e).where("is_active","=",!0).selectAll().execute()},async inactiveTags(t){return await n.selectFrom("taggables").where("taggable_id","=",t).where("taggable_type","=",e).where("is_active","=",!1).selectAll().execute()},async removeTag(t,r){await n.deleteFrom("taggables").where("taggable_id","=",t).where("taggable_type","=",e).where("id","=",r).execute()}}}import{db as Bt,sqlDateTime as J}from"@stacksjs/database";function me(e){let n=Bt;async function t(r){return(await n.selectFrom("categorizable_models").where("categorizable_id","=",r).where("categorizable_type","=",e).selectAll().execute()).map((a)=>a.category_id)}return{async categories(r){let o=await t(r);if(o.length===0)return[];return await n.selectFrom("categorizables").where("id","in",o).selectAll().execute()},async categoryCount(r){return(await t(r)).length},async addCategory(r,o){let a=()=>n.selectFrom("categorizables").where("name","=",o.name).where("categorizable_type","=",e).selectAll().executeTakeFirst(),s=await a();if(!s)await n.insertInto("categorizables").values({name:o.name,description:o.description,slug:o.name.toLowerCase().replace(/[^a-z0-9]+/g,"-"),categorizable_type:e,is_active:!0,created_at:J(),updated_at:J()}).execute(),s=await a();return await n.insertInto("categorizable_models").values({categorizable_id:r,categorizable_type:e,category_id:s?.id,created_at:J(),updated_at:J()}).execute(),s},async activeCategories(r){let o=await t(r);if(o.length===0)return[];return await n.selectFrom("categorizables").where("id","in",o).where("is_active","=",!0).selectAll().execute()},async inactiveCategories(r){let o=await t(r);if(o.length===0)return[];return await n.selectFrom("categorizables").where("id","in",o).where("is_active","=",!1).selectAll().execute()},async removeCategory(r,o){await n.deleteFrom("categorizable_models").where("categorizable_id","=",r).where("categorizable_type","=",e).where("category_id","=",o).execute()}}}import{db as qt,sqlDateTime as Ut}from"@stacksjs/database";function ye(e,n){let t=qt,r=n?.table||`${e}_likes`,o=n?.foreignKey||`${e.replace(/s$/,"")}_id`;return{async likes(a){return await t.selectFrom(r).where(o,"=",a).selectAll().execute()},async likeCount(a){let s=await t.selectFrom(r).select("count(*) as count").where(o,"=",a).executeTakeFirst();return Number(s?.count)||0},async like(a,s){if(typeof a!=="number"||!Number.isFinite(a)||a<=0)throw Error(`[orm/likeable] like requires a positive numeric id (received ${String(a)})`);if(typeof s!=="number"||!Number.isFinite(s)||s<=0)throw Error(`[orm/likeable] like requires a positive numeric userId (received ${String(s)})`);let i=Ut();try{return await t.insertInto(r).values({[o]:a,user_id:s,created_at:i,updated_at:i}).returningAll().executeTakeFirst()}catch(u){let c=u;if(!(c.code==="SQLITE_CONSTRAINT_UNIQUE"||c.code==="SQLITE_CONSTRAINT"||c.code==="23505"||c.errno===1062||/unique|duplicate/i.test(c.message??"")))throw u;let f=await t.selectFrom(r).where(o,"=",a).where("user_id","=",s).selectAll().executeTakeFirst();if(f)return f;throw u}},async unlike(a,s){await t.deleteFrom(r).where(o,"=",a).where("user_id","=",s).execute()},async isLiked(a,s){return!!await t.selectFrom(r).where(o,"=",a).where("user_id","=",s).selectAll().executeTakeFirst()},async likedBy(a){return(await t.selectFrom(r).select([o]).where("user_id","=",a).execute()).map((i)=>Number(i[o])).filter(Boolean)}}}function Le(e){let n=e;return n?.code==="SQLITE_CONSTRAINT_UNIQUE"||n?.code==="SQLITE_CONSTRAINT"||n?.code==="23505"||n?.errno===1062||/unique|duplicate/i.test(n?.message??"")}function Lt(e,n,t){let r=e;if(e instanceof Error&&typeof r.status==="number"&&Number.isInteger(r.status)&&r.status>=400&&r.status<600){let o={error:e.message};if(r.details!==void 0)o.details=r.details;return{status:r.status,body:o}}if(Le(e))return{status:409,body:{error:`${n} already exists`}};return{status:500,body:{error:`Failed to ${t} ${n}`,detail:String(e)}}}function T(e){return e.replace(/([a-z\d])([A-Z])/g,"$1_$2").replace(/([A-Z])([A-Z][a-z])/g,"$1_$2").toLowerCase()}function Kt(e){let n={};for(let[t,r]of Object.entries(e))n[T(t)]=r;return n}function qa(e,n){let t=String(n||"").replace(/^\/+|\/+$/g,""),r=String(e).replace(/^\/+/,"");return`/api/${t?`${t}/`:""}${r}`}function Ke(e){if(!e)return null;let n=e.attributes??{};if(Object.prototype.hasOwnProperty.call(n,"teamId")||Object.prototype.hasOwnProperty.call(n,"team_id"))return"team_id";return e.belongsTo?.some((t)=>t==="Team")?"team_id":null}function Qe(e){if(!e)return null;let n=e.attributes??{};if(Object.prototype.hasOwnProperty.call(n,"userId")||Object.prototype.hasOwnProperty.call(n,"user_id"))return"user_id";return e.belongsTo?.some((t)=>t==="User")?"user_id":null}function Ua(e){return e?.ownership===!1}function La(e,n,t){let r=Object.keys(e).find((a)=>T(a)===T(n));if(Array.isArray(t)){if(r===void 0)return{data:e,error:"Ownership value is required"};if(!t.some((a)=>String(a)===String(e[r])))return{data:e,error:"Ownership value is not available to this caller"};return{data:{...e,[n]:e[r]}}}if(t===null||t===void 0)return{data:e,error:"Caller has no ownership identity"};let o={...e};for(let a of Object.keys(o))if(T(a)===T(n))delete o[a];return o[n]=t,{data:o}}function Qt(e){if(!e)return[];let n=Object.entries(e.attributes??{}).filter(([,t])=>t?.fillable===!0).map(([t])=>t);for(let t of e.belongsTo??[]){if(typeof t!=="string"||!t.trim())continue;let r=T(t.trim()).split("_").filter(Boolean);if(r.length===0)continue;let o=`${r[0]}${r.slice(1).map((a)=>`${a[0]?.toUpperCase()}${a.slice(1)}`).join("")}Id`;n.push(o)}return[...new Set(n)]}function Wt(e,n){if(!e||n.length===0)return{};let t={};for(let r of n){if(r in e){t[r]=e[r];continue}let o=T(r);if(o!==r&&o in e)t[r]=e[o]}return t}function Vt(e,n){if(e?.name!=="date"||n instanceof Date||typeof n!=="string")return n;let t=/^(\d{4})-(\d{2})-(\d{2})$/.exec(n);if(!t)return n;let r=Number(t[1]),o=Number(t[2]),a=Number(t[3]),s=new Date(Date.UTC(r,o-1,a));if(s.getUTCFullYear()!==r||s.getUTCMonth()!==o-1||s.getUTCDate()!==a)return n;return s}function Ka(e,n){if(!n.length)return e;let t={...e};for(let r of n)delete t[r],delete t[T(r)];return t}function Qa(e,n){if(!e||n.length===0)return e;let t={...e};for(let r of n)delete t[r],delete t[T(r)];return t}var zt=["id","uuid","created_at","updated_at","deleted_at"];function Wa(e,n){let t=new Map;for(let r of[...Object.keys(e??{}),...zt]){let o=T(r);if(!/^\w+$/.test(o))continue;t.set(r,o),t.set(o,o)}for(let r of n)t.delete(r),t.delete(T(r));return t}function Va(e,n,t){if(!n)return e;let r=String(n).split(",").map((a)=>a.trim()).filter(Boolean),o=e;for(let a of r){let s=a.startsWith("-"),i=s?a.slice(1):a;if(!/^\w+$/.test(i))continue;let u=t.get(i);if(!u)continue;o=o.orderBy(u,s?"desc":"asc")}return o}var Ht={string:{get:(e)=>e!=null?String(e):null,set:(e)=>e!=null?String(e):null},number:{get:(e)=>e!=null?Number(e):null,set:(e)=>e!=null?Number(e):null},integer:{get:(e)=>e!=null?Math.trunc(Number(e)):null,set:(e)=>e!=null?Math.trunc(Number(e)):null},float:{get:(e)=>e!=null?Number.parseFloat(String(e)):null,set:(e)=>e!=null?Number.parseFloat(String(e)):null},boolean:{get:(e)=>e===1||e==="1"||e===!0||e==="true",set:(e)=>e===!0||e===1||e==="1"||e==="true"?1:0},json:{get:(e)=>e==null?null:typeof e==="string"?Gt(e):e,set:(e)=>e==null?null:typeof e==="string"?e:JSON.stringify(e)},datetime:{get:(e)=>e?new Date(e):null,set:(e)=>e instanceof Date?e.toISOString():e},date:{get:(e)=>e?new Date(e):null,set:(e)=>e instanceof Date?e.toISOString().split("T")[0]:e},array:{get:(e)=>e==null?[]:Array.isArray(e)?e:typeof e==="string"?Jt(e):[],set:(e)=>e==null?null:Array.isArray(e)?JSON.stringify(e):e}};function Gt(e){try{return JSON.parse(e)}catch{return e}}function Jt(e){try{return JSON.parse(e)}catch{return[]}}function za(e,n,t){if(!e||typeof e!=="object"||!n||Object.keys(n).length===0)return e;let r={...e};for(let[o,a]of Object.entries(n)){let s=typeof a==="string"?Ht[a]:a;if(!s||typeof s[t]!=="function")continue;if(Object.prototype.hasOwnProperty.call(r,o))r[o]=s[t](r[o]);let i=T(o);if(i!==o&&Object.prototype.hasOwnProperty.call(r,i))r[i]=s[t](r[i])}return r}function We(e,n,t){let r=n?.attributes??{},o={};for(let[a,s]of Object.entries(r)){let i=s?.validation?.rule;if(!i||typeof i.validate!=="function")continue;let u=Object.prototype.hasOwnProperty.call(e,a);if(!u&&t==="updating")continue;let c=s!==null&&typeof s==="object"&&Object.prototype.hasOwnProperty.call(s,"default"),l=u?e[a]:c?s.default:void 0,f=Vt(i,l),d=i.validate(f);if(!d?.valid&&Array.isArray(d?.errors)&&d.errors.length>0)o[a]=d.errors.map((m)=>s?.validation?.message?.[m?.code]??m?.message??"invalid")}return Object.keys(o).length===0?{valid:!0}:{valid:!1,errors:o}}function Ha(e,n,t){let r=qe(t);return e.find((o)=>o.method===n&&qe(String(o.path??""))===r)}function qe(e){return e.replace(/\{[^}]*\}/g,"{}").replace(/:[^/]+/g,"{}")}function ge(e){if(Array.isArray(e))return e.filter((n)=>typeof n==="string"&&n.length>0);return typeof e==="string"&&e?[e]:[]}function Ga(e){let n=typeof e==="object"&&e!==null&&"middleware"in e,t=e?.middleware;if(!n)return{read:["auth"],write:["auth"],declared:!1};if(t&&typeof t==="object"&&!Array.isArray(t)){let o=t;return{read:"read"in o?ge(o.read):["auth"],write:"write"in o?ge(o.write):["auth"],declared:!0}}let r=ge(t);return{read:r,write:r,declared:!0}}var Ue=15,Yt=100;function Ja(e){let n=Number.parseInt(e.get("page")||String(1),10),t=Number.isFinite(n)?Math.max(1,n):1,r=Number.parseInt(e.get("per_page")||String(Ue),10),o=Math.min(Number.isFinite(r)?Math.max(1,r):Ue,Yt);return{page:t,perPage:o,offset:(t-1)*o}}function Y(e,n){let t=new URL(e.toString());return t.searchParams.set("page",String(n)),`${t.pathname}${t.search}`}function Xt(e,n,t,r,o,a){let s=(n-1)*t,i=r===0,u={page:n,per_page:t,from:i?null:s+1,to:i?null:s+r,has_more_pages:o,prev_page_url:n>1?Y(e,n-1):null,next_page_url:o?Y(e,n+1):null};if(a!==void 0&&!Number.isNaN(a)){let c=Math.max(1,Math.ceil(a/t));u.total=a,u.last_page=c,u.first_page_url=Y(e,1),u.last_page_url=Y(e,c)}return u}function Ya(e,n,t,r,o,a){let{page:s,...i}=Xt(e,n,t,r,o,a);return{current_page:s,...i}}function Xa(e,n){return(n??e??"").toString().trim().toLowerCase()==="warn"?"warn":"deny"}function Za(e,n){if(e.length===0)return null;let t=[...e].sort().join(", ");if(n==="deny")return`[orm] security.api.rowScoping is 'deny': NOT registering store/update/destroy for ${e.length} model(s) `+`with no row-level scoping \u2014 ${t}. Give a model an \`ownership\` config or a \`team_id\` column to restore its writes.`;return`[orm] ${e.length} model(s) publish mutating routes with no row-level scoping, so an authenticated caller can write any row \u2014 `+`${t}. Scope one with an \`ownership\` config or a \`team_id\` column; intended for public catalog tables. Set \`security.api.rowScoping: 'deny'\` (config/security.ts) to stop generating these routes instead.`}function Zt(e){if(e?.ownership===!1)return null;if(e?.ownership)return e.ownership;let n=Ke(e);if(n)return{field:n,resolve:async(r,o)=>{let{resolveAuthenticatedTeamId:a}=await import("@stacksjs/auth");return a(be(o))}};let t=Qe(e);if(t)return{field:t,resolve:async(r)=>r?.id??null};return null}function be(e){let n=e?.headers?.get?.("authorization"),t=n&&/^Bearer\s+/i.test(n)?n.replace(/^Bearer\s+/i,"").trim():null,r=e?.headers?.get?.("cookie")||"";return{bearerToken:()=>t,cookies:{get:(o)=>{for(let a of r.split(";")){let s=a.indexOf("=");if(s===-1)continue;if(a.slice(0,s).trim()===o)return decodeURIComponent(a.slice(s+1).trim())}return null}}}}function en(e="customer_id"){return{field:e,resolve:async(n)=>{let t=n?.id;if(t==null)return null;try{let{Customer:r}=await import("@stacksjs/orm");return(await r.where("user_id",t).first())?.id??null}catch{return null}}}}function tn(e="id"){return{field:e,resolve:async(n)=>n?.id??null}}function nn(e="site_id"){return{field:e,resolve:async(n,t)=>{try{let[{resolveAuthenticatedTeamId:r},{Site:o}]=await Promise.all([import("@stacksjs/auth"),import("@stacksjs/orm")]),a=await r(be(t));if(a==null)return[];return(await o.where("team_id",a).get()??[]).map((i)=>i.id).filter((i)=>i!=null)}catch{return[]}}}}function rn(e="id"){return{field:e,resolve:async(n,t)=>{try{let{resolveAuthenticatedTeamId:r}=await import("@stacksjs/auth");return await r(be(t))}catch{return null}}}}function on(e,n){return{field:n,resolve:async(t,r)=>{try{let o=await import("@stacksjs/orm"),a=o.models?.[e]??o[e]?.definition??null,s=Zt(a);if(!s?.field||typeof s.resolve!=="function")return[];let i=await s.resolve(t,r);if(i==null||Array.isArray(i)&&i.length===0)return[];let u=o[e];if(!u)return[];return((Array.isArray(i)?await u.whereIn(s.field,i).get():await u.where(s.field,i).get())??[]).map((l)=>l.id).filter((l)=>l!=null)}catch{return[]}}}}import{cacheRequestQuery as an}from"@stacksjs/router";var X=new WeakMap;function oi(e,n){return an(`batchLoad:${e.name??"model"}:${String(n)}`,async()=>new Promise((t,r)=>{let o=X.get(e);if(!o)o={keys:[],resolvers:[],scheduled:!1},X.set(e,o);if(o.keys.push(n),o.resolvers.push({key:n,resolve:t,reject:r}),o.scheduled)return;o.scheduled=!0,Promise.resolve().then(async()=>{let a=X.get(e);if(!a)return;X.delete(e);let s=Array.from(new Set(a.keys));try{let i=typeof e.findMany==="function"?await e.findMany(s):await Promise.all(s.map((c)=>e.find?.(c))),u=new Map;for(let c of i??[]){let l=c?.id;if(l!==void 0)u.set(l,c)}for(let c of a.resolvers)c.resolve(u.get(c.key))}catch(i){for(let u of a.resolvers)u.reject(i)}})}))}import{db as ci}from"@stacksjs/database";class sn{conditions=[];where(e,...n){let[t,r]=n,o=r===void 0?"=":t,a=r===void 0?t:r;this.addCondition("and","where",e,o,a)}orWhere(e,...n){let[t,r]=n,o=r===void 0?"=":t,a=r===void 0?t:r;this.addCondition("or","where",e,o,a)}whereIn(e,n){this.conditions.push({type:"and",method:"whereIn",column:e,values:n})}whereNotIn(e,n){this.conditions.push({type:"and",method:"whereIn",column:e,values:n,operator:"not in"})}whereNull(e){this.conditions.push({type:"and",method:"whereNull",column:e})}whereNotNull(e){this.conditions.push({type:"and",method:"whereNotNull",column:e})}whereBetween(e,n){this.conditions.push({type:"and",method:"whereBetween",column:e,range:n})}whereExists(e){this.conditions.push({type:"and",method:"whereExists",column:"",callback:e})}addCondition(e,n,t,r,o){this.conditions.push({type:e,method:n,column:t,operator:r,value:o})}getConditions(){return this.conditions}}import{db as we,runInTransactionScope as cn}from"@stacksjs/database";async function di(e,n){return await cn(async()=>await we.transaction(e,n))}async function fi(e){return await we.savepoint(e)}function pi(e,n){return we.transactional(e,n)}export*from"@stacksjs/model-meta";import{createModel as yn,registerModel as gn}from"@stacksjs/query-builder";import{log as _}from"@stacksjs/logging";import{snakeCase as O}from"@stacksjs/strings";import{AsyncLocalStorage as at}from"async_hooks";import{toCursorPaginator as bn,toPaginator as wn,toSimplePaginator as hn}from"@stacksjs/pagination";function ke(e,n){let t=Se(),r=t?he(t,"per_page"):void 0,o=t?he(t,"page"):void 0,a=e!==void 0?Math.max(1,Math.floor(e)):Math.min(100,Math.max(1,r??15)),s=Math.max(1,Math.floor(n??o??1));return{perPage:a,page:s}}function _e(e,n){let t=Se(),r=t?ze(t,"cursor"):void 0,o=t?he(t,"per_page"):void 0,a=e!==void 0?Math.max(1,Math.floor(e)):Math.min(100,Math.max(1,o??15)),i=Ve(n!==void 0?n:r??null);return{perPage:a,cursor:i}}function Ve(e){if(e===null||e===void 0)return null;if(Array.isArray(e))return e;if(typeof e==="string"&&e.startsWith("["))try{let n=JSON.parse(e);if(Array.isArray(n))return n}catch{}return e}function Te(e){let n=Se();if(!n)return e;let t=(()=>{try{return new URL(n.url)}catch{return null}})();if(!t)return e;let r=t.pathname;if(e.path=r,"next_cursor"in e)return e.next_page_url=e.next_cursor!==null?v(t,{cursor:e.next_cursor}):null,e.prev_page_url=e.prev_cursor!==null?v(t,{cursor:e.prev_cursor}):null,e;let o=e.current_page;if(e.prev_page_url=o>1?v(t,{page:o-1}):null,"total"in e){let a=e.last_page;e.next_page_url=o<a?v(t,{page:o+1}):null,e.first_page_url=v(t,{page:1}),e.last_page_url=v(t,{page:a})}else e.next_page_url=e.has_more_pages?v(t,{page:o+1}):null;return e}function v(e,n){let t=new URL(e.toString());for(let[r,o]of Object.entries(n))t.searchParams.set(r,String(o));return`${t.pathname}${t.search}`}var F;function Se(){if(F===null)return;if(F===void 0)try{let n=b("@stacksjs/router");if(typeof n.getCurrentRequest==="function")F=n.getCurrentRequest;else{F=null;return}}catch{F=null;return}return F()}function he(e,n){let t=ze(e,n);if(t===void 0)return;let r=Number(t);return Number.isFinite(r)?r:void 0}function ze(e,n){let t=e.query?.[n];if(t===void 0)return;return Array.isArray(t)?t[0]:t}import{createRequire as un}from"module";import{db as ln}from"@stacksjs/database";var dn=un(import.meta.url);function He(e){let n=ln;return{async createStripeUser(t,r){let{manageCustomer:o}=await import("@stacksjs/payments");return await o.createStripeCustomer(t,r)},async updateStripeUser(t,r){let{manageCustomer:o}=await import("@stacksjs/payments");return await o.updateStripeCustomer(t,r)},async deleteStripeUser(t){let{manageCustomer:r}=await import("@stacksjs/payments");return await r.deleteStripeUser(t)},async createOrGetStripeUser(t,r){let{manageCustomer:o}=await import("@stacksjs/payments");return await o.createOrGetStripeUser(t,r)},async retrieveStripeUser(t){let{manageCustomer:r}=await import("@stacksjs/payments");return await r.retrieveStripeUser(t)},async defaultPaymentMethod(t){let{managePaymentMethod:r}=await import("@stacksjs/payments");return await r.retrieveDefaultPaymentMethod(t)},async setDefaultPaymentMethod(t,r){let{managePaymentMethod:o}=await import("@stacksjs/payments");return await o.setDefaultPaymentMethod(t,r)},async addPaymentMethod(t,r){let{managePaymentMethod:o}=await import("@stacksjs/payments");return await o.addPaymentMethod(t,r)},async paymentMethods(t,r){let{managePaymentMethod:o}=await import("@stacksjs/payments");return await o.listPaymentMethods(t,r)},async newSubscription(t,r,o,a={}){let{manageSubscription:s}=await import("@stacksjs/payments"),i=await s.create(t,r,o,a),c=i.latest_invoice?.payment_intent;return{subscription:i,paymentIntent:c}},async updateSubscription(t,r,o,a={}){let{manageSubscription:s}=await import("@stacksjs/payments"),i=await s.update(t,r,o,a),c=i.latest_invoice?.payment_intent;return{subscription:i,paymentIntent:c}},async cancelSubscription(t,r,o={}){let{manageSubscription:a}=await import("@stacksjs/payments");return{subscription:await a.cancel(r,o)}},async activeSubscription(t){let{manageSubscription:r}=await import("@stacksjs/payments"),o=await n.selectFrom("subscriptions").where("user_id","=",t.id).where("provider_status","=","active").selectAll().executeTakeFirst();if(o){let a=await r.retrieve(t,o.provider_id||"");return{subscription:o,providerSubscription:a}}return},async checkout(t,r,o={}){let{manageCheckout:a,manageCustomer:s}=await import("@stacksjs/payments"),i={};if(o.enableTax)i.automatic_tax={enabled:!0},delete o.enableTax;if(o.allowPromotions)i.allow_promotion_codes=!0,delete o.allowPromotions;let l={...{mode:"payment",customer:(await s.createOrGetStripeUser(t,{})).id,line_items:r.map((f)=>({price:f.priceId,quantity:f.quantity||1}))},...i,...o};return await a.create(t,l)},async createSetupIntent(t,r={}){let{manageSetupIntent:o}=await import("@stacksjs/payments");return await o.create(t,r)},async subscriptionHistory(t){let{manageInvoice:r}=await import("@stacksjs/payments");return await r.list(t)},async transactionHistory(t){let{manageTransaction:r}=await import("@stacksjs/payments");return await r.list(t)},async connectAccount(t,r={}){let o=r.accountColumn||"stripe_account_id",a=(t._attributes??t)[o];if(!a)return null;let s=await K();try{return await s.accounts.retrieve(a)}catch{return null}},async createConnectAccount(t,r={}){let o=r.accountColumn||"stripe_account_id",a=t._attributes??t,s=a[o],i=await K();if(!s){let{stacksIdempotencyKey:u}=await import("@stacksjs/payments"),c=r.modelTable||e,l=await i.accounts.create({type:r.type??"express",email:r.email??a.email,country:r.country??"US",capabilities:r.capabilities??{card_payments:{requested:!0},transfers:{requested:!0}}},{idempotencyKey:u("connect.account.create",c,a.id)});return s=l.id,await n.updateTable(c).set({[o]:s}).where("id","=",Number(a.id)).execute(),l}return await i.accounts.retrieve(s)},async connectOnboardLink(t,r){let o=r.accountColumn||"stripe_account_id",s=(t._attributes??t)[o];if(!s)throw Error("connectOnboardLink: model has no Stripe Connect account; call createConnectAccount first");return{url:(await(await K()).accountLinks.create({account:s,refresh_url:r.refreshUrl,return_url:r.returnUrl,type:r.type??"account_onboarding"})).url,accountId:s}},async syncConnectStatus(t,r={}){let o=r.accountColumn||"stripe_account_id",a=r.chargesColumn||"charges_enabled",s=r.payoutsColumn||"payouts_enabled",i=t._attributes??t,u=i[o];if(!u)return{chargesEnabled:!1,payoutsEnabled:!1};let l=await(await K()).accounts.retrieve(u),f=!!l.charges_enabled,d=!!l.payouts_enabled,m=r.modelTable||e;return await n.updateTable(m).set({[a]:f,[s]:d}).where("id","=",Number(i.id)).execute(),{chargesEnabled:f,payoutsEnabled:d}},async chargeWithSplit(t,r){let o=await K(),a=r.accountColumn||"stripe_account_id",s=t._attributes??t,i=r.connectAccountId||s[a],u={amount:r.amountCents,currency:r.currency||"usd",automatic_payment_methods:{enabled:!0},metadata:r.metadata};if(i){if(u.transfer_data={destination:i},r.platformFeeCents)u.application_fee_amount=r.platformFeeCents}let{freshIdempotencyKey:c}=await import("@stacksjs/payments");return await o.paymentIntents.create(u,{idempotencyKey:c("payment_intent.create",s.id,r.amountCents)})}}}function K(){let e=globalThis.process?.env?.STRIPE_SECRET_KEY;if(!e)throw Error("Stripe Connect: STRIPE_SECRET_KEY not configured");let n;try{n=dn("stripe")}catch{throw Error("Stripe Connect is being used but the `stripe` package is not installed. It is an opt-in dependency - run `bun add stripe` to enable Stripe Connect.")}return new n(e,{apiVersion:"2026-06-24.dahlia"})}function Ge(){return{async generateTwoFactorForModel(e){let{generateTwoFactorSecret:n}=await import("@stacksjs/auth"),t=n();await e.update({two_factor_secret:t})},async verifyTwoFactorCode(e,n){let t=e.get("two_factor_secret");if(typeof t!=="string")return!1;let{verifyTwoFactorCode:r,RateLimiter:o}=await import("@stacksjs/auth"),a=String(e.id??e.get?.("id")??e.get?.("email")??t),s=`2fa:${a}`;if(await o.isRateLimited(s)){let{HttpError:u}=await import("@stacksjs/error-handling");throw new u(429,"Too many verification attempts. Please try again later.")}if(!await r(n,t))return await o.recordFailedAttempt(s),!1;try{let{cache:u}=await import("@stacksjs/cache"),c=`2fa:used:${a}:${n}`;if(await u.has(c))return await o.recordFailedAttempt(s),!1;await u.set(c,"1",90)}catch{}return await o.resetAttempts(s),!0}}}import{sqlDateTime as fn}from"@stacksjs/database";import{log as I}from"@stacksjs/logging";var Z="deleted_at";function Je(e,n="id"){return{async softDelete(t){let r=fn(),o=e.where(n,t);if(typeof o?.update==="function")return await o.update({[Z]:r}),!0;return!1},async restore(t){let r=e.where(n,t);if(typeof r?.update==="function")return await r.update({[Z]:null}),!0;return!1},async forceDelete(t){let r=e.where(n,t);if(typeof r?.delete==="function")return await r.delete(),!0;return!1},withTrashed(){return typeof e.query==="function"?e.query():e},onlyTrashed(){let t=typeof e.query==="function"?e.query():e;if(typeof t?.whereNotNull==="function")return t.whereNotNull(Z);return t?.where?.(Z,"!=",null)??t}}}function Ye(e){if(e===!0||e==null)return{};if(typeof e==="object"&&!Array.isArray(e)){let n=e;if(Array.isArray(n.cascade)){let t=n.cascade.filter((r)=>typeof r==="string");return t.length?{cascade:t}:{}}return{}}return{}}function pn(e,n){let t=e.hasMany??[],r=e.hasOne??[],o=t.some((l)=>Re(l,n,!0)),a=r.some((l)=>Re(l,n,!1));if(!o&&!a)return I.warn(`[orm] soft-delete cascade: '${n}' is not a declared hasMany/hasOne relation - skipping`),null;let i=(o?t:r).find((l)=>Re(l,n,o))??null;if(!i)return null;let c=globalThis[i];if(!c)return I.warn(`[orm] soft-delete cascade: model '${i}' is not yet on globalThis - skipping cascade for '${n}'`),null;return{className:i,model:c}}function Re(e,n,t){let r=e.toLowerCase();if(n===r)return!0;if(t&&n===`${r}s`)return!0;if(t&&r.endsWith("y")&&n===`${r.slice(0,-1)}ies`)return!0;return!1}async function mn(e,n,t,r,o){try{let a=t.where;if(typeof a!=="function"){I.warn(`[orm] cascade ${o}: child model has no .where()`);return}if(o==="softDelete"){let s=t.softDelete;if(typeof s==="function"){let u=a.call(t,r,n),c=typeof u?.get==="function"?await u.get():Array.isArray(u)?u:[],l=t.primaryKey||"id";for(let f of c){let d=f?.[l];if(d!=null)await s.call(t,d)}return}let i=a.call(t,r,n);if(typeof i?.delete==="function"){I.debug(`[orm] cascade soft-delete: child has no softDeletes trait, hard-deleting from ${String(t.table??"?")}`),await i.delete();return}}else{let s=t.restore;if(typeof s!=="function"){I.debug("[orm] cascade restore: child has no restore() - nothing to do");return}let i=t.withTrashed,c=(typeof i==="function"?i.call(t):t).where?.(r,n),l=typeof c?.get==="function"?await c.get():[],f=t.primaryKey||"id";for(let d of l){let m=d?.[f];if(m!=null)await s.call(t,m)}}}catch(a){if(I.warn(`[orm] soft-delete cascade ${o} on ${e}#${String(n)} failed`,{error:a}),process.env.STACKS_ORM_CASCADE_SWALLOW!=="true")throw a}}async function Q(e,n,t,r){let o=n.cascade;if(!o||o.length===0)return;let a=`${e.name.toLowerCase()}_id`;for(let s of o){let i=pn(e,s);if(!i)continue;await mn(i.className,t,i.model,a,r)}}var it=new at;function E(){return it.getStore()?.suppressed===!0}function M(e){return Promise.resolve(it.run({suppressed:!0},e))}var st=new at;function kn(){return st.getStore()?.suppressed===!0}function _n(e){return Promise.resolve(st.run({suppressed:!0},e))}var Ce=Symbol.for("stacks.orm.modelDefinition");class ct extends Error{status=422;errors;constructor(e,n){let t=Object.keys(n).join(", ");super(`${e} validation failed: ${t}`);this.name="ModelValidationError",this.errors=n}}var Xe=new Set;function Tn(e,n){let t=typeof e==="string"?e.slice(0,80):String(e),r=`${typeof e}:${t}`;if(Xe.has(r))return;Xe.add(r);let o=n instanceof Error?n.message:String(n);console.error(`[orm] JSON cast failed to parse value (returning null): ${o} - value preview: ${JSON.stringify(t)}`)}var Sn={string:{get:(e)=>e!=null?String(e):null,set:(e)=>e!=null?String(e):null},number:{get:(e)=>e!=null?Number(e):null,set:(e)=>e!=null?Number(e):null},integer:{get:(e)=>e!=null?Math.trunc(Number(e)):null,set:(e)=>e!=null?Math.trunc(Number(e)):null},float:{get:(e)=>e!=null?Number.parseFloat(String(e)):null,set:(e)=>e!=null?Number.parseFloat(String(e)):null},boolean:{get:(e)=>e===1||e==="1"||e===!0||e==="true",set:(e)=>e===!0||e===1||e==="1"||e==="true"?1:0},json:{get:(e)=>{if(e==null)return null;if(typeof e==="string")try{return JSON.parse(e)}catch(n){return Tn(e,n),null}return e},set:(e)=>{if(e==null)return null;return typeof e==="string"?e:JSON.stringify(e)}},datetime:{get:(e)=>e?new Date(e):null,set:(e)=>e instanceof Date?e.toISOString():e},date:{get:(e)=>e?new Date(e):null,set:(e)=>e instanceof Date?e.toISOString().split("T")[0]:e},array:{get:(e)=>{if(e==null)return[];if(Array.isArray(e))return e;if(typeof e==="string")try{return JSON.parse(e)}catch{return[]}return[]},set:(e)=>{if(e==null)return null;return Array.isArray(e)?JSON.stringify(e):e}}};function ut(e){return typeof e==="string"?Sn[e]:e}function Ze(e,n,t){if(!e||typeof e!=="object")return e;let r={...e};for(let[o,a]of Object.entries(n))if(o in r){let s=ut(a);r[o]=s[t](r[o])}return r}var ee=new Set(["_attributes","_original","_definition","_hasSaved","_relations"]),et=Symbol.for("stacks.modelInstanceProxy"),Rn={tags:{bag:"_taggable",mode:"id"},tagCount:{bag:"_taggable",mode:"id"},addTag:{bag:"_taggable",mode:"id"},activeTags:{bag:"_taggable",mode:"id"},inactiveTags:{bag:"_taggable",mode:"id"},removeTag:{bag:"_taggable",mode:"id"},categories:{bag:"_categorizable",mode:"id"},categoryCount:{bag:"_categorizable",mode:"id"},addCategory:{bag:"_categorizable",mode:"id"},activeCategories:{bag:"_categorizable",mode:"id"},inactiveCategories:{bag:"_categorizable",mode:"id"},removeCategory:{bag:"_categorizable",mode:"id"},comments:{bag:"_commentable",mode:"id"},commentCount:{bag:"_commentable",mode:"id"},addComment:{bag:"_commentable",mode:"id"},approvedComments:{bag:"_commentable",mode:"id"},pendingComments:{bag:"_commentable",mode:"id"},rejectedComments:{bag:"_commentable",mode:"id"},likes:{bag:"_likeable",mode:"id"},likeCount:{bag:"_likeable",mode:"id"},like:{bag:"_likeable",mode:"id"},unlike:{bag:"_likeable",mode:"id"},isLiked:{bag:"_likeable",mode:"id"},createStripeUser:{bag:"_billable",mode:"model"},updateStripeUser:{bag:"_billable",mode:"model"},deleteStripeUser:{bag:"_billable",mode:"model"},createOrGetStripeUser:{bag:"_billable",mode:"model"},retrieveStripeUser:{bag:"_billable",mode:"model"},defaultPaymentMethod:{bag:"_billable",mode:"model"},setDefaultPaymentMethod:{bag:"_billable",mode:"model"},addPaymentMethod:{bag:"_billable",mode:"model"},paymentMethods:{bag:"_billable",mode:"model"},newSubscription:{bag:"_billable",mode:"model"},updateSubscription:{bag:"_billable",mode:"model"},cancelSubscription:{bag:"_billable",mode:"model"},activeSubscription:{bag:"_billable",mode:"model"},checkout:{bag:"_billable",mode:"model"},createSetupIntent:{bag:"_billable",mode:"model"},subscriptionHistory:{bag:"_billable",mode:"model"},transactionHistory:{bag:"_billable",mode:"model"},connectAccount:{bag:"_billable",mode:"model"},createConnectAccount:{bag:"_billable",mode:"model"},connectOnboardLink:{bag:"_billable",mode:"model"},syncConnectStatus:{bag:"_billable",mode:"model"},chargeWithSplit:{bag:"_billable",mode:"model"},generateTwoFactorForModel:{bag:"_twoFactor",mode:"model"},verifyTwoFactorCode:{bag:"_twoFactor",mode:"model"}};function Pn(e,n){if(!e||!n)return null;let t=n.split("."),r=e;for(let o of t){if(r==null||typeof r!=="object")return null;let a=r;if("_attributes"in a&&a._attributes&&typeof a._attributes==="object"){let s=a._attributes;if(o in s){r=s[o];continue}}if(o in a){r=a[o];continue}return null}return r??null}function R(e,n){if(!e||typeof e!=="object")return e;let t=e;if(t[et])return e;let r=t._attributes;if(!r||typeof r!=="object")return e;if(n&&Object.keys(n).length>0){for(let[o,a]of Object.entries(n))if(Object.prototype.hasOwnProperty.call(r,o))r[o]=ut(a).get(r[o])}return new Proxy(e,{get(o,a,s){let i=o;if(a===et)return!0;if(a==="saveAsync")return async function(){let c=i._definition,l=c?.set;if(l&&typeof i.isDirty==="function"){for(let[d,m]of Object.entries(l)){if(typeof m!=="function")continue;if(!i.isDirty(d))continue;let p=m(i._attributes),g=p&&typeof p.then==="function"?await p:p;i._attributes[d]=g}let f=c.set;c.set={};try{return i.save()}finally{c.set=f}}return i.save()};if(a==="save")return function(){let c=i._definition,l=c?.set;if(l&&Object.keys(l).length>0&&typeof i.isDirty==="function"){for(let[d,m]of Object.entries(l)){if(typeof m!=="function")continue;if(!i.isDirty(d))continue;let p=m(i._attributes);if(p&&typeof p.then==="function")throw Error(`Setter for "${d}" returned a Promise - use \`saveAsync()\` instead of \`save()\` when a model has async setters.`);i._attributes[d]=p}let f=c.set;c.set={};try{return i.save()}finally{c.set=f}}return i.save()};if(a==="updateAsync")return async function(c){if(c&&typeof c==="object"&&!Array.isArray(c))for(let[l,f]of Object.entries(c))s[l]=f;return s.saveAsync()};if(a==="saveQuietly")return function(){return M(()=>i.save())};if(a==="saveAsyncQuietly")return function(){return M(()=>s.saveAsync())};if(a==="updateQuietly")return function(c){return M(()=>i.update(c))};if(a==="updateAsyncQuietly")return function(c){return M(()=>s.updateAsync(c))};if(a==="deleteQuietly")return function(){return M(()=>i.delete())};if(a==="toSearchableObject")return function(){let f=i._definition?.traits?.useSearch;if(!f)return null;let d=i._attributes;if(!d)return null;if(f===!0){let w={...d};if(d.id!=null)w.id=String(d.id);return w}let m={},p=f.displayable?.length?f.displayable:[...f.searchable??[],...f.filterable??[],...f.sortable??[],"id"],g=f.denormalize??{},h=i._relations;for(let w of p){let k=O(w),S=d[k]??d[w];if(S!==void 0){m[k]=S;continue}let A=g[w]??g[k];if(A){m[k]=Pn(h,A);continue}m[k]=void 0}if(d.id!=null)m.id=String(d.id);return m};if(typeof a==="string"&&!ee.has(a)){let c=i._attributes;if(c&&Object.prototype.hasOwnProperty.call(c,a))return c[a];let l=i._relations;if(l&&Object.prototype.hasOwnProperty.call(l,a)){let d=l[a];if(Array.isArray(d))return d.map((m)=>R(m,n));return d&&typeof d==="object"?R(d,n):d}let f=Rn[a];if(f){let p=i._definition?.__traitMethods?.[f.bag]?.[a];if(typeof p==="function")return f.mode==="model"?(...g)=>p(s,...g):(...g)=>p(i.id,...g)}if(c){let d=O(a);if(d!==a&&Object.prototype.hasOwnProperty.call(c,d))return c[d]}}let u=Reflect.get(i,a,i);return typeof u==="function"?u.bind(i):u},set(o,a,s,i){let u=o;if(typeof a==="string"&&!ee.has(a)){let{_attributes:c,set:l}=u;if(c&&Object.prototype.hasOwnProperty.call(c,a)){if(typeof l==="function")l.call(u,a,s);else c[a]=s;return!0}if(c){let f=O(a);if(f!==a&&Object.prototype.hasOwnProperty.call(c,f)){if(typeof l==="function")l.call(u,f,s);else c[f]=s;return!0}}if(c&&!(a in u)){if(typeof l==="function")l.call(u,a,s);else c[a]=s;return!0}}return Reflect.set(u,a,s,i)},has(o,a){let s=o;if(typeof a==="string"&&!ee.has(a)){let i=s._attributes;if(i&&Object.prototype.hasOwnProperty.call(i,a))return!0;let u=s._relations;if(u&&Object.prototype.hasOwnProperty.call(u,a))return!0;if(i){let c=O(a);if(c!==a&&Object.prototype.hasOwnProperty.call(i,c))return!0}}return Reflect.has(s,a)},deleteProperty(o,a){let s=o;if(typeof a==="string"&&!ee.has(a)){let i=s._attributes;if(i&&Object.prototype.hasOwnProperty.call(i,a))return delete i[a],!0}return Reflect.deleteProperty(s,a)},ownKeys(o){let s=o._attributes;return s?Object.keys(s):[]},getOwnPropertyDescriptor(o,a){let s=o;if(typeof a==="string"){let i=s._attributes;if(i&&Object.prototype.hasOwnProperty.call(i,a))return{configurable:!0,enumerable:!0,value:i[a],writable:!0}}return Object.getOwnPropertyDescriptor(s,a)}})}var An=new Set(["get","first","last","firstOrFail","find","findOrFail","all","paginate","simplePaginate","cursorPaginate"]),xn={paginate:wn,simplePaginate:hn,cursorPaginate:bn},tt=Symbol.for("stacks.queryBuilderProxy");function lt(e,n){if(!e||typeof e!=="object")return e;if(e[tt])return e;return new Proxy(e,{get(t,r,o){if(r===tt)return!0;let a=Reflect.get(t,r,o);if(typeof a!=="function")return a;return function(...s){let i=s,u=String(r);if(u==="paginate"||u==="simplePaginate"){let{perPage:f,page:d}=ke(s[0],s[1]);i=[f,d]}else if(u==="cursorPaginate"){let{perPage:f,cursor:d}=_e(s[0],s[1]);i=[f,d,s[2],s[3]]}let c=a.apply(t,i),l=(f)=>{if(An.has(u)){if(Array.isArray(f))return f.map((m)=>R(m,n));let d=xn[u];if(d&&f&&Array.isArray(f.data)){let m=f.data.map((g)=>R(g,n)),p=d({...f,data:m});return Te(p)}if(f&&Array.isArray(f.data))return{...f,data:f.data.map((m)=>R(m,n))};return R(f,n)}if(f&&typeof f==="object"&&typeof f.get==="function")return lt(f,n);return f};if(c&&typeof c.then==="function")return c.then(l);return l(c)}}})}function On(e,n){let t=["find","first","last","all","firstOrFail","findOrFail","findMany"];for(let a of t){let s=e[a];if(typeof s!=="function")continue;e[a]=function(...i){let u=s.apply(this,i),c=(l)=>Array.isArray(l)?l.map((f)=>R(f,n)):R(l,n);if(u&&typeof u.then==="function")return u.then(c);return c(u)}}let r=["create","firstOrCreate","updateOrCreate","make"];for(let a of r){let s=e[a];if(typeof s!=="function")continue;e[a]=function(...i){let u=s.apply(this,i),c=(l)=>Array.isArray(l)?l.map((f)=>R(f,n)):R(l,n);if(u&&typeof u.then==="function")return u.then(c);return c(u)}}let o=["query","where","orWhere","whereIn","whereNotIn","whereNull","whereNotNull","whereLike","whereBetween","whereNotBetween","orderBy","orderByDesc","select","with","limit","take","skip","latest","oldest"];for(let a of o){let s=e[a];if(typeof s!=="function")continue;e[a]=function(...i){let u=s.apply(this,i);return lt(u,n)}}}class dt extends Error{model;id;constructor(e,n){super(n!=null?`[ORM] ${e} not found for id=${String(n)}`:`[ORM] No matching ${e} row`);this.name="ModelNotFoundError",this.model=e,this.id=n}}class Ae extends Error{model;attribute;reason;constructor(e,n,t){let r=t==="guarded"?`'${n}' is marked guarded`:`'${n}' is not in the fillable allowlist`;super(`[ORM] Mass assignment to ${e} forbidden: ${r}. Use ${e}.forceCreate(...) / .forceUpdate(...) to bypass.`);this.name="MassAssignmentException",this.model=e,this.attribute=n,this.reason=t}}var Cn=new Set(["id","created_at","updated_at","deleted_at","uuid"]);function W(e,n,t={}){if(t.force)return n;if(!n||typeof n!=="object"||Array.isArray(n))return n;let r=e.attributes;if(!r)return n;let o=new Set,a=new Set,s=new Set;for(let[u,c]of Object.entries(r)){let l=O(u);if(o.add(l),c?.fillable===!0)a.add(l);if(c?.guarded===!0)s.add(l)}let i=a.size>0?a:o;for(let u of Object.keys(n)){let c=O(u);if(Cn.has(c))continue;if(s.has(c))throw new Ae(e.name,u,"guarded");if(c.endsWith("_id"))continue;if(!i.has(c))throw new Ae(e.name,u,"not-fillable")}return n}async function xe(e,n){let t=e.set;if(!t||typeof t!=="object")return n;let r={...n};for(let[o,a]of Object.entries(t)){if(typeof a!=="function"||!(o in r))continue;try{r[o]=await a(r)}catch(s){_.error(`[orm] ${e.name}.set.${o} threw - skipping setter`,s)}}return r}function Dn(e,n){let t=n.primaryKey||"id",r=e.create;function o(c){let l=e.where;if(typeof l!=="function")throw Error(`[ORM] ${n.name}.${c} needs a working where(): the underlying query builder did not expose one`);return l}function a(c){let l=e.find;if(typeof l!=="function")throw Error(`[ORM] ${n.name}.${c} needs a working find(): the underlying query builder did not expose one`);return l}function s(c){let l=e.create;if(typeof l!=="function")throw Error(`[ORM] ${n.name}.${c} cannot create: the underlying query builder did not expose create()`);return l}if(typeof e.update!=="function")e.update=async function(c,l){if(c==null)throw Error(`[ORM] ${n.name}.update requires an id as the first argument`);if(!l||typeof l!=="object"||Array.isArray(l))throw Error(`[ORM] ${n.name}.update requires a data object as the second argument`);if(Object.keys(l).length===0){_.debug(`[orm] ${n.name}.update called with empty data - short-circuiting and returning current row`);let m=e.find;return typeof m==="function"?await m.call(e,c):null}W(n,l);let f=await xe(n,l);await o("update").call(e,t,c).update(f);let d=e.find;return typeof d==="function"?await d.call(e,c):null};if(typeof e.forceUpdate!=="function")e.forceUpdate=async function(c,l){if(c==null)throw Error(`[ORM] ${n.name}.forceUpdate requires an id as the first argument`);if(!l||typeof l!=="object"||Array.isArray(l))throw Error(`[ORM] ${n.name}.forceUpdate requires a data object as the second argument`);let f=await xe(n,l);await o("forceUpdate").call(e,t,c).update(f);let d=e.find;return typeof d==="function"?await d.call(e,c):null};if(typeof e.forceCreate!=="function")e.forceCreate=async function(c){if(!c||typeof c!=="object"||Array.isArray(c))throw Error(`[ORM] ${n.name}.forceCreate requires a data object`);let l=e.make;if(typeof l==="function"){let f=await l.call(e);if(f&&typeof f.forceFill==="function"&&typeof f.save==="function")return f.forceFill(c),await f.save()??f}if(typeof r!=="function")throw Error(`[ORM] ${n.name}.forceCreate cannot create: the underlying query builder did not expose create()`);return await r.call(e,c)};if(typeof e.delete!=="function")e.delete=async function(c){if(c==null)throw Error(`[ORM] ${n.name}.delete requires an id as the first argument`);if(!await a("delete").call(e,c))return!1;return await o("delete").call(e,t,c).delete(),!0};if(typeof e.findOrFail!=="function")e.findOrFail=async function(c){let l=await a("findOrFail").call(e,c);if(l==null)throw new dt(n.name,c);return l};if(typeof e.exists!=="function")e.exists=async function(c){if(c==null)return!1;let l=o("exists").call(e,t,c);if(typeof l.count==="function"){let d=await l.count();return Number(d)>0}let f=e.find;return typeof f==="function"?await f.call(e,c)!=null:!1};if(typeof e.firstOrCreate!=="function")e.firstOrCreate=async function(c,l={}){if(!c||typeof c!=="object"||Array.isArray(c))throw Error(`[ORM] ${n.name}.firstOrCreate requires a where-attrs object`);let f=o("firstOrCreate").call(e,c),d=typeof f.first==="function"?await f.first():await f;if(d)return d;let m={...c,...l};return W(n,m),await s("firstOrCreate").call(e,m)};if(typeof e.updateOrCreate!=="function")e.updateOrCreate=async function(c,l){if(!c||typeof c!=="object"||Array.isArray(c))throw Error(`[ORM] ${n.name}.updateOrCreate requires a where-attrs object`);if(!l||typeof l!=="object"||Array.isArray(l))throw Error(`[ORM] ${n.name}.updateOrCreate requires a values object`);let f=o("updateOrCreate").call(e,c),d=typeof f.first==="function"?await f.first():await f;if(d){W(n,l);let p=d[t];await o("updateOrCreate").call(e,t,p).update(l);let g=e.find;return typeof g==="function"?await g.call(e,p):{...d,...l}}let m={...c,...l};return W(n,m),await s("updateOrCreate").call(e,m)};if(typeof e.count!=="function")e.count=async function(){let c=e;if(typeof c.query==="function"){let d=c.query();if(typeof d?.count==="function"){let m=await d.count();return Number(m)||0}}let{all:l,get:f}=e;if(typeof l==="function")return(await l.call(e)||[]).length;if(typeof f==="function")return(await f.call(e)||[]).length;return 0};if(typeof e.pluck!=="function")e.pluck=async function(c){if(!c||typeof c!=="string")throw Error(`[ORM] ${n.name}.pluck requires a column name`);let l=e.all;return((typeof l==="function"?await l.call(e):[])||[]).map((d)=>d?.[c])};if(typeof e.whereIn!=="function")e.whereIn=async function(c,l){if(!c||typeof c!=="string")throw Error(`[ORM] ${n.name}.whereIn requires a column name`);if(!Array.isArray(l))throw Error(`[ORM] ${n.name}.whereIn requires an array of values`);if(l.length===0)return[];let f=e.where;if(typeof f!=="function")return[];let d=f.call(e,c,"in",l);if(d&&typeof d.get==="function")return await d.get();return await d};let i=[["latest","desc"],["oldest","asc"]];for(let[c,l]of i)if(typeof e[c]!=="function")e[c]=async function(f="created_at"){let d=e,m=typeof d.query==="function"?d.query():d;if(typeof m?.orderBy==="function"){let w=m.orderBy(f,l);if(typeof w.first==="function")return await w.first();if(typeof w.get==="function")return(await w.get())?.[0]??null}let p=e.all;if(typeof p!=="function")return null;return[...await p.call(e)||[]].sort((w,k)=>{let S=w?.[f],A=k?.[f];if(S===A)return 0;return(S>A?1:-1)*(l==="desc"?-1:1)})[0]??null};let u=mt(n.traits?.useSearch,n);if(u){let c=u.index??n.table??O(`${n.name}s`);if(typeof e.search!=="function")e.search=function(l,f){return Fn(e,c,l,f,u.searchable)};if(typeof e.makeAllSearchable!=="function")e.makeAllSearchable=async function(l=500){let f=e.all;if(typeof f!=="function")throw Error(`[ORM] ${n.name}.makeAllSearchable cannot run: the underlying query builder did not expose all()`);let{useSearchEngine:d}=await import("@stacksjs/search-engine"),m=d(),p=0,g=e.query;if(typeof g==="function")try{let k=g.call(e);if(k&&typeof k.chunk==="function")return await k.chunk(l,async(S)=>{let A=await Oe(S,u);if(A.length>0)await m.addDocuments(c,A);p+=A.length}),p}catch{}let h=await f.call(e)||[],w=await Oe(h,u);if(w.length>0)await m.addDocuments(c,w);return w.length};if(typeof e.removeAllFromSearch!=="function")e.removeAllFromSearch=async function(){let{useSearchEngine:l}=await import("@stacksjs/search-engine"),f=l();if(typeof f.deleteAllDocuments==="function"){await f.deleteAllDocuments(c);return}let d=e.all,m=typeof d==="function"?await d.call(e)||[]:[],p=l();for(let g of m){let h=g?.id??g?._attributes?.id;if(h!=null)await p.deleteDocument(c,Number(h))}}}}async function Oe(e,n){if(e.length===0)return[];if(typeof n.shapeMany==="function"){let r=await n.shapeMany(e);if(!Array.isArray(r)||r.length!==e.length)throw TypeError(`[orm/search] shapeMany returned ${Array.isArray(r)?r.length:typeof r} documents for ${e.length} rows. It must return one document per row, in order, or documents are indexed under the wrong ids.`);return r.filter(Boolean)}return(await Promise.all(e.map((r)=>En(r,n)))).filter(Boolean)}function vn(e){let n=new Set,t=e.attributes??{};for(let[r,o]of Object.entries(t))if(o?.hidden)n.add(r);return n}function Mn(e,n){if(!e||n.size===0)return e;let t={};for(let[r,o]of Object.entries(e))if(!n.has(r))t[r]=o;return t}async function En(e,n){if(typeof n.shape==="function")try{return await n.shape(e)}catch{return}let t=e?.toSearchableObject?.();if(t!==void 0)return t;return Mn(e?._attributes??(typeof e?.toJSON==="function"?e.toJSON():null),n.hidden??new Set)}function Fn(e,n,t,r,o){let a=o&&o.length>0?{query_by:[...o].join(",")}:{},s={q:t,...a,...r??{}},i={with(u){return s={...s,...u},i},where(u){return s={...s,filter:u},i},async get(){let{useSearchEngine:u}=await import("@stacksjs/search-engine");return(await u().search(n,s))?.hits??[]},async paginate(u,c=1){let{useSearchEngine:l}=await import("@stacksjs/search-engine"),d=await l().search(n,{...s,limit:u,offset:(c-1)*u});return{hits:d.hits??[],total:Number(d.estimatedTotalHits??d.nbHits??d.total??0),page:c,perPage:u}},async raw(){let{useSearchEngine:u}=await import("@stacksjs/search-engine");return await u().search(n,s)}};return i}function ft(e){let n=O(e);return n===e?[e]:[e,n]}async function Pe(e,n){if(!e||typeof e!=="object")return;let t=e._attributes??e;for(let r of n)for(let o of ft(r)){if(!(o in t))continue;let a=t[o];if(!N(a))continue;t[o]=await ae(a)}}function $n(e,n){if(n.length===0)return;let t=async(i)=>{if(Array.isArray(i)){for(let u of i)await Pe(u,n);return i}if(i&&typeof i==="object"&&Array.isArray(i.data)){for(let u of i.data)await Pe(u,n);return i}if(i)await Pe(i,n);return i},r=["find","first","last","all","firstOrFail","findOrFail","findMany"];for(let i of r){let u=e[i];if(typeof u!=="function")continue;e[i]=async function(...c){let l=await u.apply(this,c);return await t(l)}}let o=["create","firstOrCreate","updateOrCreate","make"];for(let i of o){let u=e[i];if(typeof u!=="function")continue;e[i]=async function(...c){let l=await u.apply(this,c);return await t(l)}}for(let i of["update","forceUpdate"]){let u=e[i];if(typeof u!=="function")continue;e[i]=async function(c,l){let f=await u.call(this,c,l);return await t(f)}}let a=["first","firstOrFail","get","all","find","findOrFail","last","paginate","simplePaginate"],s=(i)=>{if(!i||typeof i!=="object")return i;let u=i;if(u.__stacksEncryptedReads)return i;for(let c of a){let l=u[c];if(typeof l!=="function")continue;u[c]=async function(...f){return await t(await l.apply(this,f))}}for(let c of["where","whereIn","whereNull","whereNotNull","orWhere","orderBy","orderByDesc","limit","offset","with"]){let l=u[c];if(typeof l!=="function")continue;u[c]=function(...f){return s(l.apply(this,f))}}return Object.defineProperty(u,"__stacksEncryptedReads",{value:!0,enumerable:!1}),i};for(let i of["where","whereIn","whereNull","whereNotNull","orderBy","orderByDesc","limit","query"]){let u=e[i];if(typeof u!=="function")continue;e[i]=function(...c){return s(u.apply(this,c))}}}function In(e,n){if(n.length===0)return;let t=async(o)=>{if(!o||typeof o!=="object"||Array.isArray(o))return o;let a={...o};for(let s of n)for(let i of ft(s))if(i in a)a[i]=await oe(a[i]);return a},r=["create","firstOrCreate","updateOrCreate","forceCreate"];for(let o of r){let a=e[o];if(typeof a!=="function")continue;e[o]=async function(...s){if(s[0]=await t(s[0]),s[1])s[1]=await t(s[1]);return await a.apply(this,s)}}for(let o of["update","forceUpdate"]){let a=e[o];if(typeof a!=="function")continue;e[o]=async function(s,i){let u=await t(i);return await a.call(this,s,u)}}}function jn(e,n){let t=e.create;if(typeof t==="function")e.create=async function(r,...o){W(n,r);let a=await xe(n,r);return await t.call(this,a,...o)};for(let r of["firstOrCreate","updateOrCreate"]){let o=e[r];if(typeof o!=="function")continue}}function Nn(e,n){let t=String(n?.name??e.name??"Model"),r=(s,i)=>{if(kn())return;if(!s||typeof s!=="object"||Array.isArray(s))return;let u=We(s,n,i);if(!u.valid)throw new ct(t,u.errors)},o=e.create;if(typeof o==="function")e.create=async function(s,...i){return r(s,"creating"),await o.call(this,s,...i)};let a=e.update;if(typeof a==="function")e.update=async function(s,i,...u){return r(i,"updating"),await a.call(this,s,i,...u)}}function Bn(e,n){let t=["create","firstOrCreate","updateOrCreate"];for(let o of t){let a=e[o];if(typeof a==="function")e[o]=async function(...s){if(_.debug(`[orm] ${o.charAt(0).toUpperCase()+o.slice(1)} ${String(e.name||"unknown")}`,s[0]),s[0]&&typeof s[0]==="object"&&!Array.isArray(s[0]))s[0]=Ze(s[0],n,"set");return await a.apply(this,s)}}let r=e.update;if(typeof r==="function")e.update=async function(o,a){let s=a&&typeof a==="object"&&!Array.isArray(a)?Ze(a,n,"set"):a;return await r.call(this,o,s)}}function pt(e){_.debug(`[orm] Defining model: ${e.name} (table: ${e.table})`);let n=qn(e),t=Ln(e),r=Un(n,t),o=Kn(e);e.__traitMethods=o;let a=r?{...e,hooks:{...e.hooks,...r}}:e,i=yn(a);if(On(i,e.casts),Dn(i,a),jn(i,a),e.casts&&Object.keys(e.casts).length>0)Bn(i,e.casts);let u=ie(e);if(u.length>0)In(i,u),$n(i,u);let c=e.traits?.useSoftDeletes;if(c)Qn(i,a,c);let l=e.traits?.useAudit;if(l){let m=je(l);Ne(i,e.name,e.primaryKey||"id",m)}Nn(i,a);let f=i;f.withoutValidation=function(m){return _n(m)},f.withoutEvents=function(m){return M(m)};for(let m of["create","update","firstOrCreate","updateOrCreate","forceCreate","forceUpdate","delete","forceDelete","softDelete","restore"]){let p=i[m];if(typeof p!=="function")continue;let g=`${m}Quietly`;if(typeof i[g]==="function")continue;i[g]=function(...h){return M(()=>p.apply(i,h))}}let d=Object.assign(i,o,{...e,getDefinition:()=>e,_isStacksModel:!0});return gn(e.name,d),Object.defineProperty(d,Ce,{value:e,enumerable:!1,configurable:!0}),d}function qn(e){let n=e.traits?.observe;if(!n)return;let t=e.name.toLowerCase(),r=(d)=>{let m=d?.attributes;if(!m||typeof m!=="object")return d;let p=e.primaryKey||"id",g={...m};if(g[p]===void 0&&d[p]!==void 0)g[p]=d[p];return g},o=async(d,m)=>{if(E())return;try{let{dispatch:p}=await import("@stacksjs/events");await p(d,m)}catch(p){if(p&&typeof p==="object"&&"code"in p&&p.code==="MODULE_NOT_FOUND")return;if(console.error(`[ORM] Event '${d}' handler error:`,p),process.env.STACKS_ORM_EVENT_ERRORS!=="swallow")throw p}},a=e.traits?.broadcastOn,s=e.traits?.broadcastWith,i=typeof a==="function"&&typeof s==="function",u=async(d,m)=>{if(!i)return;if(E())return;try{let p=a(m),g=Array.isArray(p)?p:[p],h=s(m),k=(await import("@stacksjs/realtime").catch(()=>null))?.broadcast;if(typeof k!=="function")return;for(let S of g){if(typeof S!=="string"||S.length===0)continue;await k(S,d,h)}}catch(p){if(p&&typeof p==="object"&&"code"in p&&p.code==="MODULE_NOT_FOUND")return;if(console.error(`[ORM] Broadcast '${d}' handler error:`,p),process.env.STACKS_ORM_BROADCAST_ERRORS==="throw")throw p}},c=async(d,m)=>{if(E())return!0;try{let{dispatchAsync:p}=await import("@stacksjs/events"),g=await p(d,m);if(Array.isArray(g)&&g.some((h)=>h===!1))return!1}catch(p){if(p&&typeof p==="object"&&"code"in p&&p.code==="MODULE_NOT_FOUND")return!0;if(console.error(`[ORM] Before-event '${d}' handler error:`,p),process.env.STACKS_ORM_EVENT_ERRORS!=="swallow")throw p}return!0},l=n===!0?["create","update","delete"]:Array.isArray(n)?n:[],f={};if(l.includes("create"))f.beforeCreate=async(d)=>{if(_.debug(`[orm] Create ${t}`,d),!await c(`${t}:saving`,d))throw Error(`[ORM] ${t}:saving event cancelled the operation`);if(!await c(`${t}:creating`,d))throw Error(`[ORM] ${t}:creating event cancelled the operation`)},f.afterCreate=async(d)=>{let m=r(d);await o(`${t}:created`,m),await o(`${t}:saved`,m),await u(`${t}:created`,d)};if(l.includes("update"))f.beforeUpdate=async(d)=>{if(_.debug(`[orm] Update ${t}#${d?.id??"unknown"}`,d),!await c(`${t}:saving`,d))throw Error(`[ORM] ${t}:saving event cancelled the operation`);if(!await c(`${t}:updating`,d))throw Error(`[ORM] ${t}:updating event cancelled the operation`)},f.afterUpdate=async(d)=>{let m=r(d);await o(`${t}:updated`,m),await o(`${t}:saved`,m),await u(`${t}:updated`,d)};if(l.includes("delete"))f.beforeDelete=async(d)=>{if(_.debug(`[orm] Delete ${t}#${d?.id??"unknown"}`),!await c(`${t}:deleting`,d))throw Error(`[ORM] ${t}:deleting event cancelled the operation`)},f.afterDelete=async(d)=>{await o(`${t}:deleted`,r(d)),await u(`${t}:deleted`,d)};return f}function Un(...e){let n={},t=new Set;for(let r of e){if(!r)continue;for(let o of Object.keys(r))t.add(o)}for(let r of t){let o=e.map((a)=>a?.[r]).filter((a)=>typeof a==="function");if(!o.length)continue;n[r]=async(...a)=>{for(let s of o)await s(...a)}}return Object.keys(n).length?n:void 0}function mt(e,n){if(!e)return null;let t=e===!0?{}:typeof e==="object"?{...e}:null;if(!t)return null;if(n)t.hidden=vn(n);return t}function Ln(e){let n=mt(e.traits?.useSearch,e);if(!n)return;let t=n,r=t.index??e.table??O(`${e.name}s`);async function o(i){if(typeof t.shapeMany==="function")try{let[l]=await Oe([i],t);return l}catch(l){_.warn(`[orm/search] shapeMany() threw for ${e.name}: ${l.message}`);return}if(typeof t.shape==="function")try{return await t.shape(i)}catch(l){_.warn(`[orm/search] shape() threw for ${e.name}: ${l.message}`);return}let c=R(i).toSearchableObject?.();if(c!==void 0)return c;return i?._attributes??(typeof i?.toJSON==="function"?i.toJSON():null)}let a=async(i)=>{if(E())return;let u=await o(i);if(!u)return;if(n.queueable){try{let{Jobs:c}=await import("@stacksjs/queue");await c.dispatch("SyncSearchIndexJob",{index:r,op:"upsert",doc:u})}catch(c){_.warn(`[orm/search] queue dispatch failed for ${e.name}; falling back to inline: ${c.message}`),await rt(r,u,e.name)}return}await rt(r,u,e.name)};return{afterCreate:a,afterUpdate:a,afterDelete:async(i)=>{if(E())return;let u=i?.id??i?._attributes?.id;if(u==null)return;if(n.queueable){try{let{Jobs:c}=await import("@stacksjs/queue");await c.dispatch("SyncSearchIndexJob",{index:r,op:"delete",id:Number(u)})}catch(c){_.warn(`[orm/search] queue dispatch failed for ${e.name}#${u}; falling back to inline: ${c.message}`),await ot(r,Number(u),e.name)}return}await ot(r,Number(u),e.name)}}}var nt=new Map;function yt(e,n){let t=nt.get(e)??0;if(nt.set(e,t+1),t===0)_.warn(`[orm/search] ${n}`);else if(t===9)_.warn(`[orm/search] ${e} is still failing; further identical warnings suppressed for this process.`)}async function rt(e,n,t){try{let{useSearchEngine:r}=await import("@stacksjs/search-engine");await r().addDocument(e,n)}catch(r){yt(`index:${t}`,`Failed to index ${t}: ${r.message}`)}}async function ot(e,n,t){try{let{useSearchEngine:r}=await import("@stacksjs/search-engine");await r().deleteDocument(e,n)}catch(r){yt(`remove:${t}`,`Failed to remove ${t}#${n}: ${r.message}`)}}function Kn(e){let n={},t=e.table,r=e.traits;if(!r)return n;if(r.taggable)n._taggable=pe(t);if(r.categorizable)n._categorizable=me(t);if(r.commentable)n._commentable=de(t);if(r.billable)n._billable=He(t);if(r.likeable){let a=typeof r.likeable==="object"?r.likeable:void 0;n._likeable=ye(t,a)}let o=r.useAuth||r.authenticatable;if(typeof o==="object"&&o&&"useTwoFactor"in o&&o.useTwoFactor)n._twoFactor=Ge();return n}function Qn(e,n,t){let r=Je(e,n.primaryKey||"id"),o=Ye(t),a=n,s=n.name.toLowerCase(),i=n.traits?.observe!=null&&n.traits?.observe!==!1,u=async(m)=>{if(!i||E())return!0;try{let{dispatchAsync:p}=await import("@stacksjs/events"),g=await p(`${s}:restoring`,{id:m});if(Array.isArray(g)&&g.some((h)=>h===!1))return!1}catch(p){if(p?.code!=="MODULE_NOT_FOUND")console.error(`[ORM] Before-event '${s}:restoring' handler error:`,p)}return!0},c=async(m)=>{if(!i||E())return;try{let{dispatch:p}=await import("@stacksjs/events");await p(`${s}:restored`,{id:m})}catch(p){if(p?.code!=="MODULE_NOT_FOUND")console.error(`[ORM] Event '${s}:restored' handler error:`,p)}},l=process.env.STACKS_ORM_CASCADE_SWALLOW!=="true",f=async(m)=>{if(!o.cascade?.length||!l){let g=await r.softDelete(m);if(g&&o.cascade?.length)await Q(a,o,m,"softDelete");return g}let{db:p}=await import("@stacksjs/database");return await p.transaction(async()=>{let g=await r.softDelete(m);if(g)await Q(a,o,m,"softDelete");return g})},d=async(m)=>{if(!await u(m))return!1;if(!o.cascade?.length||!l){let w=await r.restore(m);if(w){if(o.cascade?.length)await Q(a,o,m,"restore");await c(m)}return w}let{db:g}=await import("@stacksjs/database"),h=await g.transaction(async()=>{let w=await r.restore(m);if(w)await Q(a,o,m,"restore");return w});if(h)await c(m);return h};e.softDelete=f,e.restore=d,e.forceDelete=r.forceDelete,e.withTrashed=r.withTrashed,e.onlyTrashed=r.onlyTrashed,e.delete=f}function Wn(e){if(e==null)return e;if(Array.isArray(e))return e.map((t)=>Wn(t));if(typeof e!=="object")return e;let n=e;if(typeof n.toJSON==="function")return n.toJSON();if(n._attributes&&typeof n._attributes==="object")return n._attributes;return e}var Vn=["belongsTo","hasOne","hasMany","belongsToMany","morphMany","morphOne"],zn=["traits","dashboard"];function Hn(e){let n=e?.[Ce];if(n&&typeof n==="object")return n;if(e&&typeof e==="object"&&"name"in e&&"attributes"in e)return e;throw TypeError("extendModel() expects a model created by defineModel(), or a model definition. Import the framework model itself rather than its table name.")}function Gn(e,n){let t=Array.isArray(e)?e:[],r=Array.isArray(n)?n:[];if(!t.length&&!r.length)return;return[...new Set([...t,...r])]}function Jn(e){if(!e)return 0;return Object.values(e).reduce((n,t)=>{let r=Number(t?.order);return Number.isFinite(r)&&r>n?r:n},0)}function Yn(e,n){let t={...e,...n},r=e.attributes??{},o=n.attributes??{};if(n.attributes){let a=Jn(r),s=Object.fromEntries(Object.entries(o).map(([i,u])=>{let c=!(i in r),l=Number.isFinite(Number(u?.order));if(c&&!l)return[i,{...u,order:++a}];return[i,u]}));t.attributes={...r,...s}}for(let a of Vn){let s=Gn(e[a],n[a]);if(s)t[a]=s}for(let a of zn){let s=e[a],i=n[a];if(s&&i&&typeof s==="object"&&typeof i==="object")t[a]={...s,...i}}return t}function Ui(e,n){return pt(Yn(Hn(e),n))}import ar from"process";import{log as ir}from"@stacksjs/logging";import{path as P}from"@stacksjs/path";import{fs as V}from"@stacksjs/storage";import{Database as Xn}from"bun:sqlite";import{existsSync as Zn,readdirSync as er,readFileSync as tr}from"fs";function nr(e){return e.startsWith("sqlite_")||e.startsWith("_qb_tmp_")}function rr(e,n){let t=e.toUpperCase();if(t.includes("BOOL"))return n==="postgres"?"boolean":"number";if(t.includes("DATE")||t.includes("TIME"))return"string";if(t.includes("INT"))return"number";if(t.includes("CHAR")||t.includes("CLOB")||t.includes("TEXT"))return"string";if(t.includes("REAL")||t.includes("FLOA")||t.includes("DOUB")||t.includes("NUMERIC")||t.includes("DEC"))return"number";if(t.includes("BLOB"))return"Uint8Array";return"unknown"}function or(e,n){try{return e.exec(n),{ok:!0}}catch(t){if(/CREATE\s+TRIGGER/i.test(n))return{ok:!1,error:t.message};let r=0;for(let o of n.split(/;\s*$/m)){if(!o.trim())continue;try{e.exec(o),r++}catch{}}return r>0?{ok:!0}:{ok:!1,error:t.message}}}function gt(e,n="sqlite"){let t=[];if(!Zn(e))return{tables:[],errors:t};let r;try{r=er(e).filter((a)=>a.endsWith(".sql")).sort()}catch(a){return{tables:[],errors:[{file:e,error:a.message}]}}let o=new Xn(":memory:");try{for(let i of r){let u=`${e}/${i}`,c;try{c=tr(u,"utf-8")}catch(f){t.push({file:u,error:f.message});continue}let l=or(o,c);if(!l.ok)t.push({file:u,error:l.error??"could not be applied"})}let a=o.query("SELECT name FROM sqlite_master WHERE type = 'table' ORDER BY name").all().map((i)=>i.name).filter((i)=>!nr(i)),s=[];for(let i of a){let u=o.query(`PRAGMA table_info("${i.replace(/"/g,'""')}")`).all();if(u.length===0)continue;let c={};for(let l of u){let f=rr(l.type??"",n),d=l.notnull===0&&l.pk===0;c[l.name]=d&&f!=="unknown"?`${f} | null`:f}s.push({table:i,columns:c})}return{tables:s,errors:t}}finally{o.close()}}function sr(e){if(e)return e;let n=String(ar.env.DB_CONNECTION??"").toLowerCase();return n==="postgres"||n==="mysql"?n:"sqlite"}function te(e){return e==="postgres"?"boolean":"number"}function C(e){return e.replace(/([A-Z]+)([A-Z][a-z])/g,"$1_$2").replace(/([a-z\d])([A-Z])/g,"$1_$2").toLowerCase()}function cr(e,n){let t=e.default;if(typeof t==="boolean")return te(n);if(typeof t==="number")return"number";if(typeof t==="string")return"string";return"unknown"}function ur(e){let n=e.validation;if(!n||typeof n!=="object")return null;let t=n.rule;return t&&typeof t==="object"?t:null}function lr(e){if(!e||String(e.name??"")!=="enum")return null;let t=(Array.isArray(e.allowedValues)?e.allowedValues:[]).filter((r)=>typeof r==="string"||typeof r==="number").map((r)=>typeof r==="number"?String(r):JSON.stringify(r));return t.length>0?t.join(" | "):null}function dr(e,n){let t=ur(e),r=lr(t);if(r!==null)return e.nullable===!0?`${r} | null`:r;let o=typeof e.type==="string"?e.type.toLowerCase():String(t?.name??"").toLowerCase(),a=(()=>{switch(o){case"string":case"text":case"longtext":case"mediumtext":case"tinytext":case"char":case"varchar":case"enum":case"uuid":case"date":case"datetime":case"timestamp":case"timestamptz":case"password":case"time":case"year":return"string";case"number":case"integer":case"int":case"tinyint":case"smallint":case"mediumint":case"float":case"double":case"decimal":case"numeric":return"number";case"bigint":return"number | bigint";case"boolean":case"bool":return te(n);case"json":case"jsonb":return"unknown";case"binary":case"blob":case"bytea":return"Uint8Array";case"unix":return"number";case"array":return"unknown[]";case"object":return"Record<string, unknown>";default:return cr(e,n)}})();return e.nullable===!0?`${a} | null`:a}function fr(e){let n={},t=e.belongsTo;if(!t)return n;let r=Array.isArray(t)?t:Object.values(t);for(let o of r){if(typeof o==="string"){n[`${C(o)}_id`]="number";continue}if(o&&typeof o==="object"){let a=o;if(typeof a.foreignKey==="string"){n[a.foreignKey]="number";continue}if(typeof a.model==="string")n[`${C(a.model)}_id`]="number"}}return n}function pr(e,n){let[t,r]=[C(e),C(n)].sort();return`${t}_${r}`}function mr(e,n){let t=e.default,r=typeof t==="string"?"string":typeof t==="number"?"number":typeof t==="boolean"?te(n):t instanceof Date?"string":"unknown";return e.nullable?`${r} | null`:r}function yr(e,n,t){let r=n.belongsToMany;if(!r)return[];let o=[],a=Array.isArray(r)?r:Object.values(r);for(let s of a){let i,u,c,l,f={},d=!0;if(typeof s==="string")i=s;else if(s&&typeof s==="object"&&"model"in s){let w=s;if(i=w.model,"pivotTable"in w||"firstForeignKey"in w||"secondForeignKey"in w)u=w.pivotTable,c=w.firstForeignKey,l=w.secondForeignKey;else{let k=s;u=k.table,c=k.foreignKey,l=k.relatedKey,f=k.pivot?.columns??{},d=Boolean(k.pivot?.timestamps)}}else continue;let m=u??pr(e,i),p=c??`${C(e)}_id`,g=l??`${C(i)}_id`,h={id:"number",[p]:"number",[g]:"number"};for(let[w,k]of Object.entries(f))h[w]=mr(k,t);if(d)h.created_at="string",h.updated_at="string | null";o.push({table:m,columns:h})}return o}function gr(e){return{email_verified_at:"string | null",password_changed_at:"string | null",two_factor_secret:"string | null",two_factor_enabled:`${te(e)} | null`,two_factor_last_used_step:"number | null",stripe_id:"string | null"}}function br(e,n){let t={id:"number"},r=e.traits??{};if(r.useUuid)t.uuid="string";if((r.useTimestamps??r.timestampable)!==!1)t.created_at="string",t.updated_at="string | null";if(r.useSoftDeletes??r.softDeletable)t.deleted_at="string | null";if((e.table??"")==="users"||e.name==="User")Object.assign(t,gr(n));return t}function wr(e,n){let t={},r=e.attributes??{};for(let[o,a]of Object.entries(r))t[C(o)]=dr(a,n);return t}function bt(e,n,t=2){let r=" ".repeat(t),o=" ".repeat(t+1),a=Object.entries(n).map(([i,u])=>`${o}${i}: ${u}`).join(`
|
|
2
|
+
var St=import.meta.require;import"@stacksjs/validation";import{log as ne}from"@stacksjs/cli";import{db as Ce}from"@stacksjs/database";async function Rt(e,n={}){let{olderThanDays:t=30,column:r="created_at",query:o}=n;try{if(o){let c=Ce.deleteFrom(e);c=o(c);let l=await c.execute(),f=Array.isArray(l)?l:[l],d=Number(f[0]?.numDeletedRows??f.length??0);return ne.info(`Pruned ${d} records from ${e}`),d}let a=new Date;a.setDate(a.getDate()-t);let s=await Ce.deleteFrom(e).where(r,"<",a.toISOString()).execute(),i=Array.isArray(s)?s:[s],u=Number(i[0]?.numDeletedRows??i.length??0);return ne.info(`Pruned ${u} records from ${e} older than ${t} days`),u}catch(a){throw ne.error(`Failed to prune ${e}:`,a),a}}async function Sa(e,n={}){return Rt(e,n)}function Ra(e){if(!e?.prunable)return null;if(typeof e.prunable==="boolean")return{olderThanDays:30,column:"created_at"};return e.prunable}import{createCipheriv as Pt,createDecipheriv as At,createHash as xt,randomBytes as Ot}from"crypto";import{log as z}from"@stacksjs/logging";var De="enc:",ve="aes-256-gcm",Ct=12,V=null;async function Me(){if(V)return V;let e=process.env.APP_KEY;if(!e)try{e=(await import("@stacksjs/config").catch(()=>null))?.config?.app?.key}catch{}if(!e)return null;return V=xt("sha256").update(e).digest(),V}function j(e){return typeof e==="string"&&e.startsWith(De)}async function re(e){if(e==null)return e;if(j(e))return e;if(typeof e!=="string")return e;let n=await Me();if(!n)return z.warn("[orm] encrypted attribute: APP_KEY not set - storing value in plaintext"),e;let t=Ot(Ct),r=Pt(ve,n,t),o=Buffer.concat([r.update(e,"utf8"),r.final()]),a=r.getAuthTag();return`${De}${t.toString("base64")}:${a.toString("base64")}:${o.toString("base64")}`}async function oe(e){if(e==null)return e;if(typeof e!=="string")return e;if(!j(e))return e;try{let n=await Me();if(!n)return z.warn("[orm] encrypted attribute: APP_KEY not set - cannot decrypt"),null;let[,t,r,o]=e.split(":");if(!t||!r||!o)return z.warn("[orm] encrypted attribute: malformed envelope, returning null"),null;let a=Buffer.from(t,"base64"),s=Buffer.from(r,"base64"),i=Buffer.from(o,"base64"),u=At(ve,n,a);return u.setAuthTag(s),Buffer.concat([u.update(i),u.final()]).toString("utf8")}catch(n){return z.warn("[orm] encrypted attribute: decrypt failed (key rotation? corrupted ciphertext?)",{error:n}),null}}function ae(e){let n=e.attributes;if(!n||typeof n!=="object")return[];let t=[];for(let[r,o]of Object.entries(n))if(o&&typeof o==="object"&&o.encrypted===!0)t.push(r);return t}import{sqlDateTime as Dt}from"@stacksjs/database";import{log as B}from"@stacksjs/logging";var vt=[/^password$/i,/^password_hash$/i,/^api_key$/i,/_token$/i,/_secret$/i,/^remember_token$/i],Fe="model_audits",ce=null;function Mt(e){ce=e}async function ie(){if(ce!=null)return ce;try{let e=await import("@stacksjs/router").catch(()=>null);if(!e)return null;let n=e.getCurrentRequest;if(typeof n!=="function")return null;let t=n();if(!t)return null;return(t.user??t._user)?.id??null}catch{return null}}function H(e){if(!e||typeof e!=="object")return null;let n={};for(let[t,r]of Object.entries(e)){if(vt.some((o)=>o.test(t)))continue;n[t]=r}return n}function N(e){if(!e||typeof e!=="object")return null;let n=e;if(n._attributes&&typeof n._attributes==="object")return{...n._attributes};return{...e}}function Et(e,n){if(!e||!n)return{old:e,next:n};let t={},r={},o=new Set([...Object.keys(e),...Object.keys(n)]);for(let a of o)if(e[a]!==n[a])t[a]=e[a],r[a]=n[a];return{old:t,next:r}}async function se(e,n=!1){try{let{db:t}=await import("@stacksjs/database");await t.insertInto(Fe).values({auditable_type:e.auditable_type,auditable_id:e.auditable_id,event:e.event,old_values:e.old_values?JSON.stringify(e.old_values):null,new_values:e.new_values?JSON.stringify(e.new_values):null,user_id:e.user_id,created_at:Dt()}).executeTakeFirst()}catch(t){if(B.warn(`[orm] audit row write failed for ${e.auditable_type}#${String(e.auditable_id)} (${e.event})`,{error:t}),n)throw t}}function $e(e){return{async audits(n){try{let{db:t}=await import("@stacksjs/database");return(await t.selectFrom(Fe).selectAll().where("auditable_type","=",e).where("auditable_id","=",n).orderBy("created_at","desc").execute()??[]).map((o)=>({...o,old_values:typeof o.old_values==="string"?Ee(o.old_values):o.old_values,new_values:typeof o.new_values==="string"?Ee(o.new_values):o.new_values}))}catch(t){return B.warn(`[orm] audits() lookup failed for ${e}#${String(n)}`,{error:t}),[]}}}}function Ee(e){try{return JSON.parse(e)}catch{return e}}function Ie(e){if(e&&typeof e==="object"&&"transactional"in e)return{transactional:e.transactional===!0};return{transactional:!1}}function je(e,n,t="id",r={}){let o=r.transactional===!0,a=e;if(typeof e.audits!=="function")e.audits=$e(n).audits;let s=async(l)=>{if(!o)return await l();let{db:f}=await import("@stacksjs/database");return await f.transaction(async()=>l())},i=e.create;if(typeof i==="function")e.create=async function(...l){return await s(async()=>{let f=await i.apply(this,l);try{let d=N(f),m=d?.[t];if(m!=null){let p=await ie();await se({auditable_type:n,auditable_id:m,event:"created",old_values:null,new_values:H(d),user_id:p},o)}}catch(d){if(B.warn(`[orm] audit(create) failed for ${n}`,{error:d}),o)throw d}return f})};let u=e.update;if(typeof u==="function")e.update=async function(l,f){return await s(async()=>{let d=a.find,m=typeof d==="function"?N(await d.call(a,l)):null,p=await u.call(this,l,f);try{let g=N(p)??(typeof d==="function"?N(await d.call(a,l)):null),{old:w,next:b}=Et(m,g);if(b&&Object.keys(b).length>0){let h=await ie();await se({auditable_type:n,auditable_id:l,event:"updated",old_values:H(w),new_values:H(b),user_id:h},o)}}catch(g){if(B.warn(`[orm] audit(update) failed for ${n}#${String(l)}`,{error:g}),o)throw g}return p})};let c=(l)=>{let f=e[l];if(typeof f!=="function")return;e[l]=async function(d){return await s(async()=>{let m=a.find,p=typeof m==="function"?N(await m.call(a,d)):null,g=await f.call(this,d);try{if(g!==!1&&p){let w=await ie();await se({auditable_type:n,auditable_id:d,event:"deleted",old_values:H(p),new_values:null,user_id:w},o)}}catch(w){if(B.warn(`[orm] audit(${l}) failed for ${n}#${String(d)}`,{error:w}),o)throw w}return g})}};c("delete"),c("softDelete")}import{db as Ft,sql as $t,sqlDateTime as ue}from"@stacksjs/database";function A(e,n){if(typeof e!=="number"||!Number.isFinite(e)||e<=0)throw Error(`[orm/commentable] ${n} requires a positive numeric id (received ${String(e)})`)}var q="commentable_upvotes",U="commentables";function It(e){let n=e;return n.code==="SQLITE_CONSTRAINT_UNIQUE"||n.code==="SQLITE_CONSTRAINT"||n.code==="23505"||n.errno===1062||/unique|duplicate/i.test(n.message??"")}function le(e){let n=Ft;return{async comments(t){return A(t,"comments"),await n.selectFrom("commentables").where("commentables_id","=",t).where("commentables_type","=",e).selectAll().execute()},async commentCount(t){let r=await n.selectFrom("commentables").select($t`count(*) as count`).where("commentables_id","=",t).where("commentables_type","=",e).executeTakeFirst();return Number(r?.count)||0},async addComment(t,r){if(A(t,"addComment"),!r||typeof r.title!=="string"||r.title.trim().length===0)throw Error("[orm/commentable] addComment requires a non-empty comment.title");if(typeof r.body!=="string"||r.body.trim().length===0)throw Error("[orm/commentable] addComment requires a non-empty comment.body");let o=await n.insertInto("commentables").values({...r,commentables_id:t,commentables_type:e,status:"pending",created_at:ue(),updated_at:ue()}).returningAll().executeTakeFirst();if(o&&typeof o==="object"&&"id"in o)return o;let a=o?.lastInsertRowid;if(a==null)return o;return await n.selectFrom("commentables").where("id","=",Number(a)).selectAll().executeTakeFirst()},async approvedComments(t){return await n.selectFrom("commentables").where("commentables_id","=",t).where("commentables_type","=",e).where("status","=","approved").selectAll().execute()},async pendingComments(t){return await n.selectFrom("commentables").where("commentables_id","=",t).where("commentables_type","=",e).where("status","=","pending").selectAll().execute()},async rejectedComments(t){return await n.selectFrom("commentables").where("commentables_id","=",t).where("commentables_type","=",e).where("status","=","rejected").selectAll().execute()},async upvoteComment(t,r){A(t,"upvoteComment"),A(r,"upvoteComment");let o=()=>n.selectFrom(q).where("upvoteable_id","=",t).where("upvoteable_type","=",U).where("user_id","=",r).selectAll().executeTakeFirst(),a=await o();if(a)return a;try{await n.insertInto(q).values({upvoteable_id:t,upvoteable_type:U,user_id:r,created_at:ue()}).execute()}catch(s){if(!It(s))throw s}return await o()},async removeCommentUpvote(t,r){A(t,"removeCommentUpvote"),A(r,"removeCommentUpvote"),await n.deleteFrom(q).where("upvoteable_id","=",t).where("upvoteable_type","=",U).where("user_id","=",r).execute()},async commentUpvoteCount(t){A(t,"commentUpvoteCount");let r=await n.selectFrom(q).select("count(*) as count").where("upvoteable_id","=",t).where("upvoteable_type","=",U).executeTakeFirst();return Number(r?.count)||0},async hasUpvotedComment(t,r){return A(t,"hasUpvotedComment"),A(r,"hasUpvotedComment"),!!await n.selectFrom(q).where("upvoteable_id","=",t).where("upvoteable_type","=",U).where("user_id","=",r).selectAll().executeTakeFirst()}}}import{db as jt,sql as Nt,sqlDateTime as Ne}from"@stacksjs/database";function de(e,n){if(typeof e!=="number"||!Number.isFinite(e)||e<=0)throw Error(`[orm/taggable] ${n} requires a positive numeric id (received ${String(e)})`)}function fe(e){let n=jt;return{async tags(t){return de(t,"tags"),await n.selectFrom("taggables").where("taggable_id","=",t).where("taggable_type","=",e).selectAll().execute()},async tagCount(t){de(t,"tagCount");let r=await n.selectFrom("taggables").select(Nt`count(*) as count`).where("taggable_id","=",t).where("taggable_type","=",e).executeTakeFirst();return Number(r?.count)||0},async addTag(t,r){if(de(t,"addTag"),!r||typeof r.name!=="string"||r.name.trim().length===0)throw Error("[orm/taggable] addTag requires a non-empty tag.name");return await n.insertInto("taggables").values({...r,taggable_id:t,taggable_type:e,slug:r.name.toLowerCase().replace(/[^a-z0-9]+/g,"-"),is_active:!0,created_at:Ne(),updated_at:Ne()}).execute(),await n.selectFrom("taggables").where("taggable_id","=",t).where("taggable_type","=",e).where("name","=",r.name).selectAll().executeTakeFirst()},async activeTags(t){return await n.selectFrom("taggables").where("taggable_id","=",t).where("taggable_type","=",e).where("is_active","=",!0).selectAll().execute()},async inactiveTags(t){return await n.selectFrom("taggables").where("taggable_id","=",t).where("taggable_type","=",e).where("is_active","=",!1).selectAll().execute()},async removeTag(t,r){await n.deleteFrom("taggables").where("taggable_id","=",t).where("taggable_type","=",e).where("id","=",r).execute()}}}import{db as Bt,sqlDateTime as G}from"@stacksjs/database";function pe(e){let n=Bt;async function t(r){return(await n.selectFrom("categorizable_models").where("categorizable_id","=",r).where("categorizable_type","=",e).selectAll().execute()).map((a)=>a.category_id)}return{async categories(r){let o=await t(r);if(o.length===0)return[];return await n.selectFrom("categorizables").where("id","in",o).selectAll().execute()},async categoryCount(r){return(await t(r)).length},async addCategory(r,o){let a=()=>n.selectFrom("categorizables").where("name","=",o.name).where("categorizable_type","=",e).selectAll().executeTakeFirst(),s=await a();if(!s)await n.insertInto("categorizables").values({name:o.name,description:o.description,slug:o.name.toLowerCase().replace(/[^a-z0-9]+/g,"-"),categorizable_type:e,is_active:!0,created_at:G(),updated_at:G()}).execute(),s=await a();return await n.insertInto("categorizable_models").values({categorizable_id:r,categorizable_type:e,category_id:s?.id,created_at:G(),updated_at:G()}).execute(),s},async activeCategories(r){let o=await t(r);if(o.length===0)return[];return await n.selectFrom("categorizables").where("id","in",o).where("is_active","=",!0).selectAll().execute()},async inactiveCategories(r){let o=await t(r);if(o.length===0)return[];return await n.selectFrom("categorizables").where("id","in",o).where("is_active","=",!1).selectAll().execute()},async removeCategory(r,o){await n.deleteFrom("categorizable_models").where("categorizable_id","=",r).where("categorizable_type","=",e).where("category_id","=",o).execute()}}}import{db as qt,sqlDateTime as Ut}from"@stacksjs/database";function me(e,n){let t=qt,r=n?.table||`${e}_likes`,o=n?.foreignKey||`${e.replace(/s$/,"")}_id`;return{async likes(a){return await t.selectFrom(r).where(o,"=",a).selectAll().execute()},async likeCount(a){let s=await t.selectFrom(r).select("count(*) as count").where(o,"=",a).executeTakeFirst();return Number(s?.count)||0},async like(a,s){if(typeof a!=="number"||!Number.isFinite(a)||a<=0)throw Error(`[orm/likeable] like requires a positive numeric id (received ${String(a)})`);if(typeof s!=="number"||!Number.isFinite(s)||s<=0)throw Error(`[orm/likeable] like requires a positive numeric userId (received ${String(s)})`);let i=Ut();try{return await t.insertInto(r).values({[o]:a,user_id:s,created_at:i,updated_at:i}).returningAll().executeTakeFirst()}catch(u){let c=u;if(!(c.code==="SQLITE_CONSTRAINT_UNIQUE"||c.code==="SQLITE_CONSTRAINT"||c.code==="23505"||c.errno===1062||/unique|duplicate/i.test(c.message??"")))throw u;let f=await t.selectFrom(r).where(o,"=",a).where("user_id","=",s).selectAll().executeTakeFirst();if(f)return f;throw u}},async unlike(a,s){await t.deleteFrom(r).where(o,"=",a).where("user_id","=",s).execute()},async isLiked(a,s){return!!await t.selectFrom(r).where(o,"=",a).where("user_id","=",s).selectAll().executeTakeFirst()},async likedBy(a){return(await t.selectFrom(r).select([o]).where("user_id","=",a).execute()).map((i)=>Number(i[o])).filter(Boolean)}}}function Ue(e){let n=e;return n?.code==="SQLITE_CONSTRAINT_UNIQUE"||n?.code==="SQLITE_CONSTRAINT"||n?.code==="23505"||n?.errno===1062||/unique|duplicate/i.test(n?.message??"")}function Lt(e,n,t){let r=e;if(e instanceof Error&&typeof r.status==="number"&&Number.isInteger(r.status)&&r.status>=400&&r.status<600){let o={error:e.message};if(r.details!==void 0)o.details=r.details;return{status:r.status,body:o}}if(Ue(e))return{status:409,body:{error:`${n} already exists`}};return{status:500,body:{error:`Failed to ${t} ${n}`,detail:String(e)}}}function _(e){return e.replace(/([a-z\d])([A-Z])/g,"$1_$2").replace(/([A-Z])([A-Z][a-z])/g,"$1_$2").toLowerCase()}function Kt(e){let n={};for(let[t,r]of Object.entries(e))n[_(t)]=r;return n}function qa(e,n){let t=String(n||"").replace(/^\/+|\/+$/g,""),r=String(e).replace(/^\/+/,"");return`/api/${t?`${t}/`:""}${r}`}function Le(e){if(!e)return null;let n=e.attributes??{};if(Object.prototype.hasOwnProperty.call(n,"teamId")||Object.prototype.hasOwnProperty.call(n,"team_id"))return"team_id";return e.belongsTo?.some((t)=>t==="Team")?"team_id":null}function Ke(e){if(!e)return null;let n=e.attributes??{};if(Object.prototype.hasOwnProperty.call(n,"userId")||Object.prototype.hasOwnProperty.call(n,"user_id"))return"user_id";return e.belongsTo?.some((t)=>t==="User")?"user_id":null}function Ua(e){return e?.ownership===!1}function La(e,n,t){let r=Object.keys(e).find((a)=>_(a)===_(n));if(Array.isArray(t)){if(r===void 0)return{data:e,error:"Ownership value is required"};if(!t.some((a)=>String(a)===String(e[r])))return{data:e,error:"Ownership value is not available to this caller"};return{data:{...e,[n]:e[r]}}}if(t===null||t===void 0)return{data:e,error:"Caller has no ownership identity"};let o={...e};for(let a of Object.keys(o))if(_(a)===_(n))delete o[a];return o[n]=t,{data:o}}function Qt(e){if(!e)return[];let n=Object.entries(e.attributes??{}).filter(([,t])=>t?.fillable===!0).map(([t])=>t);for(let t of e.belongsTo??[]){if(typeof t!=="string"||!t.trim())continue;let r=_(t.trim()).split("_").filter(Boolean);if(r.length===0)continue;let o=`${r[0]}${r.slice(1).map((a)=>`${a[0]?.toUpperCase()}${a.slice(1)}`).join("")}Id`;n.push(o)}return[...new Set(n)]}function Wt(e,n){if(!e||n.length===0)return{};let t={};for(let r of n){if(r in e){t[r]=e[r];continue}let o=_(r);if(o!==r&&o in e)t[r]=e[o]}return t}function Vt(e,n){if(e?.name!=="date"||n instanceof Date||typeof n!=="string")return n;let t=/^(\d{4})-(\d{2})-(\d{2})$/.exec(n);if(!t)return n;let r=Number(t[1]),o=Number(t[2]),a=Number(t[3]),s=new Date(Date.UTC(r,o-1,a));if(s.getUTCFullYear()!==r||s.getUTCMonth()!==o-1||s.getUTCDate()!==a)return n;return s}function Ka(e,n){if(!n.length)return e;let t={...e};for(let r of n)delete t[r],delete t[_(r)];return t}function Qa(e,n){if(!e||n.length===0)return e;let t={...e};for(let r of n)delete t[r],delete t[_(r)];return t}var zt=["id","uuid","created_at","updated_at","deleted_at"];function Wa(e,n){let t=new Map;for(let r of[...Object.keys(e??{}),...zt]){let o=_(r);if(!/^\w+$/.test(o))continue;t.set(r,o),t.set(o,o)}for(let r of n)t.delete(r),t.delete(_(r));return t}function Va(e,n,t){if(!n)return e;let r=String(n).split(",").map((a)=>a.trim()).filter(Boolean),o=e;for(let a of r){let s=a.startsWith("-"),i=s?a.slice(1):a;if(!/^\w+$/.test(i))continue;let u=t.get(i);if(!u)continue;o=o.orderBy(u,s?"desc":"asc")}return o}var Ht={string:{get:(e)=>e!=null?String(e):null,set:(e)=>e!=null?String(e):null},number:{get:(e)=>e!=null?Number(e):null,set:(e)=>e!=null?Number(e):null},integer:{get:(e)=>e!=null?Math.trunc(Number(e)):null,set:(e)=>e!=null?Math.trunc(Number(e)):null},float:{get:(e)=>e!=null?Number.parseFloat(String(e)):null,set:(e)=>e!=null?Number.parseFloat(String(e)):null},boolean:{get:(e)=>e===1||e==="1"||e===!0||e==="true",set:(e)=>e===!0||e===1||e==="1"||e==="true"?1:0},json:{get:(e)=>e==null?null:typeof e==="string"?Gt(e):e,set:(e)=>e==null?null:typeof e==="string"?e:JSON.stringify(e)},datetime:{get:(e)=>e?new Date(e):null,set:(e)=>e instanceof Date?e.toISOString():e},date:{get:(e)=>e?new Date(e):null,set:(e)=>e instanceof Date?e.toISOString().split("T")[0]:e},array:{get:(e)=>e==null?[]:Array.isArray(e)?e:typeof e==="string"?Jt(e):[],set:(e)=>e==null?null:Array.isArray(e)?JSON.stringify(e):e}};function Gt(e){try{return JSON.parse(e)}catch{return e}}function Jt(e){try{return JSON.parse(e)}catch{return[]}}function za(e,n,t){if(!e||typeof e!=="object"||!n||Object.keys(n).length===0)return e;let r={...e};for(let[o,a]of Object.entries(n)){let s=typeof a==="string"?Ht[a]:a;if(!s||typeof s[t]!=="function")continue;if(Object.prototype.hasOwnProperty.call(r,o))r[o]=s[t](r[o]);let i=_(o);if(i!==o&&Object.prototype.hasOwnProperty.call(r,i))r[i]=s[t](r[i])}return r}function Qe(e,n,t){let r=n?.attributes??{},o={};for(let[a,s]of Object.entries(r)){let i=s?.validation?.rule;if(!i||typeof i.validate!=="function")continue;let u=Object.prototype.hasOwnProperty.call(e,a);if(!u&&t==="updating")continue;let c=s!==null&&typeof s==="object"&&Object.prototype.hasOwnProperty.call(s,"default"),l=u?e[a]:c?s.default:void 0,f=Vt(i,l),d=i.validate(f);if(!d?.valid&&Array.isArray(d?.errors)&&d.errors.length>0)o[a]=d.errors.map((m)=>s?.validation?.message?.[m?.code]??m?.message??"invalid")}return Object.keys(o).length===0?{valid:!0}:{valid:!1,errors:o}}function Ha(e,n,t){let r=Be(t);return e.find((o)=>o.method===n&&Be(String(o.path??""))===r)}function Be(e){return e.replace(/\{[^}]*\}/g,"{}").replace(/:[^/]+/g,"{}")}function ye(e){if(Array.isArray(e))return e.filter((n)=>typeof n==="string"&&n.length>0);return typeof e==="string"&&e?[e]:[]}function Ga(e){let n=typeof e==="object"&&e!==null&&"middleware"in e,t=e?.middleware;if(!n)return{read:["auth"],write:["auth"],declared:!1};if(t&&typeof t==="object"&&!Array.isArray(t)){let o=t;return{read:"read"in o?ye(o.read):["auth"],write:"write"in o?ye(o.write):["auth"],declared:!0}}let r=ye(t);return{read:r,write:r,declared:!0}}var qe=15,Yt=100;function Ja(e){let n=Number.parseInt(e.get("page")||String(1),10),t=Number.isFinite(n)?Math.max(1,n):1,r=Number.parseInt(e.get("per_page")||String(qe),10),o=Math.min(Number.isFinite(r)?Math.max(1,r):qe,Yt);return{page:t,perPage:o,offset:(t-1)*o}}function J(e,n){let t=new URL(e.toString());return t.searchParams.set("page",String(n)),`${t.pathname}${t.search}`}function Xt(e,n,t,r,o,a){let s=(n-1)*t,i=r===0,u={page:n,per_page:t,from:i?null:s+1,to:i?null:s+r,has_more_pages:o,prev_page_url:n>1?J(e,n-1):null,next_page_url:o?J(e,n+1):null};if(a!==void 0&&!Number.isNaN(a)){let c=Math.max(1,Math.ceil(a/t));u.total=a,u.last_page=c,u.first_page_url=J(e,1),u.last_page_url=J(e,c)}return u}function Ya(e,n,t,r,o,a){let{page:s,...i}=Xt(e,n,t,r,o,a);return{current_page:s,...i}}function Xa(e,n){return(n??e??"").toString().trim().toLowerCase()==="warn"?"warn":"deny"}function Za(e,n){if(e.length===0)return null;let t=[...e].sort().join(", ");if(n==="deny")return`[orm] security.api.rowScoping is 'deny': NOT registering store/update/destroy for ${e.length} model(s) `+`with no row-level scoping \u2014 ${t}. Give a model an \`ownership\` config or a \`team_id\` column to restore its writes.`;return`[orm] ${e.length} model(s) publish mutating routes with no row-level scoping, so an authenticated caller can write any row \u2014 `+`${t}. Scope one with an \`ownership\` config or a \`team_id\` column; intended for public catalog tables. Set \`security.api.rowScoping: 'deny'\` (config/security.ts) to stop generating these routes instead.`}function Zt(e){if(e?.ownership===!1)return null;if(e?.ownership)return e.ownership;let n=Le(e);if(n)return{field:n,resolve:async(r,o)=>{let{resolveAuthenticatedTeamId:a}=await import("@stacksjs/auth");return a(ge(o))}};let t=Ke(e);if(t)return{field:t,resolve:async(r)=>r?.id??null};return null}function ge(e){let n=e?.headers?.get?.("authorization"),t=n&&/^Bearer\s+/i.test(n)?n.replace(/^Bearer\s+/i,"").trim():null,r=e?.headers?.get?.("cookie")||"";return{bearerToken:()=>t,cookies:{get:(o)=>{for(let a of r.split(";")){let s=a.indexOf("=");if(s===-1)continue;if(a.slice(0,s).trim()===o)return decodeURIComponent(a.slice(s+1).trim())}return null}}}}function en(e="customer_id"){return{field:e,resolve:async(n)=>{let t=n?.id;if(t==null)return null;try{let{Customer:r}=await import("@stacksjs/orm");return(await r.where("user_id",t).first())?.id??null}catch{return null}}}}function tn(e="id"){return{field:e,resolve:async(n)=>n?.id??null}}function nn(e="site_id"){return{field:e,resolve:async(n,t)=>{try{let[{resolveAuthenticatedTeamId:r},{Site:o}]=await Promise.all([import("@stacksjs/auth"),import("@stacksjs/orm")]),a=await r(ge(t));if(a==null)return[];return(await o.where("team_id",a).get()??[]).map((i)=>i.id).filter((i)=>i!=null)}catch{return[]}}}}function rn(e="id"){return{field:e,resolve:async(n,t)=>{try{let{resolveAuthenticatedTeamId:r}=await import("@stacksjs/auth");return await r(ge(t))}catch{return null}}}}function on(e,n){return{field:n,resolve:async(t,r)=>{try{let o=await import("@stacksjs/orm"),a=o.models?.[e]??o[e]?.definition??null,s=Zt(a);if(!s?.field||typeof s.resolve!=="function")return[];let i=await s.resolve(t,r);if(i==null||Array.isArray(i)&&i.length===0)return[];let u=o[e];if(!u)return[];return((Array.isArray(i)?await u.whereIn(s.field,i).get():await u.where(s.field,i).get())??[]).map((l)=>l.id).filter((l)=>l!=null)}catch{return[]}}}}import{cacheRequestQuery as an}from"@stacksjs/router";var Y=new WeakMap;function oi(e,n){return an(`batchLoad:${e.name??"model"}:${String(n)}`,async()=>new Promise((t,r)=>{let o=Y.get(e);if(!o)o={keys:[],resolvers:[],scheduled:!1},Y.set(e,o);if(o.keys.push(n),o.resolvers.push({key:n,resolve:t,reject:r}),o.scheduled)return;o.scheduled=!0,Promise.resolve().then(async()=>{let a=Y.get(e);if(!a)return;Y.delete(e);let s=Array.from(new Set(a.keys));try{let i=typeof e.findMany==="function"?await e.findMany(s):await Promise.all(s.map((c)=>e.find?.(c))),u=new Map;for(let c of i??[]){let l=c?.id;if(l!==void 0)u.set(l,c)}for(let c of a.resolvers)c.resolve(u.get(c.key))}catch(i){for(let u of a.resolvers)u.reject(i)}})}))}import{db as ci}from"@stacksjs/database";class sn{conditions=[];where(e,...n){let[t,r]=n,o=r===void 0?"=":t,a=r===void 0?t:r;this.addCondition("and","where",e,o,a)}orWhere(e,...n){let[t,r]=n,o=r===void 0?"=":t,a=r===void 0?t:r;this.addCondition("or","where",e,o,a)}whereIn(e,n){this.conditions.push({type:"and",method:"whereIn",column:e,values:n})}whereNotIn(e,n){this.conditions.push({type:"and",method:"whereIn",column:e,values:n,operator:"not in"})}whereNull(e){this.conditions.push({type:"and",method:"whereNull",column:e})}whereNotNull(e){this.conditions.push({type:"and",method:"whereNotNull",column:e})}whereBetween(e,n){this.conditions.push({type:"and",method:"whereBetween",column:e,range:n})}whereExists(e){this.conditions.push({type:"and",method:"whereExists",column:"",callback:e})}addCondition(e,n,t,r,o){this.conditions.push({type:e,method:n,column:t,operator:r,value:o})}getConditions(){return this.conditions}}import{db as be,runInTransactionScope as cn}from"@stacksjs/database";async function di(e,n){return await cn(async()=>await be.transaction(e,n))}async function fi(e){return await be.savepoint(e)}function pi(e,n){return be.transactional(e,n)}export*from"@stacksjs/model-meta";import{createModel as yn,registerModel as gn}from"@stacksjs/query-builder";import{log as k}from"@stacksjs/logging";import{snakeCase as x}from"@stacksjs/strings";import{AsyncLocalStorage as ot}from"async_hooks";import{toCursorPaginator as bn,toPaginator as wn,toSimplePaginator as hn}from"@stacksjs/pagination";function he(e,n){let t=Te(),r=t?we(t,"per_page"):void 0,o=t?we(t,"page"):void 0,a=e!==void 0?Math.max(1,Math.floor(e)):Math.min(100,Math.max(1,r??15)),s=Math.max(1,Math.floor(n??o??1));return{perPage:a,page:s}}function ke(e,n){let t=Te(),r=t?Ve(t,"cursor"):void 0,o=t?we(t,"per_page"):void 0,a=e!==void 0?Math.max(1,Math.floor(e)):Math.min(100,Math.max(1,o??15)),i=We(n!==void 0?n:r??null);return{perPage:a,cursor:i}}function We(e){if(e===null||e===void 0)return null;if(Array.isArray(e))return e;if(typeof e==="string"&&e.startsWith("["))try{let n=JSON.parse(e);if(Array.isArray(n))return n}catch{}return e}function _e(e){let n=Te();if(!n)return e;let t=(()=>{try{return new URL(n.url)}catch{return null}})();if(!t)return e;let r=t.pathname;if(e.path=r,"next_cursor"in e)return e.next_page_url=e.next_cursor!==null?D(t,{cursor:e.next_cursor}):null,e.prev_page_url=e.prev_cursor!==null?D(t,{cursor:e.prev_cursor}):null,e;let o=e.current_page;if(e.prev_page_url=o>1?D(t,{page:o-1}):null,"total"in e){let a=e.last_page;e.next_page_url=o<a?D(t,{page:o+1}):null,e.first_page_url=D(t,{page:1}),e.last_page_url=D(t,{page:a})}else e.next_page_url=e.has_more_pages?D(t,{page:o+1}):null;return e}function D(e,n){let t=new URL(e.toString());for(let[r,o]of Object.entries(n))t.searchParams.set(r,String(o));return`${t.pathname}${t.search}`}var E;function Te(){if(E===null)return;if(E===void 0)try{let n=St("@stacksjs/router");if(typeof n.getCurrentRequest==="function")E=n.getCurrentRequest;else{E=null;return}}catch{E=null;return}return E()}function we(e,n){let t=Ve(e,n);if(t===void 0)return;let r=Number(t);return Number.isFinite(r)?r:void 0}function Ve(e,n){let t=e.query?.[n];if(t===void 0)return;return Array.isArray(t)?t[0]:t}import{createRequire as un}from"module";import{db as ln}from"@stacksjs/database";var dn=un(import.meta.url);function ze(e){let n=ln;return{async createStripeUser(t,r){let{manageCustomer:o}=await import("@stacksjs/payments");return await o.createStripeCustomer(t,r)},async updateStripeUser(t,r){let{manageCustomer:o}=await import("@stacksjs/payments");return await o.updateStripeCustomer(t,r)},async deleteStripeUser(t){let{manageCustomer:r}=await import("@stacksjs/payments");return await r.deleteStripeUser(t)},async createOrGetStripeUser(t,r){let{manageCustomer:o}=await import("@stacksjs/payments");return await o.createOrGetStripeUser(t,r)},async retrieveStripeUser(t){let{manageCustomer:r}=await import("@stacksjs/payments");return await r.retrieveStripeUser(t)},async defaultPaymentMethod(t){let{managePaymentMethod:r}=await import("@stacksjs/payments");return await r.retrieveDefaultPaymentMethod(t)},async setDefaultPaymentMethod(t,r){let{managePaymentMethod:o}=await import("@stacksjs/payments");return await o.setDefaultPaymentMethod(t,r)},async addPaymentMethod(t,r){let{managePaymentMethod:o}=await import("@stacksjs/payments");return await o.addPaymentMethod(t,r)},async paymentMethods(t,r){let{managePaymentMethod:o}=await import("@stacksjs/payments");return await o.listPaymentMethods(t,r)},async newSubscription(t,r,o,a={}){let{manageSubscription:s}=await import("@stacksjs/payments"),i=await s.create(t,r,o,a),c=i.latest_invoice?.payment_intent;return{subscription:i,paymentIntent:c}},async updateSubscription(t,r,o,a={}){let{manageSubscription:s}=await import("@stacksjs/payments"),i=await s.update(t,r,o,a),c=i.latest_invoice?.payment_intent;return{subscription:i,paymentIntent:c}},async cancelSubscription(t,r,o={}){let{manageSubscription:a}=await import("@stacksjs/payments");return{subscription:await a.cancel(r,o)}},async activeSubscription(t){let{manageSubscription:r}=await import("@stacksjs/payments"),o=await n.selectFrom("subscriptions").where("user_id","=",t.id).where("provider_status","=","active").selectAll().executeTakeFirst();if(o){let a=await r.retrieve(t,o.provider_id||"");return{subscription:o,providerSubscription:a}}return},async checkout(t,r,o={}){let{manageCheckout:a,manageCustomer:s}=await import("@stacksjs/payments"),i={};if(o.enableTax)i.automatic_tax={enabled:!0},delete o.enableTax;if(o.allowPromotions)i.allow_promotion_codes=!0,delete o.allowPromotions;let l={...{mode:"payment",customer:(await s.createOrGetStripeUser(t,{})).id,line_items:r.map((f)=>({price:f.priceId,quantity:f.quantity||1}))},...i,...o};return await a.create(t,l)},async createSetupIntent(t,r={}){let{manageSetupIntent:o}=await import("@stacksjs/payments");return await o.create(t,r)},async subscriptionHistory(t){let{manageInvoice:r}=await import("@stacksjs/payments");return await r.list(t)},async transactionHistory(t){let{manageTransaction:r}=await import("@stacksjs/payments");return await r.list(t)},async connectAccount(t,r={}){let o=r.accountColumn||"stripe_account_id",a=(t._attributes??t)[o];if(!a)return null;let s=await L();try{return await s.accounts.retrieve(a)}catch{return null}},async createConnectAccount(t,r={}){let o=r.accountColumn||"stripe_account_id",a=t._attributes??t,s=a[o],i=await L();if(!s){let{stacksIdempotencyKey:u}=await import("@stacksjs/payments"),c=r.modelTable||e,l=await i.accounts.create({type:r.type??"express",email:r.email??a.email,country:r.country??"US",capabilities:r.capabilities??{card_payments:{requested:!0},transfers:{requested:!0}}},{idempotencyKey:u("connect.account.create",c,a.id)});return s=l.id,await n.updateTable(c).set({[o]:s}).where("id","=",Number(a.id)).execute(),l}return await i.accounts.retrieve(s)},async connectOnboardLink(t,r){let o=r.accountColumn||"stripe_account_id",s=(t._attributes??t)[o];if(!s)throw Error("connectOnboardLink: model has no Stripe Connect account; call createConnectAccount first");return{url:(await(await L()).accountLinks.create({account:s,refresh_url:r.refreshUrl,return_url:r.returnUrl,type:r.type??"account_onboarding"})).url,accountId:s}},async syncConnectStatus(t,r={}){let o=r.accountColumn||"stripe_account_id",a=r.chargesColumn||"charges_enabled",s=r.payoutsColumn||"payouts_enabled",i=t._attributes??t,u=i[o];if(!u)return{chargesEnabled:!1,payoutsEnabled:!1};let l=await(await L()).accounts.retrieve(u),f=!!l.charges_enabled,d=!!l.payouts_enabled,m=r.modelTable||e;return await n.updateTable(m).set({[a]:f,[s]:d}).where("id","=",Number(i.id)).execute(),{chargesEnabled:f,payoutsEnabled:d}},async chargeWithSplit(t,r){let o=await L(),a=r.accountColumn||"stripe_account_id",s=t._attributes??t,i=r.connectAccountId||s[a],u={amount:r.amountCents,currency:r.currency||"usd",automatic_payment_methods:{enabled:!0},metadata:r.metadata};if(i){if(u.transfer_data={destination:i},r.platformFeeCents)u.application_fee_amount=r.platformFeeCents}let{freshIdempotencyKey:c}=await import("@stacksjs/payments");return await o.paymentIntents.create(u,{idempotencyKey:c("payment_intent.create",s.id,r.amountCents)})}}}function L(){let e=globalThis.process?.env?.STRIPE_SECRET_KEY;if(!e)throw Error("Stripe Connect: STRIPE_SECRET_KEY not configured");let n;try{n=dn("stripe")}catch{throw Error("Stripe Connect is being used but the `stripe` package is not installed. It is an opt-in dependency - run `bun add stripe` to enable Stripe Connect.")}return new n(e,{apiVersion:"2026-06-24.dahlia"})}function He(){return{async generateTwoFactorForModel(e){let{generateTwoFactorSecret:n}=await import("@stacksjs/auth"),t=n();await e.update({two_factor_secret:t})},async verifyTwoFactorCode(e,n){let t=e.get("two_factor_secret");if(typeof t!=="string")return!1;let{verifyTwoFactorCode:r,RateLimiter:o}=await import("@stacksjs/auth"),a=String(e.id??e.get?.("id")??e.get?.("email")??t),s=`2fa:${a}`;if(await o.isRateLimited(s)){let{HttpError:u}=await import("@stacksjs/error-handling");throw new u(429,"Too many verification attempts. Please try again later.")}if(!await r(n,t))return await o.recordFailedAttempt(s),!1;try{let{cache:u}=await import("@stacksjs/cache"),c=`2fa:used:${a}:${n}`;if(await u.has(c))return await o.recordFailedAttempt(s),!1;await u.set(c,"1",90)}catch{}return await o.resetAttempts(s),!0}}}import{sqlDateTime as fn}from"@stacksjs/database";import{log as F}from"@stacksjs/logging";var X="deleted_at";function Ge(e,n="id"){return{async softDelete(t){let r=fn(),o=e.where(n,t);if(typeof o?.update==="function")return await o.update({[X]:r}),!0;return!1},async restore(t){let r=e.where(n,t);if(typeof r?.update==="function")return await r.update({[X]:null}),!0;return!1},async forceDelete(t){let r=e.where(n,t);if(typeof r?.delete==="function")return await r.delete(),!0;return!1},withTrashed(){return typeof e.query==="function"?e.query():e},onlyTrashed(){let t=typeof e.query==="function"?e.query():e;if(typeof t?.whereNotNull==="function")return t.whereNotNull(X);return t?.where?.(X,"!=",null)??t}}}function Je(e){if(e===!0||e==null)return{};if(typeof e==="object"&&!Array.isArray(e)){let n=e;if(Array.isArray(n.cascade)){let t=n.cascade.filter((r)=>typeof r==="string");return t.length?{cascade:t}:{}}return{}}return{}}function pn(e,n){let t=e.hasMany??[],r=e.hasOne??[],o=t.some((l)=>Se(l,n,!0)),a=r.some((l)=>Se(l,n,!1));if(!o&&!a)return F.warn(`[orm] soft-delete cascade: '${n}' is not a declared hasMany/hasOne relation - skipping`),null;let i=(o?t:r).find((l)=>Se(l,n,o))??null;if(!i)return null;let c=globalThis[i];if(!c)return F.warn(`[orm] soft-delete cascade: model '${i}' is not yet on globalThis - skipping cascade for '${n}'`),null;return{className:i,model:c}}function Se(e,n,t){let r=e.toLowerCase();if(n===r)return!0;if(t&&n===`${r}s`)return!0;if(t&&r.endsWith("y")&&n===`${r.slice(0,-1)}ies`)return!0;return!1}async function mn(e,n,t,r,o){try{let a=t.where;if(typeof a!=="function"){F.warn(`[orm] cascade ${o}: child model has no .where()`);return}if(o==="softDelete"){let s=t.softDelete;if(typeof s==="function"){let u=a.call(t,r,n),c=typeof u?.get==="function"?await u.get():Array.isArray(u)?u:[],l=t.primaryKey||"id";for(let f of c){let d=f?.[l];if(d!=null)await s.call(t,d)}return}let i=a.call(t,r,n);if(typeof i?.delete==="function"){F.debug(`[orm] cascade soft-delete: child has no softDeletes trait, hard-deleting from ${String(t.table??"?")}`),await i.delete();return}}else{let s=t.restore;if(typeof s!=="function"){F.debug("[orm] cascade restore: child has no restore() - nothing to do");return}let i=t.withTrashed,c=(typeof i==="function"?i.call(t):t).where?.(r,n),l=typeof c?.get==="function"?await c.get():[],f=t.primaryKey||"id";for(let d of l){let m=d?.[f];if(m!=null)await s.call(t,m)}}}catch(a){if(F.warn(`[orm] soft-delete cascade ${o} on ${e}#${String(n)} failed`,{error:a}),process.env.STACKS_ORM_CASCADE_SWALLOW!=="true")throw a}}async function K(e,n,t,r){let o=n.cascade;if(!o||o.length===0)return;let a=`${e.name.toLowerCase()}_id`;for(let s of o){let i=pn(e,s);if(!i)continue;await mn(i.className,t,i.model,a,r)}}var at=new ot;function M(){return at.getStore()?.suppressed===!0}function v(e){return Promise.resolve(at.run({suppressed:!0},e))}var it=new ot;function kn(){return it.getStore()?.suppressed===!0}function _n(e){return Promise.resolve(it.run({suppressed:!0},e))}var Oe=Symbol.for("stacks.orm.modelDefinition");class st extends Error{status=422;errors;constructor(e,n){let t=Object.keys(n).join(", ");super(`${e} validation failed: ${t}`);this.name="ModelValidationError",this.errors=n}}var Ye=new Set;function Tn(e,n){let t=typeof e==="string"?e.slice(0,80):String(e),r=`${typeof e}:${t}`;if(Ye.has(r))return;Ye.add(r);let o=n instanceof Error?n.message:String(n);console.error(`[orm] JSON cast failed to parse value (returning null): ${o} - value preview: ${JSON.stringify(t)}`)}var Sn={string:{get:(e)=>e!=null?String(e):null,set:(e)=>e!=null?String(e):null},number:{get:(e)=>e!=null?Number(e):null,set:(e)=>e!=null?Number(e):null},integer:{get:(e)=>e!=null?Math.trunc(Number(e)):null,set:(e)=>e!=null?Math.trunc(Number(e)):null},float:{get:(e)=>e!=null?Number.parseFloat(String(e)):null,set:(e)=>e!=null?Number.parseFloat(String(e)):null},boolean:{get:(e)=>e===1||e==="1"||e===!0||e==="true",set:(e)=>e===!0||e===1||e==="1"||e==="true"?1:0},json:{get:(e)=>{if(e==null)return null;if(typeof e==="string")try{return JSON.parse(e)}catch(n){return Tn(e,n),null}return e},set:(e)=>{if(e==null)return null;return typeof e==="string"?e:JSON.stringify(e)}},datetime:{get:(e)=>e?new Date(e):null,set:(e)=>e instanceof Date?e.toISOString():e},date:{get:(e)=>e?new Date(e):null,set:(e)=>e instanceof Date?e.toISOString().split("T")[0]:e},array:{get:(e)=>{if(e==null)return[];if(Array.isArray(e))return e;if(typeof e==="string")try{return JSON.parse(e)}catch{return[]}return[]},set:(e)=>{if(e==null)return null;return Array.isArray(e)?JSON.stringify(e):e}}};function ct(e){return typeof e==="string"?Sn[e]:e}function Xe(e,n,t){if(!e||typeof e!=="object")return e;let r={...e};for(let[o,a]of Object.entries(n))if(o in r){let s=ct(a);r[o]=s[t](r[o])}return r}var Z=new Set(["_attributes","_original","_definition","_hasSaved","_relations"]),Ze=Symbol.for("stacks.modelInstanceProxy"),Rn={tags:{bag:"_taggable",mode:"id"},tagCount:{bag:"_taggable",mode:"id"},addTag:{bag:"_taggable",mode:"id"},activeTags:{bag:"_taggable",mode:"id"},inactiveTags:{bag:"_taggable",mode:"id"},removeTag:{bag:"_taggable",mode:"id"},categories:{bag:"_categorizable",mode:"id"},categoryCount:{bag:"_categorizable",mode:"id"},addCategory:{bag:"_categorizable",mode:"id"},activeCategories:{bag:"_categorizable",mode:"id"},inactiveCategories:{bag:"_categorizable",mode:"id"},removeCategory:{bag:"_categorizable",mode:"id"},comments:{bag:"_commentable",mode:"id"},commentCount:{bag:"_commentable",mode:"id"},addComment:{bag:"_commentable",mode:"id"},approvedComments:{bag:"_commentable",mode:"id"},pendingComments:{bag:"_commentable",mode:"id"},rejectedComments:{bag:"_commentable",mode:"id"},likes:{bag:"_likeable",mode:"id"},likeCount:{bag:"_likeable",mode:"id"},like:{bag:"_likeable",mode:"id"},unlike:{bag:"_likeable",mode:"id"},isLiked:{bag:"_likeable",mode:"id"},createStripeUser:{bag:"_billable",mode:"model"},updateStripeUser:{bag:"_billable",mode:"model"},deleteStripeUser:{bag:"_billable",mode:"model"},createOrGetStripeUser:{bag:"_billable",mode:"model"},retrieveStripeUser:{bag:"_billable",mode:"model"},defaultPaymentMethod:{bag:"_billable",mode:"model"},setDefaultPaymentMethod:{bag:"_billable",mode:"model"},addPaymentMethod:{bag:"_billable",mode:"model"},paymentMethods:{bag:"_billable",mode:"model"},newSubscription:{bag:"_billable",mode:"model"},updateSubscription:{bag:"_billable",mode:"model"},cancelSubscription:{bag:"_billable",mode:"model"},activeSubscription:{bag:"_billable",mode:"model"},checkout:{bag:"_billable",mode:"model"},createSetupIntent:{bag:"_billable",mode:"model"},subscriptionHistory:{bag:"_billable",mode:"model"},transactionHistory:{bag:"_billable",mode:"model"},connectAccount:{bag:"_billable",mode:"model"},createConnectAccount:{bag:"_billable",mode:"model"},connectOnboardLink:{bag:"_billable",mode:"model"},syncConnectStatus:{bag:"_billable",mode:"model"},chargeWithSplit:{bag:"_billable",mode:"model"},generateTwoFactorForModel:{bag:"_twoFactor",mode:"model"},verifyTwoFactorCode:{bag:"_twoFactor",mode:"model"}};function Pn(e,n){if(!e||!n)return null;let t=n.split("."),r=e;for(let o of t){if(r==null||typeof r!=="object")return null;let a=r;if("_attributes"in a&&a._attributes&&typeof a._attributes==="object"){let s=a._attributes;if(o in s){r=s[o];continue}}if(o in a){r=a[o];continue}return null}return r??null}function S(e,n){if(!e||typeof e!=="object")return e;let t=e;if(t[Ze])return e;let r=t._attributes;if(!r||typeof r!=="object")return e;if(n&&Object.keys(n).length>0){for(let[o,a]of Object.entries(n))if(Object.prototype.hasOwnProperty.call(r,o))r[o]=ct(a).get(r[o])}return new Proxy(e,{get(o,a,s){let i=o;if(a===Ze)return!0;if(a==="saveAsync")return async function(){let c=i._definition,l=c?.set;if(l&&typeof i.isDirty==="function"){for(let[d,m]of Object.entries(l)){if(typeof m!=="function")continue;if(!i.isDirty(d))continue;let p=m(i._attributes),g=p&&typeof p.then==="function"?await p:p;i._attributes[d]=g}let f=c.set;c.set={};try{return i.save()}finally{c.set=f}}return i.save()};if(a==="save")return function(){let c=i._definition,l=c?.set;if(l&&Object.keys(l).length>0&&typeof i.isDirty==="function"){for(let[d,m]of Object.entries(l)){if(typeof m!=="function")continue;if(!i.isDirty(d))continue;let p=m(i._attributes);if(p&&typeof p.then==="function")throw Error(`Setter for "${d}" returned a Promise - use \`saveAsync()\` instead of \`save()\` when a model has async setters.`);i._attributes[d]=p}let f=c.set;c.set={};try{return i.save()}finally{c.set=f}}return i.save()};if(a==="updateAsync")return async function(c){if(c&&typeof c==="object"&&!Array.isArray(c))for(let[l,f]of Object.entries(c))s[l]=f;return s.saveAsync()};if(a==="saveQuietly")return function(){return v(()=>i.save())};if(a==="saveAsyncQuietly")return function(){return v(()=>s.saveAsync())};if(a==="updateQuietly")return function(c){return v(()=>i.update(c))};if(a==="updateAsyncQuietly")return function(c){return v(()=>s.updateAsync(c))};if(a==="deleteQuietly")return function(){return v(()=>i.delete())};if(a==="toSearchableObject")return function(){let f=i._definition?.traits?.useSearch;if(!f)return null;let d=i._attributes;if(!d)return null;if(f===!0){let b={...d};if(d.id!=null)b.id=String(d.id);return b}let m={},p=f.displayable?.length?f.displayable:[...f.searchable??[],...f.filterable??[],...f.sortable??[],"id"],g=f.denormalize??{},w=i._relations;for(let b of p){let h=x(b),T=d[h]??d[b];if(T!==void 0){m[h]=T;continue}let P=g[b]??g[h];if(P){m[h]=Pn(w,P);continue}m[h]=void 0}if(d.id!=null)m.id=String(d.id);return m};if(typeof a==="string"&&!Z.has(a)){let c=i._attributes;if(c&&Object.prototype.hasOwnProperty.call(c,a))return c[a];let l=i._relations;if(l&&Object.prototype.hasOwnProperty.call(l,a)){let d=l[a];if(Array.isArray(d))return d.map((m)=>S(m,n));return d&&typeof d==="object"?S(d,n):d}let f=Rn[a];if(f){let p=i._definition?.__traitMethods?.[f.bag]?.[a];if(typeof p==="function")return f.mode==="model"?(...g)=>p(s,...g):(...g)=>p(i.id,...g)}if(c){let d=x(a);if(d!==a&&Object.prototype.hasOwnProperty.call(c,d))return c[d]}}let u=Reflect.get(i,a,i);return typeof u==="function"?u.bind(i):u},set(o,a,s,i){let u=o;if(typeof a==="string"&&!Z.has(a)){let{_attributes:c,set:l}=u;if(c&&Object.prototype.hasOwnProperty.call(c,a)){if(typeof l==="function")l.call(u,a,s);else c[a]=s;return!0}if(c){let f=x(a);if(f!==a&&Object.prototype.hasOwnProperty.call(c,f)){if(typeof l==="function")l.call(u,f,s);else c[f]=s;return!0}}if(c&&!(a in u)){if(typeof l==="function")l.call(u,a,s);else c[a]=s;return!0}}return Reflect.set(u,a,s,i)},has(o,a){let s=o;if(typeof a==="string"&&!Z.has(a)){let i=s._attributes;if(i&&Object.prototype.hasOwnProperty.call(i,a))return!0;let u=s._relations;if(u&&Object.prototype.hasOwnProperty.call(u,a))return!0;if(i){let c=x(a);if(c!==a&&Object.prototype.hasOwnProperty.call(i,c))return!0}}return Reflect.has(s,a)},deleteProperty(o,a){let s=o;if(typeof a==="string"&&!Z.has(a)){let i=s._attributes;if(i&&Object.prototype.hasOwnProperty.call(i,a))return delete i[a],!0}return Reflect.deleteProperty(s,a)},ownKeys(o){let s=o._attributes;return s?Object.keys(s):[]},getOwnPropertyDescriptor(o,a){let s=o;if(typeof a==="string"){let i=s._attributes;if(i&&Object.prototype.hasOwnProperty.call(i,a))return{configurable:!0,enumerable:!0,value:i[a],writable:!0}}return Object.getOwnPropertyDescriptor(s,a)}})}var An=new Set(["get","first","last","firstOrFail","find","findOrFail","all","paginate","simplePaginate","cursorPaginate"]),xn={paginate:wn,simplePaginate:hn,cursorPaginate:bn},et=Symbol.for("stacks.queryBuilderProxy");function ut(e,n){if(!e||typeof e!=="object")return e;if(e[et])return e;return new Proxy(e,{get(t,r,o){if(r===et)return!0;let a=Reflect.get(t,r,o);if(typeof a!=="function")return a;return function(...s){let i=s,u=String(r);if(u==="paginate"||u==="simplePaginate"){let{perPage:f,page:d}=he(s[0],s[1]);i=[f,d]}else if(u==="cursorPaginate"){let{perPage:f,cursor:d}=ke(s[0],s[1]);i=[f,d,s[2],s[3]]}let c=a.apply(t,i),l=(f)=>{if(An.has(u)){if(Array.isArray(f))return f.map((m)=>S(m,n));let d=xn[u];if(d&&f&&Array.isArray(f.data)){let m=f.data.map((g)=>S(g,n)),p=d({...f,data:m});return _e(p)}if(f&&Array.isArray(f.data))return{...f,data:f.data.map((m)=>S(m,n))};return S(f,n)}if(f&&typeof f==="object"&&typeof f.get==="function")return ut(f,n);return f};if(c&&typeof c.then==="function")return c.then(l);return l(c)}}})}function On(e,n){let t=["find","first","last","all","firstOrFail","findOrFail","findMany"];for(let a of t){let s=e[a];if(typeof s!=="function")continue;e[a]=function(...i){let u=s.apply(this,i),c=(l)=>Array.isArray(l)?l.map((f)=>S(f,n)):S(l,n);if(u&&typeof u.then==="function")return u.then(c);return c(u)}}let r=["create","firstOrCreate","updateOrCreate","make"];for(let a of r){let s=e[a];if(typeof s!=="function")continue;e[a]=function(...i){let u=s.apply(this,i),c=(l)=>Array.isArray(l)?l.map((f)=>S(f,n)):S(l,n);if(u&&typeof u.then==="function")return u.then(c);return c(u)}}let o=["query","where","orWhere","whereIn","whereNotIn","whereNull","whereNotNull","whereLike","whereBetween","whereNotBetween","orderBy","orderByDesc","select","with","limit","take","skip","latest","oldest"];for(let a of o){let s=e[a];if(typeof s!=="function")continue;e[a]=function(...i){let u=s.apply(this,i);return ut(u,n)}}}class lt extends Error{model;id;constructor(e,n){super(n!=null?`[ORM] ${e} not found for id=${String(n)}`:`[ORM] No matching ${e} row`);this.name="ModelNotFoundError",this.model=e,this.id=n}}class Pe extends Error{model;attribute;reason;constructor(e,n,t){let r=t==="guarded"?`'${n}' is marked guarded`:`'${n}' is not in the fillable allowlist`;super(`[ORM] Mass assignment to ${e} forbidden: ${r}. Use ${e}.forceCreate(...) / .forceUpdate(...) to bypass.`);this.name="MassAssignmentException",this.model=e,this.attribute=n,this.reason=t}}var Cn=new Set(["id","created_at","updated_at","deleted_at","uuid"]);function Q(e,n,t={}){if(t.force)return n;if(!n||typeof n!=="object"||Array.isArray(n))return n;let r=e.attributes;if(!r)return n;let o=new Set,a=new Set,s=new Set;for(let[u,c]of Object.entries(r)){let l=x(u);if(o.add(l),c?.fillable===!0)a.add(l);if(c?.guarded===!0)s.add(l)}let i=a.size>0?a:o;for(let u of Object.keys(n)){let c=x(u);if(Cn.has(c))continue;if(s.has(c))throw new Pe(e.name,u,"guarded");if(c.endsWith("_id"))continue;if(!i.has(c))throw new Pe(e.name,u,"not-fillable")}return n}async function Ae(e,n){let t=e.set;if(!t||typeof t!=="object")return n;let r={...n};for(let[o,a]of Object.entries(t)){if(typeof a!=="function"||!(o in r))continue;try{r[o]=await a(r)}catch(s){k.error(`[orm] ${e.name}.set.${o} threw - skipping setter`,s)}}return r}function Dn(e,n){let t=n.primaryKey||"id",r=e.create;function o(c){let l=e.where;if(typeof l!=="function")throw Error(`[ORM] ${n.name}.${c} needs a working where(): the underlying query builder did not expose one`);return l}function a(c){let l=e.find;if(typeof l!=="function")throw Error(`[ORM] ${n.name}.${c} needs a working find(): the underlying query builder did not expose one`);return l}function s(c){let l=e.create;if(typeof l!=="function")throw Error(`[ORM] ${n.name}.${c} cannot create: the underlying query builder did not expose create()`);return l}if(typeof e.update!=="function")e.update=async function(c,l){if(c==null)throw Error(`[ORM] ${n.name}.update requires an id as the first argument`);if(!l||typeof l!=="object"||Array.isArray(l))throw Error(`[ORM] ${n.name}.update requires a data object as the second argument`);if(Object.keys(l).length===0){k.debug(`[orm] ${n.name}.update called with empty data - short-circuiting and returning current row`);let m=e.find;return typeof m==="function"?await m.call(e,c):null}Q(n,l);let f=await Ae(n,l);await o("update").call(e,t,c).update(f);let d=e.find;return typeof d==="function"?await d.call(e,c):null};if(typeof e.forceUpdate!=="function")e.forceUpdate=async function(c,l){if(c==null)throw Error(`[ORM] ${n.name}.forceUpdate requires an id as the first argument`);if(!l||typeof l!=="object"||Array.isArray(l))throw Error(`[ORM] ${n.name}.forceUpdate requires a data object as the second argument`);let f=await Ae(n,l);await o("forceUpdate").call(e,t,c).update(f);let d=e.find;return typeof d==="function"?await d.call(e,c):null};if(typeof e.forceCreate!=="function")e.forceCreate=async function(c){if(!c||typeof c!=="object"||Array.isArray(c))throw Error(`[ORM] ${n.name}.forceCreate requires a data object`);let l=e.make;if(typeof l==="function"){let f=await l.call(e);if(f&&typeof f.forceFill==="function"&&typeof f.save==="function")return f.forceFill(c),await f.save()??f}if(typeof r!=="function")throw Error(`[ORM] ${n.name}.forceCreate cannot create: the underlying query builder did not expose create()`);return await r.call(e,c)};if(typeof e.delete!=="function")e.delete=async function(c){if(c==null)throw Error(`[ORM] ${n.name}.delete requires an id as the first argument`);if(!await a("delete").call(e,c))return!1;return await o("delete").call(e,t,c).delete(),!0};if(typeof e.findOrFail!=="function")e.findOrFail=async function(c){let l=await a("findOrFail").call(e,c);if(l==null)throw new lt(n.name,c);return l};if(typeof e.exists!=="function")e.exists=async function(c){if(c==null)return!1;let l=o("exists").call(e,t,c);if(typeof l.count==="function"){let d=await l.count();return Number(d)>0}let f=e.find;return typeof f==="function"?await f.call(e,c)!=null:!1};if(typeof e.firstOrCreate!=="function")e.firstOrCreate=async function(c,l={}){if(!c||typeof c!=="object"||Array.isArray(c))throw Error(`[ORM] ${n.name}.firstOrCreate requires a where-attrs object`);let f=o("firstOrCreate").call(e,c),d=typeof f.first==="function"?await f.first():await f;if(d)return d;let m={...c,...l};return Q(n,m),await s("firstOrCreate").call(e,m)};if(typeof e.updateOrCreate!=="function")e.updateOrCreate=async function(c,l){if(!c||typeof c!=="object"||Array.isArray(c))throw Error(`[ORM] ${n.name}.updateOrCreate requires a where-attrs object`);if(!l||typeof l!=="object"||Array.isArray(l))throw Error(`[ORM] ${n.name}.updateOrCreate requires a values object`);let f=o("updateOrCreate").call(e,c),d=typeof f.first==="function"?await f.first():await f;if(d){Q(n,l);let p=d[t];await o("updateOrCreate").call(e,t,p).update(l);let g=e.find;return typeof g==="function"?await g.call(e,p):{...d,...l}}let m={...c,...l};return Q(n,m),await s("updateOrCreate").call(e,m)};if(typeof e.count!=="function")e.count=async function(){let c=e;if(typeof c.query==="function"){let d=c.query();if(typeof d?.count==="function"){let m=await d.count();return Number(m)||0}}let{all:l,get:f}=e;if(typeof l==="function")return(await l.call(e)||[]).length;if(typeof f==="function")return(await f.call(e)||[]).length;return 0};if(typeof e.pluck!=="function")e.pluck=async function(c){if(!c||typeof c!=="string")throw Error(`[ORM] ${n.name}.pluck requires a column name`);let l=e.all;return((typeof l==="function"?await l.call(e):[])||[]).map((d)=>d?.[c])};if(typeof e.whereIn!=="function")e.whereIn=async function(c,l){if(!c||typeof c!=="string")throw Error(`[ORM] ${n.name}.whereIn requires a column name`);if(!Array.isArray(l))throw Error(`[ORM] ${n.name}.whereIn requires an array of values`);if(l.length===0)return[];let f=e.where;if(typeof f!=="function")return[];let d=f.call(e,c,"in",l);if(d&&typeof d.get==="function")return await d.get();return await d};let i=[["latest","desc"],["oldest","asc"]];for(let[c,l]of i)if(typeof e[c]!=="function")e[c]=async function(f="created_at"){let d=e,m=typeof d.query==="function"?d.query():d;if(typeof m?.orderBy==="function"){let b=m.orderBy(f,l);if(typeof b.first==="function")return await b.first();if(typeof b.get==="function")return(await b.get())?.[0]??null}let p=e.all;if(typeof p!=="function")return null;return[...await p.call(e)||[]].sort((b,h)=>{let T=b?.[f],P=h?.[f];if(T===P)return 0;return(T>P?1:-1)*(l==="desc"?-1:1)})[0]??null};let u=pt(n.traits?.useSearch,n);if(u){let c=u.index??n.table??x(`${n.name}s`);if(typeof e.search!=="function")e.search=function(l,f){return Fn(e,c,l,f,u.searchable)};if(typeof e.makeAllSearchable!=="function")e.makeAllSearchable=async function(l=500){let f=e.all;if(typeof f!=="function")throw Error(`[ORM] ${n.name}.makeAllSearchable cannot run: the underlying query builder did not expose all()`);let{useSearchEngine:d}=await import("@stacksjs/search-engine"),m=d(),p=0,g=e.query;if(typeof g==="function")try{let h=g.call(e);if(h&&typeof h.chunk==="function")return await h.chunk(l,async(T)=>{let P=await xe(T,u);if(P.length>0)await m.addDocuments(c,P);p+=P.length}),p}catch{}let w=await f.call(e)||[],b=await xe(w,u);if(b.length>0)await m.addDocuments(c,b);return b.length};if(typeof e.removeAllFromSearch!=="function")e.removeAllFromSearch=async function(){let{useSearchEngine:l}=await import("@stacksjs/search-engine"),f=l();if(typeof f.deleteAllDocuments==="function"){await f.deleteAllDocuments(c);return}let d=e.all,m=typeof d==="function"?await d.call(e)||[]:[],p=l();for(let g of m){let w=g?.id??g?._attributes?.id;if(w!=null)await p.deleteDocument(c,Number(w))}}}}async function xe(e,n){if(e.length===0)return[];if(typeof n.shapeMany==="function"){let r=await n.shapeMany(e);if(!Array.isArray(r)||r.length!==e.length)throw TypeError(`[orm/search] shapeMany returned ${Array.isArray(r)?r.length:typeof r} documents for ${e.length} rows. It must return one document per row, in order, or documents are indexed under the wrong ids.`);return r.filter(Boolean)}return(await Promise.all(e.map((r)=>En(r,n)))).filter(Boolean)}function vn(e){let n=new Set,t=e.attributes??{};for(let[r,o]of Object.entries(t))if(o?.hidden)n.add(r);return n}function Mn(e,n){if(!e||n.size===0)return e;let t={};for(let[r,o]of Object.entries(e))if(!n.has(r))t[r]=o;return t}async function En(e,n){if(typeof n.shape==="function")try{return await n.shape(e)}catch{return}let t=e?.toSearchableObject?.();if(t!==void 0)return t;return Mn(e?._attributes??(typeof e?.toJSON==="function"?e.toJSON():null),n.hidden??new Set)}function Fn(e,n,t,r,o){let a=o&&o.length>0?{query_by:[...o].join(",")}:{},s={q:t,...a,...r??{}},i={with(u){return s={...s,...u},i},where(u){return s={...s,filter:u},i},async get(){let{useSearchEngine:u}=await import("@stacksjs/search-engine");return(await u().search(n,s))?.hits??[]},async paginate(u,c=1){let{useSearchEngine:l}=await import("@stacksjs/search-engine"),d=await l().search(n,{...s,limit:u,offset:(c-1)*u});return{hits:d.hits??[],total:Number(d.estimatedTotalHits??d.nbHits??d.total??0),page:c,perPage:u}},async raw(){let{useSearchEngine:u}=await import("@stacksjs/search-engine");return await u().search(n,s)}};return i}function dt(e){let n=x(e);return n===e?[e]:[e,n]}async function Re(e,n){if(!e||typeof e!=="object")return;let t=e._attributes??e;for(let r of n)for(let o of dt(r)){if(!(o in t))continue;let a=t[o];if(!j(a))continue;t[o]=await oe(a)}}function $n(e,n){if(n.length===0)return;let t=async(i)=>{if(Array.isArray(i)){for(let u of i)await Re(u,n);return i}if(i&&typeof i==="object"&&Array.isArray(i.data)){for(let u of i.data)await Re(u,n);return i}if(i)await Re(i,n);return i},r=["find","first","last","all","firstOrFail","findOrFail","findMany"];for(let i of r){let u=e[i];if(typeof u!=="function")continue;e[i]=async function(...c){let l=await u.apply(this,c);return await t(l)}}let o=["create","firstOrCreate","updateOrCreate","make"];for(let i of o){let u=e[i];if(typeof u!=="function")continue;e[i]=async function(...c){let l=await u.apply(this,c);return await t(l)}}for(let i of["update","forceUpdate"]){let u=e[i];if(typeof u!=="function")continue;e[i]=async function(c,l){let f=await u.call(this,c,l);return await t(f)}}let a=["first","firstOrFail","get","all","find","findOrFail","last","paginate","simplePaginate"],s=(i)=>{if(!i||typeof i!=="object")return i;let u=i;if(u.__stacksEncryptedReads)return i;for(let c of a){let l=u[c];if(typeof l!=="function")continue;u[c]=async function(...f){return await t(await l.apply(this,f))}}for(let c of["where","whereIn","whereNull","whereNotNull","orWhere","orderBy","orderByDesc","limit","offset","with"]){let l=u[c];if(typeof l!=="function")continue;u[c]=function(...f){return s(l.apply(this,f))}}return Object.defineProperty(u,"__stacksEncryptedReads",{value:!0,enumerable:!1}),i};for(let i of["where","whereIn","whereNull","whereNotNull","orderBy","orderByDesc","limit","query"]){let u=e[i];if(typeof u!=="function")continue;e[i]=function(...c){return s(u.apply(this,c))}}}function In(e,n){if(n.length===0)return;let t=async(o)=>{if(!o||typeof o!=="object"||Array.isArray(o))return o;let a={...o};for(let s of n)for(let i of dt(s))if(i in a)a[i]=await re(a[i]);return a},r=["create","firstOrCreate","updateOrCreate","forceCreate"];for(let o of r){let a=e[o];if(typeof a!=="function")continue;e[o]=async function(...s){if(s[0]=await t(s[0]),s[1])s[1]=await t(s[1]);return await a.apply(this,s)}}for(let o of["update","forceUpdate"]){let a=e[o];if(typeof a!=="function")continue;e[o]=async function(s,i){let u=await t(i);return await a.call(this,s,u)}}}function jn(e,n){let t=e.create;if(typeof t==="function")e.create=async function(r,...o){Q(n,r);let a=await Ae(n,r);return await t.call(this,a,...o)};for(let r of["firstOrCreate","updateOrCreate"]){let o=e[r];if(typeof o!=="function")continue}}function Nn(e,n){let t=String(n?.name??e.name??"Model"),r=(s,i)=>{if(kn())return;if(!s||typeof s!=="object"||Array.isArray(s))return;let u=Qe(s,n,i);if(!u.valid)throw new st(t,u.errors)},o=e.create;if(typeof o==="function")e.create=async function(s,...i){return r(s,"creating"),await o.call(this,s,...i)};let a=e.update;if(typeof a==="function")e.update=async function(s,i,...u){return r(i,"updating"),await a.call(this,s,i,...u)}}function Bn(e,n){let t=["create","firstOrCreate","updateOrCreate"];for(let o of t){let a=e[o];if(typeof a==="function")e[o]=async function(...s){if(k.debug(`[orm] ${o.charAt(0).toUpperCase()+o.slice(1)} ${String(e.name||"unknown")}`,s[0]),s[0]&&typeof s[0]==="object"&&!Array.isArray(s[0]))s[0]=Xe(s[0],n,"set");return await a.apply(this,s)}}let r=e.update;if(typeof r==="function")e.update=async function(o,a){let s=a&&typeof a==="object"&&!Array.isArray(a)?Xe(a,n,"set"):a;return await r.call(this,o,s)}}function ft(e){k.debug(`[orm] Defining model: ${e.name} (table: ${e.table})`);let n=qn(e),t=Ln(e),r=Un(n,t),o=Kn(e);e.__traitMethods=o;let a=r?{...e,hooks:{...e.hooks,...r}}:e,i=yn(a);if(On(i,e.casts),Dn(i,a),jn(i,a),e.casts&&Object.keys(e.casts).length>0)Bn(i,e.casts);let u=ae(e);if(u.length>0)In(i,u),$n(i,u);let c=e.traits?.useSoftDeletes;if(c)Qn(i,a,c);let l=e.traits?.useAudit;if(l){let m=Ie(l);je(i,e.name,e.primaryKey||"id",m)}Nn(i,a);let f=i;f.withoutValidation=function(m){return _n(m)},f.withoutEvents=function(m){return v(m)};for(let m of["create","update","firstOrCreate","updateOrCreate","forceCreate","forceUpdate","delete","forceDelete","softDelete","restore"]){let p=i[m];if(typeof p!=="function")continue;let g=`${m}Quietly`;if(typeof i[g]==="function")continue;i[g]=function(...w){return v(()=>p.apply(i,w))}}let d=Object.assign(i,o,{...e,getDefinition:()=>e,_isStacksModel:!0});return gn(e.name,d),Object.defineProperty(d,Oe,{value:e,enumerable:!1,configurable:!0}),d}function qn(e){let n=e.traits?.observe;if(!n)return;let t=e.name.toLowerCase(),r=(d)=>{let m=d?.attributes;if(!m||typeof m!=="object")return d;let p=e.primaryKey||"id",g={...m};if(g[p]===void 0&&d[p]!==void 0)g[p]=d[p];return g},o=async(d,m)=>{if(M())return;try{let{dispatch:p}=await import("@stacksjs/events");await p(d,m)}catch(p){if(p&&typeof p==="object"&&"code"in p&&p.code==="MODULE_NOT_FOUND")return;if(console.error(`[ORM] Event '${d}' handler error:`,p),process.env.STACKS_ORM_EVENT_ERRORS!=="swallow")throw p}},a=e.traits?.broadcastOn,s=e.traits?.broadcastWith,i=typeof a==="function"&&typeof s==="function",u=async(d,m)=>{if(!i)return;if(M())return;try{let p=a(m),g=Array.isArray(p)?p:[p],w=s(m),h=(await import("@stacksjs/realtime").catch(()=>null))?.broadcast;if(typeof h!=="function")return;for(let T of g){if(typeof T!=="string"||T.length===0)continue;await h(T,d,w)}}catch(p){if(p&&typeof p==="object"&&"code"in p&&p.code==="MODULE_NOT_FOUND")return;if(console.error(`[ORM] Broadcast '${d}' handler error:`,p),process.env.STACKS_ORM_BROADCAST_ERRORS==="throw")throw p}},c=async(d,m)=>{if(M())return!0;try{let{dispatchAsync:p}=await import("@stacksjs/events"),g=await p(d,m);if(Array.isArray(g)&&g.some((w)=>w===!1))return!1}catch(p){if(p&&typeof p==="object"&&"code"in p&&p.code==="MODULE_NOT_FOUND")return!0;if(console.error(`[ORM] Before-event '${d}' handler error:`,p),process.env.STACKS_ORM_EVENT_ERRORS!=="swallow")throw p}return!0},l=n===!0?["create","update","delete"]:Array.isArray(n)?n:[],f={};if(l.includes("create"))f.beforeCreate=async(d)=>{if(k.debug(`[orm] Create ${t}`,d),!await c(`${t}:saving`,d))throw Error(`[ORM] ${t}:saving event cancelled the operation`);if(!await c(`${t}:creating`,d))throw Error(`[ORM] ${t}:creating event cancelled the operation`)},f.afterCreate=async(d)=>{let m=r(d);await o(`${t}:created`,m),await o(`${t}:saved`,m),await u(`${t}:created`,d)};if(l.includes("update"))f.beforeUpdate=async(d)=>{if(k.debug(`[orm] Update ${t}#${d?.id??"unknown"}`,d),!await c(`${t}:saving`,d))throw Error(`[ORM] ${t}:saving event cancelled the operation`);if(!await c(`${t}:updating`,d))throw Error(`[ORM] ${t}:updating event cancelled the operation`)},f.afterUpdate=async(d)=>{let m=r(d);await o(`${t}:updated`,m),await o(`${t}:saved`,m),await u(`${t}:updated`,d)};if(l.includes("delete"))f.beforeDelete=async(d)=>{if(k.debug(`[orm] Delete ${t}#${d?.id??"unknown"}`),!await c(`${t}:deleting`,d))throw Error(`[ORM] ${t}:deleting event cancelled the operation`)},f.afterDelete=async(d)=>{await o(`${t}:deleted`,r(d)),await u(`${t}:deleted`,d)};return f}function Un(...e){let n={},t=new Set;for(let r of e){if(!r)continue;for(let o of Object.keys(r))t.add(o)}for(let r of t){let o=e.map((a)=>a?.[r]).filter((a)=>typeof a==="function");if(!o.length)continue;n[r]=async(...a)=>{for(let s of o)await s(...a)}}return Object.keys(n).length?n:void 0}function pt(e,n){if(!e)return null;let t=e===!0?{}:typeof e==="object"?{...e}:null;if(!t)return null;if(n)t.hidden=vn(n);return t}function Ln(e){let n=pt(e.traits?.useSearch,e);if(!n)return;let t=n,r=t.index??e.table??x(`${e.name}s`);async function o(i){if(typeof t.shapeMany==="function")try{let[l]=await xe([i],t);return l}catch(l){k.warn(`[orm/search] shapeMany() threw for ${e.name}: ${l.message}`);return}if(typeof t.shape==="function")try{return await t.shape(i)}catch(l){k.warn(`[orm/search] shape() threw for ${e.name}: ${l.message}`);return}let c=S(i).toSearchableObject?.();if(c!==void 0)return c;return i?._attributes??(typeof i?.toJSON==="function"?i.toJSON():null)}let a=async(i)=>{if(M())return;let u=await o(i);if(!u)return;if(n.queueable){try{let{Jobs:c}=await import("@stacksjs/queue");await c.dispatch("SyncSearchIndexJob",{index:r,op:"upsert",doc:u})}catch(c){k.warn(`[orm/search] queue dispatch failed for ${e.name}; falling back to inline: ${c.message}`),await nt(r,u,e.name)}return}await nt(r,u,e.name)};return{afterCreate:a,afterUpdate:a,afterDelete:async(i)=>{if(M())return;let u=i?.id??i?._attributes?.id;if(u==null)return;if(n.queueable){try{let{Jobs:c}=await import("@stacksjs/queue");await c.dispatch("SyncSearchIndexJob",{index:r,op:"delete",id:Number(u)})}catch(c){k.warn(`[orm/search] queue dispatch failed for ${e.name}#${u}; falling back to inline: ${c.message}`),await rt(r,Number(u),e.name)}return}await rt(r,Number(u),e.name)}}}var tt=new Map;function mt(e,n){let t=tt.get(e)??0;if(tt.set(e,t+1),t===0)k.warn(`[orm/search] ${n}`);else if(t===9)k.warn(`[orm/search] ${e} is still failing; further identical warnings suppressed for this process.`)}async function nt(e,n,t){try{let{useSearchEngine:r}=await import("@stacksjs/search-engine");await r().addDocument(e,n)}catch(r){mt(`index:${t}`,`Failed to index ${t}: ${r.message}`)}}async function rt(e,n,t){try{let{useSearchEngine:r}=await import("@stacksjs/search-engine");await r().deleteDocument(e,n)}catch(r){mt(`remove:${t}`,`Failed to remove ${t}#${n}: ${r.message}`)}}function Kn(e){let n={},{table:t,traits:r}=e;if(!r)return n;if(r.taggable)n._taggable=fe(t);if(r.categorizable)n._categorizable=pe(t);if(r.commentable)n._commentable=le(t);if(r.billable)n._billable=ze(t);if(r.likeable){let a=typeof r.likeable==="object"?r.likeable:void 0;n._likeable=me(t,a)}let o=r.useAuth||r.authenticatable;if(typeof o==="object"&&o&&"useTwoFactor"in o&&o.useTwoFactor)n._twoFactor=He();return n}function Qn(e,n,t){let r=Ge(e,n.primaryKey||"id"),o=Je(t),a=n,s=n.name.toLowerCase(),i=n.traits?.observe!=null&&n.traits?.observe!==!1,u=async(m)=>{if(!i||M())return!0;try{let{dispatchAsync:p}=await import("@stacksjs/events"),g=await p(`${s}:restoring`,{id:m});if(Array.isArray(g)&&g.some((w)=>w===!1))return!1}catch(p){if(p?.code!=="MODULE_NOT_FOUND")console.error(`[ORM] Before-event '${s}:restoring' handler error:`,p)}return!0},c=async(m)=>{if(!i||M())return;try{let{dispatch:p}=await import("@stacksjs/events");await p(`${s}:restored`,{id:m})}catch(p){if(p?.code!=="MODULE_NOT_FOUND")console.error(`[ORM] Event '${s}:restored' handler error:`,p)}},l=process.env.STACKS_ORM_CASCADE_SWALLOW!=="true",f=async(m)=>{if(!o.cascade?.length||!l){let g=await r.softDelete(m);if(g&&o.cascade?.length)await K(a,o,m,"softDelete");return g}let{db:p}=await import("@stacksjs/database");return await p.transaction(async()=>{let g=await r.softDelete(m);if(g)await K(a,o,m,"softDelete");return g})},d=async(m)=>{if(!await u(m))return!1;if(!o.cascade?.length||!l){let b=await r.restore(m);if(b){if(o.cascade?.length)await K(a,o,m,"restore");await c(m)}return b}let{db:g}=await import("@stacksjs/database"),w=await g.transaction(async()=>{let b=await r.restore(m);if(b)await K(a,o,m,"restore");return b});if(w)await c(m);return w};e.softDelete=f,e.restore=d,e.forceDelete=r.forceDelete,e.withTrashed=r.withTrashed,e.onlyTrashed=r.onlyTrashed,e.delete=f}function Wn(e){if(e==null)return e;if(Array.isArray(e))return e.map((t)=>Wn(t));if(typeof e!=="object")return e;let n=e;if(typeof n.toJSON==="function")return n.toJSON();if(n._attributes&&typeof n._attributes==="object")return n._attributes;return e}var Vn=["belongsTo","hasOne","hasMany","belongsToMany","morphMany","morphOne"],zn=["traits","dashboard"];function Hn(e){let n=e?.[Oe];if(n&&typeof n==="object")return n;if(e&&typeof e==="object"&&"name"in e&&"attributes"in e)return e;throw TypeError("extendModel() expects a model created by defineModel(), or a model definition. Import the framework model itself rather than its table name.")}function Gn(e,n){let t=Array.isArray(e)?e:[],r=Array.isArray(n)?n:[];if(!t.length&&!r.length)return;return[...new Set([...t,...r])]}function Jn(e){if(!e)return 0;return Object.values(e).reduce((n,t)=>{let r=Number(t?.order);return Number.isFinite(r)&&r>n?r:n},0)}function Yn(e,n){let t={...e,...n},r=e.attributes??{},o=n.attributes??{};if(n.attributes){let a=Jn(r),s=Object.fromEntries(Object.entries(o).map(([i,u])=>{let c=!(i in r),l=Number.isFinite(Number(u?.order));if(c&&!l)return[i,{...u,order:++a}];return[i,u]}));t.attributes={...r,...s}}for(let a of Vn){let s=Gn(e[a],n[a]);if(s)t[a]=s}for(let a of zn){let s=e[a],i=n[a];if(s&&i&&typeof s==="object"&&typeof i==="object")t[a]={...s,...i}}return t}function Ui(e,n){return ft(Yn(Hn(e),n))}import ar from"process";import{log as ir}from"@stacksjs/logging";import{path as R}from"@stacksjs/path";import{fs as W}from"@stacksjs/storage";import{Database as Xn}from"bun:sqlite";import{existsSync as Zn,readdirSync as er,readFileSync as tr}from"fs";function nr(e){return e.startsWith("sqlite_")||e.startsWith("_qb_tmp_")}function rr(e,n){let t=e.toUpperCase();if(t.includes("BOOL"))return n==="postgres"?"boolean":"number";if(t.includes("DATE")||t.includes("TIME"))return"string";if(t.includes("INT"))return"number";if(t.includes("CHAR")||t.includes("CLOB")||t.includes("TEXT"))return"string";if(t.includes("REAL")||t.includes("FLOA")||t.includes("DOUB")||t.includes("NUMERIC")||t.includes("DEC"))return"number";if(t.includes("BLOB"))return"Uint8Array";return"unknown"}function or(e,n){try{return e.exec(n),{ok:!0}}catch(t){if(/CREATE\s+TRIGGER/i.test(n))return{ok:!1,error:t.message};let r=0;for(let o of n.split(/;\s*$/m)){if(!o.trim())continue;try{e.exec(o),r++}catch{}}return r>0?{ok:!0}:{ok:!1,error:t.message}}}function yt(e,n="sqlite"){let t=[];if(!Zn(e))return{tables:[],errors:t};let r;try{r=er(e).filter((a)=>a.endsWith(".sql")).sort()}catch(a){return{tables:[],errors:[{file:e,error:a.message}]}}let o=new Xn(":memory:");try{for(let i of r){let u=`${e}/${i}`,c;try{c=tr(u,"utf-8")}catch(f){t.push({file:u,error:f.message});continue}let l=or(o,c);if(!l.ok)t.push({file:u,error:l.error??"could not be applied"})}let a=o.query("SELECT name FROM sqlite_master WHERE type = 'table' ORDER BY name").all().map((i)=>i.name).filter((i)=>!nr(i)),s=[];for(let i of a){let u=o.query(`PRAGMA table_info("${i.replace(/"/g,'""')}")`).all();if(u.length===0)continue;let c={};for(let l of u){let f=rr(l.type??"",n),d=l.notnull===0&&l.pk===0;c[l.name]=d&&f!=="unknown"?`${f} | null`:f}s.push({table:i,columns:c})}return{tables:s,errors:t}}finally{o.close()}}function sr(e){if(e)return e;let n=String(ar.env.DB_CONNECTION??"").toLowerCase();return n==="postgres"||n==="mysql"?n:"sqlite"}function ee(e){return e==="postgres"?"boolean":"number"}function O(e){return e.replace(/([A-Z]+)([A-Z][a-z])/g,"$1_$2").replace(/([a-z\d])([A-Z])/g,"$1_$2").toLowerCase()}function cr(e,n){let t=e.default;if(typeof t==="boolean")return ee(n);if(typeof t==="number")return"number";if(typeof t==="string")return"string";return"unknown"}function ur(e){let n=e.validation;if(!n||typeof n!=="object")return null;let t=n.rule;return t&&typeof t==="object"?t:null}function lr(e){if(!e||String(e.name??"")!=="enum")return null;let t=(Array.isArray(e.allowedValues)?e.allowedValues:[]).filter((r)=>typeof r==="string"||typeof r==="number").map((r)=>typeof r==="number"?String(r):JSON.stringify(r));return t.length>0?t.join(" | "):null}function dr(e,n){let t=ur(e),r=lr(t);if(r!==null)return e.nullable===!0?`${r} | null`:r;let o=typeof e.type==="string"?e.type.toLowerCase():String(t?.name??"").toLowerCase(),a=(()=>{switch(o){case"string":case"text":case"longtext":case"mediumtext":case"tinytext":case"char":case"varchar":case"enum":case"uuid":case"date":case"datetime":case"timestamp":case"timestamptz":case"password":case"time":case"year":return"string";case"number":case"integer":case"int":case"tinyint":case"smallint":case"mediumint":case"float":case"double":case"decimal":case"numeric":return"number";case"bigint":return"number | bigint";case"boolean":case"bool":return ee(n);case"json":case"jsonb":return"unknown";case"binary":case"blob":case"bytea":return"Uint8Array";case"unix":return"number";case"array":return"unknown[]";case"object":return"Record<string, unknown>";default:return cr(e,n)}})();return e.nullable===!0?`${a} | null`:a}function fr(e){let n={},t=e.belongsTo;if(!t)return n;let r=Array.isArray(t)?t:Object.values(t);for(let o of r){if(typeof o==="string"){n[`${O(o)}_id`]="number";continue}if(o&&typeof o==="object"){let a=o;if(typeof a.foreignKey==="string"){n[a.foreignKey]="number";continue}if(typeof a.model==="string")n[`${O(a.model)}_id`]="number"}}return n}function pr(e,n){let[t,r]=[O(e),O(n)].sort();return`${t}_${r}`}function mr(e,n){let t=e.default,r=typeof t==="string"?"string":typeof t==="number"?"number":typeof t==="boolean"?ee(n):t instanceof Date?"string":"unknown";return e.nullable?`${r} | null`:r}function yr(e,n,t){let r=n.belongsToMany;if(!r)return[];let o=[],a=Array.isArray(r)?r:Object.values(r);for(let s of a){let i,u,c,l,f={},d=!0;if(typeof s==="string")i=s;else if(s&&typeof s==="object"&&"model"in s){let b=s;if(i=b.model,"pivotTable"in b||"firstForeignKey"in b||"secondForeignKey"in b)u=b.pivotTable,c=b.firstForeignKey,l=b.secondForeignKey;else{let h=s;u=h.table,c=h.foreignKey,l=h.relatedKey,f=h.pivot?.columns??{},d=Boolean(h.pivot?.timestamps)}}else continue;let m=u??pr(e,i),p=c??`${O(e)}_id`,g=l??`${O(i)}_id`,w={id:"number",[p]:"number",[g]:"number"};for(let[b,h]of Object.entries(f))w[b]=mr(h,t);if(d)w.created_at="string",w.updated_at="string | null";o.push({table:m,columns:w})}return o}function gr(e){return{email_verified_at:"string | null",password_changed_at:"string | null",two_factor_secret:"string | null",two_factor_enabled:`${ee(e)} | null`,two_factor_last_used_step:"number | null",stripe_id:"string | null"}}function br(e,n){let t={id:"number"},r=e.traits??{};if(r.useUuid)t.uuid="string";if((r.useTimestamps??r.timestampable)!==!1)t.created_at="string",t.updated_at="string | null";if(r.useSoftDeletes??r.softDeletable)t.deleted_at="string | null";if((e.table??"")==="users"||e.name==="User")Object.assign(t,gr(n));return t}function wr(e,n){let t={},r=e.attributes??{};for(let[o,a]of Object.entries(r))t[O(o)]=dr(a,n);return t}function gt(e,n,t=2){let r=" ".repeat(t),o=" ".repeat(t+1),a=Object.entries(n).map(([i,u])=>`${o}${i}: ${u}`).join(`
|
|
3
3
|
`),s=/^[A-Z_a-z]\w*$/.test(e)?e:`'${e}'`;return`${r}${s}: {
|
|
4
4
|
${o}// columns
|
|
5
5
|
${a}
|
|
@@ -15,8 +15,8 @@ declare module '@stacksjs/database' {
|
|
|
15
15
|
|
|
16
16
|
export {}
|
|
17
17
|
`,_r="/* eslint-disable */\n// AUTO-GENERATED by `buddy generate:db-types --framework` \u2014 do not edit.\n//\n// The shapes of the tables the framework itself ships, so framework code gets\n// real rows from `db.selectFrom(...)` without asserting them. An application's\n// own tables (and its overrides of these) live in `DatabaseSchema`, which takes\n// precedence - see `RowOf` in `./utils`.\n\nexport interface FrameworkSchema {\n",Tr=`}
|
|
18
|
-
`;function
|
|
19
|
-
`),m=`${
|
|
20
|
-
${
|
|
21
|
-
`);return`${
|
|
22
|
-
${ht(n)}`}import{isCursorPaginator as Ss,isPaginator as Rs,isSimplePaginator as Ps,toCursorPaginator as As,toPaginator as xs,toSimplePaginator as Os}from"@stacksjs/pagination";import{configureOrm as Pr}from"@stacksjs/query-builder";function Ar(){try{let e=process.env.DB_DATABASE_PATH||"database/stacks.sqlite";if((process.env.DB_CONNECTION||"sqlite")==="sqlite")Pr({database:e})}catch{}}Ar();async function _t(e){for(let n=0;;n++){let t=await import(e);try{return t.default}catch(r){if(n<5&&r instanceof ReferenceError&&/before initialization/.test(r.message)){await new Promise((o)=>setTimeout(o,0));continue}throw r}}}async function ne(e,n=[""]){let{path:t}=await import("@stacksjs/path"),r=t.userModelsPath(`${e}.ts`);try{if(await Bun.file(r).exists())return await _t(r)}catch(o){console.error(`[orm] Failed to import userland model ${e} from ${r} - falling back to framework default. Reason:`,o)}for(let o of n){let a=o?`${o}/`:"",s=t.frameworkPath(`defaults/app/Models/${a}${e}.ts`);try{if(await Bun.file(s).exists())return await _t(s)}catch(i){console.error(`[orm] Failed to import framework default model ${e} from ${s} - trying next subdir. Reason:`,i)}}return null}var D={},Tt=()=>{},es=new Promise((e)=>{Tt=e});function y(e){return new Proxy(function(){},{get(n,t){if(t==="then")return;let r=D[e];if(r==null)return;let o=r[t];return typeof o==="function"?o.bind(r):o},set(n,t,r){let o=D[e];if(o==null)return!1;return o[t]=r,!0},has(n,t){let r=D[e];return r==null?!1:(t in r)},apply(n,t,r){let o=D[e];if(o==null||typeof o!=="function")return;return o.apply(t,r)}})}var xr=y("User"),Or=y("Job"),Cr=y("FailedJob"),Dr=[["Team",[""],"auth"],["TeamInvitation",[""],"auth"],["TeamMember",[""],"auth"],["SocialAccount",[""],"auth"],["Subscriber",[""],"auth"],["SubscriberEmail",[""],"auth"],["Subscription",[""],"auth"],["Post",["Content"],"cms"],["Page",["Content"],"cms"],["PageRevision",["Content"],"cms"],["Redirect",["Content"],"cms"],["Menu",["Content"],"cms"],["MenuItem",["Content"],"cms"],["Author",["Content"],"cms"],["Comment",[""],"cms"],["Tag",[""],"cms"],["Site",[""],"auth"],["SiteDomain",[""],"auth"],["MagicLinkToken",[""],"auth"],["SmsOptOut",[""],"auth"],["Form",["Forms"],"forms"],["FormField",["Forms"],"forms"],["FormSubmission",["Forms"],"forms"],["Activity",[""],"dashboard"],["Board",[""],"dashboard"],["BoardColumn",[""],"dashboard"],["Card",[""],"dashboard"],["CardComment",[""],"dashboard"],["Deployment",[""],"dashboard"],["Label",[""],"dashboard"],["Release",[""],"dashboard"],["Notification",[""],"dashboard"],["NotificationDelivery",[""],"dashboard"],["MailPreference",[""],"dashboard"],["Log",[""],"dashboard"],["Request",[""],"dashboard"],["AnalyticsEvent",[""],"dashboard"],["QueryLog",[""],"dashboard"],["Error",[""],"monitoring"],["Websocket",["realtime"],"realtime"],["Campaign",[""],"marketing"],["CampaignSend",[""],"marketing"],["EmailList",[""],"marketing"],["EmailListSubscriber",[""],"marketing"],["EmailIdempotency",[""],"marketing"],["EmailSuppression",[""],"marketing"],["EmailWebhookEvent",[""],"marketing"],["SocialPost",[""],"marketing"],["Automation",[""],"marketing"],["AutomationRun",[""],"marketing"],["CampaignVariant",[""],"marketing"],["CommunicationSuppression",[""],"marketing"],["ConsentEvent",[""],"marketing"],["SenderDomain",[""],"marketing"],["UsageEvent",[""],"marketing"],["PaymentMethod",[""],"commerce"],["PaymentProduct",[""],"commerce"],["PaymentTransaction",[""],"commerce"],["Order",["commerce"],"commerce"],["OrderIdempotency",["commerce"],"commerce"],["OrderItem",["commerce"],"commerce"],["Cart",["commerce"],"commerce"],["CartItem",["commerce"],"commerce"],["Customer",["commerce"],"commerce"],["Product",["commerce"],"commerce"],["ProductVariant",["commerce"],"commerce"],["ProductUnit",["commerce"],"commerce"],["Manufacturer",["commerce"],"commerce"],["Category",["commerce"],"commerce"],["Coupon",["commerce"],"commerce"],["GiftCard",["commerce"],"commerce"],["LicenseKey",["commerce"],"commerce"],["Review",["commerce"],"commerce"],["Receipt",["commerce"],"commerce"],["PrintDevice",["commerce"],"commerce"],["ShippingMethod",["commerce"],"commerce"],["ShippingRate",["commerce"],"commerce"],["ShippingZone",["commerce"],"commerce"],["DeliveryRoute",["commerce"],"commerce"],["DeliveryStop",["commerce"],"commerce"],["DigitalDelivery",["commerce"],"commerce"],["Courier",["commerce"],"commerce"],["CourierPing",["commerce"],"commerce"],["TaxRate",["commerce"],"commerce"],["WaitlistProduct",["commerce"],"commerce"],["WaitlistRestaurant",["commerce"],"commerce"],["Auction",["commerce"],"commerce"],["AuctionItem",["commerce"],"commerce"],["Bid",["commerce"],"commerce"],["Pledge",["commerce"],"commerce"],["LoyaltyPoint",["commerce"],"commerce"],["LoyaltyReward",["commerce"],"commerce"],["Payment",["commerce"],"commerce"],["Transaction",["commerce"],"commerce"]];queueMicrotask(async()=>{try{let{feature:e}=await import("@stacksjs/config"),n=await ne("User");if(n)D.User=n;if(e("queue")){let t=await ne("Job");if(t)D.Job=t;let r=await ne("FailedJob");if(r)D.FailedJob=r}for(let[t,r,o]of Dr){if(!e(o))continue;let a=await ne(t,r);if(a)D[t]=a}}catch(e){console.error("[orm] deferred model load failed:",e)}finally{Tt()}});var vr=y("Activity"),Mr=y("AnalyticsEvent"),Er=y("Automation"),Fr=y("AutomationRun"),$r=y("Auction"),Ir=y("CampaignVariant"),jr=y("CommunicationSuppression"),Nr=y("ConsentEvent"),Br=y("SenderDomain"),qr=y("UsageEvent"),Ur=y("AuctionItem"),Lr=y("Author"),Kr=y("Bid"),Qr=y("Board"),Wr=y("BoardColumn"),Vr=y("Campaign"),zr=y("Card"),Hr=y("CardComment"),Gr=y("Cart"),Jr=y("CartItem"),Yr=y("Category"),Xr=y("Comment"),Zr=y("Coupon"),eo=y("Customer"),to=y("DeliveryRoute"),no=y("DeliveryStop"),ro=y("Deployment"),oo=y("DigitalDelivery"),ao=y("Courier"),io=y("CourierPing"),so=y("CampaignSend"),co=y("EmailList"),uo=y("EmailListSubscriber"),lo=y("Form"),fo=y("FormField"),po=y("FormSubmission"),mo=y("MagicLinkToken"),yo=y("Menu"),go=y("MenuItem"),bo=y("PageRevision"),wo=y("Pledge"),ho=y("Redirect"),ko=y("Site"),_o=y("SiteDomain"),To=y("SmsOptOut"),So=y("EmailIdempotency"),Ro=y("EmailSuppression"),Po=y("EmailWebhookEvent"),Ao=y("Error"),xo=y("GiftCard"),Oo=y("Label"),Co=y("LicenseKey"),Do=y("Log"),vo=y("LoyaltyPoint"),Mo=y("LoyaltyReward"),Eo=y("MailPreference"),Fo=y("Manufacturer"),$o=y("Notification"),Io=y("NotificationDelivery"),jo=y("Order"),No=y("OrderIdempotency"),Bo=y("OrderItem"),qo=y("Page"),Uo=y("Payment"),Lo=y("PaymentMethod"),Ko=y("PaymentProduct"),Qo=y("PaymentTransaction"),Wo=y("Post"),Vo=y("PrintDevice"),zo=y("Product"),Ho=y("ProductUnit"),Go=y("ProductVariant"),Jo=y("QueryLog"),Yo=y("Receipt"),Xo=y("Release"),Zo=y("Request"),ea=y("Review"),ta=y("ShippingMethod"),na=y("ShippingRate"),ra=y("ShippingZone"),oa=y("SocialPost"),aa=y("SocialAccount"),ia=y("Subscriber"),sa=y("SubscriberEmail"),ca=y("Subscription"),ua=y("Tag"),la=y("TaxRate"),da=y("Team"),fa=y("TeamInvitation"),pa=y("TeamMember"),ma=y("Transaction"),ya=y("WaitlistProduct"),ga=y("WaitlistRestaurant"),ba=y("Websocket"),St={User:xr,Job:Or,FailedJob:Cr,Activity:vr,AnalyticsEvent:Mr,Automation:Er,AutomationRun:Fr,Auction:$r,AuctionItem:Ur,Author:Lr,Bid:Kr,Board:Qr,BoardColumn:Wr,Campaign:Vr,CampaignSend:so,CampaignVariant:Ir,Card:zr,CardComment:Hr,Cart:Gr,CartItem:Jr,Category:Yr,Comment:Xr,Coupon:Zr,Customer:eo,CommunicationSuppression:jr,ConsentEvent:Nr,DeliveryRoute:to,DeliveryStop:no,Deployment:ro,DigitalDelivery:oo,Courier:ao,CourierPing:io,EmailList:co,EmailListSubscriber:uo,EmailIdempotency:So,EmailSuppression:Ro,EmailWebhookEvent:Po,ErrorModel:Ao,Form:lo,FormField:fo,FormSubmission:po,GiftCard:xo,Label:Oo,LicenseKey:Co,Log:Do,LoyaltyPoint:vo,LoyaltyReward:Mo,MailPreference:Eo,Manufacturer:Fo,Notification:$o,MagicLinkToken:mo,Menu:yo,MenuItem:go,NotificationDelivery:Io,Order:jo,OrderIdempotency:No,OrderItem:Bo,Page:qo,PageRevision:bo,Payment:Uo,PaymentMethod:Lo,PaymentProduct:Ko,PaymentTransaction:Qo,Pledge:wo,Post:Wo,PrintDevice:Vo,Product:zo,ProductUnit:Ho,ProductVariant:Go,QueryLog:Jo,Receipt:Yo,Release:Xo,Request:Zo,Review:ea,ShippingMethod:ta,Redirect:ho,SenderDomain:Br,ShippingRate:na,ShippingZone:ra,Site:ko,SiteDomain:_o,SmsOptOut:To,SocialAccount:aa,SocialPost:oa,Subscriber:ia,SubscriberEmail:sa,Subscription:ca,Tag:ua,TaxRate:la,Team:da,TeamInvitation:fa,TeamMember:pa,Transaction:ma,UsageEvent:qr,WaitlistProduct:ya,WaitlistRestaurant:ga,Websocket:ba},j=globalThis;for(let[e,n]of Object.entries(St))if(n&&j[e]===void 0)j[e]=n;var ts=Object.keys(St);async function wa(e){if(!e)return[];try{if(typeof e.all==="function"){let n=await e.all();return Array.isArray(n)?n:[]}if(typeof e.get==="function"){let n=await e.get();return Array.isArray(n)?n:[]}}catch{}return[]}function ha(e,n,t=""){if(!e)return t;try{if(typeof e.get==="function"){let o=e.get(n);if(o!==void 0&&o!==null)return o}}catch{}let r=e?.[n];return r!==void 0&&r!==null?r:t}if(j.safeAll===void 0)j.safeAll=wa;if(j.safeGet===void 0)j.safeGet=ha;export{vr as Activity,Mr as AnalyticsEvent,$r as Auction,Ur as AuctionItem,Lr as Author,Er as Automation,Fr as AutomationRun,Kr as Bid,Qr as Board,Wr as BoardColumn,Vr as Campaign,so as CampaignSend,Ir as CampaignVariant,zr as Card,Hr as CardComment,Gr as Cart,Jr as CartItem,Yr as Category,Xr as Comment,jr as CommunicationSuppression,Nr as ConsentEvent,Zr as Coupon,ao as Courier,io as CourierPing,eo as Customer,to as DeliveryRoute,no as DeliveryStop,ro as Deployment,oo as DigitalDelivery,So as EmailIdempotency,co as EmailList,uo as EmailListSubscriber,Ro as EmailSuppression,Po as EmailWebhookEvent,Ao as ErrorModel,Cr as FailedJob,lo as Form,fo as FormField,po as FormSubmission,xo as GiftCard,Or as Job,Oo as Label,Co as LicenseKey,Do as Log,vo as LoyaltyPoint,Mo as LoyaltyReward,Ce as MODEL_DEFINITION,mo as MagicLinkToken,Eo as MailPreference,Fo as Manufacturer,Ae as MassAssignmentException,yo as Menu,go as MenuItem,dt as ModelNotFoundError,ct as ModelValidationError,$o as Notification,Io as NotificationDelivery,jo as Order,No as OrderIdempotency,Bo as OrderItem,qo as Page,bo as PageRevision,Uo as Payment,Lo as PaymentMethod,Ko as PaymentProduct,Qo as PaymentTransaction,wo as Pledge,Wo as Post,Vo as PrintDevice,zo as Product,Ho as ProductUnit,Go as ProductVariant,Jo as QueryLog,Yo as Receipt,ho as Redirect,Xo as Release,Zo as Request,ea as Review,Br as SenderDomain,ta as ShippingMethod,na as ShippingRate,ra as ShippingZone,ko as Site,_o as SiteDomain,To as SmsOptOut,aa as SocialAccount,oa as SocialPost,sn as SubqueryBuilder,ia as Subscriber,sa as SubscriberEmail,ca as Subscription,ua as Tag,la as TaxRate,da as Team,fa as TeamInvitation,pa as TeamMember,ma as Transaction,qr as UsageEvent,xr as User,ya as WaitlistProduct,ga as WaitlistRestaurant,ba as Websocket,oi as batchLoad,Sr as buildDatabaseSchema,ie as collectEncryptedAttributes,Ie as createAuditMethods,me as createCategorizableMethods,de as createCommentableMethods,ye as createLikeableMethods,pe as createTaggableMethods,en as customerOwnership,ci as db,ae as decryptValue,pt as defineModel,oe as encryptValue,Te as enrichPaginatorUrls,Ui as extendModel,Wt as filterFillable,Ra as getPrunableConfig,Qt as getWritableFields,Ss as isCursorPaginator,N as isEncrypted,Rs as isPaginator,Ps as isSimplePaginator,Le as isUniqueViolation,Lt as mapWriteError,Sa as massPrunable,Yn as mergeModelDefinition,ts as modelGlobalNames,es as ormReady,on as parentOwnership,Ve as parseCursor,Oe as projectDocumentsFromTrait,Rt as prunable,Rr as renderDatabaseTypeFile,_e as resolveCursorArgs,ke as resolvePageArgs,fi as savepoint,tn as selfOwnership,Mt as setAuditUser,nn as siteOwnership,rn as teamMembershipOwnership,Wn as toAttrs,As as toCursorPaginator,xs as toPaginator,Os as toSimplePaginator,Kt as toSnakeCaseKeys,di as transaction,pi as transactional,M as withoutEvents,_n as withoutValidation};
|
|
18
|
+
`;function bt(e){return e==="framework"?_r:hr}function wt(e){return e==="framework"?Tr:kr}async function ht(e,n,t=[]){let r=[];if(!W.existsSync(e))return r;let o=W.readdirSync(e,{withFileTypes:!0});for(let a of o){let s=R.join(e,a.name);if(a.isDirectory()){if(n){let i=await ht(s,!0,t);r.push(...i)}continue}if(!a.name.endsWith(".ts"))continue;if(a.name.startsWith("_")||a.name.startsWith("index"))continue;try{let i=await(R.isAbsolute(s)?import(s):import(R.resolve(s))),u=i.default||i;if(u?.name&&(u.attributes||u.table))r.push({filePath:s,model:u})}catch(i){t.push({file:s,error:i.message})}}return r}async function Sr(e={}){let n=sr(e.dialect),t=e.modelsDir??R.userModelsPath(),r=e.defaultsDir??R.frameworkPath("defaults/app/Models"),o=e.outFile??R.projectPath("database/types.d.ts"),a=[],s=[];for(let[p,g]of[[t,!1],[r,!0]])try{let w=await ht(p,g,a);s.push(...w)}catch(w){a.push({file:p,error:w.message})}let i=new Map;for(let p of s)i.set(p.model.name??R.basename(p.filePath).replace(/\.ts$/,""),p);for(let p of s)if(p.filePath.startsWith(t))i.set(p.model.name??R.basename(p.filePath).replace(/\.ts$/,""),p);let u=[];for(let[p,{model:g}]of i){let w=g.table??`${O(p)}s`,b={...br(g,n),...wr(g,n),...fr(g)};u.push({table:w,model:p,columns:b})}let c=new Map;for(let[p,{model:g}]of i)for(let w of yr(p,g,n)){if(c.has(w.table))continue;c.set(w.table,{table:w.table,model:`(${w.table} pivot)`,columns:w.columns})}if(u.push(...c.values()),e.migrationsDir!==!1){let p=e.migrationsDir??R.resolve(R.dirname(o),"migrations"),g=new Set(u.map((b)=>b.table)),w=yt(p,n);for(let b of w.tables){if(g.has(b.table))continue;g.add(b.table),u.push({table:b.table,model:`(${b.table} migration)`,columns:b.columns})}a.push(...w.errors)}u.sort((p,g)=>p.table.localeCompare(g.table));let l=e.target??"app",f=l==="framework"?1:2,d=u.map((p)=>gt(p.table,p.columns,f)).join(`
|
|
19
|
+
`),m=`${bt(l)}${d}
|
|
20
|
+
${wt(l)}`;if(!e.dryRun){let p=R.dirname(o);if(!W.existsSync(p))W.mkdirSync(p,{recursive:!0});W.writeFileSync(o,m,"utf-8"),ir.success(`[generate:db-types] wrote ${u.length} table(s) to ${o}`)}return{outFile:o,tables:u,errors:a,content:m}}function Rr(e,n="app"){let t=[...e].sort((r,o)=>r.table.localeCompare(o.table)).map((r)=>gt(r.table,r.columns,n==="framework"?1:2)).join(`
|
|
21
|
+
`);return`${bt(n)}${t}
|
|
22
|
+
${wt(n)}`}import{isCursorPaginator as Ss,isPaginator as Rs,isSimplePaginator as Ps,toCursorPaginator as As,toPaginator as xs,toSimplePaginator as Os}from"@stacksjs/pagination";import{configureOrm as Pr}from"@stacksjs/query-builder";function Ar(){try{let e=process.env.DB_DATABASE_PATH||"database/stacks.sqlite";if((process.env.DB_CONNECTION||"sqlite")==="sqlite")Pr({database:e})}catch{}}Ar();async function kt(e){for(let n=0;;n++){let t=await import(e);try{return t.default}catch(r){if(n<5&&r instanceof ReferenceError&&/before initialization/.test(r.message)){await new Promise((o)=>setTimeout(o,0));continue}throw r}}}async function te(e,n=[""]){let{path:t}=await import("@stacksjs/path"),r=t.userModelsPath(`${e}.ts`);try{if(await Bun.file(r).exists())return await kt(r)}catch(o){console.error(`[orm] Failed to import userland model ${e} from ${r} - falling back to framework default. Reason:`,o)}for(let o of n){let a=o?`${o}/`:"",s=t.frameworkPath(`defaults/app/Models/${a}${e}.ts`);try{if(await Bun.file(s).exists())return await kt(s)}catch(i){console.error(`[orm] Failed to import framework default model ${e} from ${s} - trying next subdir. Reason:`,i)}}return null}var C={},_t=()=>{},es=new Promise((e)=>{_t=e});function y(e){return new Proxy(function(){},{get(n,t){if(t==="then")return;let r=C[e];if(r==null)return;let o=r[t];return typeof o==="function"?o.bind(r):o},set(n,t,r){let o=C[e];if(o==null)return!1;return o[t]=r,!0},has(n,t){let r=C[e];return r==null?!1:(t in r)},apply(n,t,r){let o=C[e];if(o==null||typeof o!=="function")return;return o.apply(t,r)}})}var xr=y("User"),Or=y("Job"),Cr=y("FailedJob"),Dr=[["Team",[""],"auth"],["TeamInvitation",[""],"auth"],["TeamMember",[""],"auth"],["SocialAccount",[""],"auth"],["Subscriber",[""],"auth"],["SubscriberEmail",[""],"auth"],["Subscription",[""],"auth"],["Post",["Content"],"cms"],["Page",["Content"],"cms"],["PageRevision",["Content"],"cms"],["Redirect",["Content"],"cms"],["Menu",["Content"],"cms"],["MenuItem",["Content"],"cms"],["Author",["Content"],"cms"],["Comment",[""],"cms"],["Tag",[""],"cms"],["Site",[""],"auth"],["SiteDomain",[""],"auth"],["MagicLinkToken",[""],"auth"],["SmsOptOut",[""],"auth"],["Form",["Forms"],"forms"],["FormField",["Forms"],"forms"],["FormSubmission",["Forms"],"forms"],["Activity",[""],"dashboard"],["Board",[""],"dashboard"],["BoardColumn",[""],"dashboard"],["Card",[""],"dashboard"],["CardComment",[""],"dashboard"],["Deployment",[""],"dashboard"],["Label",[""],"dashboard"],["Release",[""],"dashboard"],["Notification",[""],"dashboard"],["NotificationDelivery",[""],"dashboard"],["MailPreference",[""],"dashboard"],["Log",[""],"dashboard"],["Request",[""],"dashboard"],["AnalyticsEvent",[""],"dashboard"],["QueryLog",[""],"dashboard"],["Error",[""],"monitoring"],["Websocket",["realtime"],"realtime"],["Campaign",[""],"marketing"],["CampaignSend",[""],"marketing"],["EmailList",[""],"marketing"],["EmailListSubscriber",[""],"marketing"],["EmailIdempotency",[""],"marketing"],["EmailSuppression",[""],"marketing"],["EmailWebhookEvent",[""],"marketing"],["SocialPost",[""],"marketing"],["Automation",[""],"marketing"],["AutomationRun",[""],"marketing"],["CampaignVariant",[""],"marketing"],["CommunicationSuppression",[""],"marketing"],["ConsentEvent",[""],"marketing"],["SenderDomain",[""],"marketing"],["UsageEvent",[""],"marketing"],["PaymentMethod",[""],"commerce"],["PaymentProduct",[""],"commerce"],["PaymentTransaction",[""],"commerce"],["Order",["commerce"],"commerce"],["OrderIdempotency",["commerce"],"commerce"],["OrderItem",["commerce"],"commerce"],["Cart",["commerce"],"commerce"],["CartItem",["commerce"],"commerce"],["Customer",["commerce"],"commerce"],["Product",["commerce"],"commerce"],["ProductVariant",["commerce"],"commerce"],["ProductUnit",["commerce"],"commerce"],["Manufacturer",["commerce"],"commerce"],["Category",["commerce"],"commerce"],["Coupon",["commerce"],"commerce"],["GiftCard",["commerce"],"commerce"],["LicenseKey",["commerce"],"commerce"],["Review",["commerce"],"commerce"],["Receipt",["commerce"],"commerce"],["PrintDevice",["commerce"],"commerce"],["ShippingMethod",["commerce"],"commerce"],["ShippingRate",["commerce"],"commerce"],["ShippingZone",["commerce"],"commerce"],["DeliveryRoute",["commerce"],"commerce"],["DeliveryStop",["commerce"],"commerce"],["DigitalDelivery",["commerce"],"commerce"],["Courier",["commerce"],"commerce"],["CourierPing",["commerce"],"commerce"],["TaxRate",["commerce"],"commerce"],["WaitlistProduct",["commerce"],"commerce"],["WaitlistRestaurant",["commerce"],"commerce"],["Auction",["commerce"],"commerce"],["AuctionItem",["commerce"],"commerce"],["Bid",["commerce"],"commerce"],["Pledge",["commerce"],"commerce"],["LoyaltyPoint",["commerce"],"commerce"],["LoyaltyReward",["commerce"],"commerce"],["Payment",["commerce"],"commerce"],["Transaction",["commerce"],"commerce"]];queueMicrotask(async()=>{try{let{feature:e}=await import("@stacksjs/config"),n=await te("User");if(n)C.User=n;if(e("queue")){let t=await te("Job");if(t)C.Job=t;let r=await te("FailedJob");if(r)C.FailedJob=r}for(let[t,r,o]of Dr){if(!e(o))continue;let a=await te(t,r);if(a)C[t]=a}}catch(e){console.error("[orm] deferred model load failed:",e)}finally{_t()}});var vr=y("Activity"),Mr=y("AnalyticsEvent"),Er=y("Automation"),Fr=y("AutomationRun"),$r=y("Auction"),Ir=y("CampaignVariant"),jr=y("CommunicationSuppression"),Nr=y("ConsentEvent"),Br=y("SenderDomain"),qr=y("UsageEvent"),Ur=y("AuctionItem"),Lr=y("Author"),Kr=y("Bid"),Qr=y("Board"),Wr=y("BoardColumn"),Vr=y("Campaign"),zr=y("Card"),Hr=y("CardComment"),Gr=y("Cart"),Jr=y("CartItem"),Yr=y("Category"),Xr=y("Comment"),Zr=y("Coupon"),eo=y("Customer"),to=y("DeliveryRoute"),no=y("DeliveryStop"),ro=y("Deployment"),oo=y("DigitalDelivery"),ao=y("Courier"),io=y("CourierPing"),so=y("CampaignSend"),co=y("EmailList"),uo=y("EmailListSubscriber"),lo=y("Form"),fo=y("FormField"),po=y("FormSubmission"),mo=y("MagicLinkToken"),yo=y("Menu"),go=y("MenuItem"),bo=y("PageRevision"),wo=y("Pledge"),ho=y("Redirect"),ko=y("Site"),_o=y("SiteDomain"),To=y("SmsOptOut"),So=y("EmailIdempotency"),Ro=y("EmailSuppression"),Po=y("EmailWebhookEvent"),Ao=y("Error"),xo=y("GiftCard"),Oo=y("Label"),Co=y("LicenseKey"),Do=y("Log"),vo=y("LoyaltyPoint"),Mo=y("LoyaltyReward"),Eo=y("MailPreference"),Fo=y("Manufacturer"),$o=y("Notification"),Io=y("NotificationDelivery"),jo=y("Order"),No=y("OrderIdempotency"),Bo=y("OrderItem"),qo=y("Page"),Uo=y("Payment"),Lo=y("PaymentMethod"),Ko=y("PaymentProduct"),Qo=y("PaymentTransaction"),Wo=y("Post"),Vo=y("PrintDevice"),zo=y("Product"),Ho=y("ProductUnit"),Go=y("ProductVariant"),Jo=y("QueryLog"),Yo=y("Receipt"),Xo=y("Release"),Zo=y("Request"),ea=y("Review"),ta=y("ShippingMethod"),na=y("ShippingRate"),ra=y("ShippingZone"),oa=y("SocialPost"),aa=y("SocialAccount"),ia=y("Subscriber"),sa=y("SubscriberEmail"),ca=y("Subscription"),ua=y("Tag"),la=y("TaxRate"),da=y("Team"),fa=y("TeamInvitation"),pa=y("TeamMember"),ma=y("Transaction"),ya=y("WaitlistProduct"),ga=y("WaitlistRestaurant"),ba=y("Websocket"),Tt={User:xr,Job:Or,FailedJob:Cr,Activity:vr,AnalyticsEvent:Mr,Automation:Er,AutomationRun:Fr,Auction:$r,AuctionItem:Ur,Author:Lr,Bid:Kr,Board:Qr,BoardColumn:Wr,Campaign:Vr,CampaignSend:so,CampaignVariant:Ir,Card:zr,CardComment:Hr,Cart:Gr,CartItem:Jr,Category:Yr,Comment:Xr,Coupon:Zr,Customer:eo,CommunicationSuppression:jr,ConsentEvent:Nr,DeliveryRoute:to,DeliveryStop:no,Deployment:ro,DigitalDelivery:oo,Courier:ao,CourierPing:io,EmailList:co,EmailListSubscriber:uo,EmailIdempotency:So,EmailSuppression:Ro,EmailWebhookEvent:Po,ErrorModel:Ao,Form:lo,FormField:fo,FormSubmission:po,GiftCard:xo,Label:Oo,LicenseKey:Co,Log:Do,LoyaltyPoint:vo,LoyaltyReward:Mo,MailPreference:Eo,Manufacturer:Fo,Notification:$o,MagicLinkToken:mo,Menu:yo,MenuItem:go,NotificationDelivery:Io,Order:jo,OrderIdempotency:No,OrderItem:Bo,Page:qo,PageRevision:bo,Payment:Uo,PaymentMethod:Lo,PaymentProduct:Ko,PaymentTransaction:Qo,Pledge:wo,Post:Wo,PrintDevice:Vo,Product:zo,ProductUnit:Ho,ProductVariant:Go,QueryLog:Jo,Receipt:Yo,Release:Xo,Request:Zo,Review:ea,ShippingMethod:ta,Redirect:ho,SenderDomain:Br,ShippingRate:na,ShippingZone:ra,Site:ko,SiteDomain:_o,SmsOptOut:To,SocialAccount:aa,SocialPost:oa,Subscriber:ia,SubscriberEmail:sa,Subscription:ca,Tag:ua,TaxRate:la,Team:da,TeamInvitation:fa,TeamMember:pa,Transaction:ma,UsageEvent:qr,WaitlistProduct:ya,WaitlistRestaurant:ga,Websocket:ba},I=globalThis;for(let[e,n]of Object.entries(Tt))if(n&&I[e]===void 0)I[e]=n;var ts=Object.keys(Tt);async function wa(e){if(!e)return[];try{if(typeof e.all==="function"){let n=await e.all();return Array.isArray(n)?n:[]}if(typeof e.get==="function"){let n=await e.get();return Array.isArray(n)?n:[]}}catch{}return[]}function ha(e,n,t=""){if(!e)return t;try{if(typeof e.get==="function"){let o=e.get(n);if(o!==void 0&&o!==null)return o}}catch{}let r=e?.[n];return r!==void 0&&r!==null?r:t}if(I.safeAll===void 0)I.safeAll=wa;if(I.safeGet===void 0)I.safeGet=ha;export{vr as Activity,Mr as AnalyticsEvent,$r as Auction,Ur as AuctionItem,Lr as Author,Er as Automation,Fr as AutomationRun,Kr as Bid,Qr as Board,Wr as BoardColumn,Vr as Campaign,so as CampaignSend,Ir as CampaignVariant,zr as Card,Hr as CardComment,Gr as Cart,Jr as CartItem,Yr as Category,Xr as Comment,jr as CommunicationSuppression,Nr as ConsentEvent,Zr as Coupon,ao as Courier,io as CourierPing,eo as Customer,to as DeliveryRoute,no as DeliveryStop,ro as Deployment,oo as DigitalDelivery,So as EmailIdempotency,co as EmailList,uo as EmailListSubscriber,Ro as EmailSuppression,Po as EmailWebhookEvent,Ao as ErrorModel,Cr as FailedJob,lo as Form,fo as FormField,po as FormSubmission,xo as GiftCard,Or as Job,Oo as Label,Co as LicenseKey,Do as Log,vo as LoyaltyPoint,Mo as LoyaltyReward,Oe as MODEL_DEFINITION,mo as MagicLinkToken,Eo as MailPreference,Fo as Manufacturer,Pe as MassAssignmentException,yo as Menu,go as MenuItem,lt as ModelNotFoundError,st as ModelValidationError,$o as Notification,Io as NotificationDelivery,jo as Order,No as OrderIdempotency,Bo as OrderItem,qo as Page,bo as PageRevision,Uo as Payment,Lo as PaymentMethod,Ko as PaymentProduct,Qo as PaymentTransaction,wo as Pledge,Wo as Post,Vo as PrintDevice,zo as Product,Ho as ProductUnit,Go as ProductVariant,Jo as QueryLog,Yo as Receipt,ho as Redirect,Xo as Release,Zo as Request,ea as Review,Br as SenderDomain,ta as ShippingMethod,na as ShippingRate,ra as ShippingZone,ko as Site,_o as SiteDomain,To as SmsOptOut,aa as SocialAccount,oa as SocialPost,sn as SubqueryBuilder,ia as Subscriber,sa as SubscriberEmail,ca as Subscription,ua as Tag,la as TaxRate,da as Team,fa as TeamInvitation,pa as TeamMember,ma as Transaction,qr as UsageEvent,xr as User,ya as WaitlistProduct,ga as WaitlistRestaurant,ba as Websocket,oi as batchLoad,Sr as buildDatabaseSchema,ae as collectEncryptedAttributes,$e as createAuditMethods,pe as createCategorizableMethods,le as createCommentableMethods,me as createLikeableMethods,fe as createTaggableMethods,en as customerOwnership,ci as db,oe as decryptValue,ft as defineModel,re as encryptValue,_e as enrichPaginatorUrls,Ui as extendModel,Wt as filterFillable,Ra as getPrunableConfig,Qt as getWritableFields,Ss as isCursorPaginator,j as isEncrypted,Rs as isPaginator,Ps as isSimplePaginator,Ue as isUniqueViolation,Lt as mapWriteError,Sa as massPrunable,Yn as mergeModelDefinition,ts as modelGlobalNames,es as ormReady,on as parentOwnership,We as parseCursor,xe as projectDocumentsFromTrait,Rt as prunable,Rr as renderDatabaseTypeFile,ke as resolveCursorArgs,he as resolvePageArgs,fi as savepoint,tn as selfOwnership,Mt as setAuditUser,nn as siteOwnership,rn as teamMembershipOwnership,Wn as toAttrs,As as toCursorPaginator,xs as toPaginator,Os as toSimplePaginator,Kt as toSnakeCaseKeys,di as transaction,pi as transactional,v as withoutEvents,_n as withoutValidation};
|
package/dist/routes.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
var H=import.meta.require;import dt from"process";import{route as U}from"@stacksjs/router";import{env as J}from"@stacksjs/env";import{projectPath as Se,storagePath as ft}from"@stacksjs/path";import{createQueryBuilder as gt,defaultConfig as We,setConfig as Le}from"@stacksjs/query-builder";import{HttpError as B}from"@stacksjs/error-handling";import{log as V}from"@stacksjs/logging";function et(e){let t=e;return t?.code==="SQLITE_CONSTRAINT_UNIQUE"||t?.code==="SQLITE_CONSTRAINT"||t?.code==="23505"||t?.errno===1062||/unique|duplicate/i.test(t?.message??"")}function fe(e,t,n){let r=e;if(e instanceof Error&&typeof r.status==="number"&&Number.isInteger(r.status)&&r.status>=400&&r.status<600){let s={error:e.message};if(r.details!==void 0)s.details=r.details;return{status:r.status,body:s}}if(et(e))return{status:409,body:{error:`${t} already exists`}};return{status:500,body:{error:`Failed to ${n} ${t}`,detail:String(e)}}}function _(e){return e.replace(/([a-z\d])([A-Z])/g,"$1_$2").replace(/([A-Z])([A-Z][a-z])/g,"$1_$2").toLowerCase()}function ge(e){let t={};for(let[n,r]of Object.entries(e))t[_(n)]=r;return t}function Ae(e,t){let n=String(t||"").replace(/^\/+|\/+$/g,""),r=String(e).replace(/^\/+/,"");return`/api/${n?`${n}/`:""}${r}`}function Pe(e){if(!e)return null;let t=e.attributes??{};if(Object.prototype.hasOwnProperty.call(t,"teamId")||Object.prototype.hasOwnProperty.call(t,"team_id"))return"team_id";return e.belongsTo?.some((n)=>n==="Team")?"team_id":null}function De(e){if(!e)return null;let t=e.attributes??{};if(Object.prototype.hasOwnProperty.call(t,"userId")||Object.prototype.hasOwnProperty.call(t,"user_id"))return"user_id";return e.belongsTo?.some((n)=>n==="User")?"user_id":null}function $e(e){return e?.ownership===!1}function Ie(e,t,n){let r=Object.keys(e).find((o)=>_(o)===_(t));if(Array.isArray(n)){if(r===void 0)return{data:e,error:"Ownership value is required"};if(!n.some((o)=>String(o)===String(e[r])))return{data:e,error:"Ownership value is not available to this caller"};return{data:{...e,[t]:e[r]}}}if(n===null||n===void 0)return{data:e,error:"Caller has no ownership identity"};let s={...e};for(let o of Object.keys(s))if(_(o)===_(t))delete s[o];return s[t]=n,{data:s}}function Ne(e){if(!e)return[];let t=Object.entries(e.attributes??{}).filter(([,n])=>n?.fillable===!0).map(([n])=>n);for(let n of e.belongsTo??[]){if(typeof n!=="string"||!n.trim())continue;let r=_(n.trim()).split("_").filter(Boolean);if(r.length===0)continue;let s=`${r[0]}${r.slice(1).map((o)=>`${o[0]?.toUpperCase()}${o.slice(1)}`).join("")}Id`;t.push(s)}return[...new Set(t)]}function pe(e,t){if(!e||t.length===0)return{};let n={};for(let r of t){if(r in e){n[r]=e[r];continue}let s=_(r);if(s!==r&&s in e)n[r]=e[s]}return n}function tt(e,t){if(e?.name!=="date"||t instanceof Date||typeof t!=="string")return t;let n=/^(\d{4})-(\d{2})-(\d{2})$/.exec(t);if(!n)return t;let r=Number(n[1]),s=Number(n[2]),o=Number(n[3]),a=new Date(Date.UTC(r,s-1,o));if(a.getUTCFullYear()!==r||a.getUTCMonth()!==s-1||a.getUTCDate()!==o)return t;return a}function ye(e,t){if(!t.length)return e;let n={...e};for(let r of t)delete n[r],delete n[_(r)];return n}function Y(e,t){if(!e||t.length===0)return e;let n={...e};for(let r of t)delete n[r],delete n[_(r)];return n}var nt=["id","uuid","created_at","updated_at","deleted_at"];function ve(e,t){let n=new Map;for(let r of[...Object.keys(e??{}),...nt]){let s=_(r);if(!/^\w+$/.test(s))continue;n.set(r,s),n.set(s,s)}for(let r of t)n.delete(r),n.delete(_(r));return n}function Ce(e,t,n){if(!t)return e;let r=String(t).split(",").map((o)=>o.trim()).filter(Boolean),s=e;for(let o of r){let a=o.startsWith("-"),l=a?o.slice(1):o;if(!/^\w+$/.test(l))continue;let w=n.get(l);if(!w)continue;s=s.orderBy(w,a?"desc":"asc")}return s}var rt={string:{get:(e)=>e!=null?String(e):null,set:(e)=>e!=null?String(e):null},number:{get:(e)=>e!=null?Number(e):null,set:(e)=>e!=null?Number(e):null},integer:{get:(e)=>e!=null?Math.trunc(Number(e)):null,set:(e)=>e!=null?Math.trunc(Number(e)):null},float:{get:(e)=>e!=null?Number.parseFloat(String(e)):null,set:(e)=>e!=null?Number.parseFloat(String(e)):null},boolean:{get:(e)=>e===1||e==="1"||e===!0||e==="true",set:(e)=>e===!0||e===1||e==="1"||e==="true"?1:0},json:{get:(e)=>e==null?null:typeof e==="string"?st(e):e,set:(e)=>e==null?null:typeof e==="string"?e:JSON.stringify(e)},datetime:{get:(e)=>e?new Date(e):null,set:(e)=>e instanceof Date?e.toISOString():e},date:{get:(e)=>e?new Date(e):null,set:(e)=>e instanceof Date?e.toISOString().split("T")[0]:e},array:{get:(e)=>e==null?[]:Array.isArray(e)?e:typeof e==="string"?ot(e):[],set:(e)=>e==null?null:Array.isArray(e)?JSON.stringify(e):e}};function st(e){try{return JSON.parse(e)}catch{return e}}function ot(e){try{return JSON.parse(e)}catch{return[]}}function me(e,t,n){if(!e||typeof e!=="object"||!t||Object.keys(t).length===0)return e;let r={...e};for(let[s,o]of Object.entries(t)){let a=typeof o==="string"?rt[o]:o;if(!a||typeof a[n]!=="function")continue;if(Object.prototype.hasOwnProperty.call(r,s))r[s]=a[n](r[s]);let l=_(s);if(l!==s&&Object.prototype.hasOwnProperty.call(r,l))r[l]=a[n](r[l])}return r}function we(e,t,n){let r=t?.attributes??{},s={};for(let[o,a]of Object.entries(r)){let l=a?.validation?.rule;if(!l||typeof l.validate!=="function")continue;let w=Object.prototype.hasOwnProperty.call(e,o);if(!w&&n==="updating")continue;let c=a!==null&&typeof a==="object"&&Object.prototype.hasOwnProperty.call(a,"default"),P=w?e[o]:c?a.default:void 0,v=tt(l,P),D=l.validate(v);if(!D?.valid&&Array.isArray(D?.errors)&&D.errors.length>0)s[o]=D.errors.map((Q)=>a?.validation?.message?.[Q?.code]??Q?.message??"invalid")}return Object.keys(s).length===0?{valid:!0}:{valid:!1,errors:s}}function Ee(e,t,n){let r=Oe(n);return e.find((s)=>s.method===t&&Oe(String(s.path??""))===r)}function Oe(e){return e.replace(/\{[^}]*\}/g,"{}").replace(/:[^/]+/g,"{}")}function de(e){if(Array.isArray(e))return e.filter((t)=>typeof t==="string"&&t.length>0);return typeof e==="string"&&e?[e]:[]}function je(e){let t=typeof e==="object"&&e!==null&&"middleware"in e,n=e?.middleware;if(!t)return{read:["auth"],write:["auth"],declared:!1};if(n&&typeof n==="object"&&!Array.isArray(n)){let s=n;return{read:"read"in s?de(s.read):["auth"],write:"write"in s?de(s.write):["auth"],declared:!0}}let r=de(n);return{read:r,write:r,declared:!0}}var Te=15,it=100;function Me(e){let t=Number.parseInt(e.get("page")||String(1),10),n=Number.isFinite(t)?Math.max(1,t):1,r=Number.parseInt(e.get("per_page")||String(Te),10),s=Math.min(Number.isFinite(r)?Math.max(1,r):Te,it);return{page:n,perPage:s,offset:(n-1)*s}}function ie(e,t){let n=new URL(e.toString());return n.searchParams.set("page",String(t)),`${n.pathname}${n.search}`}function ae(e,t,n,r,s,o){let a=(t-1)*n,l=r===0,w={page:t,per_page:n,from:l?null:a+1,to:l?null:a+r,has_more_pages:s,prev_page_url:t>1?ie(e,t-1):null,next_page_url:s?ie(e,t+1):null};if(o!==void 0&&!Number.isNaN(o)){let c=Math.max(1,Math.ceil(o/n));w.total=o,w.last_page=c,w.first_page_url=ie(e,1),w.last_page_url=ie(e,c)}return w}function he(e,t,n,r,s,o){let{page:a,...l}=ae(e,t,n,r,s,o);return{current_page:a,...l}}function be(e,t){return(t??e??"").toString().trim().toLowerCase()==="warn"?"warn":"deny"}function Fe(e,t){if(e.length===0)return null;let n=[...e].sort().join(", ");if(t==="deny")return`[orm] security.api.rowScoping is 'deny': NOT registering store/update/destroy for ${e.length} model(s) `+`with no row-level scoping \u2014 ${n}. Give a model an \`ownership\` config or a \`team_id\` column to restore its writes.`;return`[orm] ${e.length} model(s) publish mutating routes with no row-level scoping, so an authenticated caller can write any row \u2014 `+`${n}. Scope one with an \`ownership\` config or a \`team_id\` column; intended for public catalog tables. Set \`security.api.rowScoping: 'deny'\` (config/security.ts) to stop generating these routes instead.`}import{readdirSync as at}from"fs";import{basename as ut,extname as Be,join as lt}from"path";function ct(e){let t=[],n=(r)=>{let s;try{s=at(r,{withFileTypes:!0})}catch{return}for(let o of s){let a=lt(r,o.name);if(o.isDirectory()){n(a);continue}if(![".ts",".js"].includes(Be(o.name)))continue;if(o.name.startsWith(".")||o.name.startsWith("index"))continue;t.push(a)}};return n(e),t.sort()}async function Ue(e,t,n){for(let r of ct(e))try{let s=Be(r),o=await import(`${r}?t=${Date.now()}`),a=o.default??o,l=a.name??ut(r,s);t[l]={...a,name:l}}catch(s){n?.(r,s)}}async function Qe(e){let t={};return await Ue(e.defaultsRoot,t,e.onImportError),await Ue(e.userRoot,t,e.onImportError),t}function ue(e){if(e?.ownership===!1)return null;if(e?.ownership)return e.ownership;let t=Pe(e);if(t)return{field:t,resolve:async(r,s)=>{let{resolveAuthenticatedTeamId:o}=await import("@stacksjs/auth");return o(Re(s))}};let n=De(e);if(n)return{field:n,resolve:async(r)=>r?.id??null};return null}function Re(e){let t=e?.headers?.get?.("authorization"),n=t&&/^Bearer\s+/i.test(t)?t.replace(/^Bearer\s+/i,"").trim():null,r=e?.headers?.get?.("cookie")||"";return{bearerToken:()=>n,cookies:{get:(s)=>{for(let o of r.split(";")){let a=o.indexOf("=");if(a===-1)continue;if(o.slice(0,a).trim()===s)return decodeURIComponent(o.slice(a+1).trim())}return null}}}}function xt(e="customer_id"){return{field:e,resolve:async(t)=>{let n=t?.id;if(n==null)return null;try{let{Customer:r}=await import("@stacksjs/orm");return(await r.where("user_id",n).first())?.id??null}catch{return null}}}}function Ot(e="id"){return{field:e,resolve:async(t)=>t?.id??null}}function Tt(e="site_id"){return{field:e,resolve:async(t,n)=>{try{let[{resolveAuthenticatedTeamId:r},{Site:s}]=await Promise.all([import("@stacksjs/auth"),import("@stacksjs/orm")]),o=await r(Re(n));if(o==null)return[];return(await s.where("team_id",o).get()??[]).map((l)=>l.id).filter((l)=>l!=null)}catch{return[]}}}}function At(e="id"){return{field:e,resolve:async(t,n)=>{try{let{resolveAuthenticatedTeamId:r}=await import("@stacksjs/auth");return await r(Re(n))}catch{return null}}}}function Pt(e,t){return{field:t,resolve:async(n,r)=>{try{let s=await import("@stacksjs/orm"),o=s.models?.[e]??s[e]?.definition??null,a=ue(o);if(!a?.field||typeof a.resolve!=="function")return[];let l=await a.resolve(n,r);if(l==null||Array.isArray(l)&&l.length===0)return[];let w=s[e];if(!w)return[];return((Array.isArray(l)?await w.whereIn(a.field,l).get():await w.where(a.field,l).get())??[]).map((P)=>P.id).filter((P)=>P!=null)}catch{return[]}}}}var pt=Se("config/qb.ts");try{let e=(await import(pt)).default;Le(e??We)}catch{V.debug("[orm] No config/qb.ts override found - deriving config from DB_CONNECTION");let e=J.DB_CONNECTION||"sqlite";Le({...We,dialect:e,database:e==="sqlite"?{database:J.DB_DATABASE_PATH||"database/stacks.sqlite"}:{database:J.DB_DATABASE||"stacks",host:J.DB_HOST||"127.0.0.1",port:J.DB_PORT||(e==="postgres"?5432:3306),username:J.DB_USERNAME||(e==="postgres"?"postgres":"root"),password:J.DB_PASSWORD||""}})}var _e=await Qe({defaultsRoot:ft("framework/defaults/app/Models"),userRoot:Se("app/Models"),onImportError:(e,t)=>V.warn(`[orm] Could not load model ${e}: ${t.message}`)}),yt=gt(),A=yt;function q(e,t){let n=Ee(U.routes,e,t);if(!n)return!1;let r=String(n.path??"");return V.info(`[orm] Skipping generated ${e} ${t} - already defined${r&&r!==t?` as ${r}`:""}.`),!0}function Ge(e){if(!e.attributes)return[];return Object.entries(e.attributes).filter(([t,n])=>n.hidden===!0).map(([t])=>t)}function ze(e){if(e.endsWith("y")&&!/[aeiou]y$/i.test(e))return`${e.slice(0,-1)}ies`;if(/(?:s|x|z|ch|sh)$/i.test(e))return`${e}es`;return`${e}s`}async function He(e,t,n,r){if(!e.length)return e;let s=n.split(",").map((c)=>c.trim()).filter(Boolean);if(!s.length)return e;let o=Array.isArray(t.belongsTo)?t.belongsTo:[],a=Array.isArray(t.hasMany)?t.hasMany:[],l=Array.isArray(t.hasOne)?t.hasOne:[],w=new Map;for(let c of o)w.set(_(c),{kind:"belongsTo",modelName:c});for(let c of l)w.set(_(c),{kind:"hasOne",modelName:c});for(let c of a)w.set(ze(_(c)),{kind:"hasMany",modelName:c});for(let c of s){let P=w.get(c);if(!P)continue;let v=r[P.modelName];if(!v)continue;let D=v.table||ze(_(P.modelName)),Q=Ge(v),G=(W)=>Y(se(W,v),Q);if(P.kind==="belongsTo"||P.kind==="hasOne"){let W=`${_(P.modelName)}_id`,C=[...new Set(e.map((S)=>S[W]).filter((S)=>S!=null))];if(!C.length){for(let S of e)S[c]=null;continue}let K=await A.selectFrom(D).whereIn("id",C).get(),L=new Map;for(let S of K??[])L.set(String(S.id),G(S));for(let S of e)S[c]=L.get(String(S[W]))??null}else{let W=String(t.name??""),C=`${_(W)}_id`,K=[...new Set(e.map((T)=>T.id).filter((T)=>T!=null))];if(!K.length){for(let T of e)T[c]=[];continue}let L=await A.selectFrom(D).whereIn(C,K).get(),S=new Map;for(let T of L??[]){let E=String(T[C]),te=S.get(E)??[];te.push(G(T)),S.set(E,te)}for(let T of e)T[c]=S.get(String(T.id))??[]}}return e}async function Je(e,t){let n=t?.set;if(!n||typeof n!=="object")return e;let r={...e};for(let[s,o]of Object.entries(n)){if(typeof o!=="function"||!(s in r))continue;try{r[s]=await o(r)}catch{}}return r}function qe(e,t){return me(e,t?.casts,"set")}function se(e,t){return me(e,t?.casts,"get")}function d(e,t=200){return new Response(JSON.stringify(e),{status:t,headers:{"Content-Type":"application/json"}})}var le=1048576;async function ke(e){if(Number(e.headers?.get?.("content-length")??0)>le)throw new B(413,`Request body exceeds ${le}-byte limit`);if(e.jsonBody&&typeof e.jsonBody==="object")return e.jsonBody;if(e.formBody&&typeof e.formBody==="object")return e.formBody;try{let n=await e.clone().text();if(n.length>le)throw new B(413,`Request body exceeds ${le}-byte limit`);if(!n)return{};let r=JSON.parse(n);return r&&typeof r==="object"&&!Array.isArray(r)?r:{}}catch(n){if(n instanceof B)throw n;throw new B(400,`Invalid JSON body: ${n.message}`)}}function ce(e){if(e==null)return null;if(typeof e==="number")return Number.isFinite(e)&&e>0?e:null;if(typeof e==="string"){let t=e.trim();if(!t)return null;if(/^\d+$/.test(t)){let n=Number(t);return Number.isFinite(n)&&n>0?n:null}return t}return null}function mt(e){let t=e.bearerToken;if(typeof t==="function"){let r=t.call(e);if(r)return r}let n=e.headers?.get?.("authorization")||e.headers?.get?.("Authorization")||"";if(typeof n==="string"&&n.startsWith("Bearer "))return n.substring(7);return null}async function Z(e){let t=e._authenticatedUser;if(t)return t;let n=mt(e);if(!n)return null;try{let{Auth:r}=await import("@stacksjs/auth"),s=await r.getUserFromToken(n);if(s)e._authenticatedUser=s;return s||null}catch{return null}}function re(e,t){if(e==null||t==null)return!1;if(Array.isArray(t))return t.some((n)=>String(n)===String(e));return String(e)===String(t)}async function ee(e,t,n){let r=ue(e);if(!r||!r.field||typeof r.resolve!=="function")return{enforced:!1,value:null,field:"",bypass:!1};let s=typeof r.bypass==="function"?!!r.bypass(t,n):!1,o=null;try{o=await r.resolve(t,n)}catch{o=null}return{enforced:!0,value:o,field:String(r.field),bypass:s}}async function Ve(e,t,n,r){let s=e?.authedFill?.[t];if(!s)return{};if(typeof s==="function")try{let o=await s(n,r);return o&&typeof o==="object"?o:{}}catch{return{}}if(typeof s==="object"){let o={};for(let[a,l]of Object.entries(s))try{o[a]=typeof l==="function"?await l(n,r):l}catch{}return o}return{}}var Ke=await(async()=>{let e=dt.env.STACKS_API_ROW_SCOPING;try{let t=(await import(Se("config/security.ts"))).default;return be(t?.api?.rowScoping,e)}catch{return be(void 0,e)}})(),Xe=[];for(let[e,t]of Object.entries(_e)){let n=t.traits?.useApi;if(!n)continue;let r=typeof n==="object"?n:{},s=r.uri||t.table||e.toLowerCase()+"s",o=r.routes||["index","show","store","update","destroy"],a=t.table||s,l=Ne(t),w=Ge(t),c=Ae(s,r.prefix),P=ve(t.attributes,w),{read:v,write:D,declared:Q}=je(n),G=["store","update","destroy"].some((p)=>o.includes(p));if(G&&Q&&D.length===0)V.warn(`[orm] ${e}: registering UNAUTHENTICATED mutating routes at ${c} (explicit \`middleware: []\` opt-out)`);if(["index","show"].some((p)=>o.includes(p))&&Q&&v.length===0)V.debug(`[orm] ${e}: registering public read routes at ${c} (declared \`middleware.read: []\`)`);let C=!!ue(t),K=C&&!v.includes("auth")?["auth",...v]:v,L=$e(t),S=G&&!C&&!L;if(S)Xe.push(e);if(G&&L)V.debug(`[orm] ${e}: registering unscoped mutating routes at ${c} (declared \`ownership: false\`)`);let T=S&&Ke==="deny",E=(p,i=K)=>{let u=p;for(let f of i)if(u&&typeof u.middleware==="function")u=u.middleware(f);return u};if(o.includes("index")&&!q("GET",c))E(U.get(c,async(p)=>{try{let i=new URL(p.url),{page:u,perPage:f,offset:h}=Me(i.searchParams),m=i.searchParams.get("sort"),g=A.selectFrom(a);g=Ce(g,m,P);let N=new Set(["page","per_page","sort","fields","search","include","limit","offset","with_count","withTrashed","onlyTrashed"]);for(let[x,O]of i.searchParams.entries()){if(N.has(x)||!O)continue;if(!/^[a-z_][a-z0-9_]*$/i.test(x))continue;let z=P.get(x);if(z)g=g.where(z,"=",O)}let R=i.searchParams.get("search");if(R&&l.length>0){let x=l.slice(0,5);g=g.where((O)=>{for(let z of x)O=O.orWhere(_(z),"like",`%${R}%`);return O})}let k=i.searchParams.get("fields");if(k){let x=k.split(",").map((O)=>O.trim()).filter((O)=>/^[a-z_][a-z0-9_]*$/i.test(O)).map((O)=>_(O));if(x.length>0)g=g.select(x)}let I=!!t.traits?.useSoftDeletes,b=i.searchParams.get("withTrashed")==="true",j=i.searchParams.get("onlyTrashed")==="true";if(I&&!b)g=j?g.whereNotNull("deleted_at"):g.whereNull("deleted_at");let y=C?await ee(t,await Z(p),p):{enforced:!1,value:null,field:"",bypass:!1};if(y.enforced&&!y.bypass){if(y.value==null||Array.isArray(y.value)&&y.value.length===0){let x=he(i,u,f,0,!1,void 0);return new Response(JSON.stringify({data:[],...x,meta:ae(i,u,f,0,!1,void 0)}),{status:200,headers:{"Content-Type":"application/json","Cache-Control":"private, no-store",Vary:"Authorization"}})}g=Array.isArray(y.value)?g.where(y.field,"in",y.value):g.where(y.field,"=",y.value)}let M=await g.limit(f+1).offset(h).get()||[],F=M.length>f,ne=(F?M.slice(0,f):M).map((x)=>Y(se(x,t),w)),xe=i.searchParams.get("include");if(xe)ne=await He(ne,t,xe,_e);let Ye=i.searchParams.get("with_count")==="true",X;if(Ye)try{let x=A.selectFrom(a);if(y.enforced&&!y.bypass&&y.value!=null)x=Array.isArray(y.value)?x.where(y.field,"in",y.value):x.where(y.field,"=",y.value);let O=await x.count(),z=typeof O==="number"?O:Number(O?.count??O);if(Number.isFinite(z))X=z}catch{}let oe={"Content-Type":"application/json"};if(X!==void 0&&!Number.isNaN(X))oe["X-Total-Count"]=String(X);oe["Cache-Control"]=y.enforced&&!y.bypass?"private, no-store":"public, max-age=15, must-revalidate",oe.Vary="Authorization";let Ze=he(i,u,f,ne.length,F,X);return new Response(JSON.stringify({data:ne,...Ze,meta:ae(i,u,f,ne.length,F,X)}),{status:200,headers:oe})}catch(i){if(i instanceof B){let u={error:i.message};if(i.details!==void 0)u.details=i.details;return d(u,i.status||400)}return d({error:`Failed to fetch ${s}`,detail:String(i)},500)}}));if(o.includes("show")&&!q("GET",`${c}/{id}`))E(U.get(`${c}/{id}`,async(p)=>{try{let i=ce(p.params?.id);if(i==null)return d({error:"Invalid ID parameter"},400);let u=await A.selectFrom(a).where({id:i}).executeTakeFirst();if(!u)return d({error:`${e} not found`},404);let f=new URL(p.url);if(t.traits?.useSoftDeletes&&u.deleted_at&&f.searchParams.get("withTrashed")!=="true")return d({error:`${e} not found`},404);let h=C?await ee(t,await Z(p),p):{enforced:!1,value:null,field:"",bypass:!1};if(h.enforced&&!h.bypass){if(h.value==null||!re(u[h.field],h.value))return d({error:`${e} not found`},404)}let m=Y(se(u,t),w),g=f.searchParams.get("include");if(g){let[b]=await He([m],t,g,_e);m=b}let N=m?.updated_at||m?.created_at,R=N?`W/"${m.id}-${String(N)}"`:void 0,k=p.headers?.get?.("if-none-match");if(R&&k&&k===R)return new Response(null,{status:304,headers:{ETag:R}});let I={"Content-Type":"application/json"};if(R)I.ETag=R;return I["Cache-Control"]=h.enforced&&!h.bypass?"private, no-store":"public, max-age=30, must-revalidate",I.Vary="Authorization",new Response(JSON.stringify({data:m}),{status:200,headers:I})}catch(i){if(i instanceof B){let u={error:i.message};if(i.details!==void 0)u.details=i.details;return d(u,i.status||400)}return d({error:`Failed to fetch ${e}`,detail:String(i)},500)}}));if(!T&&o.includes("store")&&!q("POST",c))E(U.post(c,async(p)=>{try{let i=await ke(p),u=ye(i,w),f=pe(u,l),h=await Z(p);if(h){let b=await Ve(t,"creating",h,p);for(let[j,y]of Object.entries(b))if(y!==void 0&&y!==null&&f[j]===void 0)f[j]=y}let m=await ee(t,h,p);if(m.enforced&&!m.bypass){if(!h)return d({error:"Auth required"},401);let b=Ie(f,m.field,m.value);if(b.error)return d({error:b.error},403);f=b.data}if(Object.keys(f).length===0)return d({error:"No fillable fields provided"},422);let g=we(f,t,"creating");if(!g.valid)return d({success:!1,message:"Validation failed",errors:g.errors},422);if(t.traits?.useTimestamps!==!1){let b=new Date().toISOString();f.created_at=b,f.updated_at=b}let N=await Je(f,t),R=ge(qe(N,t)),k=await A.insertInto(a).values(R).execute(),I=R;try{let b=k?.lastInsertRowid??k?.insertId??k;if(b){let j=await A.selectFrom(a).where({id:b}).executeTakeFirst();if(j)I=j}}catch{}return d({data:Y(se(I,t),w)},201)}catch(i){let{status:u,body:f}=fe(i,e,"create");return d(f,u)}}),D);if(!T&&o.includes("update")){let p=async(i)=>{try{let u=ce(i.params?.id);if(u==null)return d({error:"Invalid ID parameter"},400);let f=await ke(i),h=ye(f,w),m=pe(h,l),g=await Z(i);if(g){let y=await Ve(t,"updating",g,i);for(let[M,F]of Object.entries(y))if(F!==void 0&&F!==null&&m[M]===void 0)m[M]=F}if(Object.keys(m).length===0)return d({error:"No fillable fields provided"},422);let N=we(m,t,"updating");if(!N.valid)return d({success:!1,message:"Validation failed",errors:N.errors},422);let R=await A.selectFrom(a).where({id:u}).executeTakeFirst();if(!R)return d({error:`${e} not found`},404);let k=await ee(t,g,i);if(k.enforced&&!k.bypass){if(!g)return d({error:"Auth required"},401);let y=R[k.field];if(!re(y,k.value))return d({error:`Not your ${e}`},403);let M=Object.keys(m).find((F)=>_(F)===_(k.field));if(M!==void 0&&!re(m[M],k.value))return d({error:`Cannot reassign ${e} ownership`},403)}if(t.traits?.useTimestamps!==!1)m.updated_at=new Date().toISOString();let I=await Je(m,t),b=ge(qe(I,t));await A.updateTable(a).set(b).where({id:u}).execute();let j={...R,...b};try{let y=await A.selectFrom(a).where({id:u}).executeTakeFirst();if(y)j=y}catch{}return d({data:Y(se(j,t),w)})}catch(u){let{status:f,body:h}=fe(u,e,"update");return d(h,f)}};if(!q("PUT",`${c}/{id}`))E(U.put(`${c}/{id}`,p),D);if(!q("PATCH",`${c}/{id}`))E(U.patch(`${c}/{id}`,p),D)}let te=!!t.traits?.useSoftDeletes;if(!T&&o.includes("destroy")&&!q("DELETE",`${c}/{id}`))E(U.delete(`${c}/{id}`,async(p)=>{try{let i=ce(p.params?.id);if(i==null)return d({error:"Invalid ID parameter"},400);let u=await A.selectFrom(a).where({id:i}).executeTakeFirst();if(!u)return d({error:`${e} not found`},404);let f=await Z(p),h=await ee(t,f,p);if(h.enforced&&!h.bypass){if(!f)return d({error:"Auth required"},401);let m=u[h.field];if(!re(m,h.value))return d({error:`Not your ${e}`},403)}if(te){let m=new Date().toISOString();await A.updateTable(a).set({deleted_at:m,updated_at:m}).where({id:i}).execute()}else await A.deleteFrom(a).where({id:i}).execute();return new Response(null,{status:204})}catch(i){if(i instanceof B){let u={error:i.message};if(i.details!==void 0)u.details=i.details;return d(u,i.status||400)}return d({error:`Failed to delete ${e}`,detail:String(i)},500)}}),D);if(!T&&o.includes("destroy")&&!q("POST",`${c}/bulk-delete`))E(U.post(`${c}/bulk-delete`,async(p)=>{try{let u=(await ke(p))?.ids;if(!Array.isArray(u)||u.length===0)return d({error:"An array of IDs is required"},422);if(u.length>100)return d({error:"Cannot delete more than 100 records at once"},422);let f=[],h=[];for(let R of u){let k=ce(R);if(k!=null)f.push(k);else h.push(R)}if(h.length>0)return d({error:"Invalid IDs in batch",invalid:h},422);let m=await Z(p),g=await ee(t,m,p);if(g.enforced&&!g.bypass){if(!m)return d({error:"Auth required"},401);if(g.value==null)return d({error:"Caller has no ownership identity"},403);let R=await A.selectFrom(a).select(["id",g.field]).execute(),k=new Set(R.filter((b)=>re(b[g.field],g.value)).map((b)=>String(b.id))),I=f.filter((b)=>!k.has(String(b)));if(I.length>0)return d({error:`Cannot delete ${e} you don't own`,ids:I},403)}let N=new Date().toISOString();for(let R of f)if(te)await A.updateTable(a).set({deleted_at:N,updated_at:N}).where({id:R}).execute();else await A.deleteFrom(a).where({id:R}).execute();return d({message:`Successfully deleted ${f.length} ${s}`})}catch(i){if(i instanceof B){let u={error:i.message};if(i.details!==void 0)u.details=i.details;return d(u,i.status||400)}return d({error:`Failed to bulk delete ${s}`,detail:String(i)},500)}}),D)}{let e=Fe(Xe,Ke);if(e)V.warn(e)}var Qt=U;export{Qt as default};
|
|
2
|
+
import ct from"process";import{route as U}from"@stacksjs/router";import{env as H}from"@stacksjs/env";import{projectPath as ke,storagePath as dt}from"@stacksjs/path";import{createQueryBuilder as ft,defaultConfig as Qe,setConfig as We}from"@stacksjs/query-builder";import{HttpError as B}from"@stacksjs/error-handling";import{log as q}from"@stacksjs/logging";function Ze(e){let t=e;return t?.code==="SQLITE_CONSTRAINT_UNIQUE"||t?.code==="SQLITE_CONSTRAINT"||t?.code==="23505"||t?.errno===1062||/unique|duplicate/i.test(t?.message??"")}function de(e,t,n){let r=e;if(e instanceof Error&&typeof r.status==="number"&&Number.isInteger(r.status)&&r.status>=400&&r.status<600){let s={error:e.message};if(r.details!==void 0)s.details=r.details;return{status:r.status,body:s}}if(Ze(e))return{status:409,body:{error:`${t} already exists`}};return{status:500,body:{error:`Failed to ${n} ${t}`,detail:String(e)}}}function _(e){return e.replace(/([a-z\d])([A-Z])/g,"$1_$2").replace(/([A-Z])([A-Z][a-z])/g,"$1_$2").toLowerCase()}function fe(e){let t={};for(let[n,r]of Object.entries(e))t[_(n)]=r;return t}function Te(e,t){let n=String(t||"").replace(/^\/+|\/+$/g,""),r=String(e).replace(/^\/+/,"");return`/api/${n?`${n}/`:""}${r}`}function Ae(e){if(!e)return null;let t=e.attributes??{};if(Object.prototype.hasOwnProperty.call(t,"teamId")||Object.prototype.hasOwnProperty.call(t,"team_id"))return"team_id";return e.belongsTo?.some((n)=>n==="Team")?"team_id":null}function Pe(e){if(!e)return null;let t=e.attributes??{};if(Object.prototype.hasOwnProperty.call(t,"userId")||Object.prototype.hasOwnProperty.call(t,"user_id"))return"user_id";return e.belongsTo?.some((n)=>n==="User")?"user_id":null}function De(e){return e?.ownership===!1}function $e(e,t,n){let r=Object.keys(e).find((o)=>_(o)===_(t));if(Array.isArray(n)){if(r===void 0)return{data:e,error:"Ownership value is required"};if(!n.some((o)=>String(o)===String(e[r])))return{data:e,error:"Ownership value is not available to this caller"};return{data:{...e,[t]:e[r]}}}if(n===null||n===void 0)return{data:e,error:"Caller has no ownership identity"};let s={...e};for(let o of Object.keys(s))if(_(o)===_(t))delete s[o];return s[t]=n,{data:s}}function Ie(e){if(!e)return[];let t=Object.entries(e.attributes??{}).filter(([,n])=>n?.fillable===!0).map(([n])=>n);for(let n of e.belongsTo??[]){if(typeof n!=="string"||!n.trim())continue;let r=_(n.trim()).split("_").filter(Boolean);if(r.length===0)continue;let s=`${r[0]}${r.slice(1).map((o)=>`${o[0]?.toUpperCase()}${o.slice(1)}`).join("")}Id`;t.push(s)}return[...new Set(t)]}function ge(e,t){if(!e||t.length===0)return{};let n={};for(let r of t){if(r in e){n[r]=e[r];continue}let s=_(r);if(s!==r&&s in e)n[r]=e[s]}return n}function et(e,t){if(e?.name!=="date"||t instanceof Date||typeof t!=="string")return t;let n=/^(\d{4})-(\d{2})-(\d{2})$/.exec(t);if(!n)return t;let r=Number(n[1]),s=Number(n[2]),o=Number(n[3]),a=new Date(Date.UTC(r,s-1,o));if(a.getUTCFullYear()!==r||a.getUTCMonth()!==s-1||a.getUTCDate()!==o)return t;return a}function pe(e,t){if(!t.length)return e;let n={...e};for(let r of t)delete n[r],delete n[_(r)];return n}function X(e,t){if(!e||t.length===0)return e;let n={...e};for(let r of t)delete n[r],delete n[_(r)];return n}var tt=["id","uuid","created_at","updated_at","deleted_at"];function Ne(e,t){let n=new Map;for(let r of[...Object.keys(e??{}),...tt]){let s=_(r);if(!/^\w+$/.test(s))continue;n.set(r,s),n.set(s,s)}for(let r of t)n.delete(r),n.delete(_(r));return n}function ve(e,t,n){if(!t)return e;let r=String(t).split(",").map((o)=>o.trim()).filter(Boolean),s=e;for(let o of r){let a=o.startsWith("-"),l=a?o.slice(1):o;if(!/^\w+$/.test(l))continue;let w=n.get(l);if(!w)continue;s=s.orderBy(w,a?"desc":"asc")}return s}var nt={string:{get:(e)=>e!=null?String(e):null,set:(e)=>e!=null?String(e):null},number:{get:(e)=>e!=null?Number(e):null,set:(e)=>e!=null?Number(e):null},integer:{get:(e)=>e!=null?Math.trunc(Number(e)):null,set:(e)=>e!=null?Math.trunc(Number(e)):null},float:{get:(e)=>e!=null?Number.parseFloat(String(e)):null,set:(e)=>e!=null?Number.parseFloat(String(e)):null},boolean:{get:(e)=>e===1||e==="1"||e===!0||e==="true",set:(e)=>e===!0||e===1||e==="1"||e==="true"?1:0},json:{get:(e)=>e==null?null:typeof e==="string"?rt(e):e,set:(e)=>e==null?null:typeof e==="string"?e:JSON.stringify(e)},datetime:{get:(e)=>e?new Date(e):null,set:(e)=>e instanceof Date?e.toISOString():e},date:{get:(e)=>e?new Date(e):null,set:(e)=>e instanceof Date?e.toISOString().split("T")[0]:e},array:{get:(e)=>e==null?[]:Array.isArray(e)?e:typeof e==="string"?st(e):[],set:(e)=>e==null?null:Array.isArray(e)?JSON.stringify(e):e}};function rt(e){try{return JSON.parse(e)}catch{return e}}function st(e){try{return JSON.parse(e)}catch{return[]}}function ye(e,t,n){if(!e||typeof e!=="object"||!t||Object.keys(t).length===0)return e;let r={...e};for(let[s,o]of Object.entries(t)){let a=typeof o==="string"?nt[o]:o;if(!a||typeof a[n]!=="function")continue;if(Object.prototype.hasOwnProperty.call(r,s))r[s]=a[n](r[s]);let l=_(s);if(l!==s&&Object.prototype.hasOwnProperty.call(r,l))r[l]=a[n](r[l])}return r}function me(e,t,n){let r=t?.attributes??{},s={};for(let[o,a]of Object.entries(r)){let l=a?.validation?.rule;if(!l||typeof l.validate!=="function")continue;let w=Object.prototype.hasOwnProperty.call(e,o);if(!w&&n==="updating")continue;let c=a!==null&&typeof a==="object"&&Object.prototype.hasOwnProperty.call(a,"default"),P=w?e[o]:c?a.default:void 0,v=et(l,P),D=l.validate(v);if(!D?.valid&&Array.isArray(D?.errors)&&D.errors.length>0)s[o]=D.errors.map((Q)=>a?.validation?.message?.[Q?.code]??Q?.message??"invalid")}return Object.keys(s).length===0?{valid:!0}:{valid:!1,errors:s}}function Ce(e,t,n){let r=xe(n);return e.find((s)=>s.method===t&&xe(String(s.path??""))===r)}function xe(e){return e.replace(/\{[^}]*\}/g,"{}").replace(/:[^/]+/g,"{}")}function ce(e){if(Array.isArray(e))return e.filter((t)=>typeof t==="string"&&t.length>0);return typeof e==="string"&&e?[e]:[]}function Ee(e){let t=typeof e==="object"&&e!==null&&"middleware"in e,n=e?.middleware;if(!t)return{read:["auth"],write:["auth"],declared:!1};if(n&&typeof n==="object"&&!Array.isArray(n)){let s=n;return{read:"read"in s?ce(s.read):["auth"],write:"write"in s?ce(s.write):["auth"],declared:!0}}let r=ce(n);return{read:r,write:r,declared:!0}}var Oe=15,ot=100;function je(e){let t=Number.parseInt(e.get("page")||String(1),10),n=Number.isFinite(t)?Math.max(1,t):1,r=Number.parseInt(e.get("per_page")||String(Oe),10),s=Math.min(Number.isFinite(r)?Math.max(1,r):Oe,ot);return{page:n,perPage:s,offset:(n-1)*s}}function oe(e,t){let n=new URL(e.toString());return n.searchParams.set("page",String(t)),`${n.pathname}${n.search}`}function ie(e,t,n,r,s,o){let a=(t-1)*n,l=r===0,w={page:t,per_page:n,from:l?null:a+1,to:l?null:a+r,has_more_pages:s,prev_page_url:t>1?oe(e,t-1):null,next_page_url:s?oe(e,t+1):null};if(o!==void 0&&!Number.isNaN(o)){let c=Math.max(1,Math.ceil(o/n));w.total=o,w.last_page=c,w.first_page_url=oe(e,1),w.last_page_url=oe(e,c)}return w}function we(e,t,n,r,s,o){let{page:a,...l}=ie(e,t,n,r,s,o);return{current_page:a,...l}}function he(e,t){return(t??e??"").toString().trim().toLowerCase()==="warn"?"warn":"deny"}function Me(e,t){if(e.length===0)return null;let n=[...e].sort().join(", ");if(t==="deny")return`[orm] security.api.rowScoping is 'deny': NOT registering store/update/destroy for ${e.length} model(s) `+`with no row-level scoping \u2014 ${n}. Give a model an \`ownership\` config or a \`team_id\` column to restore its writes.`;return`[orm] ${e.length} model(s) publish mutating routes with no row-level scoping, so an authenticated caller can write any row \u2014 `+`${n}. Scope one with an \`ownership\` config or a \`team_id\` column; intended for public catalog tables. Set \`security.api.rowScoping: 'deny'\` (config/security.ts) to stop generating these routes instead.`}import{readdirSync as it}from"fs";import{basename as at,extname as Ue,join as ut}from"path";function lt(e){let t=[],n=(r)=>{let s;try{s=it(r,{withFileTypes:!0})}catch{return}for(let o of s){let a=ut(r,o.name);if(o.isDirectory()){n(a);continue}if(![".ts",".js"].includes(Ue(o.name)))continue;if(o.name.startsWith(".")||o.name.startsWith("index"))continue;t.push(a)}};return n(e),t.sort()}async function Fe(e,t,n){for(let r of lt(e))try{let s=Ue(r),o=await import(`${r}?t=${Date.now()}`),a=o.default??o,l=a.name??at(r,s);t[l]={...a,name:l}}catch(s){n?.(r,s)}}async function Be(e){let t={};return await Fe(e.defaultsRoot,t,e.onImportError),await Fe(e.userRoot,t,e.onImportError),t}function ae(e){if(e?.ownership===!1)return null;if(e?.ownership)return e.ownership;let t=Ae(e);if(t)return{field:t,resolve:async(r,s)=>{let{resolveAuthenticatedTeamId:o}=await import("@stacksjs/auth");return o(be(s))}};let n=Pe(e);if(n)return{field:n,resolve:async(r)=>r?.id??null};return null}function be(e){let t=e?.headers?.get?.("authorization"),n=t&&/^Bearer\s+/i.test(t)?t.replace(/^Bearer\s+/i,"").trim():null,r=e?.headers?.get?.("cookie")||"";return{bearerToken:()=>n,cookies:{get:(s)=>{for(let o of r.split(";")){let a=o.indexOf("=");if(a===-1)continue;if(o.slice(0,a).trim()===s)return decodeURIComponent(o.slice(a+1).trim())}return null}}}}function kt(e="customer_id"){return{field:e,resolve:async(t)=>{let n=t?.id;if(n==null)return null;try{let{Customer:r}=await import("@stacksjs/orm");return(await r.where("user_id",n).first())?.id??null}catch{return null}}}}function St(e="id"){return{field:e,resolve:async(t)=>t?.id??null}}function xt(e="site_id"){return{field:e,resolve:async(t,n)=>{try{let[{resolveAuthenticatedTeamId:r},{Site:s}]=await Promise.all([import("@stacksjs/auth"),import("@stacksjs/orm")]),o=await r(be(n));if(o==null)return[];return(await s.where("team_id",o).get()??[]).map((l)=>l.id).filter((l)=>l!=null)}catch{return[]}}}}function Ot(e="id"){return{field:e,resolve:async(t,n)=>{try{let{resolveAuthenticatedTeamId:r}=await import("@stacksjs/auth");return await r(be(n))}catch{return null}}}}function Tt(e,t){return{field:t,resolve:async(n,r)=>{try{let s=await import("@stacksjs/orm"),o=s.models?.[e]??s[e]?.definition??null,a=ae(o);if(!a?.field||typeof a.resolve!=="function")return[];let l=await a.resolve(n,r);if(l==null||Array.isArray(l)&&l.length===0)return[];let w=s[e];if(!w)return[];return((Array.isArray(l)?await w.whereIn(a.field,l).get():await w.where(a.field,l).get())??[]).map((P)=>P.id).filter((P)=>P!=null)}catch{return[]}}}}var gt=ke("config/qb.ts");try{let e=(await import(gt)).default;We(e??Qe)}catch{q.debug("[orm] No config/qb.ts override found - deriving config from DB_CONNECTION");let e=H.DB_CONNECTION||"sqlite";We({...Qe,dialect:e,database:e==="sqlite"?{database:H.DB_DATABASE_PATH||"database/stacks.sqlite"}:{database:H.DB_DATABASE||"stacks",host:H.DB_HOST||"127.0.0.1",port:H.DB_PORT||(e==="postgres"?5432:3306),username:H.DB_USERNAME||(e==="postgres"?"postgres":"root"),password:H.DB_PASSWORD||""}})}var Re=await Be({defaultsRoot:dt("framework/defaults/app/Models"),userRoot:ke("app/Models"),onImportError:(e,t)=>q.warn(`[orm] Could not load model ${e}: ${t.message}`)}),pt=ft(),A=pt;function J(e,t){let n=Ce(U.routes,e,t);if(!n)return!1;let r=String(n.path??"");return q.info(`[orm] Skipping generated ${e} ${t} - already defined${r&&r!==t?` as ${r}`:""}.`),!0}function Ve(e){if(!e.attributes)return[];return Object.entries(e.attributes).filter(([t,n])=>n.hidden===!0).map(([t])=>t)}function Le(e){if(e.endsWith("y")&&!/[aeiou]y$/i.test(e))return`${e.slice(0,-1)}ies`;if(/(?:s|x|z|ch|sh)$/i.test(e))return`${e}es`;return`${e}s`}async function ze(e,t,n,r){if(!e.length)return e;let s=n.split(",").map((c)=>c.trim()).filter(Boolean);if(!s.length)return e;let o=Array.isArray(t.belongsTo)?t.belongsTo:[],a=Array.isArray(t.hasMany)?t.hasMany:[],l=Array.isArray(t.hasOne)?t.hasOne:[],w=new Map;for(let c of o)w.set(_(c),{kind:"belongsTo",modelName:c});for(let c of l)w.set(_(c),{kind:"hasOne",modelName:c});for(let c of a)w.set(Le(_(c)),{kind:"hasMany",modelName:c});for(let c of s){let P=w.get(c);if(!P)continue;let v=r[P.modelName];if(!v)continue;let D=v.table||Le(_(P.modelName)),Q=Ve(v),V=(W)=>X(re(W,v),Q);if(P.kind==="belongsTo"||P.kind==="hasOne"){let W=`${_(P.modelName)}_id`,C=[...new Set(e.map((S)=>S[W]).filter((S)=>S!=null))];if(!C.length){for(let S of e)S[c]=null;continue}let G=await A.selectFrom(D).whereIn("id",C).get(),L=new Map;for(let S of G??[])L.set(String(S.id),V(S));for(let S of e)S[c]=L.get(String(S[W]))??null}else{let W=String(t.name??""),C=`${_(W)}_id`,G=[...new Set(e.map((T)=>T.id).filter((T)=>T!=null))];if(!G.length){for(let T of e)T[c]=[];continue}let L=await A.selectFrom(D).whereIn(C,G).get(),S=new Map;for(let T of L??[]){let E=String(T[C]),ee=S.get(E)??[];ee.push(V(T)),S.set(E,ee)}for(let T of e)T[c]=S.get(String(T.id))??[]}}return e}async function He(e,t){let n=t?.set;if(!n||typeof n!=="object")return e;let r={...e};for(let[s,o]of Object.entries(n)){if(typeof o!=="function"||!(s in r))continue;try{r[s]=await o(r)}catch{}}return r}function Je(e,t){return ye(e,t?.casts,"set")}function re(e,t){return ye(e,t?.casts,"get")}function d(e,t=200){return new Response(JSON.stringify(e),{status:t,headers:{"Content-Type":"application/json"}})}var ue=1048576;async function _e(e){if(Number(e.headers?.get?.("content-length")??0)>ue)throw new B(413,`Request body exceeds ${ue}-byte limit`);if(e.jsonBody&&typeof e.jsonBody==="object")return e.jsonBody;if(e.formBody&&typeof e.formBody==="object")return e.formBody;try{let n=await e.clone().text();if(n.length>ue)throw new B(413,`Request body exceeds ${ue}-byte limit`);if(!n)return{};let r=JSON.parse(n);return r&&typeof r==="object"&&!Array.isArray(r)?r:{}}catch(n){if(n instanceof B)throw n;throw new B(400,`Invalid JSON body: ${n.message}`)}}function le(e){if(e==null)return null;if(typeof e==="number")return Number.isFinite(e)&&e>0?e:null;if(typeof e==="string"){let t=e.trim();if(!t)return null;if(/^\d+$/.test(t)){let n=Number(t);return Number.isFinite(n)&&n>0?n:null}return t}return null}function yt(e){let t=e.bearerToken;if(typeof t==="function"){let r=t.call(e);if(r)return r}let n=e.headers?.get?.("authorization")||e.headers?.get?.("Authorization")||"";if(typeof n==="string"&&n.startsWith("Bearer "))return n.substring(7);return null}async function Y(e){let t=e._authenticatedUser;if(t)return t;let n=yt(e);if(!n)return null;try{let{Auth:r}=await import("@stacksjs/auth"),s=await r.getUserFromToken(n);if(s)e._authenticatedUser=s;return s||null}catch{return null}}function ne(e,t){if(e==null||t==null)return!1;if(Array.isArray(t))return t.some((n)=>String(n)===String(e));return String(e)===String(t)}async function Z(e,t,n){let r=ae(e);if(!r||!r.field||typeof r.resolve!=="function")return{enforced:!1,value:null,field:"",bypass:!1};let s=typeof r.bypass==="function"?!!r.bypass(t,n):!1,o=null;try{o=await r.resolve(t,n)}catch{o=null}return{enforced:!0,value:o,field:String(r.field),bypass:s}}async function qe(e,t,n,r){let s=e?.authedFill?.[t];if(!s)return{};if(typeof s==="function")try{let o=await s(n,r);return o&&typeof o==="object"?o:{}}catch{return{}}if(typeof s==="object"){let o={};for(let[a,l]of Object.entries(s))try{o[a]=typeof l==="function"?await l(n,r):l}catch{}return o}return{}}var Ge=await(async()=>{let e=ct.env.STACKS_API_ROW_SCOPING;try{let t=(await import(ke("config/security.ts"))).default;return he(t?.api?.rowScoping,e)}catch{return he(void 0,e)}})(),Ke=[];for(let[e,t]of Object.entries(Re)){let n=t.traits?.useApi;if(!n)continue;let r=typeof n==="object"?n:{},s=r.uri||t.table||e.toLowerCase()+"s",o=r.routes||["index","show","store","update","destroy"],a=t.table||s,l=Ie(t),w=Ve(t),c=Te(s,r.prefix),P=Ne(t.attributes,w),{read:v,write:D,declared:Q}=Ee(n),V=["store","update","destroy"].some((p)=>o.includes(p));if(V&&Q&&D.length===0)q.warn(`[orm] ${e}: registering UNAUTHENTICATED mutating routes at ${c} (explicit \`middleware: []\` opt-out)`);if(["index","show"].some((p)=>o.includes(p))&&Q&&v.length===0)q.debug(`[orm] ${e}: registering public read routes at ${c} (declared \`middleware.read: []\`)`);let C=!!ae(t),G=C&&!v.includes("auth")?["auth",...v]:v,L=De(t),S=V&&!C&&!L;if(S)Ke.push(e);if(V&&L)q.debug(`[orm] ${e}: registering unscoped mutating routes at ${c} (declared \`ownership: false\`)`);let T=S&&Ge==="deny",E=(p,i=G)=>{let u=p;for(let f of i)if(u&&typeof u.middleware==="function")u=u.middleware(f);return u};if(o.includes("index")&&!J("GET",c))E(U.get(c,async(p)=>{try{let i=new URL(p.url),{page:u,perPage:f,offset:h}=je(i.searchParams),m=i.searchParams.get("sort"),g=A.selectFrom(a);g=ve(g,m,P);let N=new Set(["page","per_page","sort","fields","search","include","limit","offset","with_count","withTrashed","onlyTrashed"]);for(let[x,O]of i.searchParams.entries()){if(N.has(x)||!O)continue;if(!/^[a-z_][a-z0-9_]*$/i.test(x))continue;let z=P.get(x);if(z)g=g.where(z,"=",O)}let R=i.searchParams.get("search");if(R&&l.length>0){let x=l.slice(0,5);g=g.where((O)=>{for(let z of x)O=O.orWhere(_(z),"like",`%${R}%`);return O})}let k=i.searchParams.get("fields");if(k){let x=k.split(",").map((O)=>O.trim()).filter((O)=>/^[a-z_][a-z0-9_]*$/i.test(O)).map((O)=>_(O));if(x.length>0)g=g.select(x)}let I=!!t.traits?.useSoftDeletes,b=i.searchParams.get("withTrashed")==="true",j=i.searchParams.get("onlyTrashed")==="true";if(I&&!b)g=j?g.whereNotNull("deleted_at"):g.whereNull("deleted_at");let y=C?await Z(t,await Y(p),p):{enforced:!1,value:null,field:"",bypass:!1};if(y.enforced&&!y.bypass){if(y.value==null||Array.isArray(y.value)&&y.value.length===0){let x=we(i,u,f,0,!1,void 0);return new Response(JSON.stringify({data:[],...x,meta:ie(i,u,f,0,!1,void 0)}),{status:200,headers:{"Content-Type":"application/json","Cache-Control":"private, no-store",Vary:"Authorization"}})}g=Array.isArray(y.value)?g.where(y.field,"in",y.value):g.where(y.field,"=",y.value)}let M=await g.limit(f+1).offset(h).get()||[],F=M.length>f,te=(F?M.slice(0,f):M).map((x)=>X(re(x,t),w)),Se=i.searchParams.get("include");if(Se)te=await ze(te,t,Se,Re);let Xe=i.searchParams.get("with_count")==="true",K;if(Xe)try{let x=A.selectFrom(a);if(y.enforced&&!y.bypass&&y.value!=null)x=Array.isArray(y.value)?x.where(y.field,"in",y.value):x.where(y.field,"=",y.value);let O=await x.count(),z=typeof O==="number"?O:Number(O?.count??O);if(Number.isFinite(z))K=z}catch{}let se={"Content-Type":"application/json"};if(K!==void 0&&!Number.isNaN(K))se["X-Total-Count"]=String(K);se["Cache-Control"]=y.enforced&&!y.bypass?"private, no-store":"public, max-age=15, must-revalidate",se.Vary="Authorization";let Ye=we(i,u,f,te.length,F,K);return new Response(JSON.stringify({data:te,...Ye,meta:ie(i,u,f,te.length,F,K)}),{status:200,headers:se})}catch(i){if(i instanceof B){let u={error:i.message};if(i.details!==void 0)u.details=i.details;return d(u,i.status||400)}return d({error:`Failed to fetch ${s}`,detail:String(i)},500)}}));if(o.includes("show")&&!J("GET",`${c}/{id}`))E(U.get(`${c}/{id}`,async(p)=>{try{let i=le(p.params?.id);if(i==null)return d({error:"Invalid ID parameter"},400);let u=await A.selectFrom(a).where({id:i}).executeTakeFirst();if(!u)return d({error:`${e} not found`},404);let f=new URL(p.url);if(t.traits?.useSoftDeletes&&u.deleted_at&&f.searchParams.get("withTrashed")!=="true")return d({error:`${e} not found`},404);let h=C?await Z(t,await Y(p),p):{enforced:!1,value:null,field:"",bypass:!1};if(h.enforced&&!h.bypass){if(h.value==null||!ne(u[h.field],h.value))return d({error:`${e} not found`},404)}let m=X(re(u,t),w),g=f.searchParams.get("include");if(g){let[b]=await ze([m],t,g,Re);m=b}let N=m?.updated_at||m?.created_at,R=N?`W/"${m.id}-${String(N)}"`:void 0,k=p.headers?.get?.("if-none-match");if(R&&k&&k===R)return new Response(null,{status:304,headers:{ETag:R}});let I={"Content-Type":"application/json"};if(R)I.ETag=R;return I["Cache-Control"]=h.enforced&&!h.bypass?"private, no-store":"public, max-age=30, must-revalidate",I.Vary="Authorization",new Response(JSON.stringify({data:m}),{status:200,headers:I})}catch(i){if(i instanceof B){let u={error:i.message};if(i.details!==void 0)u.details=i.details;return d(u,i.status||400)}return d({error:`Failed to fetch ${e}`,detail:String(i)},500)}}));if(!T&&o.includes("store")&&!J("POST",c))E(U.post(c,async(p)=>{try{let i=await _e(p),u=pe(i,w),f=ge(u,l),h=await Y(p);if(h){let b=await qe(t,"creating",h,p);for(let[j,y]of Object.entries(b))if(y!==void 0&&y!==null&&f[j]===void 0)f[j]=y}let m=await Z(t,h,p);if(m.enforced&&!m.bypass){if(!h)return d({error:"Auth required"},401);let b=$e(f,m.field,m.value);if(b.error)return d({error:b.error},403);f=b.data}if(Object.keys(f).length===0)return d({error:"No fillable fields provided"},422);let g=me(f,t,"creating");if(!g.valid)return d({success:!1,message:"Validation failed",errors:g.errors},422);if(t.traits?.useTimestamps!==!1){let b=new Date().toISOString();f.created_at=b,f.updated_at=b}let N=await He(f,t),R=fe(Je(N,t)),k=await A.insertInto(a).values(R).execute(),I=R;try{let b=k?.lastInsertRowid??k?.insertId??k;if(b){let j=await A.selectFrom(a).where({id:b}).executeTakeFirst();if(j)I=j}}catch{}return d({data:X(re(I,t),w)},201)}catch(i){let{status:u,body:f}=de(i,e,"create");return d(f,u)}}),D);if(!T&&o.includes("update")){let p=async(i)=>{try{let u=le(i.params?.id);if(u==null)return d({error:"Invalid ID parameter"},400);let f=await _e(i),h=pe(f,w),m=ge(h,l),g=await Y(i);if(g){let y=await qe(t,"updating",g,i);for(let[M,F]of Object.entries(y))if(F!==void 0&&F!==null&&m[M]===void 0)m[M]=F}if(Object.keys(m).length===0)return d({error:"No fillable fields provided"},422);let N=me(m,t,"updating");if(!N.valid)return d({success:!1,message:"Validation failed",errors:N.errors},422);let R=await A.selectFrom(a).where({id:u}).executeTakeFirst();if(!R)return d({error:`${e} not found`},404);let k=await Z(t,g,i);if(k.enforced&&!k.bypass){if(!g)return d({error:"Auth required"},401);let y=R[k.field];if(!ne(y,k.value))return d({error:`Not your ${e}`},403);let M=Object.keys(m).find((F)=>_(F)===_(k.field));if(M!==void 0&&!ne(m[M],k.value))return d({error:`Cannot reassign ${e} ownership`},403)}if(t.traits?.useTimestamps!==!1)m.updated_at=new Date().toISOString();let I=await He(m,t),b=fe(Je(I,t));await A.updateTable(a).set(b).where({id:u}).execute();let j={...R,...b};try{let y=await A.selectFrom(a).where({id:u}).executeTakeFirst();if(y)j=y}catch{}return d({data:X(re(j,t),w)})}catch(u){let{status:f,body:h}=de(u,e,"update");return d(h,f)}};if(!J("PUT",`${c}/{id}`))E(U.put(`${c}/{id}`,p),D);if(!J("PATCH",`${c}/{id}`))E(U.patch(`${c}/{id}`,p),D)}let ee=!!t.traits?.useSoftDeletes;if(!T&&o.includes("destroy")&&!J("DELETE",`${c}/{id}`))E(U.delete(`${c}/{id}`,async(p)=>{try{let i=le(p.params?.id);if(i==null)return d({error:"Invalid ID parameter"},400);let u=await A.selectFrom(a).where({id:i}).executeTakeFirst();if(!u)return d({error:`${e} not found`},404);let f=await Y(p),h=await Z(t,f,p);if(h.enforced&&!h.bypass){if(!f)return d({error:"Auth required"},401);let m=u[h.field];if(!ne(m,h.value))return d({error:`Not your ${e}`},403)}if(ee){let m=new Date().toISOString();await A.updateTable(a).set({deleted_at:m,updated_at:m}).where({id:i}).execute()}else await A.deleteFrom(a).where({id:i}).execute();return new Response(null,{status:204})}catch(i){if(i instanceof B){let u={error:i.message};if(i.details!==void 0)u.details=i.details;return d(u,i.status||400)}return d({error:`Failed to delete ${e}`,detail:String(i)},500)}}),D);if(!T&&o.includes("destroy")&&!J("POST",`${c}/bulk-delete`))E(U.post(`${c}/bulk-delete`,async(p)=>{try{let u=(await _e(p))?.ids;if(!Array.isArray(u)||u.length===0)return d({error:"An array of IDs is required"},422);if(u.length>100)return d({error:"Cannot delete more than 100 records at once"},422);let f=[],h=[];for(let R of u){let k=le(R);if(k!=null)f.push(k);else h.push(R)}if(h.length>0)return d({error:"Invalid IDs in batch",invalid:h},422);let m=await Y(p),g=await Z(t,m,p);if(g.enforced&&!g.bypass){if(!m)return d({error:"Auth required"},401);if(g.value==null)return d({error:"Caller has no ownership identity"},403);let R=await A.selectFrom(a).select(["id",g.field]).execute(),k=new Set(R.filter((b)=>ne(b[g.field],g.value)).map((b)=>String(b.id))),I=f.filter((b)=>!k.has(String(b)));if(I.length>0)return d({error:`Cannot delete ${e} you don't own`,ids:I},403)}let N=new Date().toISOString();for(let R of f)if(ee)await A.updateTable(a).set({deleted_at:N,updated_at:N}).where({id:R}).execute();else await A.deleteFrom(a).where({id:R}).execute();return d({message:`Successfully deleted ${f.length} ${s}`})}catch(i){if(i instanceof B){let u={error:i.message};if(i.details!==void 0)u.details=i.details;return d(u,i.status||400)}return d({error:`Failed to bulk delete ${s}`,detail:String(i)},500)}}),D)}{let e=Me(Ke,Ge);if(e)q.warn(e)}var Ut=U;export{Ut as default};
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "@stacksjs/orm",
|
|
3
3
|
"type": "module",
|
|
4
4
|
"sideEffects": false,
|
|
5
|
-
"version": "0.74.
|
|
5
|
+
"version": "0.74.20",
|
|
6
6
|
"description": "The Stacks ORM integration",
|
|
7
7
|
"author": "Chris Breuer",
|
|
8
8
|
"contributors": [
|
|
@@ -63,31 +63,31 @@
|
|
|
63
63
|
"prepublishOnly": "bun run build"
|
|
64
64
|
},
|
|
65
65
|
"dependencies": {
|
|
66
|
-
"@stacksjs/cache": "0.74.
|
|
67
|
-
"@stacksjs/cli": "0.74.
|
|
68
|
-
"@stacksjs/config": "0.74.
|
|
69
|
-
"@stacksjs/database": "0.74.
|
|
70
|
-
"@stacksjs/env": "0.74.
|
|
71
|
-
"@stacksjs/error-handling": "0.74.
|
|
72
|
-
"@stacksjs/events": "0.74.
|
|
73
|
-
"@stacksjs/logging": "0.74.
|
|
74
|
-
"@stacksjs/model-meta": "0.74.
|
|
75
|
-
"@stacksjs/pagination": "0.74.
|
|
76
|
-
"@stacksjs/path": "0.74.
|
|
77
|
-
"@stacksjs/query-builder": "0.74.
|
|
78
|
-
"@stacksjs/realtime": "0.74.
|
|
79
|
-
"@stacksjs/router": "0.74.
|
|
80
|
-
"@stacksjs/storage": "0.74.
|
|
81
|
-
"@stacksjs/strings": "0.74.
|
|
66
|
+
"@stacksjs/cache": "0.74.20",
|
|
67
|
+
"@stacksjs/cli": "0.74.20",
|
|
68
|
+
"@stacksjs/config": "0.74.20",
|
|
69
|
+
"@stacksjs/database": "0.74.20",
|
|
70
|
+
"@stacksjs/env": "0.74.20",
|
|
71
|
+
"@stacksjs/error-handling": "0.74.20",
|
|
72
|
+
"@stacksjs/events": "0.74.20",
|
|
73
|
+
"@stacksjs/logging": "0.74.20",
|
|
74
|
+
"@stacksjs/model-meta": "0.74.20",
|
|
75
|
+
"@stacksjs/pagination": "0.74.20",
|
|
76
|
+
"@stacksjs/path": "0.74.20",
|
|
77
|
+
"@stacksjs/query-builder": "0.74.20",
|
|
78
|
+
"@stacksjs/realtime": "0.74.20",
|
|
79
|
+
"@stacksjs/router": "0.74.20",
|
|
80
|
+
"@stacksjs/storage": "0.74.20",
|
|
81
|
+
"@stacksjs/strings": "0.74.20",
|
|
82
82
|
"@stacksjs/ts-validation": "^0.5.6",
|
|
83
|
-
"@stacksjs/validation": "0.74.
|
|
83
|
+
"@stacksjs/validation": "0.74.20",
|
|
84
84
|
"bun-query-builder": "^0.2.62"
|
|
85
85
|
},
|
|
86
86
|
"peerDependencies": {
|
|
87
|
-
"@stacksjs/auth": "0.74.
|
|
88
|
-
"@stacksjs/payments": "0.74.
|
|
89
|
-
"@stacksjs/queue": "0.74.
|
|
90
|
-
"@stacksjs/search-engine": "0.74.
|
|
87
|
+
"@stacksjs/auth": "0.74.20",
|
|
88
|
+
"@stacksjs/payments": "0.74.20",
|
|
89
|
+
"@stacksjs/queue": "0.74.20",
|
|
90
|
+
"@stacksjs/search-engine": "0.74.20",
|
|
91
91
|
"stripe": "22.3.2"
|
|
92
92
|
},
|
|
93
93
|
"peerDependenciesMeta": {
|
|
@@ -108,7 +108,7 @@
|
|
|
108
108
|
}
|
|
109
109
|
},
|
|
110
110
|
"devDependencies": {
|
|
111
|
-
"@stacksjs/types": "0.74.
|
|
111
|
+
"@stacksjs/types": "0.74.20",
|
|
112
112
|
"better-dx": "^0.2.24",
|
|
113
113
|
"stripe": "22.3.2"
|
|
114
114
|
}
|