@stacksjs/orm 0.74.47 → 0.74.48
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/db.d.ts +2 -2
- package/dist/index.js +1 -1
- package/dist/transaction.d.ts +1 -1
- package/package.json +23 -23
package/dist/db.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Database access re-export
|
|
3
3
|
*
|
|
4
|
-
* This module re-exports the db instance from @stacksjs/database
|
|
4
|
+
* This module re-exports the request-time db instance from @stacksjs/database
|
|
5
5
|
* for convenience within the ORM package.
|
|
6
6
|
*/
|
|
7
|
-
export { db } from '@stacksjs/database';
|
|
7
|
+
export { db } from '@stacksjs/database/runtime';
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
var It=import.meta.require;import"@stacksjs/validation";import{log as ne}from"@stacksjs/cli";import{db as ve,mutationCount as Me}from"@stacksjs/database";async function jt(e,t={}){let{olderThanDays:n=30,column:r="created_at",query:o}=t;try{if(o){let c=ve.deleteFrom(e);c=o(c);let u=Me(await c.execute());return ne.info(`Pruned ${u} records from ${e}`),u}let a=new Date;a.setDate(a.getDate()-n);let i=await ve.deleteFrom(e).where(r,"<",a.toISOString()).execute(),s=Me(i);return ne.info(`Pruned ${s} records from ${e} older than ${n} days`),s}catch(a){throw ne.error(`Failed to prune ${e}:`,a),a}}async function Va(e,t={}){return jt(e,t)}function za(e){if(!e?.prunable)return null;if(typeof e.prunable==="boolean")return{olderThanDays:30,column:"created_at"};return e.prunable}import{createCipheriv as Bt,createDecipheriv as Nt,createHash as qt,randomBytes as Lt}from"crypto";import{log as z}from"@stacksjs/logging";var De="enc:",Ee="aes-256-gcm",Ut=12,V=null;async function Fe(){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=qt("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 t=await Fe();if(!t)return z.warn("[orm] encrypted attribute: APP_KEY not set - storing value in plaintext"),e;let n=Lt(Ut),r=Bt(Ee,t,n),o=Buffer.concat([r.update(e,"utf8"),r.final()]),a=r.getAuthTag();return`${De}${n.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 t=await Fe();if(!t)return z.warn("[orm] encrypted attribute: APP_KEY not set - cannot decrypt"),null;let[,n,r,o]=e.split(":");if(!n||!r||!o)return z.warn("[orm] encrypted attribute: malformed envelope, returning null"),null;let a=Buffer.from(n,"base64"),i=Buffer.from(r,"base64"),s=Buffer.from(o,"base64"),c=Nt(Ee,t,a);return c.setAuthTag(i),Buffer.concat([c.update(s),c.final()]).toString("utf8")}catch(t){return z.warn("[orm] encrypted attribute: decrypt failed (key rotation? corrupted ciphertext?)",{error:t}),null}}function ae(e){let t=e.attributes;if(!t||typeof t!=="object")return[];let n=[];for(let[r,o]of Object.entries(t))if(o&&typeof o==="object"&&o.encrypted===!0)n.push(r);return n}import{sqlDateTime as Kt}from"@stacksjs/database";import{log as N}from"@stacksjs/logging";var Wt=[/^password$/i,/^password_hash$/i,/^api_key$/i,/_token$/i,/_secret$/i,/^remember_token$/i],Ie="model_audits",ue=null;function Qt(e){ue=e}async function ie(){if(ue!=null)return ue;try{let e=await import("@stacksjs/router").catch(()=>null);if(!e)return null;let t=e.getCurrentRequest;if(typeof t!=="function")return null;let n=t();if(!n)return null;return(n.user??n._user)?.id??null}catch{return null}}function H(e){if(!e||typeof e!=="object")return null;let t={};for(let[n,r]of Object.entries(e)){if(Wt.some((o)=>o.test(n)))continue;t[n]=r}return t}function B(e){if(!e||typeof e!=="object")return null;let t=e;if(t._attributes&&typeof t._attributes==="object")return{...t._attributes};return{...e}}function Vt(e,t){if(!e||!t)return{old:e,next:t};let n={},r={},o=new Set([...Object.keys(e),...Object.keys(t)]);for(let a of o)if(e[a]!==t[a])n[a]=e[a],r[a]=t[a];return{old:n,next:r}}async function se(e,t=!1){try{let{db:n}=await import("@stacksjs/database");await n.insertInto(Ie).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:Kt()}).executeTakeFirst()}catch(n){if(N.warn(`[orm] audit row write failed for ${e.auditable_type}#${String(e.auditable_id)} (${e.event})`,{error:n}),t)throw n}}function je(e){return{async audits(t){try{let{db:n}=await import("@stacksjs/database");return(await n.selectFrom(Ie).selectAll().where("auditable_type","=",e).where("auditable_id","=",t).orderBy("created_at","desc").execute()??[]).map((o)=>({...o,old_values:typeof o.old_values==="string"?$e(o.old_values):o.old_values,new_values:typeof o.new_values==="string"?$e(o.new_values):o.new_values}))}catch(n){return N.warn(`[orm] audits() lookup failed for ${e}#${String(t)}`,{error:n}),[]}}}}function $e(e){try{return JSON.parse(e)}catch{return e}}function Be(e){if(e&&typeof e==="object"&&"transactional"in e)return{transactional:e.transactional===!0};return{transactional:!1}}function Ne(e,t,n="id",r={}){let o=r.transactional===!0,a=e;if(typeof e.audits!=="function")e.audits=je(t).audits;let i=async(l)=>{if(!o)return await l();let{db:d}=await import("@stacksjs/database");return await d.transaction(async()=>l())},s=e.create;if(typeof s==="function")e.create=async function(...l){return await i(async()=>{let d=await s.apply(this,l);try{let f=B(d),m=f?.[n];if(m!=null){let p=await ie();await se({auditable_type:t,auditable_id:m,event:"created",old_values:null,new_values:H(f),user_id:p},o)}}catch(f){if(N.warn(`[orm] audit(create) failed for ${t}`,{error:f}),o)throw f}return d})};let c=e.update;if(typeof c==="function")e.update=async function(l,d){return await i(async()=>{let f=a.find,m=typeof f==="function"?B(await f.call(a,l)):null,p=await c.call(this,l,d);try{let g=B(p)??(typeof f==="function"?B(await f.call(a,l)):null),{old:w,next:b}=Vt(m,g);if(b&&Object.keys(b).length>0){let h=await ie();await se({auditable_type:t,auditable_id:l,event:"updated",old_values:H(w),new_values:H(b),user_id:h},o)}}catch(g){if(N.warn(`[orm] audit(update) failed for ${t}#${String(l)}`,{error:g}),o)throw g}return p})};let u=(l)=>{let d=e[l];if(typeof d!=="function")return;e[l]=async function(f){return await i(async()=>{let m=a.find,p=typeof m==="function"?B(await m.call(a,f)):null,g=await d.call(this,f);try{if(g!==!1&&p){let w=await ie();await se({auditable_type:t,auditable_id:f,event:"deleted",old_values:H(p),new_values:null,user_id:w},o)}}catch(w){if(N.warn(`[orm] audit(${l}) failed for ${t}#${String(f)}`,{error:w}),o)throw w}return g})}};u("delete"),u("softDelete")}import{db as zt,sql as Ht,sqlDateTime as ce}from"@stacksjs/database";function A(e,t){if(typeof e!=="number"||!Number.isFinite(e)||e<=0)throw Error(`[orm/commentable] ${t} requires a positive numeric id (received ${String(e)})`)}var q="commentable_upvotes",L="commentables";function Gt(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 le(e){let t=zt;return{async comments(n){return A(n,"comments"),await t.selectFrom("commentables").where("commentables_id","=",n).where("commentables_type","=",e).selectAll().execute()},async commentCount(n){let r=await t.selectFrom("commentables").select(Ht`count(*) as count`).where("commentables_id","=",n).where("commentables_type","=",e).executeTakeFirst();return Number(r?.count)||0},async addComment(n,r){if(A(n,"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 t.insertInto("commentables").values({...r,commentables_id:n,commentables_type:e,status:"pending",created_at:ce(),updated_at:ce()}).returningAll().executeTakeFirst();if(o&&typeof o==="object"&&"id"in o)return o;let a=o?.lastInsertRowid;if(a==null)return o;return await t.selectFrom("commentables").where("id","=",Number(a)).selectAll().executeTakeFirst()},async approvedComments(n){return await t.selectFrom("commentables").where("commentables_id","=",n).where("commentables_type","=",e).where("status","=","approved").selectAll().execute()},async pendingComments(n){return await t.selectFrom("commentables").where("commentables_id","=",n).where("commentables_type","=",e).where("status","=","pending").selectAll().execute()},async rejectedComments(n){return await t.selectFrom("commentables").where("commentables_id","=",n).where("commentables_type","=",e).where("status","=","rejected").selectAll().execute()},async upvoteComment(n,r){A(n,"upvoteComment"),A(r,"upvoteComment");let o=()=>t.selectFrom(q).where("upvoteable_id","=",n).where("upvoteable_type","=",L).where("user_id","=",r).selectAll().executeTakeFirst(),a=await o();if(a)return a;try{await t.insertInto(q).values({upvoteable_id:n,upvoteable_type:L,user_id:r,created_at:ce()}).execute()}catch(i){if(!Gt(i))throw i}return await o()},async removeCommentUpvote(n,r){A(n,"removeCommentUpvote"),A(r,"removeCommentUpvote"),await t.deleteFrom(q).where("upvoteable_id","=",n).where("upvoteable_type","=",L).where("user_id","=",r).execute()},async commentUpvoteCount(n){A(n,"commentUpvoteCount");let r=await t.selectFrom(q).select("count(*) as count").where("upvoteable_id","=",n).where("upvoteable_type","=",L).executeTakeFirst();return Number(r?.count)||0},async hasUpvotedComment(n,r){return A(n,"hasUpvotedComment"),A(r,"hasUpvotedComment"),!!await t.selectFrom(q).where("upvoteable_id","=",n).where("upvoteable_type","=",L).where("user_id","=",r).selectAll().executeTakeFirst()}}}import{db as Jt,sql as Yt,sqlDateTime as qe}from"@stacksjs/database";function de(e,t){if(typeof e!=="number"||!Number.isFinite(e)||e<=0)throw Error(`[orm/taggable] ${t} requires a positive numeric id (received ${String(e)})`)}function fe(e){let t=Jt;return{async tags(n){return de(n,"tags"),await t.selectFrom("taggables").where("taggable_id","=",n).where("taggable_type","=",e).selectAll().execute()},async tagCount(n){de(n,"tagCount");let r=await t.selectFrom("taggables").select(Yt`count(*) as count`).where("taggable_id","=",n).where("taggable_type","=",e).executeTakeFirst();return Number(r?.count)||0},async addTag(n,r){if(de(n,"addTag"),!r||typeof r.name!=="string"||r.name.trim().length===0)throw Error("[orm/taggable] addTag requires a non-empty tag.name");return await t.insertInto("taggables").values({...r,taggable_id:n,taggable_type:e,slug:r.name.toLowerCase().replace(/[^a-z0-9]+/g,"-"),is_active:!0,created_at:qe(),updated_at:qe()}).execute(),await t.selectFrom("taggables").where("taggable_id","=",n).where("taggable_type","=",e).where("name","=",r.name).selectAll().executeTakeFirst()},async activeTags(n){return await t.selectFrom("taggables").where("taggable_id","=",n).where("taggable_type","=",e).where("is_active","=",!0).selectAll().execute()},async inactiveTags(n){return await t.selectFrom("taggables").where("taggable_id","=",n).where("taggable_type","=",e).where("is_active","=",!1).selectAll().execute()},async removeTag(n,r){await t.deleteFrom("taggables").where("taggable_id","=",n).where("taggable_type","=",e).where("id","=",r).execute()}}}import{db as Xt,sqlDateTime as G}from"@stacksjs/database";function pe(e){let t=Xt;async function n(r){return(await t.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 n(r);if(o.length===0)return[];return await t.selectFrom("categorizables").where("id","in",o).selectAll().execute()},async categoryCount(r){return(await n(r)).length},async addCategory(r,o){let a=()=>t.selectFrom("categorizables").where("name","=",o.name).where("categorizable_type","=",e).selectAll().executeTakeFirst(),i=await a();if(!i)await t.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(),i=await a();return await t.insertInto("categorizable_models").values({categorizable_id:r,categorizable_type:e,category_id:i?.id,created_at:G(),updated_at:G()}).execute(),i},async activeCategories(r){let o=await n(r);if(o.length===0)return[];return await t.selectFrom("categorizables").where("id","in",o).where("is_active","=",!0).selectAll().execute()},async inactiveCategories(r){let o=await n(r);if(o.length===0)return[];return await t.selectFrom("categorizables").where("id","in",o).where("is_active","=",!1).selectAll().execute()},async removeCategory(r,o){await t.deleteFrom("categorizable_models").where("categorizable_id","=",r).where("categorizable_type","=",e).where("category_id","=",o).execute()}}}import{db as Zt,sqlDateTime as en}from"@stacksjs/database";function me(e,t){let n=Zt,r=t?.table||`${e}_likes`,o=t?.foreignKey||`${e.replace(/s$/,"")}_id`;return{async likes(a){return await n.selectFrom(r).where(o,"=",a).selectAll().execute()},async likeCount(a){let i=await n.selectFrom(r).select("count(*) as count").where(o,"=",a).executeTakeFirst();return Number(i?.count)||0},async like(a,i){if(typeof a!=="number"||!Number.isFinite(a)||a<=0)throw Error(`[orm/likeable] like requires a positive numeric id (received ${String(a)})`);if(typeof i!=="number"||!Number.isFinite(i)||i<=0)throw Error(`[orm/likeable] like requires a positive numeric userId (received ${String(i)})`);let s=en();try{return await n.insertInto(r).values({[o]:a,user_id:i,created_at:s,updated_at:s}).returningAll().executeTakeFirst()}catch(c){let u=c;if(!(u.code==="SQLITE_CONSTRAINT_UNIQUE"||u.code==="SQLITE_CONSTRAINT"||u.code==="23505"||u.errno===1062||/unique|duplicate/i.test(u.message??"")))throw c;let d=await n.selectFrom(r).where(o,"=",a).where("user_id","=",i).selectAll().executeTakeFirst();if(d)return d;throw c}},async unlike(a,i){await n.deleteFrom(r).where(o,"=",a).where("user_id","=",i).execute()},async isLiked(a,i){return!!await n.selectFrom(r).where(o,"=",a).where("user_id","=",i).selectAll().executeTakeFirst()},async likedBy(a){return(await n.selectFrom(r).select([o]).where("user_id","=",a).execute()).map((s)=>Number(s[o])).filter(Boolean)}}}function Ke(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 tn(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 o={error:e.message};if(r.details!==void 0)o.details=r.details;return{status:r.status,body:o}}if(Ke(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 nn(e){let t={};for(let[n,r]of Object.entries(e))t[_(n)]=r;return t}function ci(e,t){let n=String(t||"").replace(/^\/+|\/+$/g,""),r=String(e).replace(/^\/+/,"");return`/api/${n?`${n}/`:""}${r}`}function We(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 Qe(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 li(e){return e?.ownership===!1}function di(e,t,n){let r=Object.keys(e).find((a)=>_(a)===_(t));if(Array.isArray(n)){if(r===void 0)return{data:e,error:"Ownership value is required"};if(!n.some((a)=>String(a)===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 o={...e};for(let a of Object.keys(o))if(_(a)===_(t))delete o[a];return o[t]=n,{data:o}}function rn(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 o=`${r[0]}${r.slice(1).map((a)=>`${a[0]?.toUpperCase()}${a.slice(1)}`).join("")}Id`;t.push(o)}return[...new Set(t)]}function on(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 o=_(r);if(o!==r&&o in e)n[r]=e[o]}return n}function an(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]),o=Number(n[2]),a=Number(n[3]),i=new Date(Date.UTC(r,o-1,a));if(i.getUTCFullYear()!==r||i.getUTCMonth()!==o-1||i.getUTCDate()!==a)return t;return i}function fi(e,t){if(!t.length)return e;let n={...e};for(let r of t)delete n[r],delete n[_(r)];return n}function pi(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 sn=["id","uuid","created_at","updated_at","deleted_at"];function mi(e,t){let n=new Map;for(let r of[...Object.keys(e??{}),...sn]){let o=_(r);if(!/^\w+$/.test(o))continue;n.set(r,o),n.set(o,o)}for(let r of t)n.delete(r),n.delete(_(r));return n}function yi(e,t,n){if(!t)return e;let r=String(t).split(",").map((a)=>a.trim()).filter(Boolean),o=e;for(let a of r){let i=a.startsWith("-"),s=i?a.slice(1):a;if(!/^\w+$/.test(s))continue;let c=n.get(s);if(!c)continue;o=o.orderBy(c,i?"desc":"asc")}return o}var un={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"?cn(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"?ln(e):[],set:(e)=>e==null?null:Array.isArray(e)?JSON.stringify(e):e}};function cn(e){try{return JSON.parse(e)}catch{return e}}function ln(e){try{return JSON.parse(e)}catch{return[]}}function gi(e,t,n){if(!e||typeof e!=="object"||!t||Object.keys(t).length===0)return e;let r={...e};for(let[o,a]of Object.entries(t)){let i=typeof a==="string"?un[a]:a;if(!i||typeof i[n]!=="function")continue;if(Object.prototype.hasOwnProperty.call(r,o))r[o]=i[n](r[o]);let s=_(o);if(s!==o&&Object.prototype.hasOwnProperty.call(r,s))r[s]=i[n](r[s])}return r}function Ve(e,t,n){let r=t?.attributes??{},o={};for(let[a,i]of Object.entries(r)){let s=i?.validation?.rule;if(!s||typeof s.validate!=="function")continue;let c=Object.prototype.hasOwnProperty.call(e,a);if(!c&&n==="updating")continue;let u=i!==null&&typeof i==="object"&&Object.prototype.hasOwnProperty.call(i,"default"),l=c?e[a]:u?i.default:void 0,d=an(s,l),f=s.validate(d);if(!f?.valid&&Array.isArray(f?.errors)&&f.errors.length>0)o[a]=f.errors.map((m)=>i?.validation?.message?.[m?.code]??m?.message??"invalid")}return Object.keys(o).length===0?{valid:!0}:{valid:!1,errors:o}}function bi(e,t,n){let r=Le(n);return e.find((o)=>o.method===t&&Le(String(o.path??""))===r)}function Le(e){return e.replace(/\{[^}]*\}/g,"{}").replace(/:[^/]+/g,"{}")}function ye(e){if(Array.isArray(e))return e.filter((t)=>typeof t==="string"&&t.length>0);return typeof e==="string"&&e?[e]:[]}function wi(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 o=n;return{read:"read"in o?ye(o.read):["auth"],write:"write"in o?ye(o.write):["auth"],declared:!0}}let r=ye(n);return{read:r,write:r,declared:!0}}var Ue=15,dn=100;function hi(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(Ue),10),o=Math.min(Number.isFinite(r)?Math.max(1,r):Ue,dn);return{page:n,perPage:o,offset:(n-1)*o}}function J(e,t){let n=new URL(e.toString());return n.searchParams.set("page",String(t)),`${n.pathname}${n.search}`}function fn(e,t,n,r,o,a){let i=(t-1)*n,s=r===0,c={page:t,per_page:n,from:s?null:i+1,to:s?null:i+r,has_more_pages:o,prev_page_url:t>1?J(e,t-1):null,next_page_url:o?J(e,t+1):null};if(a!==void 0&&!Number.isNaN(a)){let u=Math.max(1,Math.ceil(a/n));c.total=a,c.last_page=u,c.first_page_url=J(e,1),c.last_page_url=J(e,u)}return c}function ki(e,t,n,r,o,a){let{page:i,...s}=fn(e,t,n,r,o,a);return{current_page:i,...s}}function _i(e,t){return(t??e??"").toString().trim().toLowerCase()==="warn"?"warn":"deny"}function Ti(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.`}function pn(e){if(e?.ownership===!1)return null;if(e?.ownership)return e.ownership;let t=We(e);if(t)return{field:t,resolve:async(r,o)=>{let{resolveAuthenticatedTeamId:a}=await import("@stacksjs/auth");return a(ge(o))}};let n=Qe(e);if(n)return{field:n,resolve:async(r)=>r?.id??null};return null}function ge(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:(o)=>{for(let a of r.split(";")){let i=a.indexOf("=");if(i===-1)continue;if(a.slice(0,i).trim()===o)return decodeURIComponent(a.slice(i+1).trim())}return null}}}}function mn(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 yn(e="id"){return{field:e,resolve:async(t)=>t?.id??null}}function gn(e="site_id"){return{field:e,resolve:async(t,n)=>{try{let[{resolveAuthenticatedTeamId:r},{Site:o}]=await Promise.all([import("@stacksjs/auth"),import("@stacksjs/orm")]),a=await r(ge(n));if(a==null)return[];return(await o.where("team_id",a).get()??[]).map((s)=>s.id).filter((s)=>s!=null)}catch{return[]}}}}function bn(e="id"){return{field:e,resolve:async(t,n)=>{try{let{resolveAuthenticatedTeamId:r}=await import("@stacksjs/auth");return await r(ge(n))}catch{return null}}}}function wn(e,t){return{field:t,resolve:async(n,r)=>{try{let o=await import("@stacksjs/orm"),a=o.models?.[e]??o[e]?.definition??null,i=pn(a);if(!i?.field||typeof i.resolve!=="function")return[];let s=await i.resolve(n,r);if(s==null||Array.isArray(s)&&s.length===0)return[];let c=o[e];if(!c)return[];return((Array.isArray(s)?await c.whereIn(i.field,s).get():await c.where(i.field,s).get())??[]).map((l)=>l.id).filter((l)=>l!=null)}catch{return[]}}}}import{getCurrentRequest as hn}from"@stacksjs/router";var ze=new WeakMap;function He(e){let t=new Map;for(let n of e){let r=n?.id;if(r!==void 0)t.set(r,n)}return t}async function kn(e,t){if(typeof e.find==="function")return e.find(t);let n=await e.findMany?.([t]);return He(n??[]).get(t)}async function _n(e,t,n){t.pending=void 0;try{let r=typeof e.findMany==="function"?await e.findMany(n.keys):await Promise.all(n.keys.map((a)=>e.find?.(a))),o=He(r??[]);for(let a of n.resolvers)a.resolve(o.get(a.key))}catch(r){for(let o of n.resolvers)o.reject(r)}}function xi(e,t){let n=hn();if(!n)return kn(e,t);let r=ze.get(n);if(!r)r=new WeakMap,ze.set(n,r);let o=r.get(e);if(!o)o={cache:new Map},r.set(e,o);let a=o.cache.get(t);if(a)return a.then();let i=o.pending;if(!i){i={keys:[],resolvers:[]},o.pending=i;let u=i,l=o;queueMicrotask(()=>{_n(e,l,u)})}let s=new Promise((u,l)=>{i.keys.push(t),i.resolvers.push({key:t,resolve:u,reject:l})});o.cache.set(t,s);let c=o.cache;return s.catch(()=>c.delete(t)),s.then()}import{db as Mi}from"@stacksjs/database";class Tn{conditions=[];where(e,...t){let[n,r]=t,o=r===void 0?"=":n,a=r===void 0?n:r;this.addCondition("and","where",e,o,a)}orWhere(e,...t){let[n,r]=t,o=r===void 0?"=":n,a=r===void 0?n:r;this.addCondition("or","where",e,o,a)}whereIn(e,t){this.conditions.push({type:"and",method:"whereIn",column:e,values:t})}whereNotIn(e,t){this.conditions.push({type:"and",method:"whereIn",column:e,values:t,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,t){this.conditions.push({type:"and",method:"whereBetween",column:e,range:t})}whereExists(e){this.conditions.push({type:"and",method:"whereExists",column:"",callback:e})}addCondition(e,t,n,r,o){this.conditions.push({type:e,method:t,column:n,operator:r,value:o})}getConditions(){return this.conditions}}import{db as be}from"@stacksjs/database";async function Fi(e,t){return await be.transaction(e,t)}async function $i(e){return await be.savepoint(e)}function Ii(e,t){return be.transactional(e,t)}export*from"@stacksjs/model-meta";import{createModel as Bn,registerModel as Nn}from"@stacksjs/query-builder";import{log as k}from"@stacksjs/logging";import{snakeCase as x}from"@stacksjs/strings";import{AsyncLocalStorage as gt}from"async_hooks";import{toCursorPaginator as qn,toPaginator as Ln,toSimplePaginator as Un}from"@stacksjs/pagination";function he(e,t){let n=Te(),r=n?we(n,"per_page"):void 0,o=n?we(n,"page"):void 0,a=e!==void 0?Math.max(1,Math.floor(e)):Math.min(100,Math.max(1,r??15)),i=Math.max(1,Math.floor(t??o??1));return{perPage:a,page:i}}function ke(e,t){let n=Te(),r=n?Je(n,"cursor"):void 0,o=n?we(n,"per_page"):void 0,a=e!==void 0?Math.max(1,Math.floor(e)):Math.min(100,Math.max(1,o??15)),s=Ge(t!==void 0?t:r??null);return{perPage:a,cursor:s}}function Ge(e){if(e===null||e===void 0)return null;if(Array.isArray(e))return e;if(typeof e==="string"&&e.startsWith("["))try{let t=JSON.parse(e);if(Array.isArray(t))return t}catch{}return e}function _e(e){let t=Te();if(!t)return e;let n=(()=>{try{return new URL(t.url)}catch{return null}})();if(!n)return e;let r=n.pathname;if(e.path=r,"next_cursor"in e)return e.next_page_url=e.next_cursor!==null?v(n,{cursor:e.next_cursor}):null,e.prev_page_url=e.prev_cursor!==null?v(n,{cursor:e.prev_cursor}):null,e;let o=e.current_page;if(e.prev_page_url=o>1?v(n,{page:o-1}):null,"total"in e){let a=e.last_page;e.next_page_url=o<a?v(n,{page:o+1}):null,e.first_page_url=v(n,{page:1}),e.last_page_url=v(n,{page:a})}else e.next_page_url=e.has_more_pages?v(n,{page:o+1}):null;return e}function v(e,t){let n=new URL(e.toString());for(let[r,o]of Object.entries(t))n.searchParams.set(r,String(o));return`${n.pathname}${n.search}`}var E;function Te(){if(E===null)return;if(E===void 0)try{let t=It("@stacksjs/router");if(typeof t.getCurrentRequest==="function")E=t.getCurrentRequest;else{E=null;return}}catch{E=null;return}return E()}function we(e,t){let n=Je(e,t);if(n===void 0)return;let r=Number(n);return Number.isFinite(r)?r:void 0}function Je(e,t){let n=e.query?.[t];if(n===void 0)return;return Array.isArray(n)?n[0]:n}import{createRequire as Rn}from"module";import{db as Sn}from"@stacksjs/database";var Pn=Rn(import.meta.url);function Ye(e){let t=Sn;return{async createStripeUser(n,r){let{manageCustomer:o}=await import("@stacksjs/payments");return await o.createStripeCustomer(n,r)},async updateStripeUser(n,r){let{manageCustomer:o}=await import("@stacksjs/payments");return await o.updateStripeCustomer(n,r)},async deleteStripeUser(n){let{manageCustomer:r}=await import("@stacksjs/payments");return await r.deleteStripeUser(n)},async createOrGetStripeUser(n,r){let{manageCustomer:o}=await import("@stacksjs/payments");return await o.createOrGetStripeUser(n,r)},async retrieveStripeUser(n){let{manageCustomer:r}=await import("@stacksjs/payments");return await r.retrieveStripeUser(n)},async defaultPaymentMethod(n){let{managePaymentMethod:r}=await import("@stacksjs/payments");return await r.retrieveDefaultPaymentMethod(n)},async setDefaultPaymentMethod(n,r){let{managePaymentMethod:o}=await import("@stacksjs/payments");return await o.setDefaultPaymentMethod(n,r)},async addPaymentMethod(n,r){let{managePaymentMethod:o}=await import("@stacksjs/payments");return await o.addPaymentMethod(n,r)},async paymentMethods(n,r){let{managePaymentMethod:o}=await import("@stacksjs/payments");return await o.listPaymentMethods(n,r)},async newSubscription(n,r,o,a={}){let{manageSubscription:i}=await import("@stacksjs/payments"),s=await i.create(n,r,o,a),u=s.latest_invoice?.payment_intent;return{subscription:s,paymentIntent:u}},async updateSubscription(n,r,o,a={}){let{manageSubscription:i}=await import("@stacksjs/payments"),s=await i.update(n,r,o,a),u=s.latest_invoice?.payment_intent;return{subscription:s,paymentIntent:u}},async cancelSubscription(n,r,o={}){let{manageSubscription:a}=await import("@stacksjs/payments");return{subscription:await a.cancel(r,o)}},async activeSubscription(n){let{manageSubscription:r}=await import("@stacksjs/payments"),o=await t.selectFrom("subscriptions").where("user_id","=",n.id).where("provider_status","=","active").selectAll().executeTakeFirst();if(o){let a=await r.retrieve(n,o.provider_id||"");return{subscription:o,providerSubscription:a}}return},async checkout(n,r,o={}){let{manageCheckout:a,manageCustomer:i}=await import("@stacksjs/payments"),s={};if(o.enableTax)s.automatic_tax={enabled:!0},delete o.enableTax;if(o.allowPromotions)s.allow_promotion_codes=!0,delete o.allowPromotions;let l={...{mode:"payment",customer:(await i.createOrGetStripeUser(n,{})).id,line_items:r.map((d)=>({price:d.priceId,quantity:d.quantity||1}))},...s,...o};return await a.create(n,l)},async createSetupIntent(n,r={}){let{manageSetupIntent:o}=await import("@stacksjs/payments");return await o.create(n,r)},async subscriptionHistory(n){let{manageInvoice:r}=await import("@stacksjs/payments");return await r.list(n)},async transactionHistory(n){let{manageTransaction:r}=await import("@stacksjs/payments");return await r.list(n)},async connectAccount(n,r={}){let o=r.accountColumn||"stripe_account_id",a=(n._attributes??n)[o];if(!a)return null;let i=await U();try{return await i.accounts.retrieve(a)}catch{return null}},async createConnectAccount(n,r={}){let o=r.accountColumn||"stripe_account_id",a=n._attributes??n,i=a[o],s=await U();if(!i){let{stacksIdempotencyKey:c}=await import("@stacksjs/payments"),u=r.modelTable||e,l=await s.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:c("connect.account.create",u,a.id)});return i=l.id,await t.updateTable(u).set({[o]:i}).where("id","=",Number(a.id)).execute(),l}return await s.accounts.retrieve(i)},async connectOnboardLink(n,r){let o=r.accountColumn||"stripe_account_id",i=(n._attributes??n)[o];if(!i)throw Error("connectOnboardLink: model has no Stripe Connect account; call createConnectAccount first");return{url:(await(await U()).accountLinks.create({account:i,refresh_url:r.refreshUrl,return_url:r.returnUrl,type:r.type??"account_onboarding"})).url,accountId:i}},async syncConnectStatus(n,r={}){let o=r.accountColumn||"stripe_account_id",a=r.chargesColumn||"charges_enabled",i=r.payoutsColumn||"payouts_enabled",s=n._attributes??n,c=s[o];if(!c)return{chargesEnabled:!1,payoutsEnabled:!1};let l=await(await U()).accounts.retrieve(c),d=!!l.charges_enabled,f=!!l.payouts_enabled,m=r.modelTable||e;return await t.updateTable(m).set({[a]:d,[i]:f}).where("id","=",Number(s.id)).execute(),{chargesEnabled:d,payoutsEnabled:f}},async chargeWithSplit(n,r){let o=await U(),a=r.accountColumn||"stripe_account_id",i=n._attributes??n,s=r.connectAccountId||i[a],c={amount:r.amountCents,currency:r.currency||"usd",automatic_payment_methods:{enabled:!0},metadata:r.metadata};if(s){if(c.transfer_data={destination:s},r.platformFeeCents)c.application_fee_amount=r.platformFeeCents}let{freshIdempotencyKey:u}=await import("@stacksjs/payments");return await o.paymentIntents.create(c,{idempotencyKey:u("payment_intent.create",i.id,r.amountCents)})}}}function U(){let e=globalThis.process?.env?.STRIPE_SECRET_KEY;if(!e)throw Error("Stripe Connect: STRIPE_SECRET_KEY not configured");let t;try{t=Pn("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 t(e,{apiVersion:"2026-06-24.dahlia"})}function Xe(){return{async generateTwoFactorForModel(e){let{generateTwoFactorSecret:t}=await import("@stacksjs/auth"),n=t();await e.update({two_factor_secret:n})},async verifyTwoFactorCode(e,t){let n=e.get("two_factor_secret");if(typeof n!=="string")return!1;let{verifyTwoFactorCode:r,RateLimiter:o}=await import("@stacksjs/auth"),a=String(e.id??e.get?.("id")??e.get?.("email")??n),i=`2fa:${a}`;if(await o.isRateLimited(i)){let{HttpError:c}=await import("@stacksjs/error-handling");throw new c(429,"Too many verification attempts. Please try again later.")}if(!await r(t,n))return await o.recordFailedAttempt(i),!1;try{let{cache:c}=await import("@stacksjs/cache"),u=`2fa:used:${a}:${t}`;if(await c.has(u))return await o.recordFailedAttempt(i),!1;await c.set(u,"1",90)}catch{}return await o.resetAttempts(i),!0}}}import{mutationCount as An,sqlDateTime as xn}from"@stacksjs/database";import{log as F}from"@stacksjs/logging";var Y="deleted_at";function Ze(e,t="id"){return{async softDelete(n){let r=xn(),o=e.where(t,n);if(typeof o?.update==="function")return await o.update({[Y]:r}),!0;return!1},async restore(n){let r=e.where(t,n).withTrashed();if(typeof r?.update==="function")return await r.update({[Y]:null}),!0;return!1},async forceDelete(n){let r=e.where(t,n),o=typeof r?.withTrashed==="function"?r.withTrashed():r;if(typeof o?.delete==="function")return An(await o.delete())>0;return!1},withTrashed(){return typeof e.query==="function"?e.query():e},onlyTrashed(){let n=typeof e.query==="function"?e.query():e;if(typeof n?.whereNotNull==="function")return n.whereNotNull(Y);return n?.where?.(Y,"!=",null)??n}}}function et(e){if(e===!0||e==null)return{};if(typeof e==="object"&&!Array.isArray(e)){let t=e;if(Array.isArray(t.cascade)){let n=t.cascade.filter((r)=>typeof r==="string");return n.length?{cascade:n}:{}}return{}}return{}}function On(e,t){let n=e.hasMany??[],r=e.hasOne??[],o=n.some((l)=>Re(l,t,!0)),a=r.some((l)=>Re(l,t,!1));if(!o&&!a)return F.warn(`[orm] soft-delete cascade: '${t}' is not a declared hasMany/hasOne relation - skipping`),null;let s=(o?n:r).find((l)=>Re(l,t,o))??null;if(!s)return null;let u=globalThis[s];if(!u)return F.warn(`[orm] soft-delete cascade: model '${s}' is not yet on globalThis - skipping cascade for '${t}'`),null;return{className:s,model:u}}function Re(e,t,n){let r=e.toLowerCase();if(t===r)return!0;if(n&&t===`${r}s`)return!0;if(n&&r.endsWith("y")&&t===`${r.slice(0,-1)}ies`)return!0;return!1}async function Cn(e,t,n,r,o){try{let a=n.where;if(typeof a!=="function"){F.warn(`[orm] cascade ${o}: child model has no .where()`);return}if(o==="softDelete"){let i=n.softDelete;if(typeof i==="function"){let c=a.call(n,r,t),u=typeof c?.get==="function"?await c.get():Array.isArray(c)?c:[],l=n.primaryKey||"id";for(let d of u){let f=d?.[l];if(f!=null)await i.call(n,f)}return}let s=a.call(n,r,t);if(typeof s?.delete==="function"){F.debug(`[orm] cascade soft-delete: child has no softDeletes trait, hard-deleting from ${String(n.table??"?")}`),await s.delete();return}}else{let i=n.restore;if(typeof i!=="function"){F.debug("[orm] cascade restore: child has no restore() - nothing to do");return}let s=n.withTrashed,u=(typeof s==="function"?s.call(n):n).where?.(r,t),l=typeof u?.get==="function"?await u.get():[],d=n.primaryKey||"id";for(let f of l){let m=f?.[d];if(m!=null)await i.call(n,m)}}}catch(a){if(F.warn(`[orm] soft-delete cascade ${o} on ${e}#${String(t)} failed`,{error:a}),process.env.STACKS_ORM_CASCADE_SWALLOW!=="true")throw a}}async function K(e,t,n,r){let o=t.cascade;if(!o||o.length===0)return;let a=`${e.name.toLowerCase()}_id`;for(let i of o){let s=On(e,i);if(!s)continue;await Cn(s.className,n,s.model,a,r)}}import{sqlDateTime as Dn}from"@stacksjs/database";import{log as vn}from"@stacksjs/logging";var Mn=[/^password$/i,/^password_hash$/i,/^api_key$/i,/_token$/i,/_secret$/i,/^remember_token$/i],tt=null;async function nt(){if(tt!=null)return tt;try{let e=await import("@stacksjs/router").catch(()=>null);if(!e)return null;let t=e.getCurrentRequest;if(typeof t!=="function")return null;let n=t();return n?.user?.id??n?._user?.id??null}catch{return null}}async function rt(){try{let t=(await import("@stacksjs/router").catch(()=>null))?.getCurrentRequest;if(typeof t!=="function")return null;let n=t();return typeof n?.ip==="function"?n.ip()??null:null}catch{return null}}function ot(e){if(!e||typeof e!=="object")return null;let t={};for(let[n,r]of Object.entries(e)){if(Mn.some((o)=>o.test(n)))continue;t[n]=r}return t}function at(e,t,n){vn.warn(`[orm] ${e} row write failed for ${t}: ${n?.message??String(n)}`)}var En="activities";function it(e){if(!e)return null;if(e===!0)return{};if(typeof e!=="object")return null;let t=e;return{logOnly:Array.isArray(t.logOnly)?t.logOnly:void 0,include:Array.isArray(t.include)?t.include:void 0,exclude:Array.isArray(t.exclude)?t.exclude:void 0}}function Fn(e,t,n=[]){let r=ot(e);if(!r)return null;let o=new Set(n),a=t.logOnly??t.include,i=new Set(t.exclude??[]),s={};for(let[c,u]of Object.entries(r)){if(o.has(c)||i.has(c))continue;if(a&&!a.includes(c))continue;s[c]=u}return s}function $n(e,t,n){return n==null?`${e} was ${t}`:`${e} ${String(n)} was ${t}`}async function In(e){try{let{db:t}=await import("@stacksjs/database");await t.insertInto(En).values({type:e.type,description:e.description,subject_type:e.subject_type,subject_id:e.subject_id,causer:e.causer,properties:e.properties?JSON.stringify(e.properties):null,ip_address:e.ip_address,user_id:e.user_id,created_at:Dn()}).executeTakeFirst()}catch(t){at("activity",`${e.subject_type}#${String(e.subject_id)}`,t)}}async function jn(e){let{attributes:t,event:n,modelName:r,options:o,primaryKey:a}=e,i=t?.[a]??null,s=await nt();await In({type:`${r.toLowerCase()}.${n}`,description:$n(r,n,i),subject_type:r,subject_id:i,properties:Fn(t,o,e.hidden),causer:s==null?null:`User:${String(s)}`,user_id:s,ip_address:await rt()})}function Se(e){if(!e||typeof e!=="object")return null;let t=e;if(t.attributes&&typeof t.attributes==="object")return{...t.attributes};if(t._attributes&&typeof t._attributes==="object")return{...t._attributes};return{...e}}function st(e,t,n,r,o=[]){if(t==="Activity")return;let a=e,i=async(d)=>typeof a.find==="function"?Se(await a.find(d)):null,s=async(d,f)=>{await jn({modelName:t,event:d,attributes:f,primaryKey:n,options:r,hidden:o})},c=e.create;if(typeof c==="function")e.create=async function(...d){let f=await c.apply(this,d);return await s("created",Se(f)),f};let u=e.update;if(typeof u==="function")e.update=async function(d,f){let m=await u.call(this,d,f);return await s("updated",Se(m)??await i(d)),m};let l=e.delete;if(typeof l==="function")e.delete=async function(d){let f=await i(d),m=await l.call(this,d);return await s("deleted",f??{[n]:d}),m}}var Z,bt=new gt;function D(){return bt.getStore()?.suppressed===!0}function M(e){return Promise.resolve(bt.run({suppressed:!0},e))}var wt=new gt;function Kn(){return wt.getStore()?.suppressed===!0}function Wn(e){return Promise.resolve(wt.run({suppressed:!0},e))}var Ce=Symbol.for("stacks.orm.modelDefinition");class ht extends Error{status=422;errors;constructor(e,t){let n=Object.keys(t).join(", ");super(`${e} validation failed: ${n}`);this.name="ModelValidationError",this.errors=t}}var ut=new Set;function Qn(e,t){let n=typeof e==="string"?e.slice(0,80):String(e),r=`${typeof e}:${n}`;if(ut.has(r))return;ut.add(r);let o=t instanceof Error?t.message:String(t);console.error(`[orm] JSON cast failed to parse value (returning null): ${o} - value preview: ${JSON.stringify(n)}`)}var Vn={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(t){return Qn(e,t),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 kt(e){return typeof e==="string"?Vn[e]:e}function ct(e,t,n){if(!e||typeof e!=="object")return e;let r={...e};for(let[o,a]of Object.entries(t))if(o in r){let i=kt(a);r[o]=i[n](r[o])}return r}var X=new Set(["_attributes","_original","_definition","_hasSaved","_relations"]),lt=Symbol.for("stacks.modelInstanceProxy"),zn={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 Hn(e,t){if(!e||!t)return null;let n=t.split("."),r=e;for(let o of n){if(r==null||typeof r!=="object")return null;let a=r;if("_attributes"in a&&a._attributes&&typeof a._attributes==="object"){let i=a._attributes;if(o in i){r=i[o];continue}}if(o in a){r=a[o];continue}return null}return r??null}function R(e,t){if(!e||typeof e!=="object")return e;let n=e;if(n[lt])return e;let r=n._attributes;if(!r||typeof r!=="object")return e;if(t&&Object.keys(t).length>0){for(let[o,a]of Object.entries(t))if(Object.prototype.hasOwnProperty.call(r,o))r[o]=kt(a).get(r[o])}return new Proxy(e,{get(o,a,i){let s=o;if(a===lt)return!0;if(a==="saveAsync")return async function(){let u=s._definition,l=u?.set;if(l&&typeof s.isDirty==="function"){for(let[f,m]of Object.entries(l)){if(typeof m!=="function")continue;if(!s.isDirty(f))continue;let p=m(s._attributes),g=p&&typeof p.then==="function"?await p:p;s._attributes[f]=g}let d=u.set;u.set={};try{return s.save()}finally{u.set=d}}return s.save()};if(a==="save")return function(){let u=s._definition,l=u?.set;if(l&&Object.keys(l).length>0&&typeof s.isDirty==="function"){for(let[f,m]of Object.entries(l)){if(typeof m!=="function")continue;if(!s.isDirty(f))continue;let p=m(s._attributes);if(p&&typeof p.then==="function")throw Error(`Setter for "${f}" returned a Promise - use \`saveAsync()\` instead of \`save()\` when a model has async setters.`);s._attributes[f]=p}let d=u.set;u.set={};try{return s.save()}finally{u.set=d}}return s.save()};if(a==="updateAsync")return async function(u){if(u&&typeof u==="object"&&!Array.isArray(u))for(let[l,d]of Object.entries(u))i[l]=d;return i.saveAsync()};if(a==="saveQuietly")return function(){return M(()=>s.save())};if(a==="saveAsyncQuietly")return function(){return M(()=>i.saveAsync())};if(a==="updateQuietly")return function(u){return M(()=>s.update(u))};if(a==="updateAsyncQuietly")return function(u){return M(()=>i.updateAsync(u))};if(a==="deleteQuietly")return function(){return M(()=>s.delete())};if(a==="toSearchableObject")return function(){let d=s._definition?.traits?.useSearch;if(!d)return null;let f=s._attributes;if(!f)return null;if(d===!0){let b={...f};if(f.id!=null)b.id=String(f.id);return b}let m={},p=d.displayable?.length?d.displayable:[...d.searchable??[],...d.filterable??[],...d.sortable??[],"id"],g=d.denormalize??{},w=s._relations;for(let b of p){let h=x(b),T=f[h]??f[b];if(T!==void 0){m[h]=T;continue}let P=g[b]??g[h];if(P){m[h]=Hn(w,P);continue}m[h]=void 0}if(f.id!=null)m.id=String(f.id);return m};if(typeof a==="string"&&!X.has(a)){let u=s._attributes;if(u&&Object.prototype.hasOwnProperty.call(u,a))return u[a];let l=s._relations;if(l&&Object.prototype.hasOwnProperty.call(l,a)){let f=l[a];if(Array.isArray(f))return f.map((m)=>R(m,t));return f&&typeof f==="object"?R(f,t):f}let d=zn[a];if(d){let p=s._definition?.__traitMethods?.[d.bag]?.[a];if(typeof p==="function")return d.mode==="model"?(...g)=>p(i,...g):(...g)=>p(s.id,...g)}if(u){let f=x(a);if(f!==a&&Object.prototype.hasOwnProperty.call(u,f))return u[f]}}let c=Reflect.get(s,a,s);return typeof c==="function"?c.bind(s):c},set(o,a,i,s){let c=o;if(typeof a==="string"&&!X.has(a)){let{_attributes:u,set:l}=c;if(u&&Object.prototype.hasOwnProperty.call(u,a)){if(typeof l==="function")l.call(c,a,i);else u[a]=i;return!0}if(u){let d=x(a);if(d!==a&&Object.prototype.hasOwnProperty.call(u,d)){if(typeof l==="function")l.call(c,d,i);else u[d]=i;return!0}}if(u&&!(a in c)){if(typeof l==="function")l.call(c,a,i);else u[a]=i;return!0}}return Reflect.set(c,a,i,s)},has(o,a){let i=o;if(typeof a==="string"&&!X.has(a)){let s=i._attributes;if(s&&Object.prototype.hasOwnProperty.call(s,a))return!0;let c=i._relations;if(c&&Object.prototype.hasOwnProperty.call(c,a))return!0;if(s){let u=x(a);if(u!==a&&Object.prototype.hasOwnProperty.call(s,u))return!0}}return Reflect.has(i,a)},deleteProperty(o,a){let i=o;if(typeof a==="string"&&!X.has(a)){let s=i._attributes;if(s&&Object.prototype.hasOwnProperty.call(s,a))return delete s[a],!0}return Reflect.deleteProperty(i,a)},ownKeys(o){let i=o._attributes;return i?Object.keys(i):[]},getOwnPropertyDescriptor(o,a){let i=o;if(typeof a==="string"){let s=i._attributes;if(s&&Object.prototype.hasOwnProperty.call(s,a))return{configurable:!0,enumerable:!0,value:s[a],writable:!0}}return Object.getOwnPropertyDescriptor(i,a)}})}var Gn=new Set(["get","first","last","firstOrFail","find","findOrFail","all","paginate","simplePaginate","cursorPaginate"]),Jn={paginate:Ln,simplePaginate:Un,cursorPaginate:qn},dt=Symbol.for("stacks.queryBuilderProxy");function _t(e,t){if(!e||typeof e!=="object")return e;if(e[dt])return e;return new Proxy(e,{get(n,r,o){if(r===dt)return!0;let a=Reflect.get(n,r,o);if(typeof a!=="function")return a;return function(...i){let s=i,c=String(r);if(c==="paginate"||c==="simplePaginate"){let{perPage:d,page:f}=he(i[0],i[1]);s=[d,f]}else if(c==="cursorPaginate"){let{perPage:d,cursor:f}=ke(i[0],i[1]);s=[d,f,i[2],i[3]]}let u=a.apply(n,s),l=(d)=>{if(Gn.has(c)){if(Array.isArray(d))return d.map((m)=>R(m,t));let f=Jn[c];if(f&&d&&Array.isArray(d.data)){let m=d.data.map((g)=>R(g,t)),p=f({...d,data:m});return _e(p)}if(d&&Array.isArray(d.data))return{...d,data:d.data.map((m)=>R(m,t))};return R(d,t)}if(d&&typeof d==="object"&&typeof d.get==="function")return _t(d,t);return d};if(u&&typeof u.then==="function")return u.then(l);return l(u)}}})}function Yn(e,t){let n=["find","first","last","all","firstOrFail","findOrFail","findMany"];for(let a of n){let i=e[a];if(typeof i!=="function")continue;e[a]=function(...s){let c=i.apply(this,s),u=(l)=>Array.isArray(l)?l.map((d)=>R(d,t)):R(l,t);if(c&&typeof c.then==="function")return c.then(u);return u(c)}}let r=["create","firstOrCreate","updateOrCreate","make"];for(let a of r){let i=e[a];if(typeof i!=="function")continue;e[a]=function(...s){let c=i.apply(this,s),u=(l)=>Array.isArray(l)?l.map((d)=>R(d,t)):R(l,t);if(c&&typeof c.then==="function")return c.then(u);return u(c)}}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 i=e[a];if(typeof i!=="function")continue;e[a]=function(...s){let c=i.apply(this,s);return _t(c,t)}}}class Tt extends Error{model;id;constructor(e,t){super(t!=null?`[ORM] ${e} not found for id=${String(t)}`:`[ORM] No matching ${e} row`);this.name="ModelNotFoundError",this.model=e,this.id=t}}class Ae extends Error{model;attribute;reason;constructor(e,t,n){let r=n==="guarded"?`'${t}' is marked guarded`:`'${t}' 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=t,this.reason=n}}var Xn=new Set(["id","created_at","updated_at","deleted_at","uuid"]);function W(e,t,n={}){if(n.force)return t;if(!t||typeof t!=="object"||Array.isArray(t))return t;let r=e.attributes;if(!r)return t;let o=new Set,a=new Set,i=new Set;for(let[c,u]of Object.entries(r)){let l=x(c);if(o.add(l),u?.fillable===!0)a.add(l);if(u?.guarded===!0)i.add(l)}let s=a.size>0?a:o;for(let c of Object.keys(t)){let u=x(c);if(Xn.has(u))continue;if(i.has(u))throw new Ae(e.name,c,"guarded");if(u.endsWith("_id"))continue;if(!s.has(u))throw new Ae(e.name,c,"not-fillable")}return t}async function xe(e,t){let n=e.set;if(!n||typeof n!=="object")return t;let r={...t};for(let[o,a]of Object.entries(n)){if(typeof a!=="function"||!(o in r))continue;try{r[o]=await a(r)}catch(i){k.error(`[orm] ${e.name}.set.${o} threw - skipping setter`,i)}}return r}function Zn(e,t){let n=t.primaryKey||"id",r=e.create;function o(u){let l=e.where;if(typeof l!=="function")throw Error(`[ORM] ${t.name}.${u} needs a working where(): the underlying query builder did not expose one`);return l}function a(u){let l=e.find;if(typeof l!=="function")throw Error(`[ORM] ${t.name}.${u} needs a working find(): the underlying query builder did not expose one`);return l}function i(u){let l=e.create;if(typeof l!=="function")throw Error(`[ORM] ${t.name}.${u} cannot create: the underlying query builder did not expose create()`);return l}if(e.update=async function(u,l){if(u==null)throw Error(`[ORM] ${t.name}.update requires an id as the first argument`);if(!l||typeof l!=="object"||Array.isArray(l))throw Error(`[ORM] ${t.name}.update requires a data object as the second argument`);if(Object.keys(l).length===0){k.debug(`[orm] ${t.name}.update called with empty data - short-circuiting and returning current row`);let m=e.find;return typeof m==="function"?await m.call(e,u):null}W(t,l);let d=await xe(t,l);await o("update").call(e,n,u).update(d);let f=e.find;return typeof f==="function"?await f.call(e,u):null},typeof e.forceUpdate!=="function")e.forceUpdate=async function(u,l){if(u==null)throw Error(`[ORM] ${t.name}.forceUpdate requires an id as the first argument`);if(!l||typeof l!=="object"||Array.isArray(l))throw Error(`[ORM] ${t.name}.forceUpdate requires a data object as the second argument`);let d=await xe(t,l);await o("forceUpdate").call(e,n,u).update(d);let f=e.find;return typeof f==="function"?await f.call(e,u):null};if(typeof e.forceCreate!=="function")e.forceCreate=async function(u){if(!u||typeof u!=="object"||Array.isArray(u))throw Error(`[ORM] ${t.name}.forceCreate requires a data object`);let l=e.make;if(typeof l==="function"){let d=await l.call(e);if(d&&typeof d.forceFill==="function"&&typeof d.save==="function")return d.forceFill(u),await d.save()??d}if(typeof r!=="function")throw Error(`[ORM] ${t.name}.forceCreate cannot create: the underlying query builder did not expose create()`);return await r.call(e,u)};if(e.delete=async function(u){if(u==null)throw Error(`[ORM] ${t.name}.delete requires an id as the first argument`);if(!await a("delete").call(e,u))return!1;return await o("delete").call(e,n,u).delete(),!0},typeof e.findOrFail!=="function")e.findOrFail=async function(u){let l=await a("findOrFail").call(e,u);if(l==null)throw new Tt(t.name,u);return l};if(typeof e.exists!=="function")e.exists=async function(u){if(u==null)return!1;let l=o("exists").call(e,n,u);if(typeof l.count==="function"){let f=await l.count();return Number(f)>0}let d=e.find;return typeof d==="function"?await d.call(e,u)!=null:!1};if(typeof e.firstOrCreate!=="function")e.firstOrCreate=async function(u,l={}){if(!u||typeof u!=="object"||Array.isArray(u))throw Error(`[ORM] ${t.name}.firstOrCreate requires a where-attrs object`);let d=o("firstOrCreate").call(e,u),f=typeof d.first==="function"?await d.first():await d;if(f)return f;let m={...u,...l};return W(t,m),await i("firstOrCreate").call(e,m)};if(typeof e.updateOrCreate!=="function")e.updateOrCreate=async function(u,l){if(!u||typeof u!=="object"||Array.isArray(u))throw Error(`[ORM] ${t.name}.updateOrCreate requires a where-attrs object`);if(!l||typeof l!=="object"||Array.isArray(l))throw Error(`[ORM] ${t.name}.updateOrCreate requires a values object`);let d=o("updateOrCreate").call(e,u),f=typeof d.first==="function"?await d.first():await d;if(f){W(t,l);let p=f[n];await o("updateOrCreate").call(e,n,p).update(l);let g=e.find;return typeof g==="function"?await g.call(e,p):{...f,...l}}let m={...u,...l};return W(t,m),await i("updateOrCreate").call(e,m)};if(typeof e.count!=="function")e.count=async function(){let u=e;if(typeof u.query==="function"){let f=u.query();if(typeof f?.count==="function"){let m=await f.count();return Number(m)||0}}let{all:l,get:d}=e;if(typeof l==="function")return(await l.call(e)||[]).length;if(typeof d==="function")return(await d.call(e)||[]).length;return 0};if(typeof e.pluck!=="function")e.pluck=async function(u){if(!u||typeof u!=="string")throw Error(`[ORM] ${t.name}.pluck requires a column name`);let l=e.all;return((typeof l==="function"?await l.call(e):[])||[]).map((f)=>f?.[u])};if(typeof e.whereIn!=="function")e.whereIn=async function(u,l){if(!u||typeof u!=="string")throw Error(`[ORM] ${t.name}.whereIn requires a column name`);if(!Array.isArray(l))throw Error(`[ORM] ${t.name}.whereIn requires an array of values`);if(l.length===0)return[];let d=e.where;if(typeof d!=="function")return[];let f=d.call(e,u,"in",l);if(f&&typeof f.get==="function")return await f.get();return await f};let s=[["latest","desc"],["oldest","asc"]];for(let[u,l]of s)if(typeof e[u]!=="function")e[u]=async function(d="created_at"){let f=e,m=typeof f.query==="function"?f.query():f;if(typeof m?.orderBy==="function"){let b=m.orderBy(d,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?.[d],P=h?.[d];if(T===P)return 0;return(T>P?1:-1)*(l==="desc"?-1:1)})[0]??null};let c=At(t.traits?.useSearch,t);if(c){let u=c.index??t.table??x(`${t.name}s`);if(typeof e.search!=="function")e.search=function(l,d){return nr(e,u,l,d,c.searchable)};if(typeof e.makeAllSearchable!=="function")e.makeAllSearchable=async function(l=500){let d=e.all;if(typeof d!=="function")throw Error(`[ORM] ${t.name}.makeAllSearchable cannot run: the underlying query builder did not expose all()`);let{useSearchEngine:f}=await import("@stacksjs/search-engine"),m=f(),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 Oe(T,c);if(P.length>0)await m.addDocuments(u,P);p+=P.length}),p}catch{}let w=await d.call(e)||[],b=await Oe(w,c);if(b.length>0)await m.addDocuments(u,b);return b.length};if(typeof e.removeAllFromSearch!=="function")e.removeAllFromSearch=async function(){let{useSearchEngine:l}=await import("@stacksjs/search-engine"),d=l();if(typeof d.deleteAllDocuments==="function"){await d.deleteAllDocuments(u);return}let f=e.all,m=typeof f==="function"?await f.call(e)||[]:[],p=l();for(let g of m){let w=g?.id??g?._attributes?.id;if(w!=null)await p.deleteDocument(u,Number(w))}}}}async function Oe(e,t){if(e.length===0)return[];if(typeof t.shapeMany==="function"){let r=await t.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)=>tr(r,t)))).filter(Boolean)}function Rt(e){let t=new Set,n=e.attributes??{};for(let[r,o]of Object.entries(n))if(o?.hidden)t.add(r);return t}function er(e,t){if(!e||t.size===0)return e;let n={};for(let[r,o]of Object.entries(e))if(!t.has(r))n[r]=o;return n}async function tr(e,t){if(typeof t.shape==="function")try{return await t.shape(e)}catch{return}let n=e?.toSearchableObject?.();if(n!==void 0)return n;return er(e?._attributes??(typeof e?.toJSON==="function"?e.toJSON():null),t.hidden??new Set)}function nr(e,t,n,r,o){let a=o&&o.length>0?{query_by:[...o].join(",")}:{},i={q:n,...a,...r??{}},s={with(c){return i={...i,...c},s},where(c){return i={...i,filter:c},s},async get(){let{useSearchEngine:c}=await import("@stacksjs/search-engine");return(await c().search(t,i))?.hits??[]},async paginate(c,u=1){let{useSearchEngine:l}=await import("@stacksjs/search-engine"),f=await l().search(t,{...i,limit:c,offset:(u-1)*c});return{hits:f.hits??[],total:Number(f.estimatedTotalHits??f.nbHits??f.total??0),page:u,perPage:c}},async raw(){let{useSearchEngine:c}=await import("@stacksjs/search-engine");return await c().search(t,i)}};return s}function St(e){let t=x(e);return t===e?[e]:[e,t]}async function Pe(e,t){if(!e||typeof e!=="object")return;let n=e._attributes??e;for(let r of t)for(let o of St(r)){if(!(o in n))continue;let a=n[o];if(!j(a))continue;n[o]=await oe(a)}}function rr(e,t){if(t.length===0)return;let n=async(s)=>{if(Array.isArray(s)){for(let c of s)await Pe(c,t);return s}if(s&&typeof s==="object"&&Array.isArray(s.data)){for(let c of s.data)await Pe(c,t);return s}if(s)await Pe(s,t);return s},r=["find","first","last","all","firstOrFail","findOrFail","findMany"];for(let s of r){let c=e[s];if(typeof c!=="function")continue;e[s]=async function(...u){let l=await c.apply(this,u);return await n(l)}}let o=["create","firstOrCreate","updateOrCreate","make"];for(let s of o){let c=e[s];if(typeof c!=="function")continue;e[s]=async function(...u){let l=await c.apply(this,u);return await n(l)}}for(let s of["update","forceUpdate"]){let c=e[s];if(typeof c!=="function")continue;e[s]=async function(u,l){let d=await c.call(this,u,l);return await n(d)}}let a=["first","firstOrFail","get","all","find","findOrFail","last","paginate","simplePaginate"],i=(s)=>{if(!s||typeof s!=="object")return s;let c=s;if(c.__stacksEncryptedReads)return s;for(let u of a){let l=c[u];if(typeof l!=="function")continue;c[u]=async function(...d){return await n(await l.apply(this,d))}}for(let u of["where","whereIn","whereNull","whereNotNull","orWhere","orderBy","orderByDesc","limit","offset","with"]){let l=c[u];if(typeof l!=="function")continue;c[u]=function(...d){return i(l.apply(this,d))}}return Object.defineProperty(c,"__stacksEncryptedReads",{value:!0,enumerable:!1}),s};for(let s of["where","whereIn","whereNull","whereNotNull","orderBy","orderByDesc","limit","query"]){let c=e[s];if(typeof c!=="function")continue;e[s]=function(...u){return i(c.apply(this,u))}}}function or(e,t){if(t.length===0)return;let n=async(o)=>{if(!o||typeof o!=="object"||Array.isArray(o))return o;let a={...o};for(let i of t)for(let s of St(i))if(s in a)a[s]=await re(a[s]);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(...i){if(i[0]=await n(i[0]),i[1])i[1]=await n(i[1]);return await a.apply(this,i)}}for(let o of["update","forceUpdate"]){let a=e[o];if(typeof a!=="function")continue;e[o]=async function(i,s){let c=await n(s);return await a.call(this,i,c)}}}function ar(e,t){let n=e.create;if(typeof n==="function")e.create=async function(r,...o){W(t,r);let a=await xe(t,r);return await n.call(this,a,...o)};for(let r of["firstOrCreate","updateOrCreate"]){let o=e[r];if(typeof o!=="function")continue}}function ir(e,t){let n=String(t?.name??e.name??"Model"),r=(i,s)=>{if(Kn())return;if(!i||typeof i!=="object"||Array.isArray(i))return;let c=Ve(i,t,s);if(!c.valid)throw new ht(n,c.errors)},o=e.create;if(typeof o==="function")e.create=async function(i,...s){return r(i,"creating"),await o.call(this,i,...s)};let a=e.update;if(typeof a==="function")e.update=async function(i,s,...c){return r(s,"updating"),await a.call(this,i,s,...c)}}function sr(e,t){let n=["create","firstOrCreate","updateOrCreate"];for(let o of n){let a=e[o];if(typeof a==="function")e[o]=async function(...i){if(k.debug(`[orm] ${o.charAt(0).toUpperCase()+o.slice(1)} ${String(e.name||"unknown")}`,i[0]),i[0]&&typeof i[0]==="object"&&!Array.isArray(i[0]))i[0]=ct(i[0],t,"set");return await a.apply(this,i)}}let r=e.update;if(typeof r==="function")e.update=async function(o,a){let i=a&&typeof a==="object"&&!Array.isArray(a)?ct(a,t,"set"):a;return await r.call(this,o,i)}}var ft=new Set(["useUuid","useTimestamps","timestampable","useSoftDeletes","softDeletable","useApi","useAuth","authenticatable","useSearch","searchable","useSeeder","seedable","useSocials","billable","observe","useAudit","useActivityLog","prunable","sharding","likeable","taggable","categorizable","commentable","commentables","broadcastOn","broadcastWith"]);function Pt(e){k.debug(`[orm] Defining model: ${e.name} (table: ${e.table})`);for(let g of Object.keys(e.traits??{}))if(!ft.has(g))k.warn(`[orm] Model '${e.name}' declares an unknown trait '${g}'. It does nothing. Known traits: ${[...ft].sort().join(", ")}.`);let t=ur(e),n=lr(e),r=cr(t,n),o=dr(e);e.__traitMethods=o;let a=e.traits;if((a?.useAuth||a?.authenticatable)&&e.name!=="PersonalAccessToken"){let g=e.morphMany;if(!g||!("tokenable"in g))e.morphMany={...g??{},tokenable:"PersonalAccessToken"}}let i=r?{...e,hooks:{...e.hooks,...r}}:e,c=Bn(i);if(Yn(c,e.casts),Zn(c,i),ar(c,i),e.casts&&Object.keys(e.casts).length>0)sr(c,e.casts);let u=ae(e);if(u.length>0)or(c,u),rr(c,u);let l=e.traits?.useSoftDeletes;if(l)fr(c,i,l);let d=e.traits?.useAudit;if(d){let g=Be(d);Ne(c,e.name,e.primaryKey||"id",g)}let f=it(e.traits?.useActivityLog);if(f)st(c,e.name,e.primaryKey||"id",f,[...Rt(e)]);ir(c,i);let m=c;m.withoutValidation=function(g){return Wn(g)},m.withoutEvents=function(g){return M(g)};for(let g of["create","update","firstOrCreate","updateOrCreate","forceCreate","forceUpdate","delete","forceDelete","softDelete","restore"]){let w=c[g];if(typeof w!=="function")continue;let b=`${g}Quietly`;if(typeof c[b]==="function")continue;c[b]=function(...h){return M(()=>w.apply(c,h))}}let p=Object.assign(c,o,{...e,getDefinition:()=>e,_isStacksModel:!0});return Nn(e.name,p),Object.defineProperty(p,Ce,{value:e,enumerable:!1,configurable:!0}),p}function ur(e){let t=e.traits?.observe;if(!t)return;let n=e.name.toLowerCase(),r=(f)=>{let m=f?.attributes;if(!m||typeof m!=="object")return f;let p=e.primaryKey||"id",g={...m};if(g[p]===void 0&&f[p]!==void 0)g[p]=f[p];return g},o=async(f,m)=>{if(D())return;try{let{dispatch:p}=Z??=await import("@stacksjs/events");await p(f,m)}catch(p){if(p&&typeof p==="object"&&"code"in p&&p.code==="MODULE_NOT_FOUND")return;if(console.error(`[ORM] Event '${f}' handler error:`,p),process.env.STACKS_ORM_EVENT_ERRORS!=="swallow")throw p}},a=e.traits?.broadcastOn,i=e.traits?.broadcastWith,s=typeof a==="function"&&typeof i==="function",c=async(f,m)=>{if(!s)return;if(D())return;try{let p=a(m),g=Array.isArray(p)?p:[p],w=i(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,f,w)}}catch(p){if(p&&typeof p==="object"&&"code"in p&&p.code==="MODULE_NOT_FOUND")return;if(console.error(`[ORM] Broadcast '${f}' handler error:`,p),process.env.STACKS_ORM_BROADCAST_ERRORS==="throw")throw p}},u=async(f,m)=>{if(D())return!0;let p;try{p=Z??=await import("@stacksjs/events");let{dispatchAndCollect:g}=p,w=await g(f,m);if(w.some((h)=>h.ok&&h.value===!1))return!1;let b=w.find((h)=>!h.ok);if(b&&!b.ok)throw b.error}catch(g){if(!p&&g&&typeof g==="object"&&"code"in g&&g.code==="MODULE_NOT_FOUND")return!0;if(console.error(`[ORM] Before-event '${f}' handler error:`,g),process.env.STACKS_ORM_EVENT_ERRORS!=="swallow")throw g}return!0},l=t===!0?["create","update","delete"]:Array.isArray(t)?t:[],d={};if(l.includes("create"))d.beforeCreate=async(f)=>{if(k.debug(`[orm] Create ${n}`,f),!await u(`${n}:saving`,f))throw Error(`[ORM] ${n}:saving event cancelled the operation`);if(!await u(`${n}:creating`,f))throw Error(`[ORM] ${n}:creating event cancelled the operation`)},d.afterCreate=async(f)=>{let m=r(f);await o(`${n}:created`,m),await o(`${n}:saved`,m),await c(`${n}:created`,f)};if(l.includes("update"))d.beforeUpdate=async(f)=>{if(k.debug(`[orm] Update ${n}#${f?.id??"unknown"}`,f),!await u(`${n}:saving`,f))throw Error(`[ORM] ${n}:saving event cancelled the operation`);if(!await u(`${n}:updating`,f))throw Error(`[ORM] ${n}:updating event cancelled the operation`)},d.afterUpdate=async(f)=>{let m=r(f);await o(`${n}:updated`,m),await o(`${n}:saved`,m),await c(`${n}:updated`,f)};if(l.includes("delete"))d.beforeDelete=async(f)=>{if(k.debug(`[orm] Delete ${n}#${f?.id??"unknown"}`),!await u(`${n}:deleting`,f))throw Error(`[ORM] ${n}:deleting event cancelled the operation`)},d.afterDelete=async(f)=>{await o(`${n}:deleted`,r(f)),await c(`${n}:deleted`,f)};return d}function cr(...e){let t={},n=new Set;for(let r of e){if(!r)continue;for(let o of Object.keys(r))n.add(o)}for(let r of n){let o=e.map((a)=>a?.[r]).filter((a)=>typeof a==="function");if(!o.length)continue;t[r]=async(...a)=>{for(let i of o)await i(...a)}}return Object.keys(t).length?t:void 0}function At(e,t){if(!e)return null;let n=e===!0?{}:typeof e==="object"?{...e}:null;if(!n)return null;if(t)n.hidden=Rt(t);return n}function lr(e){let t=At(e.traits?.useSearch,e);if(!t)return;let n=t,r=n.index??e.table??x(`${e.name}s`);async function o(s){if(typeof n.shapeMany==="function")try{let[l]=await Oe([s],n);return l}catch(l){k.warn(`[orm/search] shapeMany() threw for ${e.name}: ${l.message}`);return}if(typeof n.shape==="function")try{return await n.shape(s)}catch(l){k.warn(`[orm/search] shape() threw for ${e.name}: ${l.message}`);return}let u=R(s).toSearchableObject?.();if(u!==void 0)return u;return s?._attributes??(typeof s?.toJSON==="function"?s.toJSON():null)}let a=async(s)=>{if(D())return;let c=await o(s);if(!c)return;if(t.queueable){try{let{Jobs:u}=await import("@stacksjs/queue");await u.dispatch("SyncSearchIndexJob",{index:r,op:"upsert",doc:c})}catch(u){k.warn(`[orm/search] queue dispatch failed for ${e.name}; falling back to inline: ${u.message}`),await mt(r,c,e.name)}return}await mt(r,c,e.name)};return{afterCreate:a,afterUpdate:a,afterDelete:async(s)=>{if(D())return;let c=s?.id??s?._attributes?.id;if(c==null)return;if(t.queueable){try{let{Jobs:u}=await import("@stacksjs/queue");await u.dispatch("SyncSearchIndexJob",{index:r,op:"delete",id:Number(c)})}catch(u){k.warn(`[orm/search] queue dispatch failed for ${e.name}#${c}; falling back to inline: ${u.message}`),await yt(r,Number(c),e.name)}return}await yt(r,Number(c),e.name)}}}var pt=new Map;function xt(e,t){let n=pt.get(e)??0;if(pt.set(e,n+1),n===0)k.warn(`[orm/search] ${t}`);else if(n===9)k.warn(`[orm/search] ${e} is still failing; further identical warnings suppressed for this process.`)}async function mt(e,t,n){try{let{useSearchEngine:r}=await import("@stacksjs/search-engine");await r().addDocument(e,t)}catch(r){xt(`index:${n}`,`Failed to index ${n}: ${r.message}`)}}async function yt(e,t,n){try{let{useSearchEngine:r}=await import("@stacksjs/search-engine");await r().deleteDocument(e,t)}catch(r){xt(`remove:${n}`,`Failed to remove ${n}#${t}: ${r.message}`)}}function dr(e){let t={},{table:n,traits:r}=e;if(!r)return t;if(r.taggable)t._taggable=fe(n);if(r.categorizable)t._categorizable=pe(n);if(r.commentable)t._commentable=le(n);if(r.billable)t._billable=Ye(n);if(r.likeable){let a=typeof r.likeable==="object"?r.likeable:void 0;t._likeable=me(n,a)}let o=r.useAuth||r.authenticatable;if(typeof o==="object"&&o&&"useTwoFactor"in o&&o.useTwoFactor)t._twoFactor=Xe();return t}function fr(e,t,n){let r=Ze(e,t.primaryKey||"id"),o=et(n),a=t,i=t.name.toLowerCase(),s=t.traits?.observe!=null&&t.traits?.observe!==!1,c=async(m)=>{if(!s||D())return!0;try{let{dispatchAsync:p}=Z??=await import("@stacksjs/events"),g=await p(`${i}: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 '${i}:restoring' handler error:`,p)}return!0},u=async(m)=>{if(!s||D())return;try{let{dispatch:p}=Z??=await import("@stacksjs/events");await p(`${i}:restored`,{id:m})}catch(p){if(p?.code!=="MODULE_NOT_FOUND")console.error(`[ORM] Event '${i}:restored' handler error:`,p)}},l=process.env.STACKS_ORM_CASCADE_SWALLOW!=="true",d=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})},f=async(m)=>{if(!await c(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 u(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 u(m);return w};e.softDelete=d,e.restore=f,e.forceDelete=r.forceDelete,e.withTrashed=r.withTrashed,e.onlyTrashed=r.onlyTrashed,e.delete=d}function pr(e){if(e==null)return e;if(Array.isArray(e))return e.map((n)=>pr(n));if(typeof e!=="object")return e;let t=e;if(typeof t.toJSON==="function")return t.toJSON();if(t._attributes&&typeof t._attributes==="object")return t._attributes;return e}var mr=["belongsTo","hasOne","hasMany","belongsToMany","morphMany","morphOne"],yr=["traits","dashboard"];function gr(e){let t=e?.[Ce];if(t&&typeof t==="object")return t;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 br(e,t){let n=Array.isArray(e)?e:[],r=Array.isArray(t)?t:[];if(!n.length&&!r.length)return;return[...new Set([...n,...r])]}function wr(e){if(!e)return 0;return Object.values(e).reduce((t,n)=>{let r=Number(n?.order);return Number.isFinite(r)&&r>t?r:t},0)}function hr(e,t){let n={...e,...t},r=e.attributes??{},o=t.attributes??{};if(t.attributes){let a=wr(r),i=Object.fromEntries(Object.entries(o).map(([s,c])=>{let u=!(s in r),l=Number.isFinite(Number(c?.order));if(u&&!l)return[s,{...c,order:++a}];return[s,c]}));n.attributes={...r,...i}}for(let a of mr){let i=br(e[a],t[a]);if(i)n[a]=i}for(let a of yr){let i=e[a],s=t[a];if(i&&s&&typeof i==="object"&&typeof s==="object")n[a]={...i,...s}}return n}function gs(e,t){return Pt(hr(gr(e),t))}import xr from"process";import{log as Or}from"@stacksjs/logging";import{path as S}from"@stacksjs/path";import{fs as Q}from"@stacksjs/storage";import{Database as kr}from"bun:sqlite";import{existsSync as _r,readdirSync as Tr,readFileSync as Rr}from"fs";function Sr(e){return e.startsWith("sqlite_")||e.startsWith("_qb_tmp_")}function Pr(e,t){let n=e.toUpperCase();if(n.includes("BOOL"))return t==="postgres"?"boolean":"number";if(n.includes("DATE")||n.includes("TIME"))return"string";if(n.includes("INT"))return"number";if(n.includes("CHAR")||n.includes("CLOB")||n.includes("TEXT"))return"string";if(n.includes("REAL")||n.includes("FLOA")||n.includes("DOUB")||n.includes("NUMERIC")||n.includes("DEC"))return"number";if(n.includes("BLOB"))return"Uint8Array";return"unknown"}function Ar(e,t){try{return e.exec(t),{ok:!0}}catch(n){if(/CREATE\s+TRIGGER/i.test(t))return{ok:!1,error:n.message};let r=0;for(let o of t.split(/;\s*$/m)){if(!o.trim())continue;try{e.exec(o),r++}catch{}}return r>0?{ok:!0}:{ok:!1,error:n.message}}}function Ot(e,t="sqlite"){let n=[];if(!_r(e))return{tables:[],errors:n};let r;try{r=Tr(e).filter((a)=>a.endsWith(".sql")).sort()}catch(a){return{tables:[],errors:[{file:e,error:a.message}]}}let o=new kr(":memory:");try{for(let s of r){let c=`${e}/${s}`,u;try{u=Rr(c,"utf-8")}catch(d){n.push({file:c,error:d.message});continue}let l=Ar(o,u);if(!l.ok)n.push({file:c,error:l.error??"could not be applied"})}let a=o.query("SELECT name FROM sqlite_master WHERE type = 'table' ORDER BY name").all().map((s)=>s.name).filter((s)=>!Sr(s)),i=[];for(let s of a){let c=o.query(`PRAGMA table_info("${s.replace(/"/g,'""')}")`).all();if(c.length===0)continue;let u={};for(let l of c){let d=Pr(l.type??"",t),f=l.notnull===0&&l.pk===0;u[l.name]=f&&d!=="unknown"?`${d} | null`:d}i.push({table:s,columns:u})}return{tables:i,errors:n}}finally{o.close()}}function Cr(e){if(e)return e;let t=String(xr.env.DB_CONNECTION??"").toLowerCase();return t==="postgres"||t==="mysql"?t:"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 vr(e,t){let n=e.default;if(typeof n==="boolean")return ee(t);if(typeof n==="number")return"number";if(typeof n==="string")return"string";return"unknown"}function Mr(e){let t=e.validation;if(!t||typeof t!=="object")return null;let n=t.rule;return n&&typeof n==="object"?n:null}function Dr(e){if(!e||String(e.name??"")!=="enum")return null;let n=(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 n.length>0?n.join(" | "):null}function Er(e,t){let n=Mr(e),r=Dr(n);if(r!==null)return e.nullable===!0?`${r} | null`:r;let o=typeof e.type==="string"?e.type.toLowerCase():String(n?.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(t);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 vr(e,t)}})();return e.nullable===!0?`${a} | null`:a}function Fr(e){let t={},n=e.belongsTo;if(!n)return t;let r=Array.isArray(n)?n:Object.values(n);for(let o of r){if(typeof o==="string"){t[`${O(o)}_id`]="number";continue}if(o&&typeof o==="object"){let a=o;if(typeof a.foreignKey==="string"){t[a.foreignKey]="number";continue}if(typeof a.model==="string")t[`${O(a.model)}_id`]="number"}}return t}function $r(e,t){let[n,r]=[O(e),O(t)].sort();return`${n}_${r}`}function Ir(e,t){let n=e.default,r=typeof n==="string"?"string":typeof n==="number"?"number":typeof n==="boolean"?ee(t):n instanceof Date?"string":"unknown";return e.nullable?`${r} | null`:r}function jr(e,t,n){let r=t.belongsToMany;if(!r)return[];let o=[],a=Array.isArray(r)?r:Object.values(r);for(let i of a){let s,c,u,l,d={},f=!0;if(typeof i==="string")s=i;else if(i&&typeof i==="object"&&"model"in i){let b=i;if(s=b.model,"pivotTable"in b||"firstForeignKey"in b||"secondForeignKey"in b)c=b.pivotTable,u=b.firstForeignKey,l=b.secondForeignKey;else{let h=i;c=h.table,u=h.foreignKey,l=h.relatedKey,d=h.pivot?.columns??{},f=Boolean(h.pivot?.timestamps)}}else continue;let m=c??$r(e,s),p=u??`${O(e)}_id`,g=l??`${O(s)}_id`,w={id:"number",[p]:"number",[g]:"number"};for(let[b,h]of Object.entries(d))w[b]=Ir(h,n);if(f)w.created_at="string",w.updated_at="string | null";o.push({table:m,columns:w})}return o}function Br(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 Nr(e,t){let n={id:"number"},r=e.traits??{};if(r.useUuid)n.uuid="string";if((r.useTimestamps??r.timestampable)!==!1)n.created_at="string",n.updated_at="string | null";if(r.useSoftDeletes??r.softDeletable)n.deleted_at="string | null";if((e.table??"")==="users"||e.name==="User")Object.assign(n,Br(t));return n}function qr(e,t){let n={},r=e.attributes??{};for(let[o,a]of Object.entries(r))n[O(o)]=Er(a,t);return n}function Ct(e,t,n=2){let r=" ".repeat(n),o=" ".repeat(n+1),a=Object.entries(t).map(([s,c])=>`${o}${s}: ${c}`).join(`
|
|
2
|
+
var It=import.meta.require;import"@stacksjs/validation";import{log as ne}from"@stacksjs/cli";import{db as ve,mutationCount as Me}from"@stacksjs/database/runtime";async function jt(e,t={}){let{olderThanDays:n=30,column:r="created_at",query:o}=t;try{if(o){let c=ve.deleteFrom(e);c=o(c);let u=Me(await c.execute());return ne.info(`Pruned ${u} records from ${e}`),u}let a=new Date;a.setDate(a.getDate()-n);let i=await ve.deleteFrom(e).where(r,"<",a.toISOString()).execute(),s=Me(i);return ne.info(`Pruned ${s} records from ${e} older than ${n} days`),s}catch(a){throw ne.error(`Failed to prune ${e}:`,a),a}}async function Va(e,t={}){return jt(e,t)}function za(e){if(!e?.prunable)return null;if(typeof e.prunable==="boolean")return{olderThanDays:30,column:"created_at"};return e.prunable}import{createCipheriv as Bt,createDecipheriv as Nt,createHash as qt,randomBytes as Lt}from"crypto";import{log as z}from"@stacksjs/logging";var De="enc:",Ee="aes-256-gcm",Ut=12,V=null;async function Fe(){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=qt("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 t=await Fe();if(!t)return z.warn("[orm] encrypted attribute: APP_KEY not set - storing value in plaintext"),e;let n=Lt(Ut),r=Bt(Ee,t,n),o=Buffer.concat([r.update(e,"utf8"),r.final()]),a=r.getAuthTag();return`${De}${n.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 t=await Fe();if(!t)return z.warn("[orm] encrypted attribute: APP_KEY not set - cannot decrypt"),null;let[,n,r,o]=e.split(":");if(!n||!r||!o)return z.warn("[orm] encrypted attribute: malformed envelope, returning null"),null;let a=Buffer.from(n,"base64"),i=Buffer.from(r,"base64"),s=Buffer.from(o,"base64"),c=Nt(Ee,t,a);return c.setAuthTag(i),Buffer.concat([c.update(s),c.final()]).toString("utf8")}catch(t){return z.warn("[orm] encrypted attribute: decrypt failed (key rotation? corrupted ciphertext?)",{error:t}),null}}function ae(e){let t=e.attributes;if(!t||typeof t!=="object")return[];let n=[];for(let[r,o]of Object.entries(t))if(o&&typeof o==="object"&&o.encrypted===!0)n.push(r);return n}import{sqlDateTime as Kt}from"@stacksjs/database/runtime";import{log as N}from"@stacksjs/logging";var Wt=[/^password$/i,/^password_hash$/i,/^api_key$/i,/_token$/i,/_secret$/i,/^remember_token$/i],Ie="model_audits",ue=null;function Qt(e){ue=e}async function ie(){if(ue!=null)return ue;try{let e=await import("@stacksjs/router").catch(()=>null);if(!e)return null;let t=e.getCurrentRequest;if(typeof t!=="function")return null;let n=t();if(!n)return null;return(n.user??n._user)?.id??null}catch{return null}}function H(e){if(!e||typeof e!=="object")return null;let t={};for(let[n,r]of Object.entries(e)){if(Wt.some((o)=>o.test(n)))continue;t[n]=r}return t}function B(e){if(!e||typeof e!=="object")return null;let t=e;if(t._attributes&&typeof t._attributes==="object")return{...t._attributes};return{...e}}function Vt(e,t){if(!e||!t)return{old:e,next:t};let n={},r={},o=new Set([...Object.keys(e),...Object.keys(t)]);for(let a of o)if(e[a]!==t[a])n[a]=e[a],r[a]=t[a];return{old:n,next:r}}async function se(e,t=!1){try{let{db:n}=await import("@stacksjs/database/runtime");await n.insertInto(Ie).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:Kt()}).executeTakeFirst()}catch(n){if(N.warn(`[orm] audit row write failed for ${e.auditable_type}#${String(e.auditable_id)} (${e.event})`,{error:n}),t)throw n}}function je(e){return{async audits(t){try{let{db:n}=await import("@stacksjs/database/runtime");return(await n.selectFrom(Ie).selectAll().where("auditable_type","=",e).where("auditable_id","=",t).orderBy("created_at","desc").execute()??[]).map((o)=>({...o,old_values:typeof o.old_values==="string"?$e(o.old_values):o.old_values,new_values:typeof o.new_values==="string"?$e(o.new_values):o.new_values}))}catch(n){return N.warn(`[orm] audits() lookup failed for ${e}#${String(t)}`,{error:n}),[]}}}}function $e(e){try{return JSON.parse(e)}catch{return e}}function Be(e){if(e&&typeof e==="object"&&"transactional"in e)return{transactional:e.transactional===!0};return{transactional:!1}}function Ne(e,t,n="id",r={}){let o=r.transactional===!0,a=e;if(typeof e.audits!=="function")e.audits=je(t).audits;let i=async(l)=>{if(!o)return await l();let{db:d}=await import("@stacksjs/database/runtime");return await d.transaction(async()=>l())},s=e.create;if(typeof s==="function")e.create=async function(...l){return await i(async()=>{let d=await s.apply(this,l);try{let f=B(d),m=f?.[n];if(m!=null){let p=await ie();await se({auditable_type:t,auditable_id:m,event:"created",old_values:null,new_values:H(f),user_id:p},o)}}catch(f){if(N.warn(`[orm] audit(create) failed for ${t}`,{error:f}),o)throw f}return d})};let c=e.update;if(typeof c==="function")e.update=async function(l,d){return await i(async()=>{let f=a.find,m=typeof f==="function"?B(await f.call(a,l)):null,p=await c.call(this,l,d);try{let g=B(p)??(typeof f==="function"?B(await f.call(a,l)):null),{old:w,next:b}=Vt(m,g);if(b&&Object.keys(b).length>0){let h=await ie();await se({auditable_type:t,auditable_id:l,event:"updated",old_values:H(w),new_values:H(b),user_id:h},o)}}catch(g){if(N.warn(`[orm] audit(update) failed for ${t}#${String(l)}`,{error:g}),o)throw g}return p})};let u=(l)=>{let d=e[l];if(typeof d!=="function")return;e[l]=async function(f){return await i(async()=>{let m=a.find,p=typeof m==="function"?B(await m.call(a,f)):null,g=await d.call(this,f);try{if(g!==!1&&p){let w=await ie();await se({auditable_type:t,auditable_id:f,event:"deleted",old_values:H(p),new_values:null,user_id:w},o)}}catch(w){if(N.warn(`[orm] audit(${l}) failed for ${t}#${String(f)}`,{error:w}),o)throw w}return g})}};u("delete"),u("softDelete")}import{db as zt,sql as Ht,sqlDateTime as ce}from"@stacksjs/database/runtime";function A(e,t){if(typeof e!=="number"||!Number.isFinite(e)||e<=0)throw Error(`[orm/commentable] ${t} requires a positive numeric id (received ${String(e)})`)}var q="commentable_upvotes",L="commentables";function Gt(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 le(e){let t=zt;return{async comments(n){return A(n,"comments"),await t.selectFrom("commentables").where("commentables_id","=",n).where("commentables_type","=",e).selectAll().execute()},async commentCount(n){let r=await t.selectFrom("commentables").select(Ht`count(*) as count`).where("commentables_id","=",n).where("commentables_type","=",e).executeTakeFirst();return Number(r?.count)||0},async addComment(n,r){if(A(n,"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 t.insertInto("commentables").values({...r,commentables_id:n,commentables_type:e,status:"pending",created_at:ce(),updated_at:ce()}).returningAll().executeTakeFirst();if(o&&typeof o==="object"&&"id"in o)return o;let a=o?.lastInsertRowid;if(a==null)return o;return await t.selectFrom("commentables").where("id","=",Number(a)).selectAll().executeTakeFirst()},async approvedComments(n){return await t.selectFrom("commentables").where("commentables_id","=",n).where("commentables_type","=",e).where("status","=","approved").selectAll().execute()},async pendingComments(n){return await t.selectFrom("commentables").where("commentables_id","=",n).where("commentables_type","=",e).where("status","=","pending").selectAll().execute()},async rejectedComments(n){return await t.selectFrom("commentables").where("commentables_id","=",n).where("commentables_type","=",e).where("status","=","rejected").selectAll().execute()},async upvoteComment(n,r){A(n,"upvoteComment"),A(r,"upvoteComment");let o=()=>t.selectFrom(q).where("upvoteable_id","=",n).where("upvoteable_type","=",L).where("user_id","=",r).selectAll().executeTakeFirst(),a=await o();if(a)return a;try{await t.insertInto(q).values({upvoteable_id:n,upvoteable_type:L,user_id:r,created_at:ce()}).execute()}catch(i){if(!Gt(i))throw i}return await o()},async removeCommentUpvote(n,r){A(n,"removeCommentUpvote"),A(r,"removeCommentUpvote"),await t.deleteFrom(q).where("upvoteable_id","=",n).where("upvoteable_type","=",L).where("user_id","=",r).execute()},async commentUpvoteCount(n){A(n,"commentUpvoteCount");let r=await t.selectFrom(q).select("count(*) as count").where("upvoteable_id","=",n).where("upvoteable_type","=",L).executeTakeFirst();return Number(r?.count)||0},async hasUpvotedComment(n,r){return A(n,"hasUpvotedComment"),A(r,"hasUpvotedComment"),!!await t.selectFrom(q).where("upvoteable_id","=",n).where("upvoteable_type","=",L).where("user_id","=",r).selectAll().executeTakeFirst()}}}import{db as Jt,sql as Yt,sqlDateTime as qe}from"@stacksjs/database/runtime";function de(e,t){if(typeof e!=="number"||!Number.isFinite(e)||e<=0)throw Error(`[orm/taggable] ${t} requires a positive numeric id (received ${String(e)})`)}function fe(e){let t=Jt;return{async tags(n){return de(n,"tags"),await t.selectFrom("taggables").where("taggable_id","=",n).where("taggable_type","=",e).selectAll().execute()},async tagCount(n){de(n,"tagCount");let r=await t.selectFrom("taggables").select(Yt`count(*) as count`).where("taggable_id","=",n).where("taggable_type","=",e).executeTakeFirst();return Number(r?.count)||0},async addTag(n,r){if(de(n,"addTag"),!r||typeof r.name!=="string"||r.name.trim().length===0)throw Error("[orm/taggable] addTag requires a non-empty tag.name");return await t.insertInto("taggables").values({...r,taggable_id:n,taggable_type:e,slug:r.name.toLowerCase().replace(/[^a-z0-9]+/g,"-"),is_active:!0,created_at:qe(),updated_at:qe()}).execute(),await t.selectFrom("taggables").where("taggable_id","=",n).where("taggable_type","=",e).where("name","=",r.name).selectAll().executeTakeFirst()},async activeTags(n){return await t.selectFrom("taggables").where("taggable_id","=",n).where("taggable_type","=",e).where("is_active","=",!0).selectAll().execute()},async inactiveTags(n){return await t.selectFrom("taggables").where("taggable_id","=",n).where("taggable_type","=",e).where("is_active","=",!1).selectAll().execute()},async removeTag(n,r){await t.deleteFrom("taggables").where("taggable_id","=",n).where("taggable_type","=",e).where("id","=",r).execute()}}}import{db as Xt,sqlDateTime as G}from"@stacksjs/database/runtime";function pe(e){let t=Xt;async function n(r){return(await t.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 n(r);if(o.length===0)return[];return await t.selectFrom("categorizables").where("id","in",o).selectAll().execute()},async categoryCount(r){return(await n(r)).length},async addCategory(r,o){let a=()=>t.selectFrom("categorizables").where("name","=",o.name).where("categorizable_type","=",e).selectAll().executeTakeFirst(),i=await a();if(!i)await t.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(),i=await a();return await t.insertInto("categorizable_models").values({categorizable_id:r,categorizable_type:e,category_id:i?.id,created_at:G(),updated_at:G()}).execute(),i},async activeCategories(r){let o=await n(r);if(o.length===0)return[];return await t.selectFrom("categorizables").where("id","in",o).where("is_active","=",!0).selectAll().execute()},async inactiveCategories(r){let o=await n(r);if(o.length===0)return[];return await t.selectFrom("categorizables").where("id","in",o).where("is_active","=",!1).selectAll().execute()},async removeCategory(r,o){await t.deleteFrom("categorizable_models").where("categorizable_id","=",r).where("categorizable_type","=",e).where("category_id","=",o).execute()}}}import{db as Zt,sqlDateTime as en}from"@stacksjs/database/runtime";function me(e,t){let n=Zt,r=t?.table||`${e}_likes`,o=t?.foreignKey||`${e.replace(/s$/,"")}_id`;return{async likes(a){return await n.selectFrom(r).where(o,"=",a).selectAll().execute()},async likeCount(a){let i=await n.selectFrom(r).select("count(*) as count").where(o,"=",a).executeTakeFirst();return Number(i?.count)||0},async like(a,i){if(typeof a!=="number"||!Number.isFinite(a)||a<=0)throw Error(`[orm/likeable] like requires a positive numeric id (received ${String(a)})`);if(typeof i!=="number"||!Number.isFinite(i)||i<=0)throw Error(`[orm/likeable] like requires a positive numeric userId (received ${String(i)})`);let s=en();try{return await n.insertInto(r).values({[o]:a,user_id:i,created_at:s,updated_at:s}).returningAll().executeTakeFirst()}catch(c){let u=c;if(!(u.code==="SQLITE_CONSTRAINT_UNIQUE"||u.code==="SQLITE_CONSTRAINT"||u.code==="23505"||u.errno===1062||/unique|duplicate/i.test(u.message??"")))throw c;let d=await n.selectFrom(r).where(o,"=",a).where("user_id","=",i).selectAll().executeTakeFirst();if(d)return d;throw c}},async unlike(a,i){await n.deleteFrom(r).where(o,"=",a).where("user_id","=",i).execute()},async isLiked(a,i){return!!await n.selectFrom(r).where(o,"=",a).where("user_id","=",i).selectAll().executeTakeFirst()},async likedBy(a){return(await n.selectFrom(r).select([o]).where("user_id","=",a).execute()).map((s)=>Number(s[o])).filter(Boolean)}}}function Ke(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 tn(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 o={error:e.message};if(r.details!==void 0)o.details=r.details;return{status:r.status,body:o}}if(Ke(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 nn(e){let t={};for(let[n,r]of Object.entries(e))t[_(n)]=r;return t}function ci(e,t){let n=String(t||"").replace(/^\/+|\/+$/g,""),r=String(e).replace(/^\/+/,"");return`/api/${n?`${n}/`:""}${r}`}function We(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 Qe(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 li(e){return e?.ownership===!1}function di(e,t,n){let r=Object.keys(e).find((a)=>_(a)===_(t));if(Array.isArray(n)){if(r===void 0)return{data:e,error:"Ownership value is required"};if(!n.some((a)=>String(a)===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 o={...e};for(let a of Object.keys(o))if(_(a)===_(t))delete o[a];return o[t]=n,{data:o}}function rn(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 o=`${r[0]}${r.slice(1).map((a)=>`${a[0]?.toUpperCase()}${a.slice(1)}`).join("")}Id`;t.push(o)}return[...new Set(t)]}function on(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 o=_(r);if(o!==r&&o in e)n[r]=e[o]}return n}function an(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]),o=Number(n[2]),a=Number(n[3]),i=new Date(Date.UTC(r,o-1,a));if(i.getUTCFullYear()!==r||i.getUTCMonth()!==o-1||i.getUTCDate()!==a)return t;return i}function fi(e,t){if(!t.length)return e;let n={...e};for(let r of t)delete n[r],delete n[_(r)];return n}function pi(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 sn=["id","uuid","created_at","updated_at","deleted_at"];function mi(e,t){let n=new Map;for(let r of[...Object.keys(e??{}),...sn]){let o=_(r);if(!/^\w+$/.test(o))continue;n.set(r,o),n.set(o,o)}for(let r of t)n.delete(r),n.delete(_(r));return n}function yi(e,t,n){if(!t)return e;let r=String(t).split(",").map((a)=>a.trim()).filter(Boolean),o=e;for(let a of r){let i=a.startsWith("-"),s=i?a.slice(1):a;if(!/^\w+$/.test(s))continue;let c=n.get(s);if(!c)continue;o=o.orderBy(c,i?"desc":"asc")}return o}var un={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"?cn(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"?ln(e):[],set:(e)=>e==null?null:Array.isArray(e)?JSON.stringify(e):e}};function cn(e){try{return JSON.parse(e)}catch{return e}}function ln(e){try{return JSON.parse(e)}catch{return[]}}function gi(e,t,n){if(!e||typeof e!=="object"||!t||Object.keys(t).length===0)return e;let r={...e};for(let[o,a]of Object.entries(t)){let i=typeof a==="string"?un[a]:a;if(!i||typeof i[n]!=="function")continue;if(Object.prototype.hasOwnProperty.call(r,o))r[o]=i[n](r[o]);let s=_(o);if(s!==o&&Object.prototype.hasOwnProperty.call(r,s))r[s]=i[n](r[s])}return r}function Ve(e,t,n){let r=t?.attributes??{},o={};for(let[a,i]of Object.entries(r)){let s=i?.validation?.rule;if(!s||typeof s.validate!=="function")continue;let c=Object.prototype.hasOwnProperty.call(e,a);if(!c&&n==="updating")continue;let u=i!==null&&typeof i==="object"&&Object.prototype.hasOwnProperty.call(i,"default"),l=c?e[a]:u?i.default:void 0,d=an(s,l),f=s.validate(d);if(!f?.valid&&Array.isArray(f?.errors)&&f.errors.length>0)o[a]=f.errors.map((m)=>i?.validation?.message?.[m?.code]??m?.message??"invalid")}return Object.keys(o).length===0?{valid:!0}:{valid:!1,errors:o}}function bi(e,t,n){let r=Le(n);return e.find((o)=>o.method===t&&Le(String(o.path??""))===r)}function Le(e){return e.replace(/\{[^}]*\}/g,"{}").replace(/:[^/]+/g,"{}")}function ye(e){if(Array.isArray(e))return e.filter((t)=>typeof t==="string"&&t.length>0);return typeof e==="string"&&e?[e]:[]}function wi(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 o=n;return{read:"read"in o?ye(o.read):["auth"],write:"write"in o?ye(o.write):["auth"],declared:!0}}let r=ye(n);return{read:r,write:r,declared:!0}}var Ue=15,dn=100;function hi(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(Ue),10),o=Math.min(Number.isFinite(r)?Math.max(1,r):Ue,dn);return{page:n,perPage:o,offset:(n-1)*o}}function J(e,t){let n=new URL(e.toString());return n.searchParams.set("page",String(t)),`${n.pathname}${n.search}`}function fn(e,t,n,r,o,a){let i=(t-1)*n,s=r===0,c={page:t,per_page:n,from:s?null:i+1,to:s?null:i+r,has_more_pages:o,prev_page_url:t>1?J(e,t-1):null,next_page_url:o?J(e,t+1):null};if(a!==void 0&&!Number.isNaN(a)){let u=Math.max(1,Math.ceil(a/n));c.total=a,c.last_page=u,c.first_page_url=J(e,1),c.last_page_url=J(e,u)}return c}function ki(e,t,n,r,o,a){let{page:i,...s}=fn(e,t,n,r,o,a);return{current_page:i,...s}}function _i(e,t){return(t??e??"").toString().trim().toLowerCase()==="warn"?"warn":"deny"}function Ti(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.`}function pn(e){if(e?.ownership===!1)return null;if(e?.ownership)return e.ownership;let t=We(e);if(t)return{field:t,resolve:async(r,o)=>{let{resolveAuthenticatedTeamId:a}=await import("@stacksjs/auth");return a(ge(o))}};let n=Qe(e);if(n)return{field:n,resolve:async(r)=>r?.id??null};return null}function ge(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:(o)=>{for(let a of r.split(";")){let i=a.indexOf("=");if(i===-1)continue;if(a.slice(0,i).trim()===o)return decodeURIComponent(a.slice(i+1).trim())}return null}}}}function mn(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 yn(e="id"){return{field:e,resolve:async(t)=>t?.id??null}}function gn(e="site_id"){return{field:e,resolve:async(t,n)=>{try{let[{resolveAuthenticatedTeamId:r},{Site:o}]=await Promise.all([import("@stacksjs/auth"),import("@stacksjs/orm")]),a=await r(ge(n));if(a==null)return[];return(await o.where("team_id",a).get()??[]).map((s)=>s.id).filter((s)=>s!=null)}catch{return[]}}}}function bn(e="id"){return{field:e,resolve:async(t,n)=>{try{let{resolveAuthenticatedTeamId:r}=await import("@stacksjs/auth");return await r(ge(n))}catch{return null}}}}function wn(e,t){return{field:t,resolve:async(n,r)=>{try{let o=await import("@stacksjs/orm"),a=o.models?.[e]??o[e]?.definition??null,i=pn(a);if(!i?.field||typeof i.resolve!=="function")return[];let s=await i.resolve(n,r);if(s==null||Array.isArray(s)&&s.length===0)return[];let c=o[e];if(!c)return[];return((Array.isArray(s)?await c.whereIn(i.field,s).get():await c.where(i.field,s).get())??[]).map((l)=>l.id).filter((l)=>l!=null)}catch{return[]}}}}import{getCurrentRequest as hn}from"@stacksjs/router";var ze=new WeakMap;function He(e){let t=new Map;for(let n of e){let r=n?.id;if(r!==void 0)t.set(r,n)}return t}async function kn(e,t){if(typeof e.find==="function")return e.find(t);let n=await e.findMany?.([t]);return He(n??[]).get(t)}async function _n(e,t,n){t.pending=void 0;try{let r=typeof e.findMany==="function"?await e.findMany(n.keys):await Promise.all(n.keys.map((a)=>e.find?.(a))),o=He(r??[]);for(let a of n.resolvers)a.resolve(o.get(a.key))}catch(r){for(let o of n.resolvers)o.reject(r)}}function xi(e,t){let n=hn();if(!n)return kn(e,t);let r=ze.get(n);if(!r)r=new WeakMap,ze.set(n,r);let o=r.get(e);if(!o)o={cache:new Map},r.set(e,o);let a=o.cache.get(t);if(a)return a.then();let i=o.pending;if(!i){i={keys:[],resolvers:[]},o.pending=i;let u=i,l=o;queueMicrotask(()=>{_n(e,l,u)})}let s=new Promise((u,l)=>{i.keys.push(t),i.resolvers.push({key:t,resolve:u,reject:l})});o.cache.set(t,s);let c=o.cache;return s.catch(()=>c.delete(t)),s.then()}import{db as Mi}from"@stacksjs/database/runtime";class Tn{conditions=[];where(e,...t){let[n,r]=t,o=r===void 0?"=":n,a=r===void 0?n:r;this.addCondition("and","where",e,o,a)}orWhere(e,...t){let[n,r]=t,o=r===void 0?"=":n,a=r===void 0?n:r;this.addCondition("or","where",e,o,a)}whereIn(e,t){this.conditions.push({type:"and",method:"whereIn",column:e,values:t})}whereNotIn(e,t){this.conditions.push({type:"and",method:"whereIn",column:e,values:t,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,t){this.conditions.push({type:"and",method:"whereBetween",column:e,range:t})}whereExists(e){this.conditions.push({type:"and",method:"whereExists",column:"",callback:e})}addCondition(e,t,n,r,o){this.conditions.push({type:e,method:t,column:n,operator:r,value:o})}getConditions(){return this.conditions}}import{db as be}from"@stacksjs/database/runtime";async function Fi(e,t){return await be.transaction(e,t)}async function $i(e){return await be.savepoint(e)}function Ii(e,t){return be.transactional(e,t)}export*from"@stacksjs/model-meta";import{createModel as Bn,registerModel as Nn}from"@stacksjs/query-builder";import{log as k}from"@stacksjs/logging";import{snakeCase as x}from"@stacksjs/strings";import{AsyncLocalStorage as gt}from"async_hooks";import{toCursorPaginator as qn,toPaginator as Ln,toSimplePaginator as Un}from"@stacksjs/pagination";function he(e,t){let n=Te(),r=n?we(n,"per_page"):void 0,o=n?we(n,"page"):void 0,a=e!==void 0?Math.max(1,Math.floor(e)):Math.min(100,Math.max(1,r??15)),i=Math.max(1,Math.floor(t??o??1));return{perPage:a,page:i}}function ke(e,t){let n=Te(),r=n?Je(n,"cursor"):void 0,o=n?we(n,"per_page"):void 0,a=e!==void 0?Math.max(1,Math.floor(e)):Math.min(100,Math.max(1,o??15)),s=Ge(t!==void 0?t:r??null);return{perPage:a,cursor:s}}function Ge(e){if(e===null||e===void 0)return null;if(Array.isArray(e))return e;if(typeof e==="string"&&e.startsWith("["))try{let t=JSON.parse(e);if(Array.isArray(t))return t}catch{}return e}function _e(e){let t=Te();if(!t)return e;let n=(()=>{try{return new URL(t.url)}catch{return null}})();if(!n)return e;let r=n.pathname;if(e.path=r,"next_cursor"in e)return e.next_page_url=e.next_cursor!==null?v(n,{cursor:e.next_cursor}):null,e.prev_page_url=e.prev_cursor!==null?v(n,{cursor:e.prev_cursor}):null,e;let o=e.current_page;if(e.prev_page_url=o>1?v(n,{page:o-1}):null,"total"in e){let a=e.last_page;e.next_page_url=o<a?v(n,{page:o+1}):null,e.first_page_url=v(n,{page:1}),e.last_page_url=v(n,{page:a})}else e.next_page_url=e.has_more_pages?v(n,{page:o+1}):null;return e}function v(e,t){let n=new URL(e.toString());for(let[r,o]of Object.entries(t))n.searchParams.set(r,String(o));return`${n.pathname}${n.search}`}var E;function Te(){if(E===null)return;if(E===void 0)try{let t=It("@stacksjs/router");if(typeof t.getCurrentRequest==="function")E=t.getCurrentRequest;else{E=null;return}}catch{E=null;return}return E()}function we(e,t){let n=Je(e,t);if(n===void 0)return;let r=Number(n);return Number.isFinite(r)?r:void 0}function Je(e,t){let n=e.query?.[t];if(n===void 0)return;return Array.isArray(n)?n[0]:n}import{createRequire as Rn}from"module";import{db as Sn}from"@stacksjs/database/runtime";var Pn=Rn(import.meta.url);function Ye(e){let t=Sn;return{async createStripeUser(n,r){let{manageCustomer:o}=await import("@stacksjs/payments");return await o.createStripeCustomer(n,r)},async updateStripeUser(n,r){let{manageCustomer:o}=await import("@stacksjs/payments");return await o.updateStripeCustomer(n,r)},async deleteStripeUser(n){let{manageCustomer:r}=await import("@stacksjs/payments");return await r.deleteStripeUser(n)},async createOrGetStripeUser(n,r){let{manageCustomer:o}=await import("@stacksjs/payments");return await o.createOrGetStripeUser(n,r)},async retrieveStripeUser(n){let{manageCustomer:r}=await import("@stacksjs/payments");return await r.retrieveStripeUser(n)},async defaultPaymentMethod(n){let{managePaymentMethod:r}=await import("@stacksjs/payments");return await r.retrieveDefaultPaymentMethod(n)},async setDefaultPaymentMethod(n,r){let{managePaymentMethod:o}=await import("@stacksjs/payments");return await o.setDefaultPaymentMethod(n,r)},async addPaymentMethod(n,r){let{managePaymentMethod:o}=await import("@stacksjs/payments");return await o.addPaymentMethod(n,r)},async paymentMethods(n,r){let{managePaymentMethod:o}=await import("@stacksjs/payments");return await o.listPaymentMethods(n,r)},async newSubscription(n,r,o,a={}){let{manageSubscription:i}=await import("@stacksjs/payments"),s=await i.create(n,r,o,a),u=s.latest_invoice?.payment_intent;return{subscription:s,paymentIntent:u}},async updateSubscription(n,r,o,a={}){let{manageSubscription:i}=await import("@stacksjs/payments"),s=await i.update(n,r,o,a),u=s.latest_invoice?.payment_intent;return{subscription:s,paymentIntent:u}},async cancelSubscription(n,r,o={}){let{manageSubscription:a}=await import("@stacksjs/payments");return{subscription:await a.cancel(r,o)}},async activeSubscription(n){let{manageSubscription:r}=await import("@stacksjs/payments"),o=await t.selectFrom("subscriptions").where("user_id","=",n.id).where("provider_status","=","active").selectAll().executeTakeFirst();if(o){let a=await r.retrieve(n,o.provider_id||"");return{subscription:o,providerSubscription:a}}return},async checkout(n,r,o={}){let{manageCheckout:a,manageCustomer:i}=await import("@stacksjs/payments"),s={};if(o.enableTax)s.automatic_tax={enabled:!0},delete o.enableTax;if(o.allowPromotions)s.allow_promotion_codes=!0,delete o.allowPromotions;let l={...{mode:"payment",customer:(await i.createOrGetStripeUser(n,{})).id,line_items:r.map((d)=>({price:d.priceId,quantity:d.quantity||1}))},...s,...o};return await a.create(n,l)},async createSetupIntent(n,r={}){let{manageSetupIntent:o}=await import("@stacksjs/payments");return await o.create(n,r)},async subscriptionHistory(n){let{manageInvoice:r}=await import("@stacksjs/payments");return await r.list(n)},async transactionHistory(n){let{manageTransaction:r}=await import("@stacksjs/payments");return await r.list(n)},async connectAccount(n,r={}){let o=r.accountColumn||"stripe_account_id",a=(n._attributes??n)[o];if(!a)return null;let i=await U();try{return await i.accounts.retrieve(a)}catch{return null}},async createConnectAccount(n,r={}){let o=r.accountColumn||"stripe_account_id",a=n._attributes??n,i=a[o],s=await U();if(!i){let{stacksIdempotencyKey:c}=await import("@stacksjs/payments"),u=r.modelTable||e,l=await s.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:c("connect.account.create",u,a.id)});return i=l.id,await t.updateTable(u).set({[o]:i}).where("id","=",Number(a.id)).execute(),l}return await s.accounts.retrieve(i)},async connectOnboardLink(n,r){let o=r.accountColumn||"stripe_account_id",i=(n._attributes??n)[o];if(!i)throw Error("connectOnboardLink: model has no Stripe Connect account; call createConnectAccount first");return{url:(await(await U()).accountLinks.create({account:i,refresh_url:r.refreshUrl,return_url:r.returnUrl,type:r.type??"account_onboarding"})).url,accountId:i}},async syncConnectStatus(n,r={}){let o=r.accountColumn||"stripe_account_id",a=r.chargesColumn||"charges_enabled",i=r.payoutsColumn||"payouts_enabled",s=n._attributes??n,c=s[o];if(!c)return{chargesEnabled:!1,payoutsEnabled:!1};let l=await(await U()).accounts.retrieve(c),d=!!l.charges_enabled,f=!!l.payouts_enabled,m=r.modelTable||e;return await t.updateTable(m).set({[a]:d,[i]:f}).where("id","=",Number(s.id)).execute(),{chargesEnabled:d,payoutsEnabled:f}},async chargeWithSplit(n,r){let o=await U(),a=r.accountColumn||"stripe_account_id",i=n._attributes??n,s=r.connectAccountId||i[a],c={amount:r.amountCents,currency:r.currency||"usd",automatic_payment_methods:{enabled:!0},metadata:r.metadata};if(s){if(c.transfer_data={destination:s},r.platformFeeCents)c.application_fee_amount=r.platformFeeCents}let{freshIdempotencyKey:u}=await import("@stacksjs/payments");return await o.paymentIntents.create(c,{idempotencyKey:u("payment_intent.create",i.id,r.amountCents)})}}}function U(){let e=globalThis.process?.env?.STRIPE_SECRET_KEY;if(!e)throw Error("Stripe Connect: STRIPE_SECRET_KEY not configured");let t;try{t=Pn("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 t(e,{apiVersion:"2026-06-24.dahlia"})}function Xe(){return{async generateTwoFactorForModel(e){let{generateTwoFactorSecret:t}=await import("@stacksjs/auth"),n=t();await e.update({two_factor_secret:n})},async verifyTwoFactorCode(e,t){let n=e.get("two_factor_secret");if(typeof n!=="string")return!1;let{verifyTwoFactorCode:r,RateLimiter:o}=await import("@stacksjs/auth"),a=String(e.id??e.get?.("id")??e.get?.("email")??n),i=`2fa:${a}`;if(await o.isRateLimited(i)){let{HttpError:c}=await import("@stacksjs/error-handling");throw new c(429,"Too many verification attempts. Please try again later.")}if(!await r(t,n))return await o.recordFailedAttempt(i),!1;try{let{cache:c}=await import("@stacksjs/cache"),u=`2fa:used:${a}:${t}`;if(await c.has(u))return await o.recordFailedAttempt(i),!1;await c.set(u,"1",90)}catch{}return await o.resetAttempts(i),!0}}}import{mutationCount as An,sqlDateTime as xn}from"@stacksjs/database/runtime";import{log as F}from"@stacksjs/logging";var Y="deleted_at";function Ze(e,t="id"){return{async softDelete(n){let r=xn(),o=e.where(t,n);if(typeof o?.update==="function")return await o.update({[Y]:r}),!0;return!1},async restore(n){let r=e.where(t,n).withTrashed();if(typeof r?.update==="function")return await r.update({[Y]:null}),!0;return!1},async forceDelete(n){let r=e.where(t,n),o=typeof r?.withTrashed==="function"?r.withTrashed():r;if(typeof o?.delete==="function")return An(await o.delete())>0;return!1},withTrashed(){return typeof e.query==="function"?e.query():e},onlyTrashed(){let n=typeof e.query==="function"?e.query():e;if(typeof n?.whereNotNull==="function")return n.whereNotNull(Y);return n?.where?.(Y,"!=",null)??n}}}function et(e){if(e===!0||e==null)return{};if(typeof e==="object"&&!Array.isArray(e)){let t=e;if(Array.isArray(t.cascade)){let n=t.cascade.filter((r)=>typeof r==="string");return n.length?{cascade:n}:{}}return{}}return{}}function On(e,t){let n=e.hasMany??[],r=e.hasOne??[],o=n.some((l)=>Re(l,t,!0)),a=r.some((l)=>Re(l,t,!1));if(!o&&!a)return F.warn(`[orm] soft-delete cascade: '${t}' is not a declared hasMany/hasOne relation - skipping`),null;let s=(o?n:r).find((l)=>Re(l,t,o))??null;if(!s)return null;let u=globalThis[s];if(!u)return F.warn(`[orm] soft-delete cascade: model '${s}' is not yet on globalThis - skipping cascade for '${t}'`),null;return{className:s,model:u}}function Re(e,t,n){let r=e.toLowerCase();if(t===r)return!0;if(n&&t===`${r}s`)return!0;if(n&&r.endsWith("y")&&t===`${r.slice(0,-1)}ies`)return!0;return!1}async function Cn(e,t,n,r,o){try{let a=n.where;if(typeof a!=="function"){F.warn(`[orm] cascade ${o}: child model has no .where()`);return}if(o==="softDelete"){let i=n.softDelete;if(typeof i==="function"){let c=a.call(n,r,t),u=typeof c?.get==="function"?await c.get():Array.isArray(c)?c:[],l=n.primaryKey||"id";for(let d of u){let f=d?.[l];if(f!=null)await i.call(n,f)}return}let s=a.call(n,r,t);if(typeof s?.delete==="function"){F.debug(`[orm] cascade soft-delete: child has no softDeletes trait, hard-deleting from ${String(n.table??"?")}`),await s.delete();return}}else{let i=n.restore;if(typeof i!=="function"){F.debug("[orm] cascade restore: child has no restore() - nothing to do");return}let s=n.withTrashed,u=(typeof s==="function"?s.call(n):n).where?.(r,t),l=typeof u?.get==="function"?await u.get():[],d=n.primaryKey||"id";for(let f of l){let m=f?.[d];if(m!=null)await i.call(n,m)}}}catch(a){if(F.warn(`[orm] soft-delete cascade ${o} on ${e}#${String(t)} failed`,{error:a}),process.env.STACKS_ORM_CASCADE_SWALLOW!=="true")throw a}}async function K(e,t,n,r){let o=t.cascade;if(!o||o.length===0)return;let a=`${e.name.toLowerCase()}_id`;for(let i of o){let s=On(e,i);if(!s)continue;await Cn(s.className,n,s.model,a,r)}}import{sqlDateTime as Dn}from"@stacksjs/database/runtime";import{log as vn}from"@stacksjs/logging";var Mn=[/^password$/i,/^password_hash$/i,/^api_key$/i,/_token$/i,/_secret$/i,/^remember_token$/i],tt=null;async function nt(){if(tt!=null)return tt;try{let e=await import("@stacksjs/router").catch(()=>null);if(!e)return null;let t=e.getCurrentRequest;if(typeof t!=="function")return null;let n=t();return n?.user?.id??n?._user?.id??null}catch{return null}}async function rt(){try{let t=(await import("@stacksjs/router").catch(()=>null))?.getCurrentRequest;if(typeof t!=="function")return null;let n=t();return typeof n?.ip==="function"?n.ip()??null:null}catch{return null}}function ot(e){if(!e||typeof e!=="object")return null;let t={};for(let[n,r]of Object.entries(e)){if(Mn.some((o)=>o.test(n)))continue;t[n]=r}return t}function at(e,t,n){vn.warn(`[orm] ${e} row write failed for ${t}: ${n?.message??String(n)}`)}var En="activities";function it(e){if(!e)return null;if(e===!0)return{};if(typeof e!=="object")return null;let t=e;return{logOnly:Array.isArray(t.logOnly)?t.logOnly:void 0,include:Array.isArray(t.include)?t.include:void 0,exclude:Array.isArray(t.exclude)?t.exclude:void 0}}function Fn(e,t,n=[]){let r=ot(e);if(!r)return null;let o=new Set(n),a=t.logOnly??t.include,i=new Set(t.exclude??[]),s={};for(let[c,u]of Object.entries(r)){if(o.has(c)||i.has(c))continue;if(a&&!a.includes(c))continue;s[c]=u}return s}function $n(e,t,n){return n==null?`${e} was ${t}`:`${e} ${String(n)} was ${t}`}async function In(e){try{let{db:t}=await import("@stacksjs/database/runtime");await t.insertInto(En).values({type:e.type,description:e.description,subject_type:e.subject_type,subject_id:e.subject_id,causer:e.causer,properties:e.properties?JSON.stringify(e.properties):null,ip_address:e.ip_address,user_id:e.user_id,created_at:Dn()}).executeTakeFirst()}catch(t){at("activity",`${e.subject_type}#${String(e.subject_id)}`,t)}}async function jn(e){let{attributes:t,event:n,modelName:r,options:o,primaryKey:a}=e,i=t?.[a]??null,s=await nt();await In({type:`${r.toLowerCase()}.${n}`,description:$n(r,n,i),subject_type:r,subject_id:i,properties:Fn(t,o,e.hidden),causer:s==null?null:`User:${String(s)}`,user_id:s,ip_address:await rt()})}function Se(e){if(!e||typeof e!=="object")return null;let t=e;if(t.attributes&&typeof t.attributes==="object")return{...t.attributes};if(t._attributes&&typeof t._attributes==="object")return{...t._attributes};return{...e}}function st(e,t,n,r,o=[]){if(t==="Activity")return;let a=e,i=async(d)=>typeof a.find==="function"?Se(await a.find(d)):null,s=async(d,f)=>{await jn({modelName:t,event:d,attributes:f,primaryKey:n,options:r,hidden:o})},c=e.create;if(typeof c==="function")e.create=async function(...d){let f=await c.apply(this,d);return await s("created",Se(f)),f};let u=e.update;if(typeof u==="function")e.update=async function(d,f){let m=await u.call(this,d,f);return await s("updated",Se(m)??await i(d)),m};let l=e.delete;if(typeof l==="function")e.delete=async function(d){let f=await i(d),m=await l.call(this,d);return await s("deleted",f??{[n]:d}),m}}var Z,bt=new gt;function D(){return bt.getStore()?.suppressed===!0}function M(e){return Promise.resolve(bt.run({suppressed:!0},e))}var wt=new gt;function Kn(){return wt.getStore()?.suppressed===!0}function Wn(e){return Promise.resolve(wt.run({suppressed:!0},e))}var Ce=Symbol.for("stacks.orm.modelDefinition");class ht extends Error{status=422;errors;constructor(e,t){let n=Object.keys(t).join(", ");super(`${e} validation failed: ${n}`);this.name="ModelValidationError",this.errors=t}}var ut=new Set;function Qn(e,t){let n=typeof e==="string"?e.slice(0,80):String(e),r=`${typeof e}:${n}`;if(ut.has(r))return;ut.add(r);let o=t instanceof Error?t.message:String(t);console.error(`[orm] JSON cast failed to parse value (returning null): ${o} - value preview: ${JSON.stringify(n)}`)}var Vn={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(t){return Qn(e,t),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 kt(e){return typeof e==="string"?Vn[e]:e}function ct(e,t,n){if(!e||typeof e!=="object")return e;let r={...e};for(let[o,a]of Object.entries(t))if(o in r){let i=kt(a);r[o]=i[n](r[o])}return r}var X=new Set(["_attributes","_original","_definition","_hasSaved","_relations"]),lt=Symbol.for("stacks.modelInstanceProxy"),zn={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 Hn(e,t){if(!e||!t)return null;let n=t.split("."),r=e;for(let o of n){if(r==null||typeof r!=="object")return null;let a=r;if("_attributes"in a&&a._attributes&&typeof a._attributes==="object"){let i=a._attributes;if(o in i){r=i[o];continue}}if(o in a){r=a[o];continue}return null}return r??null}function R(e,t){if(!e||typeof e!=="object")return e;let n=e;if(n[lt])return e;let r=n._attributes;if(!r||typeof r!=="object")return e;if(t&&Object.keys(t).length>0){for(let[o,a]of Object.entries(t))if(Object.prototype.hasOwnProperty.call(r,o))r[o]=kt(a).get(r[o])}return new Proxy(e,{get(o,a,i){let s=o;if(a===lt)return!0;if(a==="saveAsync")return async function(){let u=s._definition,l=u?.set;if(l&&typeof s.isDirty==="function"){for(let[f,m]of Object.entries(l)){if(typeof m!=="function")continue;if(!s.isDirty(f))continue;let p=m(s._attributes),g=p&&typeof p.then==="function"?await p:p;s._attributes[f]=g}let d=u.set;u.set={};try{return s.save()}finally{u.set=d}}return s.save()};if(a==="save")return function(){let u=s._definition,l=u?.set;if(l&&Object.keys(l).length>0&&typeof s.isDirty==="function"){for(let[f,m]of Object.entries(l)){if(typeof m!=="function")continue;if(!s.isDirty(f))continue;let p=m(s._attributes);if(p&&typeof p.then==="function")throw Error(`Setter for "${f}" returned a Promise - use \`saveAsync()\` instead of \`save()\` when a model has async setters.`);s._attributes[f]=p}let d=u.set;u.set={};try{return s.save()}finally{u.set=d}}return s.save()};if(a==="updateAsync")return async function(u){if(u&&typeof u==="object"&&!Array.isArray(u))for(let[l,d]of Object.entries(u))i[l]=d;return i.saveAsync()};if(a==="saveQuietly")return function(){return M(()=>s.save())};if(a==="saveAsyncQuietly")return function(){return M(()=>i.saveAsync())};if(a==="updateQuietly")return function(u){return M(()=>s.update(u))};if(a==="updateAsyncQuietly")return function(u){return M(()=>i.updateAsync(u))};if(a==="deleteQuietly")return function(){return M(()=>s.delete())};if(a==="toSearchableObject")return function(){let d=s._definition?.traits?.useSearch;if(!d)return null;let f=s._attributes;if(!f)return null;if(d===!0){let b={...f};if(f.id!=null)b.id=String(f.id);return b}let m={},p=d.displayable?.length?d.displayable:[...d.searchable??[],...d.filterable??[],...d.sortable??[],"id"],g=d.denormalize??{},w=s._relations;for(let b of p){let h=x(b),T=f[h]??f[b];if(T!==void 0){m[h]=T;continue}let P=g[b]??g[h];if(P){m[h]=Hn(w,P);continue}m[h]=void 0}if(f.id!=null)m.id=String(f.id);return m};if(typeof a==="string"&&!X.has(a)){let u=s._attributes;if(u&&Object.prototype.hasOwnProperty.call(u,a))return u[a];let l=s._relations;if(l&&Object.prototype.hasOwnProperty.call(l,a)){let f=l[a];if(Array.isArray(f))return f.map((m)=>R(m,t));return f&&typeof f==="object"?R(f,t):f}let d=zn[a];if(d){let p=s._definition?.__traitMethods?.[d.bag]?.[a];if(typeof p==="function")return d.mode==="model"?(...g)=>p(i,...g):(...g)=>p(s.id,...g)}if(u){let f=x(a);if(f!==a&&Object.prototype.hasOwnProperty.call(u,f))return u[f]}}let c=Reflect.get(s,a,s);return typeof c==="function"?c.bind(s):c},set(o,a,i,s){let c=o;if(typeof a==="string"&&!X.has(a)){let{_attributes:u,set:l}=c;if(u&&Object.prototype.hasOwnProperty.call(u,a)){if(typeof l==="function")l.call(c,a,i);else u[a]=i;return!0}if(u){let d=x(a);if(d!==a&&Object.prototype.hasOwnProperty.call(u,d)){if(typeof l==="function")l.call(c,d,i);else u[d]=i;return!0}}if(u&&!(a in c)){if(typeof l==="function")l.call(c,a,i);else u[a]=i;return!0}}return Reflect.set(c,a,i,s)},has(o,a){let i=o;if(typeof a==="string"&&!X.has(a)){let s=i._attributes;if(s&&Object.prototype.hasOwnProperty.call(s,a))return!0;let c=i._relations;if(c&&Object.prototype.hasOwnProperty.call(c,a))return!0;if(s){let u=x(a);if(u!==a&&Object.prototype.hasOwnProperty.call(s,u))return!0}}return Reflect.has(i,a)},deleteProperty(o,a){let i=o;if(typeof a==="string"&&!X.has(a)){let s=i._attributes;if(s&&Object.prototype.hasOwnProperty.call(s,a))return delete s[a],!0}return Reflect.deleteProperty(i,a)},ownKeys(o){let i=o._attributes;return i?Object.keys(i):[]},getOwnPropertyDescriptor(o,a){let i=o;if(typeof a==="string"){let s=i._attributes;if(s&&Object.prototype.hasOwnProperty.call(s,a))return{configurable:!0,enumerable:!0,value:s[a],writable:!0}}return Object.getOwnPropertyDescriptor(i,a)}})}var Gn=new Set(["get","first","last","firstOrFail","find","findOrFail","all","paginate","simplePaginate","cursorPaginate"]),Jn={paginate:Ln,simplePaginate:Un,cursorPaginate:qn},dt=Symbol.for("stacks.queryBuilderProxy");function _t(e,t){if(!e||typeof e!=="object")return e;if(e[dt])return e;return new Proxy(e,{get(n,r,o){if(r===dt)return!0;let a=Reflect.get(n,r,o);if(typeof a!=="function")return a;return function(...i){let s=i,c=String(r);if(c==="paginate"||c==="simplePaginate"){let{perPage:d,page:f}=he(i[0],i[1]);s=[d,f]}else if(c==="cursorPaginate"){let{perPage:d,cursor:f}=ke(i[0],i[1]);s=[d,f,i[2],i[3]]}let u=a.apply(n,s),l=(d)=>{if(Gn.has(c)){if(Array.isArray(d))return d.map((m)=>R(m,t));let f=Jn[c];if(f&&d&&Array.isArray(d.data)){let m=d.data.map((g)=>R(g,t)),p=f({...d,data:m});return _e(p)}if(d&&Array.isArray(d.data))return{...d,data:d.data.map((m)=>R(m,t))};return R(d,t)}if(d&&typeof d==="object"&&typeof d.get==="function")return _t(d,t);return d};if(u&&typeof u.then==="function")return u.then(l);return l(u)}}})}function Yn(e,t){let n=["find","first","last","all","firstOrFail","findOrFail","findMany"];for(let a of n){let i=e[a];if(typeof i!=="function")continue;e[a]=function(...s){let c=i.apply(this,s),u=(l)=>Array.isArray(l)?l.map((d)=>R(d,t)):R(l,t);if(c&&typeof c.then==="function")return c.then(u);return u(c)}}let r=["create","firstOrCreate","updateOrCreate","make"];for(let a of r){let i=e[a];if(typeof i!=="function")continue;e[a]=function(...s){let c=i.apply(this,s),u=(l)=>Array.isArray(l)?l.map((d)=>R(d,t)):R(l,t);if(c&&typeof c.then==="function")return c.then(u);return u(c)}}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 i=e[a];if(typeof i!=="function")continue;e[a]=function(...s){let c=i.apply(this,s);return _t(c,t)}}}class Tt extends Error{model;id;constructor(e,t){super(t!=null?`[ORM] ${e} not found for id=${String(t)}`:`[ORM] No matching ${e} row`);this.name="ModelNotFoundError",this.model=e,this.id=t}}class Ae extends Error{model;attribute;reason;constructor(e,t,n){let r=n==="guarded"?`'${t}' is marked guarded`:`'${t}' 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=t,this.reason=n}}var Xn=new Set(["id","created_at","updated_at","deleted_at","uuid"]);function W(e,t,n={}){if(n.force)return t;if(!t||typeof t!=="object"||Array.isArray(t))return t;let r=e.attributes;if(!r)return t;let o=new Set,a=new Set,i=new Set;for(let[c,u]of Object.entries(r)){let l=x(c);if(o.add(l),u?.fillable===!0)a.add(l);if(u?.guarded===!0)i.add(l)}let s=a.size>0?a:o;for(let c of Object.keys(t)){let u=x(c);if(Xn.has(u))continue;if(i.has(u))throw new Ae(e.name,c,"guarded");if(u.endsWith("_id"))continue;if(!s.has(u))throw new Ae(e.name,c,"not-fillable")}return t}async function xe(e,t){let n=e.set;if(!n||typeof n!=="object")return t;let r={...t};for(let[o,a]of Object.entries(n)){if(typeof a!=="function"||!(o in r))continue;try{r[o]=await a(r)}catch(i){k.error(`[orm] ${e.name}.set.${o} threw - skipping setter`,i)}}return r}function Zn(e,t){let n=t.primaryKey||"id",r=e.create;function o(u){let l=e.where;if(typeof l!=="function")throw Error(`[ORM] ${t.name}.${u} needs a working where(): the underlying query builder did not expose one`);return l}function a(u){let l=e.find;if(typeof l!=="function")throw Error(`[ORM] ${t.name}.${u} needs a working find(): the underlying query builder did not expose one`);return l}function i(u){let l=e.create;if(typeof l!=="function")throw Error(`[ORM] ${t.name}.${u} cannot create: the underlying query builder did not expose create()`);return l}if(e.update=async function(u,l){if(u==null)throw Error(`[ORM] ${t.name}.update requires an id as the first argument`);if(!l||typeof l!=="object"||Array.isArray(l))throw Error(`[ORM] ${t.name}.update requires a data object as the second argument`);if(Object.keys(l).length===0){k.debug(`[orm] ${t.name}.update called with empty data - short-circuiting and returning current row`);let m=e.find;return typeof m==="function"?await m.call(e,u):null}W(t,l);let d=await xe(t,l);await o("update").call(e,n,u).update(d);let f=e.find;return typeof f==="function"?await f.call(e,u):null},typeof e.forceUpdate!=="function")e.forceUpdate=async function(u,l){if(u==null)throw Error(`[ORM] ${t.name}.forceUpdate requires an id as the first argument`);if(!l||typeof l!=="object"||Array.isArray(l))throw Error(`[ORM] ${t.name}.forceUpdate requires a data object as the second argument`);let d=await xe(t,l);await o("forceUpdate").call(e,n,u).update(d);let f=e.find;return typeof f==="function"?await f.call(e,u):null};if(typeof e.forceCreate!=="function")e.forceCreate=async function(u){if(!u||typeof u!=="object"||Array.isArray(u))throw Error(`[ORM] ${t.name}.forceCreate requires a data object`);let l=e.make;if(typeof l==="function"){let d=await l.call(e);if(d&&typeof d.forceFill==="function"&&typeof d.save==="function")return d.forceFill(u),await d.save()??d}if(typeof r!=="function")throw Error(`[ORM] ${t.name}.forceCreate cannot create: the underlying query builder did not expose create()`);return await r.call(e,u)};if(e.delete=async function(u){if(u==null)throw Error(`[ORM] ${t.name}.delete requires an id as the first argument`);if(!await a("delete").call(e,u))return!1;return await o("delete").call(e,n,u).delete(),!0},typeof e.findOrFail!=="function")e.findOrFail=async function(u){let l=await a("findOrFail").call(e,u);if(l==null)throw new Tt(t.name,u);return l};if(typeof e.exists!=="function")e.exists=async function(u){if(u==null)return!1;let l=o("exists").call(e,n,u);if(typeof l.count==="function"){let f=await l.count();return Number(f)>0}let d=e.find;return typeof d==="function"?await d.call(e,u)!=null:!1};if(typeof e.firstOrCreate!=="function")e.firstOrCreate=async function(u,l={}){if(!u||typeof u!=="object"||Array.isArray(u))throw Error(`[ORM] ${t.name}.firstOrCreate requires a where-attrs object`);let d=o("firstOrCreate").call(e,u),f=typeof d.first==="function"?await d.first():await d;if(f)return f;let m={...u,...l};return W(t,m),await i("firstOrCreate").call(e,m)};if(typeof e.updateOrCreate!=="function")e.updateOrCreate=async function(u,l){if(!u||typeof u!=="object"||Array.isArray(u))throw Error(`[ORM] ${t.name}.updateOrCreate requires a where-attrs object`);if(!l||typeof l!=="object"||Array.isArray(l))throw Error(`[ORM] ${t.name}.updateOrCreate requires a values object`);let d=o("updateOrCreate").call(e,u),f=typeof d.first==="function"?await d.first():await d;if(f){W(t,l);let p=f[n];await o("updateOrCreate").call(e,n,p).update(l);let g=e.find;return typeof g==="function"?await g.call(e,p):{...f,...l}}let m={...u,...l};return W(t,m),await i("updateOrCreate").call(e,m)};if(typeof e.count!=="function")e.count=async function(){let u=e;if(typeof u.query==="function"){let f=u.query();if(typeof f?.count==="function"){let m=await f.count();return Number(m)||0}}let{all:l,get:d}=e;if(typeof l==="function")return(await l.call(e)||[]).length;if(typeof d==="function")return(await d.call(e)||[]).length;return 0};if(typeof e.pluck!=="function")e.pluck=async function(u){if(!u||typeof u!=="string")throw Error(`[ORM] ${t.name}.pluck requires a column name`);let l=e.all;return((typeof l==="function"?await l.call(e):[])||[]).map((f)=>f?.[u])};if(typeof e.whereIn!=="function")e.whereIn=async function(u,l){if(!u||typeof u!=="string")throw Error(`[ORM] ${t.name}.whereIn requires a column name`);if(!Array.isArray(l))throw Error(`[ORM] ${t.name}.whereIn requires an array of values`);if(l.length===0)return[];let d=e.where;if(typeof d!=="function")return[];let f=d.call(e,u,"in",l);if(f&&typeof f.get==="function")return await f.get();return await f};let s=[["latest","desc"],["oldest","asc"]];for(let[u,l]of s)if(typeof e[u]!=="function")e[u]=async function(d="created_at"){let f=e,m=typeof f.query==="function"?f.query():f;if(typeof m?.orderBy==="function"){let b=m.orderBy(d,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?.[d],P=h?.[d];if(T===P)return 0;return(T>P?1:-1)*(l==="desc"?-1:1)})[0]??null};let c=At(t.traits?.useSearch,t);if(c){let u=c.index??t.table??x(`${t.name}s`);if(typeof e.search!=="function")e.search=function(l,d){return nr(e,u,l,d,c.searchable)};if(typeof e.makeAllSearchable!=="function")e.makeAllSearchable=async function(l=500){let d=e.all;if(typeof d!=="function")throw Error(`[ORM] ${t.name}.makeAllSearchable cannot run: the underlying query builder did not expose all()`);let{useSearchEngine:f}=await import("@stacksjs/search-engine"),m=f(),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 Oe(T,c);if(P.length>0)await m.addDocuments(u,P);p+=P.length}),p}catch{}let w=await d.call(e)||[],b=await Oe(w,c);if(b.length>0)await m.addDocuments(u,b);return b.length};if(typeof e.removeAllFromSearch!=="function")e.removeAllFromSearch=async function(){let{useSearchEngine:l}=await import("@stacksjs/search-engine"),d=l();if(typeof d.deleteAllDocuments==="function"){await d.deleteAllDocuments(u);return}let f=e.all,m=typeof f==="function"?await f.call(e)||[]:[],p=l();for(let g of m){let w=g?.id??g?._attributes?.id;if(w!=null)await p.deleteDocument(u,Number(w))}}}}async function Oe(e,t){if(e.length===0)return[];if(typeof t.shapeMany==="function"){let r=await t.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)=>tr(r,t)))).filter(Boolean)}function Rt(e){let t=new Set,n=e.attributes??{};for(let[r,o]of Object.entries(n))if(o?.hidden)t.add(r);return t}function er(e,t){if(!e||t.size===0)return e;let n={};for(let[r,o]of Object.entries(e))if(!t.has(r))n[r]=o;return n}async function tr(e,t){if(typeof t.shape==="function")try{return await t.shape(e)}catch{return}let n=e?.toSearchableObject?.();if(n!==void 0)return n;return er(e?._attributes??(typeof e?.toJSON==="function"?e.toJSON():null),t.hidden??new Set)}function nr(e,t,n,r,o){let a=o&&o.length>0?{query_by:[...o].join(",")}:{},i={q:n,...a,...r??{}},s={with(c){return i={...i,...c},s},where(c){return i={...i,filter:c},s},async get(){let{useSearchEngine:c}=await import("@stacksjs/search-engine");return(await c().search(t,i))?.hits??[]},async paginate(c,u=1){let{useSearchEngine:l}=await import("@stacksjs/search-engine"),f=await l().search(t,{...i,limit:c,offset:(u-1)*c});return{hits:f.hits??[],total:Number(f.estimatedTotalHits??f.nbHits??f.total??0),page:u,perPage:c}},async raw(){let{useSearchEngine:c}=await import("@stacksjs/search-engine");return await c().search(t,i)}};return s}function St(e){let t=x(e);return t===e?[e]:[e,t]}async function Pe(e,t){if(!e||typeof e!=="object")return;let n=e._attributes??e;for(let r of t)for(let o of St(r)){if(!(o in n))continue;let a=n[o];if(!j(a))continue;n[o]=await oe(a)}}function rr(e,t){if(t.length===0)return;let n=async(s)=>{if(Array.isArray(s)){for(let c of s)await Pe(c,t);return s}if(s&&typeof s==="object"&&Array.isArray(s.data)){for(let c of s.data)await Pe(c,t);return s}if(s)await Pe(s,t);return s},r=["find","first","last","all","firstOrFail","findOrFail","findMany"];for(let s of r){let c=e[s];if(typeof c!=="function")continue;e[s]=async function(...u){let l=await c.apply(this,u);return await n(l)}}let o=["create","firstOrCreate","updateOrCreate","make"];for(let s of o){let c=e[s];if(typeof c!=="function")continue;e[s]=async function(...u){let l=await c.apply(this,u);return await n(l)}}for(let s of["update","forceUpdate"]){let c=e[s];if(typeof c!=="function")continue;e[s]=async function(u,l){let d=await c.call(this,u,l);return await n(d)}}let a=["first","firstOrFail","get","all","find","findOrFail","last","paginate","simplePaginate"],i=(s)=>{if(!s||typeof s!=="object")return s;let c=s;if(c.__stacksEncryptedReads)return s;for(let u of a){let l=c[u];if(typeof l!=="function")continue;c[u]=async function(...d){return await n(await l.apply(this,d))}}for(let u of["where","whereIn","whereNull","whereNotNull","orWhere","orderBy","orderByDesc","limit","offset","with"]){let l=c[u];if(typeof l!=="function")continue;c[u]=function(...d){return i(l.apply(this,d))}}return Object.defineProperty(c,"__stacksEncryptedReads",{value:!0,enumerable:!1}),s};for(let s of["where","whereIn","whereNull","whereNotNull","orderBy","orderByDesc","limit","query"]){let c=e[s];if(typeof c!=="function")continue;e[s]=function(...u){return i(c.apply(this,u))}}}function or(e,t){if(t.length===0)return;let n=async(o)=>{if(!o||typeof o!=="object"||Array.isArray(o))return o;let a={...o};for(let i of t)for(let s of St(i))if(s in a)a[s]=await re(a[s]);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(...i){if(i[0]=await n(i[0]),i[1])i[1]=await n(i[1]);return await a.apply(this,i)}}for(let o of["update","forceUpdate"]){let a=e[o];if(typeof a!=="function")continue;e[o]=async function(i,s){let c=await n(s);return await a.call(this,i,c)}}}function ar(e,t){let n=e.create;if(typeof n==="function")e.create=async function(r,...o){W(t,r);let a=await xe(t,r);return await n.call(this,a,...o)};for(let r of["firstOrCreate","updateOrCreate"]){let o=e[r];if(typeof o!=="function")continue}}function ir(e,t){let n=String(t?.name??e.name??"Model"),r=(i,s)=>{if(Kn())return;if(!i||typeof i!=="object"||Array.isArray(i))return;let c=Ve(i,t,s);if(!c.valid)throw new ht(n,c.errors)},o=e.create;if(typeof o==="function")e.create=async function(i,...s){return r(i,"creating"),await o.call(this,i,...s)};let a=e.update;if(typeof a==="function")e.update=async function(i,s,...c){return r(s,"updating"),await a.call(this,i,s,...c)}}function sr(e,t){let n=["create","firstOrCreate","updateOrCreate"];for(let o of n){let a=e[o];if(typeof a==="function")e[o]=async function(...i){if(k.debug(`[orm] ${o.charAt(0).toUpperCase()+o.slice(1)} ${String(e.name||"unknown")}`,i[0]),i[0]&&typeof i[0]==="object"&&!Array.isArray(i[0]))i[0]=ct(i[0],t,"set");return await a.apply(this,i)}}let r=e.update;if(typeof r==="function")e.update=async function(o,a){let i=a&&typeof a==="object"&&!Array.isArray(a)?ct(a,t,"set"):a;return await r.call(this,o,i)}}var ft=new Set(["useUuid","useTimestamps","timestampable","useSoftDeletes","softDeletable","useApi","useAuth","authenticatable","useSearch","searchable","useSeeder","seedable","useSocials","billable","observe","useAudit","useActivityLog","prunable","sharding","likeable","taggable","categorizable","commentable","commentables","broadcastOn","broadcastWith"]);function Pt(e){k.debug(`[orm] Defining model: ${e.name} (table: ${e.table})`);for(let g of Object.keys(e.traits??{}))if(!ft.has(g))k.warn(`[orm] Model '${e.name}' declares an unknown trait '${g}'. It does nothing. Known traits: ${[...ft].sort().join(", ")}.`);let t=ur(e),n=lr(e),r=cr(t,n),o=dr(e);e.__traitMethods=o;let a=e.traits;if((a?.useAuth||a?.authenticatable)&&e.name!=="PersonalAccessToken"){let g=e.morphMany;if(!g||!("tokenable"in g))e.morphMany={...g??{},tokenable:"PersonalAccessToken"}}let i=r?{...e,hooks:{...e.hooks,...r}}:e,c=Bn(i);if(Yn(c,e.casts),Zn(c,i),ar(c,i),e.casts&&Object.keys(e.casts).length>0)sr(c,e.casts);let u=ae(e);if(u.length>0)or(c,u),rr(c,u);let l=e.traits?.useSoftDeletes;if(l)fr(c,i,l);let d=e.traits?.useAudit;if(d){let g=Be(d);Ne(c,e.name,e.primaryKey||"id",g)}let f=it(e.traits?.useActivityLog);if(f)st(c,e.name,e.primaryKey||"id",f,[...Rt(e)]);ir(c,i);let m=c;m.withoutValidation=function(g){return Wn(g)},m.withoutEvents=function(g){return M(g)};for(let g of["create","update","firstOrCreate","updateOrCreate","forceCreate","forceUpdate","delete","forceDelete","softDelete","restore"]){let w=c[g];if(typeof w!=="function")continue;let b=`${g}Quietly`;if(typeof c[b]==="function")continue;c[b]=function(...h){return M(()=>w.apply(c,h))}}let p=Object.assign(c,o,{...e,getDefinition:()=>e,_isStacksModel:!0});return Nn(e.name,p),Object.defineProperty(p,Ce,{value:e,enumerable:!1,configurable:!0}),p}function ur(e){let t=e.traits?.observe;if(!t)return;let n=e.name.toLowerCase(),r=(f)=>{let m=f?.attributes;if(!m||typeof m!=="object")return f;let p=e.primaryKey||"id",g={...m};if(g[p]===void 0&&f[p]!==void 0)g[p]=f[p];return g},o=async(f,m)=>{if(D())return;try{let{dispatch:p}=Z??=await import("@stacksjs/events");await p(f,m)}catch(p){if(p&&typeof p==="object"&&"code"in p&&p.code==="MODULE_NOT_FOUND")return;if(console.error(`[ORM] Event '${f}' handler error:`,p),process.env.STACKS_ORM_EVENT_ERRORS!=="swallow")throw p}},a=e.traits?.broadcastOn,i=e.traits?.broadcastWith,s=typeof a==="function"&&typeof i==="function",c=async(f,m)=>{if(!s)return;if(D())return;try{let p=a(m),g=Array.isArray(p)?p:[p],w=i(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,f,w)}}catch(p){if(p&&typeof p==="object"&&"code"in p&&p.code==="MODULE_NOT_FOUND")return;if(console.error(`[ORM] Broadcast '${f}' handler error:`,p),process.env.STACKS_ORM_BROADCAST_ERRORS==="throw")throw p}},u=async(f,m)=>{if(D())return!0;let p;try{p=Z??=await import("@stacksjs/events");let{dispatchAndCollect:g}=p,w=await g(f,m);if(w.some((h)=>h.ok&&h.value===!1))return!1;let b=w.find((h)=>!h.ok);if(b&&!b.ok)throw b.error}catch(g){if(!p&&g&&typeof g==="object"&&"code"in g&&g.code==="MODULE_NOT_FOUND")return!0;if(console.error(`[ORM] Before-event '${f}' handler error:`,g),process.env.STACKS_ORM_EVENT_ERRORS!=="swallow")throw g}return!0},l=t===!0?["create","update","delete"]:Array.isArray(t)?t:[],d={};if(l.includes("create"))d.beforeCreate=async(f)=>{if(k.debug(`[orm] Create ${n}`,f),!await u(`${n}:saving`,f))throw Error(`[ORM] ${n}:saving event cancelled the operation`);if(!await u(`${n}:creating`,f))throw Error(`[ORM] ${n}:creating event cancelled the operation`)},d.afterCreate=async(f)=>{let m=r(f);await o(`${n}:created`,m),await o(`${n}:saved`,m),await c(`${n}:created`,f)};if(l.includes("update"))d.beforeUpdate=async(f)=>{if(k.debug(`[orm] Update ${n}#${f?.id??"unknown"}`,f),!await u(`${n}:saving`,f))throw Error(`[ORM] ${n}:saving event cancelled the operation`);if(!await u(`${n}:updating`,f))throw Error(`[ORM] ${n}:updating event cancelled the operation`)},d.afterUpdate=async(f)=>{let m=r(f);await o(`${n}:updated`,m),await o(`${n}:saved`,m),await c(`${n}:updated`,f)};if(l.includes("delete"))d.beforeDelete=async(f)=>{if(k.debug(`[orm] Delete ${n}#${f?.id??"unknown"}`),!await u(`${n}:deleting`,f))throw Error(`[ORM] ${n}:deleting event cancelled the operation`)},d.afterDelete=async(f)=>{await o(`${n}:deleted`,r(f)),await c(`${n}:deleted`,f)};return d}function cr(...e){let t={},n=new Set;for(let r of e){if(!r)continue;for(let o of Object.keys(r))n.add(o)}for(let r of n){let o=e.map((a)=>a?.[r]).filter((a)=>typeof a==="function");if(!o.length)continue;t[r]=async(...a)=>{for(let i of o)await i(...a)}}return Object.keys(t).length?t:void 0}function At(e,t){if(!e)return null;let n=e===!0?{}:typeof e==="object"?{...e}:null;if(!n)return null;if(t)n.hidden=Rt(t);return n}function lr(e){let t=At(e.traits?.useSearch,e);if(!t)return;let n=t,r=n.index??e.table??x(`${e.name}s`);async function o(s){if(typeof n.shapeMany==="function")try{let[l]=await Oe([s],n);return l}catch(l){k.warn(`[orm/search] shapeMany() threw for ${e.name}: ${l.message}`);return}if(typeof n.shape==="function")try{return await n.shape(s)}catch(l){k.warn(`[orm/search] shape() threw for ${e.name}: ${l.message}`);return}let u=R(s).toSearchableObject?.();if(u!==void 0)return u;return s?._attributes??(typeof s?.toJSON==="function"?s.toJSON():null)}let a=async(s)=>{if(D())return;let c=await o(s);if(!c)return;if(t.queueable){try{let{Jobs:u}=await import("@stacksjs/queue");await u.dispatch("SyncSearchIndexJob",{index:r,op:"upsert",doc:c})}catch(u){k.warn(`[orm/search] queue dispatch failed for ${e.name}; falling back to inline: ${u.message}`),await mt(r,c,e.name)}return}await mt(r,c,e.name)};return{afterCreate:a,afterUpdate:a,afterDelete:async(s)=>{if(D())return;let c=s?.id??s?._attributes?.id;if(c==null)return;if(t.queueable){try{let{Jobs:u}=await import("@stacksjs/queue");await u.dispatch("SyncSearchIndexJob",{index:r,op:"delete",id:Number(c)})}catch(u){k.warn(`[orm/search] queue dispatch failed for ${e.name}#${c}; falling back to inline: ${u.message}`),await yt(r,Number(c),e.name)}return}await yt(r,Number(c),e.name)}}}var pt=new Map;function xt(e,t){let n=pt.get(e)??0;if(pt.set(e,n+1),n===0)k.warn(`[orm/search] ${t}`);else if(n===9)k.warn(`[orm/search] ${e} is still failing; further identical warnings suppressed for this process.`)}async function mt(e,t,n){try{let{useSearchEngine:r}=await import("@stacksjs/search-engine");await r().addDocument(e,t)}catch(r){xt(`index:${n}`,`Failed to index ${n}: ${r.message}`)}}async function yt(e,t,n){try{let{useSearchEngine:r}=await import("@stacksjs/search-engine");await r().deleteDocument(e,t)}catch(r){xt(`remove:${n}`,`Failed to remove ${n}#${t}: ${r.message}`)}}function dr(e){let t={},{table:n,traits:r}=e;if(!r)return t;if(r.taggable)t._taggable=fe(n);if(r.categorizable)t._categorizable=pe(n);if(r.commentable)t._commentable=le(n);if(r.billable)t._billable=Ye(n);if(r.likeable){let a=typeof r.likeable==="object"?r.likeable:void 0;t._likeable=me(n,a)}let o=r.useAuth||r.authenticatable;if(typeof o==="object"&&o&&"useTwoFactor"in o&&o.useTwoFactor)t._twoFactor=Xe();return t}function fr(e,t,n){let r=Ze(e,t.primaryKey||"id"),o=et(n),a=t,i=t.name.toLowerCase(),s=t.traits?.observe!=null&&t.traits?.observe!==!1,c=async(m)=>{if(!s||D())return!0;try{let{dispatchAsync:p}=Z??=await import("@stacksjs/events"),g=await p(`${i}: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 '${i}:restoring' handler error:`,p)}return!0},u=async(m)=>{if(!s||D())return;try{let{dispatch:p}=Z??=await import("@stacksjs/events");await p(`${i}:restored`,{id:m})}catch(p){if(p?.code!=="MODULE_NOT_FOUND")console.error(`[ORM] Event '${i}:restored' handler error:`,p)}},l=process.env.STACKS_ORM_CASCADE_SWALLOW!=="true",d=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/runtime");return await p.transaction(async()=>{let g=await r.softDelete(m);if(g)await K(a,o,m,"softDelete");return g})},f=async(m)=>{if(!await c(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 u(m)}return b}let{db:g}=await import("@stacksjs/database/runtime"),w=await g.transaction(async()=>{let b=await r.restore(m);if(b)await K(a,o,m,"restore");return b});if(w)await u(m);return w};e.softDelete=d,e.restore=f,e.forceDelete=r.forceDelete,e.withTrashed=r.withTrashed,e.onlyTrashed=r.onlyTrashed,e.delete=d}function pr(e){if(e==null)return e;if(Array.isArray(e))return e.map((n)=>pr(n));if(typeof e!=="object")return e;let t=e;if(typeof t.toJSON==="function")return t.toJSON();if(t._attributes&&typeof t._attributes==="object")return t._attributes;return e}var mr=["belongsTo","hasOne","hasMany","belongsToMany","morphMany","morphOne"],yr=["traits","dashboard"];function gr(e){let t=e?.[Ce];if(t&&typeof t==="object")return t;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 br(e,t){let n=Array.isArray(e)?e:[],r=Array.isArray(t)?t:[];if(!n.length&&!r.length)return;return[...new Set([...n,...r])]}function wr(e){if(!e)return 0;return Object.values(e).reduce((t,n)=>{let r=Number(n?.order);return Number.isFinite(r)&&r>t?r:t},0)}function hr(e,t){let n={...e,...t},r=e.attributes??{},o=t.attributes??{};if(t.attributes){let a=wr(r),i=Object.fromEntries(Object.entries(o).map(([s,c])=>{let u=!(s in r),l=Number.isFinite(Number(c?.order));if(u&&!l)return[s,{...c,order:++a}];return[s,c]}));n.attributes={...r,...i}}for(let a of mr){let i=br(e[a],t[a]);if(i)n[a]=i}for(let a of yr){let i=e[a],s=t[a];if(i&&s&&typeof i==="object"&&typeof s==="object")n[a]={...i,...s}}return n}function gs(e,t){return Pt(hr(gr(e),t))}import xr from"process";import{log as Or}from"@stacksjs/logging";import{path as S}from"@stacksjs/path";import{fs as Q}from"@stacksjs/storage";import{Database as kr}from"bun:sqlite";import{existsSync as _r,readdirSync as Tr,readFileSync as Rr}from"fs";function Sr(e){return e.startsWith("sqlite_")||e.startsWith("_qb_tmp_")}function Pr(e,t){let n=e.toUpperCase();if(n.includes("BOOL"))return t==="postgres"?"boolean":"number";if(n.includes("DATE")||n.includes("TIME"))return"string";if(n.includes("INT"))return"number";if(n.includes("CHAR")||n.includes("CLOB")||n.includes("TEXT"))return"string";if(n.includes("REAL")||n.includes("FLOA")||n.includes("DOUB")||n.includes("NUMERIC")||n.includes("DEC"))return"number";if(n.includes("BLOB"))return"Uint8Array";return"unknown"}function Ar(e,t){try{return e.exec(t),{ok:!0}}catch(n){if(/CREATE\s+TRIGGER/i.test(t))return{ok:!1,error:n.message};let r=0;for(let o of t.split(/;\s*$/m)){if(!o.trim())continue;try{e.exec(o),r++}catch{}}return r>0?{ok:!0}:{ok:!1,error:n.message}}}function Ot(e,t="sqlite"){let n=[];if(!_r(e))return{tables:[],errors:n};let r;try{r=Tr(e).filter((a)=>a.endsWith(".sql")).sort()}catch(a){return{tables:[],errors:[{file:e,error:a.message}]}}let o=new kr(":memory:");try{for(let s of r){let c=`${e}/${s}`,u;try{u=Rr(c,"utf-8")}catch(d){n.push({file:c,error:d.message});continue}let l=Ar(o,u);if(!l.ok)n.push({file:c,error:l.error??"could not be applied"})}let a=o.query("SELECT name FROM sqlite_master WHERE type = 'table' ORDER BY name").all().map((s)=>s.name).filter((s)=>!Sr(s)),i=[];for(let s of a){let c=o.query(`PRAGMA table_info("${s.replace(/"/g,'""')}")`).all();if(c.length===0)continue;let u={};for(let l of c){let d=Pr(l.type??"",t),f=l.notnull===0&&l.pk===0;u[l.name]=f&&d!=="unknown"?`${d} | null`:d}i.push({table:s,columns:u})}return{tables:i,errors:n}}finally{o.close()}}function Cr(e){if(e)return e;let t=String(xr.env.DB_CONNECTION??"").toLowerCase();return t==="postgres"||t==="mysql"?t:"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 vr(e,t){let n=e.default;if(typeof n==="boolean")return ee(t);if(typeof n==="number")return"number";if(typeof n==="string")return"string";return"unknown"}function Mr(e){let t=e.validation;if(!t||typeof t!=="object")return null;let n=t.rule;return n&&typeof n==="object"?n:null}function Dr(e){if(!e||String(e.name??"")!=="enum")return null;let n=(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 n.length>0?n.join(" | "):null}function Er(e,t){let n=Mr(e),r=Dr(n);if(r!==null)return e.nullable===!0?`${r} | null`:r;let o=typeof e.type==="string"?e.type.toLowerCase():String(n?.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(t);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 vr(e,t)}})();return e.nullable===!0?`${a} | null`:a}function Fr(e){let t={},n=e.belongsTo;if(!n)return t;let r=Array.isArray(n)?n:Object.values(n);for(let o of r){if(typeof o==="string"){t[`${O(o)}_id`]="number";continue}if(o&&typeof o==="object"){let a=o;if(typeof a.foreignKey==="string"){t[a.foreignKey]="number";continue}if(typeof a.model==="string")t[`${O(a.model)}_id`]="number"}}return t}function $r(e,t){let[n,r]=[O(e),O(t)].sort();return`${n}_${r}`}function Ir(e,t){let n=e.default,r=typeof n==="string"?"string":typeof n==="number"?"number":typeof n==="boolean"?ee(t):n instanceof Date?"string":"unknown";return e.nullable?`${r} | null`:r}function jr(e,t,n){let r=t.belongsToMany;if(!r)return[];let o=[],a=Array.isArray(r)?r:Object.values(r);for(let i of a){let s,c,u,l,d={},f=!0;if(typeof i==="string")s=i;else if(i&&typeof i==="object"&&"model"in i){let b=i;if(s=b.model,"pivotTable"in b||"firstForeignKey"in b||"secondForeignKey"in b)c=b.pivotTable,u=b.firstForeignKey,l=b.secondForeignKey;else{let h=i;c=h.table,u=h.foreignKey,l=h.relatedKey,d=h.pivot?.columns??{},f=Boolean(h.pivot?.timestamps)}}else continue;let m=c??$r(e,s),p=u??`${O(e)}_id`,g=l??`${O(s)}_id`,w={id:"number",[p]:"number",[g]:"number"};for(let[b,h]of Object.entries(d))w[b]=Ir(h,n);if(f)w.created_at="string",w.updated_at="string | null";o.push({table:m,columns:w})}return o}function Br(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 Nr(e,t){let n={id:"number"},r=e.traits??{};if(r.useUuid)n.uuid="string";if((r.useTimestamps??r.timestampable)!==!1)n.created_at="string",n.updated_at="string | null";if(r.useSoftDeletes??r.softDeletable)n.deleted_at="string | null";if((e.table??"")==="users"||e.name==="User")Object.assign(n,Br(t));return n}function qr(e,t){let n={},r=e.attributes??{};for(let[o,a]of Object.entries(r))n[O(o)]=Er(a,t);return n}function Ct(e,t,n=2){let r=" ".repeat(n),o=" ".repeat(n+1),a=Object.entries(t).map(([s,c])=>`${o}${s}: ${c}`).join(`
|
|
3
3
|
`),i=/^[A-Z_a-z]\w*$/.test(e)?e:`'${e}'`;return`${r}${i}: {
|
|
4
4
|
${o}// columns
|
|
5
5
|
${a}
|
package/dist/transaction.d.ts
CHANGED
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.48",
|
|
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.48",
|
|
67
|
+
"@stacksjs/cli": "0.74.48",
|
|
68
|
+
"@stacksjs/config": "0.74.48",
|
|
69
|
+
"@stacksjs/database": "0.74.48",
|
|
70
|
+
"@stacksjs/env": "0.74.48",
|
|
71
|
+
"@stacksjs/error-handling": "0.74.48",
|
|
72
|
+
"@stacksjs/events": "0.74.48",
|
|
73
|
+
"@stacksjs/logging": "0.74.48",
|
|
74
|
+
"@stacksjs/model-meta": "0.74.48",
|
|
75
|
+
"@stacksjs/pagination": "0.74.48",
|
|
76
|
+
"@stacksjs/path": "0.74.48",
|
|
77
|
+
"@stacksjs/query-builder": "0.74.48",
|
|
78
|
+
"@stacksjs/realtime": "0.74.48",
|
|
79
|
+
"@stacksjs/router": "0.74.48",
|
|
80
|
+
"@stacksjs/storage": "0.74.48",
|
|
81
|
+
"@stacksjs/strings": "0.74.48",
|
|
82
82
|
"@stacksjs/ts-validation": "^0.5.6",
|
|
83
|
-
"@stacksjs/validation": "0.74.
|
|
83
|
+
"@stacksjs/validation": "0.74.48",
|
|
84
84
|
"bun-query-builder": "^0.2.70"
|
|
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.48",
|
|
88
|
+
"@stacksjs/payments": "0.74.48",
|
|
89
|
+
"@stacksjs/queue": "0.74.48",
|
|
90
|
+
"@stacksjs/search-engine": "0.74.48",
|
|
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.48",
|
|
112
112
|
"better-dx": "^0.2.24",
|
|
113
113
|
"stripe": "22.3.2"
|
|
114
114
|
}
|