@stacksjs/orm 0.74.0 → 0.74.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/dist/auto-crud.d.ts +30 -0
  2. package/dist/generate-database-schema.d.ts +1 -0
  3. package/dist/index.d.ts +3 -0
  4. package/dist/index.js +9 -9
  5. package/dist/migration-tables.d.ts +18 -0
  6. package/dist/models/AnalyticsEvent.ts +5 -0
  7. package/dist/models/Content/Menu.ts +5 -1
  8. package/dist/models/Content/MenuItem.ts +6 -1
  9. package/dist/models/Content/Page.ts +5 -1
  10. package/dist/models/Content/Post.ts +5 -1
  11. package/dist/models/Content/Redirect.ts +5 -1
  12. package/dist/models/EmailIdempotency.ts +5 -0
  13. package/dist/models/EmailList.ts +6 -0
  14. package/dist/models/EmailSuppression.ts +5 -0
  15. package/dist/models/EmailWebhookEvent.ts +5 -0
  16. package/dist/models/Forms/Form.ts +5 -1
  17. package/dist/models/Forms/FormField.ts +6 -1
  18. package/dist/models/MailPreference.ts +5 -0
  19. package/dist/models/Request.ts +5 -0
  20. package/dist/models/SiteDomain.ts +5 -1
  21. package/dist/models/Tag.ts +6 -0
  22. package/dist/models/Team.ts +6 -1
  23. package/dist/models/User.ts +6 -1
  24. package/dist/models/commerce/Auction.ts +6 -0
  25. package/dist/models/commerce/AuctionItem.ts +6 -0
  26. package/dist/models/commerce/Cart.ts +6 -1
  27. package/dist/models/commerce/CartItem.ts +6 -1
  28. package/dist/models/commerce/Category.ts +6 -0
  29. package/dist/models/commerce/Coupon.ts +6 -0
  30. package/dist/models/commerce/DeliveryRoute.ts +6 -1
  31. package/dist/models/commerce/DeliveryStop.ts +6 -1
  32. package/dist/models/commerce/GiftCard.ts +6 -1
  33. package/dist/models/commerce/LicenseKey.ts +6 -1
  34. package/dist/models/commerce/LoyaltyReward.ts +6 -0
  35. package/dist/models/commerce/Manufacturer.ts +6 -0
  36. package/dist/models/commerce/Order.ts +6 -1
  37. package/dist/models/commerce/Payment.ts +6 -1
  38. package/dist/models/commerce/PrintDevice.ts +6 -0
  39. package/dist/models/commerce/Product.ts +6 -0
  40. package/dist/models/commerce/ProductUnit.ts +6 -0
  41. package/dist/models/commerce/ProductVariant.ts +6 -0
  42. package/dist/models/commerce/Review.ts +6 -1
  43. package/dist/models/commerce/ShippingMethod.ts +6 -0
  44. package/dist/models/commerce/ShippingRate.ts +6 -0
  45. package/dist/models/commerce/ShippingZone.ts +6 -0
  46. package/dist/models/commerce/TaxRate.ts +6 -0
  47. package/dist/models/commerce/Transaction.ts +6 -1
  48. package/dist/models/commerce/WaitlistProduct.ts +6 -1
  49. package/dist/models/commerce/WaitlistRestaurant.ts +6 -1
  50. package/dist/models/realtime/Websocket.ts +5 -0
  51. package/dist/ownership.d.ts +96 -0
  52. package/dist/routes.js +1 -1
  53. package/package.json +21 -21
package/dist/index.js CHANGED
@@ -1,22 +1,22 @@
1
1
  // @bun
2
- var b=import.meta.require;import"@stacksjs/validation";import{log as le}from"@stacksjs/cli";import{db as Le}from"@stacksjs/database";async function qt(e,n={}){let{olderThanDays:t=30,column:r="created_at",query:o}=n;try{if(o){let u=Le.deleteFrom(e);u=o(u);let l=await u.execute(),f=Array.isArray(l)?l:[l],d=Number(f[0]?.numDeletedRows??f.length??0);return le.info(`Pruned ${d} records from ${e}`),d}let a=new Date;a.setDate(a.getDate()-t);let i=await Le.deleteFrom(e).where(r,"<",a.toISOString()).execute(),s=Array.isArray(i)?i:[i],c=Number(s[0]?.numDeletedRows??s.length??0);return le.info(`Pruned ${c} records from ${e} older than ${t} days`),c}catch(a){throw le.error(`Failed to prune ${e}:`,a),a}}async function Oa(e,n={}){return qt(e,n)}function va(e){if(!e?.prunable)return null;if(typeof e.prunable==="boolean")return{olderThanDays:30,column:"created_at"};return e.prunable}import{createCipheriv as Ut,createDecipheriv as Lt,createHash as Qt,randomBytes as Vt}from"crypto";import{log as X}from"@stacksjs/logging";var Qe="enc:",Ve="aes-256-gcm",Wt=12,Z=null;async function We(){if(Z)return Z;let e=process.env.APP_KEY;if(!e)try{e=(await import("@stacksjs/config").catch(()=>null))?.config?.app?.key}catch{}if(!e)return null;return Z=Qt("sha256").update(e).digest(),Z}function U(e){return typeof e==="string"&&e.startsWith(Qe)}async function de(e){if(e==null)return e;if(U(e))return e;if(typeof e!=="string")return e;let n=await We();if(!n)return X.warn("[orm] encrypted attribute: APP_KEY not set - storing value in plaintext"),e;let t=Vt(Wt),r=Ut(Ve,n,t),o=Buffer.concat([r.update(e,"utf8"),r.final()]),a=r.getAuthTag();return`${Qe}${t.toString("base64")}:${a.toString("base64")}:${o.toString("base64")}`}async function fe(e){if(e==null)return e;if(typeof e!=="string")return e;if(!U(e))return e;try{let n=await We();if(!n)return X.warn("[orm] encrypted attribute: APP_KEY not set - cannot decrypt"),null;let[,t,r,o]=e.split(":");if(!t||!r||!o)return X.warn("[orm] encrypted attribute: malformed envelope, returning null"),null;let a=Buffer.from(t,"base64"),i=Buffer.from(r,"base64"),s=Buffer.from(o,"base64"),c=Lt(Ve,n,a);return c.setAuthTag(i),Buffer.concat([c.update(s),c.final()]).toString("utf8")}catch(n){return X.warn("[orm] encrypted attribute: decrypt failed (key rotation? corrupted ciphertext?)",{error:n}),null}}function pe(e){let n=e.attributes;if(!n||typeof n!=="object")return[];let t=[];for(let[r,o]of Object.entries(n))if(o&&typeof o==="object"&&o.encrypted===!0)t.push(r);return t}import{sqlDateTime as zt}from"@stacksjs/database";import{log as Q}from"@stacksjs/logging";var Ht=[/^password$/i,/^password_hash$/i,/^api_key$/i,/_token$/i,/_secret$/i,/^remember_token$/i],He="model_audits",ye=null;function Gt(e){ye=e}async function me(){if(ye!=null)return ye;try{let e=await import("@stacksjs/router").catch(()=>null);if(!e)return null;let n=e.getCurrentRequest;if(typeof n!=="function")return null;let t=n();if(!t)return null;return(t.user??t._user)?.id??null}catch{return null}}function ee(e){if(!e||typeof e!=="object")return null;let n={};for(let[t,r]of Object.entries(e)){if(Ht.some((o)=>o.test(t)))continue;n[t]=r}return n}function L(e){if(!e||typeof e!=="object")return null;let n=e;if(n._attributes&&typeof n._attributes==="object")return{...n._attributes};return{...e}}function Jt(e,n){if(!e||!n)return{old:e,next:n};let t={},r={},o=new Set([...Object.keys(e),...Object.keys(n)]);for(let a of o)if(e[a]!==n[a])t[a]=e[a],r[a]=n[a];return{old:t,next:r}}async function ge(e,n=!1){try{let{db:t}=await import("@stacksjs/database");await t.insertInto(He).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:zt()}).executeTakeFirst()}catch(t){if(Q.warn(`[orm] audit row write failed for ${e.auditable_type}#${String(e.auditable_id)} (${e.event})`,{error:t}),n)throw t}}function Ge(e){return{async audits(n){try{let{db:t}=await import("@stacksjs/database");return(await t.selectFrom(He).selectAll().where("auditable_type","=",e).where("auditable_id","=",n).orderBy("created_at","desc").execute()??[]).map((o)=>({...o,old_values:typeof o.old_values==="string"?ze(o.old_values):o.old_values,new_values:typeof o.new_values==="string"?ze(o.new_values):o.new_values}))}catch(t){return Q.warn(`[orm] audits() lookup failed for ${e}#${String(n)}`,{error:t}),[]}}}}function ze(e){try{return JSON.parse(e)}catch{return e}}function Je(e){if(e&&typeof e==="object"&&"transactional"in e)return{transactional:e.transactional===!0};return{transactional:!1}}function Ye(e,n,t="id",r={}){let o=r.transactional===!0,a=e;if(typeof e.audits!=="function")e.audits=Ge(n).audits;let i=async(l)=>{if(!o)return await l();let{db:f}=await import("@stacksjs/database");return await f.transaction(async()=>l())},s=e.create;if(typeof s==="function")e.create=async function(...l){return await i(async()=>{let f=await s.apply(this,l);try{let d=L(f),m=d?.[t];if(m!=null){let p=await me();await ge({auditable_type:n,auditable_id:m,event:"created",old_values:null,new_values:ee(d),user_id:p},o)}}catch(d){if(Q.warn(`[orm] audit(create) failed for ${n}`,{error:d}),o)throw d}return f})};let c=e.update;if(typeof c==="function")e.update=async function(l,f){return await i(async()=>{let d=a.find,m=typeof d==="function"?L(await d.call(a,l)):null,p=await c.call(this,l,f);try{let y=L(p)??(typeof d==="function"?L(await d.call(a,l)):null),{old:w,next:h}=Jt(m,y);if(h&&Object.keys(h).length>0){let T=await me();await ge({auditable_type:n,auditable_id:l,event:"updated",old_values:ee(w),new_values:ee(h),user_id:T},o)}}catch(y){if(Q.warn(`[orm] audit(update) failed for ${n}#${String(l)}`,{error:y}),o)throw y}return p})};let u=(l)=>{let f=e[l];if(typeof f!=="function")return;e[l]=async function(d){return await i(async()=>{let m=a.find,p=typeof m==="function"?L(await m.call(a,d)):null,y=await f.call(this,d);try{if(y!==!1&&p){let w=await me();await ge({auditable_type:n,auditable_id:d,event:"deleted",old_values:ee(p),new_values:null,user_id:w},o)}}catch(w){if(Q.warn(`[orm] audit(${l}) failed for ${n}#${String(d)}`,{error:w}),o)throw w}return y})}};u("delete"),u("softDelete")}import{db as Yt,sql as Zt,sqlDateTime as be}from"@stacksjs/database";function M(e,n){if(typeof e!=="number"||!Number.isFinite(e)||e<=0)throw Error(`[orm/commentable] ${n} requires a positive numeric id (received ${String(e)})`)}var V="commentable_upvotes",W="commentables";function Xt(e){let n=e;return n.code==="SQLITE_CONSTRAINT_UNIQUE"||n.code==="SQLITE_CONSTRAINT"||n.code==="23505"||n.errno===1062||/unique|duplicate/i.test(n.message??"")}function we(e){let n=Yt;return{async comments(t){return M(t,"comments"),await n.selectFrom("commentables").where("commentables_id","=",t).where("commentables_type","=",e).selectAll().execute()},async commentCount(t){let r=await n.selectFrom("commentables").select(Zt`count(*) as count`).where("commentables_id","=",t).where("commentables_type","=",e).executeTakeFirst();return Number(r?.count)||0},async addComment(t,r){if(M(t,"addComment"),!r||typeof r.title!=="string"||r.title.trim().length===0)throw Error("[orm/commentable] addComment requires a non-empty comment.title");if(typeof r.body!=="string"||r.body.trim().length===0)throw Error("[orm/commentable] addComment requires a non-empty comment.body");let o=await n.insertInto("commentables").values({...r,commentables_id:t,commentables_type:e,status:"pending",created_at:be(),updated_at:be()}).returningAll().executeTakeFirst();if(o&&typeof o==="object"&&"id"in o)return o;let a=o?.lastInsertRowid;if(a==null)return o;return await n.selectFrom("commentables").where("id","=",Number(a)).selectAll().executeTakeFirst()},async approvedComments(t){return await n.selectFrom("commentables").where("commentables_id","=",t).where("commentables_type","=",e).where("status","=","approved").selectAll().execute()},async pendingComments(t){return await n.selectFrom("commentables").where("commentables_id","=",t).where("commentables_type","=",e).where("status","=","pending").selectAll().execute()},async rejectedComments(t){return await n.selectFrom("commentables").where("commentables_id","=",t).where("commentables_type","=",e).where("status","=","rejected").selectAll().execute()},async upvoteComment(t,r){M(t,"upvoteComment"),M(r,"upvoteComment");let o=()=>n.selectFrom(V).where("upvoteable_id","=",t).where("upvoteable_type","=",W).where("user_id","=",r).selectAll().executeTakeFirst(),a=await o();if(a)return a;try{await n.insertInto(V).values({upvoteable_id:t,upvoteable_type:W,user_id:r,created_at:be()}).execute()}catch(i){if(!Xt(i))throw i}return await o()},async removeCommentUpvote(t,r){M(t,"removeCommentUpvote"),M(r,"removeCommentUpvote"),await n.deleteFrom(V).where("upvoteable_id","=",t).where("upvoteable_type","=",W).where("user_id","=",r).execute()},async commentUpvoteCount(t){M(t,"commentUpvoteCount");let r=await n.selectFrom(V).select("count(*) as count").where("upvoteable_id","=",t).where("upvoteable_type","=",W).executeTakeFirst();return Number(r?.count)||0},async hasUpvotedComment(t,r){return M(t,"hasUpvotedComment"),M(r,"hasUpvotedComment"),!!await n.selectFrom(V).where("upvoteable_id","=",t).where("upvoteable_type","=",W).where("user_id","=",r).selectAll().executeTakeFirst()}}}import{db as en,sql as tn,sqlDateTime as Ze}from"@stacksjs/database";function he(e,n){if(typeof e!=="number"||!Number.isFinite(e)||e<=0)throw Error(`[orm/taggable] ${n} requires a positive numeric id (received ${String(e)})`)}function Te(e){let n=en;return{async tags(t){return he(t,"tags"),await n.selectFrom("taggables").where("taggable_id","=",t).where("taggable_type","=",e).selectAll().execute()},async tagCount(t){he(t,"tagCount");let r=await n.selectFrom("taggables").select(tn`count(*) as count`).where("taggable_id","=",t).where("taggable_type","=",e).executeTakeFirst();return Number(r?.count)||0},async addTag(t,r){if(he(t,"addTag"),!r||typeof r.name!=="string"||r.name.trim().length===0)throw Error("[orm/taggable] addTag requires a non-empty tag.name");return await n.insertInto("taggables").values({...r,taggable_id:t,taggable_type:e,slug:r.name.toLowerCase().replace(/[^a-z0-9]+/g,"-"),is_active:!0,created_at:Ze(),updated_at:Ze()}).execute(),await n.selectFrom("taggables").where("taggable_id","=",t).where("taggable_type","=",e).where("name","=",r.name).selectAll().executeTakeFirst()},async activeTags(t){return await n.selectFrom("taggables").where("taggable_id","=",t).where("taggable_type","=",e).where("is_active","=",!0).selectAll().execute()},async inactiveTags(t){return await n.selectFrom("taggables").where("taggable_id","=",t).where("taggable_type","=",e).where("is_active","=",!1).selectAll().execute()},async removeTag(t,r){await n.deleteFrom("taggables").where("taggable_id","=",t).where("taggable_type","=",e).where("id","=",r).execute()}}}import{db as nn,sqlDateTime as te}from"@stacksjs/database";function _e(e){let n=nn;async function t(r){return(await n.selectFrom("categorizable_models").where("categorizable_id","=",r).where("categorizable_type","=",e).selectAll().execute()).map((a)=>a.category_id)}return{async categories(r){let o=await t(r);if(o.length===0)return[];return await n.selectFrom("categorizables").where("id","in",o).selectAll().execute()},async categoryCount(r){return(await t(r)).length},async addCategory(r,o){let a=()=>n.selectFrom("categorizables").where("name","=",o.name).where("categorizable_type","=",e).selectAll().executeTakeFirst(),i=await a();if(!i)await n.insertInto("categorizables").values({name:o.name,description:o.description,slug:o.name.toLowerCase().replace(/[^a-z0-9]+/g,"-"),categorizable_type:e,is_active:!0,created_at:te(),updated_at:te()}).execute(),i=await a();return await n.insertInto("categorizable_models").values({categorizable_id:r,categorizable_type:e,category_id:i?.id,created_at:te(),updated_at:te()}).execute(),i},async activeCategories(r){let o=await t(r);if(o.length===0)return[];return await n.selectFrom("categorizables").where("id","in",o).where("is_active","=",!0).selectAll().execute()},async inactiveCategories(r){let o=await t(r);if(o.length===0)return[];return await n.selectFrom("categorizables").where("id","in",o).where("is_active","=",!1).selectAll().execute()},async removeCategory(r,o){await n.deleteFrom("categorizable_models").where("categorizable_id","=",r).where("categorizable_type","=",e).where("category_id","=",o).execute()}}}import{db as rn,sqlDateTime as on}from"@stacksjs/database";function ke(e,n){let t=rn,r=n?.table||`${e}_likes`,o=n?.foreignKey||`${e.replace(/s$/,"")}_id`;return{async likes(a){return await t.selectFrom(r).where(o,"=",a).selectAll().execute()},async likeCount(a){let i=await t.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=on();try{return await t.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 f=await t.selectFrom(r).where(o,"=",a).where("user_id","=",i).selectAll().executeTakeFirst();if(f)return f;throw c}},async unlike(a,i){await t.deleteFrom(r).where(o,"=",a).where("user_id","=",i).execute()},async isLiked(a,i){return!!await t.selectFrom(r).where(o,"=",a).where("user_id","=",i).selectAll().executeTakeFirst()},async likedBy(a){return(await t.selectFrom(r).select([o]).where("user_id","=",a).execute()).map((s)=>Number(s[o])).filter(Boolean)}}}function tt(e){let n=e;return n?.code==="SQLITE_CONSTRAINT_UNIQUE"||n?.code==="SQLITE_CONSTRAINT"||n?.code==="23505"||n?.errno===1062||/unique|duplicate/i.test(n?.message??"")}function an(e,n,t){let r=e;if(e instanceof Error&&typeof r.status==="number"&&Number.isInteger(r.status)&&r.status>=400&&r.status<600){let o={error:e.message};if(r.details!==void 0)o.details=r.details;return{status:r.status,body:o}}if(tt(e))return{status:409,body:{error:`${n} already exists`}};return{status:500,body:{error:`Failed to ${t} ${n}`,detail:String(e)}}}function R(e){return e.replace(/([a-z\d])([A-Z])/g,"$1_$2").replace(/([A-Z])([A-Z][a-z])/g,"$1_$2").toLowerCase()}function sn(e){let n={};for(let[t,r]of Object.entries(e))n[R(t)]=r;return n}function za(e,n){let t=String(n||"").replace(/^\/+|\/+$/g,""),r=String(e).replace(/^\/+/,"");return`/api/${t?`${t}/`:""}${r}`}function Ha(e){if(!e)return null;let n=e.attributes??{};if(Object.prototype.hasOwnProperty.call(n,"teamId")||Object.prototype.hasOwnProperty.call(n,"team_id"))return"team_id";return e.belongsTo?.some((t)=>t==="Team")?"team_id":null}function Ga(e,n,t){let r=Object.keys(e).find((a)=>R(a)===R(n));if(Array.isArray(t)){if(r===void 0)return{data:e,error:"Ownership value is required"};if(!t.some((a)=>String(a)===String(e[r])))return{data:e,error:"Ownership value is not available to this caller"};return{data:{...e,[n]:e[r]}}}if(t===null||t===void 0)return{data:e,error:"Caller has no ownership identity"};let o={...e};for(let a of Object.keys(o))if(R(a)===R(n))delete o[a];return o[n]=t,{data:o}}function un(e){if(!e)return[];let n=Object.entries(e.attributes??{}).filter(([,t])=>t?.fillable===!0).map(([t])=>t);for(let t of e.belongsTo??[]){if(typeof t!=="string"||!t.trim())continue;let r=R(t.trim()).split("_").filter(Boolean);if(r.length===0)continue;let o=`${r[0]}${r.slice(1).map((a)=>`${a[0]?.toUpperCase()}${a.slice(1)}`).join("")}Id`;n.push(o)}return[...new Set(n)]}function cn(e,n){if(!e||n.length===0)return{};let t={};for(let r of n){if(r in e){t[r]=e[r];continue}let o=R(r);if(o!==r&&o in e)t[r]=e[o]}return t}function ln(e,n){if(e?.name!=="date"||n instanceof Date||typeof n!=="string")return n;let t=/^(\d{4})-(\d{2})-(\d{2})$/.exec(n);if(!t)return n;let r=Number(t[1]),o=Number(t[2]),a=Number(t[3]),i=new Date(Date.UTC(r,o-1,a));if(i.getUTCFullYear()!==r||i.getUTCMonth()!==o-1||i.getUTCDate()!==a)return n;return i}function Ja(e,n){if(!n.length)return e;let t={...e};for(let r of n)delete t[r],delete t[R(r)];return t}function Ya(e,n){if(!e||n.length===0)return e;let t={...e};for(let r of n)delete t[r],delete t[R(r)];return t}var dn=["id","uuid","created_at","updated_at","deleted_at"];function Za(e,n){let t=new Map;for(let r of[...Object.keys(e??{}),...dn]){let o=R(r);if(!/^\w+$/.test(o))continue;t.set(r,o),t.set(o,o)}for(let r of n)t.delete(r),t.delete(R(r));return t}function Xa(e,n,t){if(!n)return e;let r=String(n).split(",").map((a)=>a.trim()).filter(Boolean),o=e;for(let a of r){let i=a.startsWith("-"),s=i?a.slice(1):a;if(!/^\w+$/.test(s))continue;let c=t.get(s);if(!c)continue;o=o.orderBy(c,i?"desc":"asc")}return o}var fn={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"?pn(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"?mn(e):[],set:(e)=>e==null?null:Array.isArray(e)?JSON.stringify(e):e}};function pn(e){try{return JSON.parse(e)}catch{return e}}function mn(e){try{return JSON.parse(e)}catch{return[]}}function ei(e,n,t){if(!e||typeof e!=="object"||!n||Object.keys(n).length===0)return e;let r={...e};for(let[o,a]of Object.entries(n)){let i=typeof a==="string"?fn[a]:a;if(!i||typeof i[t]!=="function")continue;if(Object.prototype.hasOwnProperty.call(r,o))r[o]=i[t](r[o]);let s=R(o);if(s!==o&&Object.prototype.hasOwnProperty.call(r,s))r[s]=i[t](r[s])}return r}function nt(e,n,t){let r=n?.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&&t==="updating")continue;let u=i!==null&&typeof i==="object"&&Object.prototype.hasOwnProperty.call(i,"default"),l=c?e[a]:u?i.default:void 0,f=ln(s,l),d=s.validate(f);if(!d?.valid&&Array.isArray(d?.errors)&&d.errors.length>0)o[a]=d.errors.map((m)=>i?.validation?.message?.[m?.code]??m?.message??"invalid")}return Object.keys(o).length===0?{valid:!0}:{valid:!1,errors:o}}function ti(e,n,t){let r=Xe(t);return e.find((o)=>o.method===n&&Xe(String(o.path??""))===r)}function Xe(e){return e.replace(/\{[^}]*\}/g,"{}").replace(/:[^/]+/g,"{}")}function Re(e){if(Array.isArray(e))return e.filter((n)=>typeof n==="string"&&n.length>0);return typeof e==="string"&&e?[e]:[]}function ni(e){let n=typeof e==="object"&&e!==null&&"middleware"in e,t=e?.middleware;if(!n)return{read:["auth"],write:["auth"],declared:!1};if(t&&typeof t==="object"&&!Array.isArray(t)){let o=t;return{read:"read"in o?Re(o.read):["auth"],write:"write"in o?Re(o.write):["auth"],declared:!0}}let r=Re(t);return{read:r,write:r,declared:!0}}var et=15,gn=100;function ri(e){let n=Number.parseInt(e.get("page")||String(1),10),t=Number.isFinite(n)?Math.max(1,n):1,r=Number.parseInt(e.get("per_page")||String(et),10),o=Math.min(Number.isFinite(r)?Math.max(1,r):et,gn);return{page:t,perPage:o,offset:(t-1)*o}}function ne(e,n){let t=new URL(e.toString());return t.searchParams.set("page",String(n)),`${t.pathname}${t.search}`}function yn(e,n,t,r,o,a){let i=(n-1)*t,s=r===0,c={page:n,per_page:t,from:s?null:i+1,to:s?null:i+r,has_more_pages:o,prev_page_url:n>1?ne(e,n-1):null,next_page_url:o?ne(e,n+1):null};if(a!==void 0&&!Number.isNaN(a)){let u=Math.max(1,Math.ceil(a/t));c.total=a,c.last_page=u,c.first_page_url=ne(e,1),c.last_page_url=ne(e,u)}return c}function oi(e,n,t,r,o,a){let{page:i,...s}=yn(e,n,t,r,o,a);return{current_page:i,...s}}function ai(e,n){return(n??e??"").toString().trim().toLowerCase()==="deny"?"deny":"warn"}function ii(e,n){if(e.length===0)return null;let t=[...e].sort().join(", ");if(n==="deny")return`[orm] security.api.rowScoping is 'deny': NOT registering store/update/destroy for ${e.length} model(s) `+`with no row-level scoping \u2014 ${t}. Give a model an \`ownership\` config or a \`team_id\` column to restore its writes.`;return`[orm] ${e.length} model(s) publish mutating routes with no row-level scoping, so an authenticated caller can write any row \u2014 `+`${t}. Scope one with an \`ownership\` config or a \`team_id\` column; intended for public catalog tables. Set \`security.api.rowScoping: 'deny'\` (config/security.ts) to stop generating these routes instead.`}import{cacheRequestQuery as bn}from"@stacksjs/router";var re=new WeakMap;function ci(e,n){return bn(`batchLoad:${e.name??"model"}:${String(n)}`,async()=>new Promise((t,r)=>{let o=re.get(e);if(!o)o={keys:[],resolvers:[],scheduled:!1},re.set(e,o);if(o.keys.push(n),o.resolvers.push({key:n,resolve:t,reject:r}),o.scheduled)return;o.scheduled=!0,Promise.resolve().then(async()=>{let a=re.get(e);if(!a)return;re.delete(e);let i=Array.from(new Set(a.keys));try{let s=typeof e.findMany==="function"?await e.findMany(i):await Promise.all(i.map((u)=>e.find?.(u))),c=new Map;for(let u of s??[]){let l=u?.id;if(l!==void 0)c.set(l,u)}for(let u of a.resolvers)u.resolve(c.get(u.key))}catch(s){for(let c of a.resolvers)c.reject(s)}})}))}import{db as pi}from"@stacksjs/database";class wn{conditions=[];where(e,...n){let[t,r]=n,o=r===void 0?"=":t,a=r===void 0?t:r;this.addCondition("and","where",e,o,a)}orWhere(e,...n){let[t,r]=n,o=r===void 0?"=":t,a=r===void 0?t:r;this.addCondition("or","where",e,o,a)}whereIn(e,n){this.conditions.push({type:"and",method:"whereIn",column:e,values:n})}whereNotIn(e,n){this.conditions.push({type:"and",method:"whereIn",column:e,values:n,operator:"not in"})}whereNull(e){this.conditions.push({type:"and",method:"whereNull",column:e})}whereNotNull(e){this.conditions.push({type:"and",method:"whereNotNull",column:e})}whereBetween(e,n){this.conditions.push({type:"and",method:"whereBetween",column:e,range:n})}whereExists(e){this.conditions.push({type:"and",method:"whereExists",column:"",callback:e})}addCondition(e,n,t,r,o){this.conditions.push({type:e,method:n,column:t,operator:r,value:o})}getConditions(){return this.conditions}}import{db as Se,runInTransactionScope as hn}from"@stacksjs/database";async function yi(e,n){return await hn(async()=>await Se.transaction(e,n))}async function bi(e){return await Se.savepoint(e)}function wi(e,n){return Se.transactional(e,n)}import{path as C}from"@stacksjs/path";import{fs as B,globSync as Me}from"@stacksjs/storage";import{plural as st,singular as rt,snakeCase as _}from"@stacksjs/strings";import{isString as oe}from"@stacksjs/validation";function ut(e){let n=e.belongsToMany;if(!n)return[];if(Array.isArray(n))return n.map((t)=>({relationName:typeof t==="string"?_(t):_(String(t.model)),relation:t}));return Object.entries(n).map(([t,r])=>{if(typeof r==="string")return{relationName:t,relation:r};return{relationName:t,relation:{model:r.model,pivotTable:r.table,firstForeignKey:r.foreignKey,secondForeignKey:r.relatedKey}}})}async function Si(e){if(typeof e==="string")e=(await import(e)).default;return e.table??_(st(e?.name||""))}function z(e,n){if(e.name)return e.name;return C.basename(n).replace(/\.ts$/,"")}function x(e,n){if(e.table)return e.table;return _(st(z(e,n)))}function Tn(e,n){let t=[e,n];return t.sort(),t.join("_")}function Pi(e,n){return n in e}async function _n(e,n){let t=[];if(e.hasOne)for(let r of e.hasOne)t.push(await Pe(r,e,n,"hasOne"));if(e.hasMany)for(let r of e.hasMany)t.push(await Pe(r,e,n,"hasMany"));if(e.belongsTo)for(let r of e.belongsTo)t.push(await Pe(r,e,n,"belongsTo"));if(e.hasOneThrough)for(let r of e.hasOneThrough)t.push(await at(r,e,n,"hasOneThrough"));if(e.hasManyThrough)for(let r of e.hasManyThrough)t.push(await at(r,e,n,"hasManyThrough"));if(e.belongsToMany)for(let{relationName:r,relation:o}of ut(e))t.push(await Rn(o,e,n,"belongsToMany",r));if(e.morphOne)t.push(await it(e.morphOne,e,n,"morphOne"));if(e.morphMany){let r=Array.isArray(e.morphMany)?e.morphMany:[e.morphMany];for(let o of r)t.push(await it(o,e,n,"morphMany"))}if(e.morphTo){let r=e.morphTo,o=Array.isArray(r)?r:typeof r==="object"&&r!==null?[r]:[];for(let a of o)t.push(kn(a,e,n))}if(e.morphToMany){let r=Array.isArray(e.morphToMany)?e.morphToMany:[e.morphToMany];for(let o of r)t.push(ot(o,e,n,"morphToMany"))}if(e.morphedByMany){let r=Array.isArray(e.morphedByMany)?e.morphedByMany:[e.morphedByMany];for(let o of r)t.push(ot(o,e,n,"morphedByMany"))}return t}function kn(e,n,t){let r=e&&typeof e==="object"&&e.name?String(e.name):`${_(t)}able`,o=e?.type||`${r}_type`;return{relationship:"morphTo",model:"",table:"",relationTable:"",foreignKey:e?.id||`${r}_id`,modelKey:o,relationName:r,relationModel:t,throughModel:"",throughForeignKey:"",pivotForeign:"",pivotKey:"",pivotTable:""}}function ot(e,n,t,r){let o=typeof e==="object"&&e!==null,a=o?String(e.model||""):String(e),i=o&&e.morphName?String(e.morphName):`${_(t)}able`,s=o&&e.pivotTable?String(e.pivotTable):i,c=o&&e.id||`${i}_id`,u=o&&e.type||`${i}_type`;return{relationship:r,model:a,table:"",relationTable:"",foreignKey:c,modelKey:u,relationName:i,relationModel:t,throughModel:"",throughForeignKey:"",pivotForeign:c,pivotKey:u,pivotTable:s}}async function ae(e,n){let t=Ae(`${n}.ts`),r=Ae(`${e}.ts`),o=xe(`${e}.ts`),a=xe(`${n}.ts`);if(!t&&!a)throw Error(`Model not found: ${n}`);if(!r&&!o)throw Error(`Model not found: ${e}`);let i;try{if(B.existsSync(t))i=(await import(t)).default;else i=(await import(a)).default}catch(c){throw Error(`Failed to load model: ${n}. Error: ${c?.message||"Unknown error"}`)}let s=B.existsSync(r)?r:o;return{modelRelation:i,modelPath:s,modelRelationPath:B.existsSync(t)?t:a}}async function at(e,n,t,r){let o="",a="",i="",s="";if(oe(e))o=e;else o=e.model,a=e.relationName||"",i=e.through,s=e.throughForeignKey||"";let{modelRelation:c,modelPath:u,modelRelationPath:l}=await ae(t,o),f=x(c,l),d=x(n,u),m=_(z(c,l)),p=_(t);return{relationship:r,model:o,table:f,relationTable:d,foreignKey:`${p}_id`,modelKey:`${m}_id`,relationName:a,relationModel:t,throughModel:i,throughForeignKey:s,pivotForeign:`${p}_id`,pivotKey:`${m}_id`,pivotTable:d}}async function Rn(e,n,t,r,o){let a="",i="",s="",c=_(t);if(oe(e))a=e;else a=e.model,i=e.pivotTable||"",s=e.firstForeignKey||`${c}_id`;let{modelRelation:u,modelPath:l,modelRelationPath:f}=await ae(t,a),d=x(u,f),m=x(n,l),p=_(z(u,f));return{relationship:r,model:a,table:d,relationTable:m,foreignKey:typeof e==="string"?`${c}_id`:e.firstForeignKey||`${c}_id`,modelKey:typeof e==="string"?`${p}_id`:e.secondForeignKey||`${p}_id`,relationName:o,relationModel:t,throughModel:"",throughForeignKey:"",pivotForeign:s,pivotKey:`${p}_id`,pivotTable:i}}async function it(e,n,t,r){let o="",a="",i="",s="";if(oe(e))o=e,a=`${_(t)}able`;else o=e.model,a=e.morphName||`${_(t)}able`,i=e.type||`${a}_type`,s=e.id||`${a}_id`;let{modelRelation:c,modelPath:u,modelRelationPath:l}=await ae(t,o),f=x(c,l),d=x(n,u);return{relationship:r,model:o,table:f,relationTable:d,foreignKey:s||`${a}_id`,modelKey:i||`${a}_type`,relationName:a,relationModel:t,throughModel:"",throughForeignKey:"",pivotForeign:"",pivotKey:"",pivotTable:d}}async function Pe(e,n,t,r){let o="",a="";if(oe(e))o=e;else o=e.model,a=e.relationName||"";let{modelRelation:i,modelPath:s,modelRelationPath:c}=await ae(t,o),u=x(i,c),l=x(n,s),f=_(z(i,c)),d=_(t),m=typeof e==="string"?"":e.foreignKey||"",p={relationship:r,model:o,table:u,relationTable:l,foreignKey:m||`${d}_id`,modelKey:`${f}_id`,relationName:a,relationModel:t,throughModel:"",throughForeignKey:"",pivotForeign:`${d}_id`,pivotKey:`${f}_id`,pivotTable:l};if(r==="belongsTo"){if(p.foreignKey="",m)p.modelKey=m}return p}function xi(e){let n=/belongs/,t=/has/,r=/Through/,o=/morph/;if(r.test(e))return"throughType";if(n.test(e))return"belongsType";if(t.test(e))return"hasType";if(o.test(e))return"morphType";return""}function Ai(e){let n=/One/;if(/Many/.test(e))return"many";if(n.test(e))return"one";return""}async function Mi(e,n){let t=[];if("belongsToMany"in e){for(let{relation:r}of ut(e)){let o,a;if(typeof r==="string")a=r;else a=r.model;let i=Ae(`${a}.ts`),s=xe(`${a}.ts`);if(B.existsSync(i))o=(await import(i)).default;else o=(await import(s)).default;let c=x(o,i),u=x(e,n),l=typeof r==="object"&&"firstForeignKey"in r?r.firstForeignKey:`${rt(u)}_${e.primaryKey}`,f=typeof r==="object"&&"secondForeignKey"in r?r.secondForeignKey:`${rt(c)}_${e.primaryKey}`;t.push({table:(typeof r==="object"&&"pivotTable"in r?r.pivotTable:void 0)??Tn(u,c),firstForeignKey:l,secondForeignKey:f})}return t}return[]}async function Ci(e){let n=Me([C.userModelsPath("*.ts"),C.storagePath("framework/defaults/app/Models/**/*.ts")],{absolute:!0}),t=[];for(let r=0;r<n.length;r++){let o=n[r],a=await import(o);if(e===a.default.name)continue;let i=z(a,o),s=await _n(a.default,i);if(!s.length)continue;let c=s.find((u)=>u.model===e);if(c)t.push(c)}return t}function Oi(e){if(e===void 0)return[];return Object.keys(e).filter((n)=>e[n]?.hidden===!0)}function vi(e){let n=e.attributes;if(n===void 0)return[];return Object.keys(n).filter((t)=>n[t]?.guarded===!0).map((t)=>_(t))}function Di(e,n){let t=e.attributes,r=[];if(t===void 0)return[];let o=typeof e.traits?.billable==="object"||typeof e.traits?.billable==="boolean",a=typeof e.traits?.useAuth==="object"?e.traits?.useAuth.usePasskey:!1,i=e.traits?.useUuid||!1;if(o)r.push("stripe_id");if(i)r.push("uuid");if(a)r.push(...["two_factor_secret","public_key"]);let s=n.map((c)=>c.foreignKey).filter((c)=>c);return[...Object.keys(t).filter((c)=>{if(t===void 0)return!1;return t[c]?.fillable===!0}).map((c)=>_(c)),...r,...s]}async function Ei(e,n){let t=e.attributes;if(!t)t={};let r=Object.keys(t),o=[],a=Bun.file(n),i="";try{if(await a.exists())i=await a.text()}catch{i=""}let s=/rule:.*$/gm,c;c=s.exec(i);while(c!==null)o.push(c[0]),c=s.exec(i);return r.map((l,f)=>{let d=t[l],m=null,p=!1,y=!1,w=!1,h=!1;if(d)m=d||null,p=d.unique||!1,y=d.hidden||!1,w=d.fillable||!1;let T=o[f]??"";return h=(d.validation?.rule).isRequired??!1,{field:l,default:m,unique:p,hidden:y,fillable:w,required:h,fieldArray:Sn(T)}})}function Sn(e){let n=e.split("rule: schema.");if(n.length!==2)return null;if(!n[1])n[1]="";let t=n[1].replace(/,/g,"");if(!t)return null;let r=t.split("."),o=/\(([^)]+)\)/;return r.map((a)=>{let i=o.exec(a),s=i?i[1]:null;return{entity:a.replace(o,"").replace(/\(|\)/g,""),charValue:s}})[0]||null}function Fi(e){let n=e.fieldArray?.entity;switch(n){case"enum":return"string | string[]";case"date":return"Date | string";case"timestamp":return"Date | string";case"datetime":return"Date | string";case"float":return"number";case"double":return"number";case"decimal":return"number";case"integer":return"number";case"bigint":return"number";default:return n}}function xe(e){let n=C.join(C.storagePath("framework/defaults/app/Models"),"/"),t=C.join(n,e);if(B.existsSync(t))return t;return Me(`${n}**/${e}`,{absolute:!0})[0]??""}function Ae(e){let n=C.join(C.userModelsPath("/"),"/"),t=C.join(n,e);if(B.existsSync(t))return t;return Me(`${n}**/${e}`,{absolute:!0})[0]??""}function $i(e){let n=typeof e==="number"?new Date(e):typeof e==="string"?new Date(e):e;if(Number.isNaN(n.getTime()))throw Error(`Invalid date value: ${String(e)}`);return n.toISOString().replace("T"," ").split(".")[0]??""}function Ni(e){return e.toISOString().split("T")[0]??""}function ji(e){return e.getTime()}import{createModel as Dn,registerModel as En}from"@stacksjs/query-builder";import{log as k}from"@stacksjs/logging";import{snakeCase as O}from"@stacksjs/strings";import{AsyncLocalStorage as Rt}from"async_hooks";function Pn(e){if(e===null||typeof e!=="object")return!1;let n=e;return Array.isArray(n.data)&&typeof n.current_page==="number"&&typeof n.per_page==="number"&&typeof n.total==="number"&&typeof n.last_page==="number"}function xn(e){if(e===null||typeof e!=="object")return!1;let n=e;return Array.isArray(n.data)&&typeof n.current_page==="number"&&typeof n.per_page==="number"&&typeof n.has_more_pages==="boolean"&&!("total"in n)}function An(e){if(e===null||typeof e!=="object")return!1;let n=e;return Array.isArray(n.data)&&(typeof n.next_cursor==="string"||n.next_cursor===null)}function Ce(e){let{data:n}=e,{perPage:t,page:r,total:o,lastPage:a}=e.meta,i=n.length===0,s=i?null:(r-1)*t+1,c=i?null:s+n.length-1;return{data:n,current_page:r,per_page:t,total:o,last_page:a,from:s,to:c,has_more_pages:r<a}}function Oe(e){return{data:e.data,current_page:e.meta.page,per_page:e.meta.perPage,has_more_pages:e.meta.hasMore}}function ve(e){return{data:e.data,per_page:e.meta.perPage,next_cursor:ct(e.meta.nextCursor),prev_cursor:ct(e.meta.prevCursor),has_more_pages:e.meta.nextCursor!==null&&e.meta.nextCursor!==void 0}}function ct(e){if(e===null||e===void 0)return null;if(typeof e==="string")return e;return JSON.stringify(e)}function Ee(e,n){let t=Ne(),r=t?De(t,"per_page"):void 0,o=t?De(t,"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(n??o??1));return{perPage:a,page:i}}function Fe(e,n){let t=Ne(),r=t?dt(t,"cursor"):void 0,o=t?De(t,"per_page"):void 0,a=e!==void 0?Math.max(1,Math.floor(e)):Math.min(100,Math.max(1,o??15)),s=lt(n!==void 0?n:r??null);return{perPage:a,cursor:s}}function lt(e){if(e===null||e===void 0)return null;if(Array.isArray(e))return e;if(typeof e==="string"&&e.startsWith("["))try{let n=JSON.parse(e);if(Array.isArray(n))return n}catch{}return e}function $e(e){let n=Ne();if(!n)return e;let t=(()=>{try{return new URL(n.url)}catch{return null}})();if(!t)return e;let r=t.pathname;if(e.path=r,"next_cursor"in e)return e.next_page_url=e.next_cursor!==null?F(t,{cursor:e.next_cursor}):null,e.prev_page_url=e.prev_cursor!==null?F(t,{cursor:e.prev_cursor}):null,e;let o=e.current_page;if(e.prev_page_url=o>1?F(t,{page:o-1}):null,"total"in e){let a=e.last_page;e.next_page_url=o<a?F(t,{page:o+1}):null,e.first_page_url=F(t,{page:1}),e.last_page_url=F(t,{page:a})}else e.next_page_url=e.has_more_pages?F(t,{page:o+1}):null;return e}function F(e,n){let t=new URL(e.toString());for(let[r,o]of Object.entries(n))t.searchParams.set(r,String(o));return`${t.pathname}${t.search}`}var I;function Ne(){if(I===null)return;if(I===void 0)try{let n=b("@stacksjs/router");if(typeof n.getCurrentRequest==="function")I=n.getCurrentRequest;else{I=null;return}}catch{I=null;return}return I()}function De(e,n){let t=dt(e,n);if(t===void 0)return;let r=Number(t);return Number.isFinite(r)?r:void 0}function dt(e,n){let t=e.query?.[n];if(t===void 0)return;return Array.isArray(t)?t[0]:t}import{db as Mn}from"@stacksjs/database";function ft(e){let n=Mn;return{async createStripeUser(t,r){let{manageCustomer:o}=await import("@stacksjs/payments");return await o.createStripeCustomer(t,r)},async updateStripeUser(t,r){let{manageCustomer:o}=await import("@stacksjs/payments");return await o.updateStripeCustomer(t,r)},async deleteStripeUser(t){let{manageCustomer:r}=await import("@stacksjs/payments");return await r.deleteStripeUser(t)},async createOrGetStripeUser(t,r){let{manageCustomer:o}=await import("@stacksjs/payments");return await o.createOrGetStripeUser(t,r)},async retrieveStripeUser(t){let{manageCustomer:r}=await import("@stacksjs/payments");return await r.retrieveStripeUser(t)},async defaultPaymentMethod(t){let{managePaymentMethod:r}=await import("@stacksjs/payments");return await r.retrieveDefaultPaymentMethod(t)},async setDefaultPaymentMethod(t,r){let{managePaymentMethod:o}=await import("@stacksjs/payments");return await o.setDefaultPaymentMethod(t,r)},async addPaymentMethod(t,r){let{managePaymentMethod:o}=await import("@stacksjs/payments");return await o.addPaymentMethod(t,r)},async paymentMethods(t,r){let{managePaymentMethod:o}=await import("@stacksjs/payments");return await o.listPaymentMethods(t,r)},async newSubscription(t,r,o,a={}){let{manageSubscription:i}=await import("@stacksjs/payments"),s=await i.create(t,r,o,a),u=s.latest_invoice?.payment_intent;return{subscription:s,paymentIntent:u}},async updateSubscription(t,r,o,a={}){let{manageSubscription:i}=await import("@stacksjs/payments"),s=await i.update(t,r,o,a),u=s.latest_invoice?.payment_intent;return{subscription:s,paymentIntent:u}},async cancelSubscription(t,r,o={}){let{manageSubscription:a}=await import("@stacksjs/payments");return{subscription:await a.cancel(r,o)}},async activeSubscription(t){let{manageSubscription:r}=await import("@stacksjs/payments"),o=await n.selectFrom("subscriptions").where("user_id","=",t.id).where("provider_status","=","active").selectAll().executeTakeFirst();if(o){let a=await r.retrieve(t,o.provider_id||"");return{subscription:o,providerSubscription:a}}return},async checkout(t,r,o={}){let{manageCheckout:a,manageCustomer: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(t,{})).id,line_items:r.map((f)=>({price:f.priceId,quantity:f.quantity||1}))},...s,...o};return await a.create(t,l)},async createSetupIntent(t,r={}){let{manageSetupIntent:o}=await import("@stacksjs/payments");return await o.create(t,r)},async subscriptionHistory(t){let{manageInvoice:r}=await import("@stacksjs/payments");return await r.list(t)},async transactionHistory(t){let{manageTransaction:r}=await import("@stacksjs/payments");return await r.list(t)},async connectAccount(t,r={}){let o=r.accountColumn||"stripe_account_id",a=(t._attributes??t)[o];if(!a)return null;let i=await H();try{return await i.accounts.retrieve(a)}catch{return null}},async createConnectAccount(t,r={}){let o=r.accountColumn||"stripe_account_id",a=t._attributes??t,i=a[o],s=await H();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 n.updateTable(u).set({[o]:i}).where("id","=",Number(a.id)).execute(),l}return await s.accounts.retrieve(i)},async connectOnboardLink(t,r){let o=r.accountColumn||"stripe_account_id",i=(t._attributes??t)[o];if(!i)throw Error("connectOnboardLink: model has no Stripe Connect account; call createConnectAccount first");return{url:(await(await H()).accountLinks.create({account:i,refresh_url:r.refreshUrl,return_url:r.returnUrl,type:r.type??"account_onboarding"})).url,accountId:i}},async syncConnectStatus(t,r={}){let o=r.accountColumn||"stripe_account_id",a=r.chargesColumn||"charges_enabled",i=r.payoutsColumn||"payouts_enabled",s=t._attributes??t,c=s[o];if(!c)return{chargesEnabled:!1,payoutsEnabled:!1};let l=await(await H()).accounts.retrieve(c),f=!!l.charges_enabled,d=!!l.payouts_enabled,m=r.modelTable||e;return await n.updateTable(m).set({[a]:f,[i]:d}).where("id","=",Number(s.id)).execute(),{chargesEnabled:f,payoutsEnabled:d}},async chargeWithSplit(t,r){let o=await H(),a=r.accountColumn||"stripe_account_id",i=t._attributes??t,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)})}}}async function H(){let e=globalThis.process?.env?.STRIPE_SECRET_KEY;if(!e)throw Error("Stripe Connect: STRIPE_SECRET_KEY not configured");return new(await import("stripe")).default(e,{apiVersion:"2026-06-24.dahlia"})}function pt(){return{async generateTwoFactorForModel(e){let{generateTwoFactorSecret:n}=await import("@stacksjs/auth"),t=n();await e.update({two_factor_secret:t})},async verifyTwoFactorCode(e,n){let t=e.get("two_factor_secret");if(typeof t!=="string")return!1;let{verifyTwoFactorCode:r,RateLimiter:o}=await import("@stacksjs/auth"),a=String(e.id??e.get?.("id")??e.get?.("email")??t),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(n,t))return await o.recordFailedAttempt(i),!1;try{let{cache:c}=await import("@stacksjs/cache"),u=`2fa:used:${a}:${n}`;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{sqlDateTime as Cn}from"@stacksjs/database";import{log as K}from"@stacksjs/logging";var ie="deleted_at";function mt(e,n="id"){return{async softDelete(t){let r=Cn(),o=e.where(n,t);if(typeof o?.update==="function")return await o.update({[ie]:r}),!0;return!1},async restore(t){let r=e.where(n,t);if(typeof r?.update==="function")return await r.update({[ie]:null}),!0;return!1},async forceDelete(t){let r=e.where(n,t);if(typeof r?.delete==="function")return await r.delete(),!0;return!1},withTrashed(){return typeof e.query==="function"?e.query():e},onlyTrashed(){let t=typeof e.query==="function"?e.query():e;if(typeof t?.whereNotNull==="function")return t.whereNotNull(ie);return t?.where?.(ie,"!=",null)??t}}}function gt(e){if(e===!0||e==null)return{};if(typeof e==="object"&&!Array.isArray(e)){let n=e;if(Array.isArray(n.cascade)){let t=n.cascade.filter((r)=>typeof r==="string");return t.length?{cascade:t}:{}}return{}}return{}}function On(e,n){let t=e.hasMany??[],r=e.hasOne??[],o=t.some((l)=>je(l,n,!0)),a=r.some((l)=>je(l,n,!1));if(!o&&!a)return K.warn(`[orm] soft-delete cascade: '${n}' is not a declared hasMany/hasOne relation - skipping`),null;let s=(o?t:r).find((l)=>je(l,n,o))??null;if(!s)return null;let u=globalThis[s];if(!u)return K.warn(`[orm] soft-delete cascade: model '${s}' is not yet on globalThis - skipping cascade for '${n}'`),null;return{className:s,model:u}}function je(e,n,t){let r=e.toLowerCase();if(n===r)return!0;if(t&&n===`${r}s`)return!0;if(t&&r.endsWith("y")&&n===`${r.slice(0,-1)}ies`)return!0;return!1}async function vn(e,n,t,r,o){try{let a=t.where;if(typeof a!=="function"){K.warn(`[orm] cascade ${o}: child model has no .where()`);return}if(o==="softDelete"){let i=t.softDelete;if(typeof i==="function"){let c=a.call(t,r,n),u=typeof c?.get==="function"?await c.get():Array.isArray(c)?c:[],l=t.primaryKey||"id";for(let f of u){let d=f?.[l];if(d!=null)await i.call(t,d)}return}let s=a.call(t,r,n);if(typeof s?.delete==="function"){K.debug(`[orm] cascade soft-delete: child has no softDeletes trait, hard-deleting from ${String(t.table??"?")}`),await s.delete();return}}else{let i=t.restore;if(typeof i!=="function"){K.debug("[orm] cascade restore: child has no restore() - nothing to do");return}let s=t.withTrashed,u=(typeof s==="function"?s.call(t):t).where?.(r,n),l=typeof u?.get==="function"?await u.get():[],f=t.primaryKey||"id";for(let d of l){let m=d?.[f];if(m!=null)await i.call(t,m)}}}catch(a){if(K.warn(`[orm] soft-delete cascade ${o} on ${e}#${String(n)} failed`,{error:a}),process.env.STACKS_ORM_CASCADE_SWALLOW!=="true")throw a}}async function G(e,n,t,r){let o=n.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 vn(s.className,t,s.model,a,r)}}var St=new Rt;function j(){return St.getStore()?.suppressed===!0}function N(e){return Promise.resolve(St.run({suppressed:!0},e))}var Pt=new Rt;function Fn(){return Pt.getStore()?.suppressed===!0}function $n(e){return Promise.resolve(Pt.run({suppressed:!0},e))}var Ue=Symbol.for("stacks.orm.modelDefinition");class xt extends Error{status=422;errors;constructor(e,n){let t=Object.keys(n).join(", ");super(`${e} validation failed: ${t}`);this.name="ModelValidationError",this.errors=n}}var yt=new Set;function Nn(e,n){let t=typeof e==="string"?e.slice(0,80):String(e),r=`${typeof e}:${t}`;if(yt.has(r))return;yt.add(r);let o=n instanceof Error?n.message:String(n);console.error(`[orm] JSON cast failed to parse value (returning null): ${o} - value preview: ${JSON.stringify(t)}`)}var jn={string:{get:(e)=>e!=null?String(e):null,set:(e)=>e!=null?String(e):null},number:{get:(e)=>e!=null?Number(e):null,set:(e)=>e!=null?Number(e):null},integer:{get:(e)=>e!=null?Math.trunc(Number(e)):null,set:(e)=>e!=null?Math.trunc(Number(e)):null},float:{get:(e)=>e!=null?Number.parseFloat(String(e)):null,set:(e)=>e!=null?Number.parseFloat(String(e)):null},boolean:{get:(e)=>e===1||e==="1"||e===!0||e==="true",set:(e)=>e===!0||e===1||e==="1"||e==="true"?1:0},json:{get:(e)=>{if(e==null)return null;if(typeof e==="string")try{return JSON.parse(e)}catch(n){return Nn(e,n),null}return e},set:(e)=>{if(e==null)return null;return typeof e==="string"?e:JSON.stringify(e)}},datetime:{get:(e)=>e?new Date(e):null,set:(e)=>e instanceof Date?e.toISOString():e},date:{get:(e)=>e?new Date(e):null,set:(e)=>e instanceof Date?e.toISOString().split("T")[0]:e},array:{get:(e)=>{if(e==null)return[];if(Array.isArray(e))return e;if(typeof e==="string")try{return JSON.parse(e)}catch{return[]}return[]},set:(e)=>{if(e==null)return null;return Array.isArray(e)?JSON.stringify(e):e}}};function At(e){return typeof e==="string"?jn[e]:e}function bt(e,n,t){if(!e||typeof e!=="object")return e;let r={...e};for(let[o,a]of Object.entries(n))if(o in r){let i=At(a);r[o]=i[t](r[o])}return r}var se=new Set(["_attributes","_original","_definition","_hasSaved","_relations"]),wt=Symbol.for("stacks.modelInstanceProxy"),Bn={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 In(e,n){if(!e||!n)return null;let t=n.split("."),r=e;for(let o of t){if(r==null||typeof r!=="object")return null;let a=r;if("_attributes"in a&&a._attributes&&typeof a._attributes==="object"){let 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 P(e,n){if(!e||typeof e!=="object")return e;let t=e;if(t[wt])return e;let r=t._attributes;if(!r||typeof r!=="object")return e;if(n&&Object.keys(n).length>0){for(let[o,a]of Object.entries(n))if(Object.prototype.hasOwnProperty.call(r,o))r[o]=At(a).get(r[o])}return new Proxy(e,{get(o,a,i){let s=o;if(a===wt)return!0;if(a==="saveAsync")return async function(){let u=s._definition,l=u?.set;if(l&&typeof s.isDirty==="function"){for(let[d,m]of Object.entries(l)){if(typeof m!=="function")continue;if(!s.isDirty(d))continue;let p=m(s._attributes),y=p&&typeof p.then==="function"?await p:p;s._attributes[d]=y}let f=u.set;u.set={};try{return s.save()}finally{u.set=f}}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[d,m]of Object.entries(l)){if(typeof m!=="function")continue;if(!s.isDirty(d))continue;let p=m(s._attributes);if(p&&typeof p.then==="function")throw Error(`Setter for "${d}" returned a Promise - use \`saveAsync()\` instead of \`save()\` when a model has async setters.`);s._attributes[d]=p}let f=u.set;u.set={};try{return s.save()}finally{u.set=f}}return s.save()};if(a==="updateAsync")return async function(u){if(u&&typeof u==="object"&&!Array.isArray(u))for(let[l,f]of Object.entries(u))i[l]=f;return i.saveAsync()};if(a==="saveQuietly")return function(){return N(()=>s.save())};if(a==="saveAsyncQuietly")return function(){return N(()=>i.saveAsync())};if(a==="updateQuietly")return function(u){return N(()=>s.update(u))};if(a==="updateAsyncQuietly")return function(u){return N(()=>i.updateAsync(u))};if(a==="deleteQuietly")return function(){return N(()=>s.delete())};if(a==="toSearchableObject")return function(){let f=s._definition?.traits?.useSearch;if(!f)return null;let d=s._attributes;if(!d)return null;if(f===!0){let h={...d};if(d.id!=null)h.id=String(d.id);return h}let m={},p=f.displayable?.length?f.displayable:[...f.searchable??[],...f.filterable??[],...f.sortable??[],"id"],y=f.denormalize??{},w=s._relations;for(let h of p){let T=O(h),S=d[T]??d[h];if(S!==void 0){m[T]=S;continue}let A=y[h]??y[T];if(A){m[T]=In(w,A);continue}m[T]=void 0}if(d.id!=null)m.id=String(d.id);return m};if(typeof a==="string"&&!se.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 d=l[a];if(Array.isArray(d))return d.map((m)=>P(m,n));return d&&typeof d==="object"?P(d,n):d}let f=Bn[a];if(f){let p=s._definition?.__traitMethods?.[f.bag]?.[a];if(typeof p==="function")return f.mode==="model"?(...y)=>p(i,...y):(...y)=>p(s.id,...y)}if(u){let d=O(a);if(d!==a&&Object.prototype.hasOwnProperty.call(u,d))return u[d]}}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"&&!se.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 f=O(a);if(f!==a&&Object.prototype.hasOwnProperty.call(u,f)){if(typeof l==="function")l.call(c,f,i);else u[f]=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"&&!se.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=O(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"&&!se.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 Kn=new Set(["get","first","last","firstOrFail","find","findOrFail","all","paginate","simplePaginate","cursorPaginate"]),qn={paginate:Ce,simplePaginate:Oe,cursorPaginate:ve},ht=Symbol.for("stacks.queryBuilderProxy");function Mt(e,n){if(!e||typeof e!=="object")return e;if(e[ht])return e;return new Proxy(e,{get(t,r,o){if(r===ht)return!0;let a=Reflect.get(t,r,o);if(typeof a!=="function")return a;return function(...i){let s=i,c=String(r);if(c==="paginate"||c==="simplePaginate"){let{perPage:f,page:d}=Ee(i[0],i[1]);s=[f,d]}else if(c==="cursorPaginate"){let{perPage:f,cursor:d}=Fe(i[0],i[1]);s=[f,d,i[2],i[3]]}let u=a.apply(t,s),l=(f)=>{if(Kn.has(c)){if(Array.isArray(f))return f.map((m)=>P(m,n));let d=qn[c];if(d&&f&&Array.isArray(f.data)){let m=f.data.map((y)=>P(y,n)),p=d({...f,data:m});return $e(p)}if(f&&Array.isArray(f.data))return{...f,data:f.data.map((m)=>P(m,n))};return P(f,n)}if(f&&typeof f==="object"&&typeof f.get==="function")return Mt(f,n);return f};if(u&&typeof u.then==="function")return u.then(l);return l(u)}}})}function Un(e,n){let t=["find","first","last","all","firstOrFail","findOrFail","findMany"];for(let a of t){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((f)=>P(f,n)):P(l,n);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((f)=>P(f,n)):P(l,n);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 Mt(c,n)}}}class Ct extends Error{model;id;constructor(e,n){super(n!=null?`[ORM] ${e} not found for id=${String(n)}`:`[ORM] No matching ${e} row`);this.name="ModelNotFoundError",this.model=e,this.id=n}}class Ie extends Error{model;attribute;reason;constructor(e,n,t){let r=t==="guarded"?`'${n}' is marked guarded`:`'${n}' is not in the fillable allowlist`;super(`[ORM] Mass assignment to ${e} forbidden: ${r}. Use ${e}.forceCreate(...) / .forceUpdate(...) to bypass.`);this.name="MassAssignmentException",this.model=e,this.attribute=n,this.reason=t}}var Ln=new Set(["id","created_at","updated_at","deleted_at","uuid"]);function J(e,n,t={}){if(t.force)return n;if(!n||typeof n!=="object"||Array.isArray(n))return n;let r=e.attributes;if(!r)return n;let o=new Set,a=new Set,i=new Set;for(let[c,u]of Object.entries(r)){let l=O(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(n)){let u=O(c);if(Ln.has(u))continue;if(i.has(u))throw new Ie(e.name,c,"guarded");if(u.endsWith("_id"))continue;if(!s.has(u))throw new Ie(e.name,c,"not-fillable")}return n}async function Ke(e,n){let t=e.set;if(!t||typeof t!=="object")return n;let r={...n};for(let[o,a]of Object.entries(t)){if(typeof a!=="function"||!(o in r))continue;try{r[o]=await a(r)}catch(i){k.error(`[orm] ${e.name}.set.${o} threw - skipping setter`,i)}}return r}function Qn(e,n){let t=n.primaryKey||"id",r=e.create;function o(u){let l=e.where;if(typeof l!=="function")throw Error(`[ORM] ${n.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] ${n.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] ${n.name}.${u} cannot create: the underlying query builder did not expose create()`);return l}if(typeof e.update!=="function")e.update=async function(u,l){if(u==null)throw Error(`[ORM] ${n.name}.update requires an id as the first argument`);if(!l||typeof l!=="object"||Array.isArray(l))throw Error(`[ORM] ${n.name}.update requires a data object as the second argument`);if(Object.keys(l).length===0){k.debug(`[orm] ${n.name}.update called with empty data - short-circuiting and returning current row`);let m=e.find;return typeof m==="function"?await m.call(e,u):null}J(n,l);let f=await Ke(n,l);await o("update").call(e,t,u).update(f);let d=e.find;return typeof d==="function"?await d.call(e,u):null};if(typeof e.forceUpdate!=="function")e.forceUpdate=async function(u,l){if(u==null)throw Error(`[ORM] ${n.name}.forceUpdate requires an id as the first argument`);if(!l||typeof l!=="object"||Array.isArray(l))throw Error(`[ORM] ${n.name}.forceUpdate requires a data object as the second argument`);let f=await Ke(n,l);await o("forceUpdate").call(e,t,u).update(f);let d=e.find;return typeof d==="function"?await d.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] ${n.name}.forceCreate requires a data object`);let l=e.make;if(typeof l==="function"){let f=await l.call(e);if(f&&typeof f.forceFill==="function"&&typeof f.save==="function")return f.forceFill(u),await f.save()??f}if(typeof r!=="function")throw Error(`[ORM] ${n.name}.forceCreate cannot create: the underlying query builder did not expose create()`);return await r.call(e,u)};if(typeof e.delete!=="function")e.delete=async function(u){if(u==null)throw Error(`[ORM] ${n.name}.delete requires an id as the first argument`);if(!await a("delete").call(e,u))return!1;return await o("delete").call(e,t,u).delete(),!0};if(typeof e.findOrFail!=="function")e.findOrFail=async function(u){let l=await a("findOrFail").call(e,u);if(l==null)throw new Ct(n.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,t,u);if(typeof l.count==="function"){let d=await l.count();return Number(d)>0}let f=e.find;return typeof f==="function"?await f.call(e,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] ${n.name}.firstOrCreate requires a where-attrs object`);let f=o("firstOrCreate").call(e,u),d=typeof f.first==="function"?await f.first():await f;if(d)return d;let m={...u,...l};return J(n,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] ${n.name}.updateOrCreate requires a where-attrs object`);if(!l||typeof l!=="object"||Array.isArray(l))throw Error(`[ORM] ${n.name}.updateOrCreate requires a values object`);let f=o("updateOrCreate").call(e,u),d=typeof f.first==="function"?await f.first():await f;if(d){J(n,l);let p=d[t];await o("updateOrCreate").call(e,t,p).update(l);let y=e.find;return typeof y==="function"?await y.call(e,p):{...d,...l}}let m={...u,...l};return J(n,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 d=u.query();if(typeof d?.count==="function"){let m=await d.count();return Number(m)||0}}let{all:l,get:f}=e;if(typeof l==="function")return(await l.call(e)||[]).length;if(typeof f==="function")return(await f.call(e)||[]).length;return 0};if(typeof e.pluck!=="function")e.pluck=async function(u){if(!u||typeof u!=="string")throw Error(`[ORM] ${n.name}.pluck requires a column name`);let l=e.all;return((typeof l==="function"?await l.call(e):[])||[]).map((d)=>d?.[u])};if(typeof e.whereIn!=="function")e.whereIn=async function(u,l){if(!u||typeof u!=="string")throw Error(`[ORM] ${n.name}.whereIn requires a column name`);if(!Array.isArray(l))throw Error(`[ORM] ${n.name}.whereIn requires an array of values`);if(l.length===0)return[];let f=e.where;if(typeof f!=="function")return[];let d=f.call(e,u,"in",l);if(d&&typeof d.get==="function")return await d.get();return await d};let s=[["latest","desc"],["oldest","asc"]];for(let[u,l]of s)if(typeof e[u]!=="function")e[u]=async function(f="created_at"){let d=e,m=typeof d.query==="function"?d.query():d;if(typeof m?.orderBy==="function"){let h=m.orderBy(f,l);if(typeof h.first==="function")return await h.first();if(typeof h.get==="function")return(await h.get())?.[0]??null}let p=e.all;if(typeof p!=="function")return null;return[...await p.call(e)||[]].sort((h,T)=>{let S=h?.[f],A=T?.[f];if(S===A)return 0;return(S>A?1:-1)*(l==="desc"?-1:1)})[0]??null};let c=Dt(n.traits?.useSearch,n);if(c){let u=c.index??n.table??O(`${n.name}s`);if(typeof e.search!=="function")e.search=function(l,f){return Hn(e,u,l,f,c.searchable)};if(typeof e.makeAllSearchable!=="function")e.makeAllSearchable=async function(l=500){let f=e.all;if(typeof f!=="function")throw Error(`[ORM] ${n.name}.makeAllSearchable cannot run: the underlying query builder did not expose all()`);let{useSearchEngine:d}=await import("@stacksjs/search-engine"),m=d(),p=0,y=e.query;if(typeof y==="function")try{let T=y.call(e);if(T&&typeof T.chunk==="function")return await T.chunk(l,async(S)=>{let A=await qe(S,c);if(A.length>0)await m.addDocuments(u,A);p+=A.length}),p}catch{}let w=await f.call(e)||[],h=await qe(w,c);if(h.length>0)await m.addDocuments(u,h);return h.length};if(typeof e.removeAllFromSearch!=="function")e.removeAllFromSearch=async function(){let{useSearchEngine:l}=await import("@stacksjs/search-engine"),f=l();if(typeof f.deleteAllDocuments==="function"){await f.deleteAllDocuments(u);return}let d=e.all,m=typeof d==="function"?await d.call(e)||[]:[],p=l();for(let y of m){let w=y?.id??y?._attributes?.id;if(w!=null)await p.deleteDocument(u,Number(w))}}}}async function qe(e,n){if(e.length===0)return[];if(typeof n.shapeMany==="function"){let r=await n.shapeMany(e);if(!Array.isArray(r)||r.length!==e.length)throw TypeError(`[orm/search] shapeMany returned ${Array.isArray(r)?r.length:typeof r} documents for ${e.length} rows. It must return one document per row, in order, or documents are indexed under the wrong ids.`);return r.filter(Boolean)}return(await Promise.all(e.map((r)=>zn(r,n)))).filter(Boolean)}function Vn(e){let n=new Set,t=e.attributes??{};for(let[r,o]of Object.entries(t))if(o?.hidden)n.add(r);return n}function Wn(e,n){if(!e||n.size===0)return e;let t={};for(let[r,o]of Object.entries(e))if(!n.has(r))t[r]=o;return t}async function zn(e,n){if(typeof n.shape==="function")try{return await n.shape(e)}catch{return}let t=e?.toSearchableObject?.();if(t!==void 0)return t;return Wn(e?._attributes??(typeof e?.toJSON==="function"?e.toJSON():null),n.hidden??new Set)}function Hn(e,n,t,r,o){let a=o&&o.length>0?{query_by:[...o].join(",")}:{},i={q:t,...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(n,i))?.hits??[]},async paginate(c,u=1){let{useSearchEngine:l}=await import("@stacksjs/search-engine"),d=await l().search(n,{...i,limit:c,offset:(u-1)*c});return{hits:d.hits??[],total:Number(d.estimatedTotalHits??d.nbHits??d.total??0),page:u,perPage:c}},async raw(){let{useSearchEngine:c}=await import("@stacksjs/search-engine");return await c().search(n,i)}};return s}function Ot(e){let n=O(e);return n===e?[e]:[e,n]}async function Be(e,n){if(!e||typeof e!=="object")return;let t=e._attributes??e;for(let r of n)for(let o of Ot(r)){if(!(o in t))continue;let a=t[o];if(!U(a))continue;t[o]=await fe(a)}}function Gn(e,n){if(n.length===0)return;let t=async(s)=>{if(Array.isArray(s)){for(let c of s)await Be(c,n);return s}if(s&&typeof s==="object"&&Array.isArray(s.data)){for(let c of s.data)await Be(c,n);return s}if(s)await Be(s,n);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 t(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 t(l)}}for(let s of["update","forceUpdate"]){let c=e[s];if(typeof c!=="function")continue;e[s]=async function(u,l){let f=await c.call(this,u,l);return await t(f)}}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(...f){return await t(await l.apply(this,f))}}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(...f){return i(l.apply(this,f))}}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 Jn(e,n){if(n.length===0)return;let t=async(o)=>{if(!o||typeof o!=="object"||Array.isArray(o))return o;let a={...o};for(let i of n)for(let s of Ot(i))if(s in a)a[s]=await de(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 t(i[0]),i[1])i[1]=await t(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 t(s);return await a.call(this,i,c)}}}function Yn(e,n){let t=e.create;if(typeof t==="function")e.create=async function(r,...o){J(n,r);let a=await Ke(n,r);return await t.call(this,a,...o)};for(let r of["firstOrCreate","updateOrCreate"]){let o=e[r];if(typeof o!=="function")continue}}function Zn(e,n){let t=String(n?.name??e.name??"Model"),r=(i,s)=>{if(Fn())return;if(!i||typeof i!=="object"||Array.isArray(i))return;let c=nt(i,n,s);if(!c.valid)throw new xt(t,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 Xn(e,n){let t=["create","firstOrCreate","updateOrCreate"];for(let o of t){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]=bt(i[0],n,"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)?bt(a,n,"set"):a;return await r.call(this,o,i)}}function vt(e){k.debug(`[orm] Defining model: ${e.name} (table: ${e.table})`);let n=er(e),t=nr(e),r=tr(n,t),o=rr(e);e.__traitMethods=o;let a=r?{...e,hooks:{...e.hooks,...r}}:e,s=Dn(a);if(Un(s,e.casts),Qn(s,a),Yn(s,a),e.casts&&Object.keys(e.casts).length>0)Xn(s,e.casts);let c=pe(e);if(c.length>0)Jn(s,c),Gn(s,c);let u=e.traits?.useSoftDeletes;if(u)or(s,a,u);let l=e.traits?.useAudit;if(l){let m=Je(l);Ye(s,e.name,e.primaryKey||"id",m)}Zn(s,a);let f=s;f.withoutValidation=function(m){return $n(m)},f.withoutEvents=function(m){return N(m)};for(let m of["create","update","firstOrCreate","updateOrCreate","forceCreate","forceUpdate","delete","forceDelete","softDelete","restore"]){let p=s[m];if(typeof p!=="function")continue;let y=`${m}Quietly`;if(typeof s[y]==="function")continue;s[y]=function(...w){return N(()=>p.apply(s,w))}}let d=Object.assign(s,o,{...e,getDefinition:()=>e,_isStacksModel:!0});return En(e.name,d),Object.defineProperty(d,Ue,{value:e,enumerable:!1,configurable:!0}),d}function er(e){let n=e.traits?.observe;if(!n)return;let t=e.name.toLowerCase(),r=(d)=>{let m=d?.attributes;if(!m||typeof m!=="object")return d;let p=e.primaryKey||"id",y={...m};if(y[p]===void 0&&d[p]!==void 0)y[p]=d[p];return y},o=async(d,m)=>{if(j())return;try{let{dispatch:p}=await import("@stacksjs/events");await p(d,m)}catch(p){if(p&&typeof p==="object"&&"code"in p&&p.code==="MODULE_NOT_FOUND")return;if(console.error(`[ORM] Event '${d}' handler error:`,p),process.env.STACKS_ORM_EVENT_ERRORS!=="swallow")throw p}},a=e.traits?.broadcastOn,i=e.traits?.broadcastWith,s=typeof a==="function"&&typeof i==="function",c=async(d,m)=>{if(!s)return;if(j())return;try{let p=a(m),y=Array.isArray(p)?p:[p],w=i(m),T=(await import("@stacksjs/realtime").catch(()=>null))?.broadcast;if(typeof T!=="function")return;for(let S of y){if(typeof S!=="string"||S.length===0)continue;await T(S,d,w)}}catch(p){if(p&&typeof p==="object"&&"code"in p&&p.code==="MODULE_NOT_FOUND")return;if(console.error(`[ORM] Broadcast '${d}' handler error:`,p),process.env.STACKS_ORM_BROADCAST_ERRORS==="throw")throw p}},u=async(d,m)=>{if(j())return!0;try{let{dispatchAsync:p}=await import("@stacksjs/events"),y=await p(d,m);if(Array.isArray(y)&&y.some((w)=>w===!1))return!1}catch(p){if(p&&typeof p==="object"&&"code"in p&&p.code==="MODULE_NOT_FOUND")return!0;if(console.error(`[ORM] Before-event '${d}' handler error:`,p),process.env.STACKS_ORM_EVENT_ERRORS!=="swallow")throw p}return!0},l=n===!0?["create","update","delete"]:Array.isArray(n)?n:[],f={};if(l.includes("create"))f.beforeCreate=async(d)=>{if(k.debug(`[orm] Create ${t}`,d),!await u(`${t}:saving`,d))throw Error(`[ORM] ${t}:saving event cancelled the operation`);if(!await u(`${t}:creating`,d))throw Error(`[ORM] ${t}:creating event cancelled the operation`)},f.afterCreate=async(d)=>{let m=r(d);await o(`${t}:created`,m),await o(`${t}:saved`,m),await c(`${t}:created`,d)};if(l.includes("update"))f.beforeUpdate=async(d)=>{if(k.debug(`[orm] Update ${t}#${d?.id??"unknown"}`,d),!await u(`${t}:saving`,d))throw Error(`[ORM] ${t}:saving event cancelled the operation`);if(!await u(`${t}:updating`,d))throw Error(`[ORM] ${t}:updating event cancelled the operation`)},f.afterUpdate=async(d)=>{let m=r(d);await o(`${t}:updated`,m),await o(`${t}:saved`,m),await c(`${t}:updated`,d)};if(l.includes("delete"))f.beforeDelete=async(d)=>{if(k.debug(`[orm] Delete ${t}#${d?.id??"unknown"}`),!await u(`${t}:deleting`,d))throw Error(`[ORM] ${t}:deleting event cancelled the operation`)},f.afterDelete=async(d)=>{await o(`${t}:deleted`,r(d)),await c(`${t}:deleted`,d)};return f}function tr(...e){let n={},t=new Set;for(let r of e){if(!r)continue;for(let o of Object.keys(r))t.add(o)}for(let r of t){let o=e.map((a)=>a?.[r]).filter((a)=>typeof a==="function");if(!o.length)continue;n[r]=async(...a)=>{for(let i of o)await i(...a)}}return Object.keys(n).length?n:void 0}function Dt(e,n){if(!e)return null;let t=e===!0?{}:typeof e==="object"?{...e}:null;if(!t)return null;if(n)t.hidden=Vn(n);return t}function nr(e){let n=Dt(e.traits?.useSearch,e);if(!n)return;let t=n,r=t.index??e.table??O(`${e.name}s`);async function o(s){if(typeof t.shapeMany==="function")try{let[l]=await qe([s],t);return l}catch(l){k.warn(`[orm/search] shapeMany() threw for ${e.name}: ${l.message}`);return}if(typeof t.shape==="function")try{return await t.shape(s)}catch(l){k.warn(`[orm/search] shape() threw for ${e.name}: ${l.message}`);return}let u=P(s).toSearchableObject?.();if(u!==void 0)return u;return s?._attributes??(typeof s?.toJSON==="function"?s.toJSON():null)}let a=async(s)=>{if(j())return;let c=await o(s);if(!c)return;if(n.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 _t(r,c,e.name)}return}await _t(r,c,e.name)};return{afterCreate:a,afterUpdate:a,afterDelete:async(s)=>{if(j())return;let c=s?.id??s?._attributes?.id;if(c==null)return;if(n.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 kt(r,Number(c),e.name)}return}await kt(r,Number(c),e.name)}}}var Tt=new Map;function Et(e,n){let t=Tt.get(e)??0;if(Tt.set(e,t+1),t===0)k.warn(`[orm/search] ${n}`);else if(t===9)k.warn(`[orm/search] ${e} is still failing; further identical warnings suppressed for this process.`)}async function _t(e,n,t){try{let{useSearchEngine:r}=await import("@stacksjs/search-engine");await r().addDocument(e,n)}catch(r){Et(`index:${t}`,`Failed to index ${t}: ${r.message}`)}}async function kt(e,n,t){try{let{useSearchEngine:r}=await import("@stacksjs/search-engine");await r().deleteDocument(e,n)}catch(r){Et(`remove:${t}`,`Failed to remove ${t}#${n}: ${r.message}`)}}function rr(e){let n={},t=e.table,r=e.traits;if(!r)return n;if(r.taggable)n._taggable=Te(t);if(r.categorizable)n._categorizable=_e(t);if(r.commentable)n._commentable=we(t);if(r.billable)n._billable=ft(t);if(r.likeable){let a=typeof r.likeable==="object"?r.likeable:void 0;n._likeable=ke(t,a)}let o=r.useAuth||r.authenticatable;if(typeof o==="object"&&o&&"useTwoFactor"in o&&o.useTwoFactor)n._twoFactor=pt();return n}function or(e,n,t){let r=mt(e,n.primaryKey||"id"),o=gt(t),a=n,i=n.name.toLowerCase(),s=n.traits?.observe!=null&&n.traits?.observe!==!1,c=async(m)=>{if(!s||j())return!0;try{let{dispatchAsync:p}=await import("@stacksjs/events"),y=await p(`${i}:restoring`,{id:m});if(Array.isArray(y)&&y.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||j())return;try{let{dispatch:p}=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",f=async(m)=>{if(!o.cascade?.length||!l){let y=await r.softDelete(m);if(y&&o.cascade?.length)await G(a,o,m,"softDelete");return y}let{db:p}=await import("@stacksjs/database");return await p.transaction(async()=>{let y=await r.softDelete(m);if(y)await G(a,o,m,"softDelete");return y})},d=async(m)=>{if(!await c(m))return!1;if(!o.cascade?.length||!l){let h=await r.restore(m);if(h){if(o.cascade?.length)await G(a,o,m,"restore");await u(m)}return h}let{db:y}=await import("@stacksjs/database"),w=await y.transaction(async()=>{let h=await r.restore(m);if(h)await G(a,o,m,"restore");return h});if(w)await u(m);return w};e.softDelete=f,e.restore=d,e.forceDelete=r.forceDelete,e.withTrashed=r.withTrashed,e.onlyTrashed=r.onlyTrashed,e.delete=f}function ar(e){if(e==null)return e;if(Array.isArray(e))return e.map((t)=>ar(t));if(typeof e!=="object")return e;let n=e;if(typeof n.toJSON==="function")return n.toJSON();if(n._attributes&&typeof n._attributes==="object")return n._attributes;return e}var ir=["belongsTo","hasOne","hasMany","belongsToMany","morphMany","morphOne"],sr=["traits","dashboard"];function ur(e){let n=e?.[Ue];if(n&&typeof n==="object")return n;if(e&&typeof e==="object"&&"name"in e&&"attributes"in e)return e;throw TypeError("extendModel() expects a model created by defineModel(), or a model definition. Import the framework model itself rather than its table name.")}function cr(e,n){let t=Array.isArray(e)?e:[],r=Array.isArray(n)?n:[];if(!t.length&&!r.length)return;return[...new Set([...t,...r])]}function lr(e){if(!e)return 0;return Object.values(e).reduce((n,t)=>{let r=Number(t?.order);return Number.isFinite(r)&&r>n?r:n},0)}function dr(e,n){let t={...e,...n},r=e.attributes??{},o=n.attributes??{};if(n.attributes){let a=lr(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]}));t.attributes={...r,...i}}for(let a of ir){let i=cr(e[a],n[a]);if(i)t[a]=i}for(let a of sr){let i=e[a],s=n[a];if(i&&s&&typeof i==="object"&&typeof s==="object")t[a]={...i,...s}}return t}function ds(e,n){return vt(dr(ur(e),n))}import fr from"process";import{log as pr}from"@stacksjs/logging";import{path as v}from"@stacksjs/path";import{fs as Y}from"@stacksjs/storage";function mr(e){if(e)return e;let n=String(fr.env.DB_CONNECTION??"").toLowerCase();return n==="postgres"||n==="mysql"?n:"sqlite"}function ue(e){return e==="postgres"?"boolean":"number"}function D(e){return e.replace(/([A-Z]+)([A-Z][a-z])/g,"$1_$2").replace(/([a-z\d])([A-Z])/g,"$1_$2").toLowerCase()}function gr(e,n){let t=e.default;if(typeof t==="boolean")return ue(n);if(typeof t==="number")return"number";if(typeof t==="string")return"string";return"unknown"}function yr(e){let n=e.validation;if(!n||typeof n!=="object")return null;let t=n.rule;return t&&typeof t==="object"?t:null}function br(e){if(!e||String(e.name??"")!=="enum")return null;let t=(Array.isArray(e.allowedValues)?e.allowedValues:[]).filter((r)=>typeof r==="string"||typeof r==="number").map((r)=>typeof r==="number"?String(r):JSON.stringify(r));return t.length>0?t.join(" | "):null}function wr(e,n){let t=yr(e),r=br(t);if(r!==null)return e.nullable===!0?`${r} | null`:r;let o=typeof e.type==="string"?e.type.toLowerCase():String(t?.name??"").toLowerCase(),a=(()=>{switch(o){case"string":case"text":case"longtext":case"mediumtext":case"tinytext":case"char":case"varchar":case"enum":case"uuid":case"date":case"datetime":case"timestamp":case"timestamptz":case"password":case"time":case"year":return"string";case"number":case"integer":case"int":case"tinyint":case"smallint":case"mediumint":case"float":case"double":case"decimal":case"numeric":return"number";case"bigint":return"number | bigint";case"boolean":case"bool":return ue(n);case"json":case"jsonb":return"unknown";case"binary":case"blob":case"bytea":return"Uint8Array";case"unix":return"number";case"array":return"unknown[]";case"object":return"Record<string, unknown>";default:return gr(e,n)}})();return e.nullable===!0?`${a} | null`:a}function hr(e){let n={},t=e.belongsTo;if(!t)return n;let r=Array.isArray(t)?t:Object.values(t);for(let o of r){if(typeof o==="string"){n[`${D(o)}_id`]="number";continue}if(o&&typeof o==="object"){let a=o;if(typeof a.foreignKey==="string"){n[a.foreignKey]="number";continue}if(typeof a.model==="string")n[`${D(a.model)}_id`]="number"}}return n}function Tr(e,n){let[t,r]=[D(e),D(n)].sort();return`${t}_${r}`}function _r(e,n){let t=e.default,r=typeof t==="string"?"string":typeof t==="number"?"number":typeof t==="boolean"?ue(n):t instanceof Date?"string":"unknown";return e.nullable?`${r} | null`:r}function kr(e,n,t){let r=n.belongsToMany;if(!r)return[];let o=[],a=Array.isArray(r)?r:Object.values(r);for(let i of a){let s,c,u,l,f={},d=!0;if(typeof i==="string")s=i;else if(i&&typeof i==="object"&&"model"in i){let h=i;if(s=h.model,"pivotTable"in h||"firstForeignKey"in h||"secondForeignKey"in h)c=h.pivotTable,u=h.firstForeignKey,l=h.secondForeignKey;else{let T=i;c=T.table,u=T.foreignKey,l=T.relatedKey,f=T.pivot?.columns??{},d=Boolean(T.pivot?.timestamps)}}else continue;let m=c??Tr(e,s),p=u??`${D(e)}_id`,y=l??`${D(s)}_id`,w={id:"number",[p]:"number",[y]:"number"};for(let[h,T]of Object.entries(f))w[h]=_r(T,t);if(d)w.created_at="string",w.updated_at="string | null";o.push({table:m,columns:w})}return o}function Rr(e){return{email_verified_at:"string | null",password_changed_at:"string | null",two_factor_secret:"string | null",two_factor_enabled:`${ue(e)} | null`,two_factor_last_used_step:"number | null",stripe_id:"string | null"}}function Sr(e,n){let t={id:"number"},r=e.traits??{};if(r.useUuid)t.uuid="string";if((r.useTimestamps??r.timestampable)!==!1)t.created_at="string",t.updated_at="string | null";if(r.useSoftDeletes??r.softDeletable)t.deleted_at="string | null";if((e.table??"")==="users"||e.name==="User")Object.assign(t,Rr(n));return t}function Pr(e,n){let t={},r=e.attributes??{};for(let[o,a]of Object.entries(r))t[D(o)]=wr(a,n);return t}function Ft(e,n,t=2){let r=" ".repeat(t),o=" ".repeat(t+1),a=Object.entries(n).map(([s,c])=>`${o}${s}: ${c}`).join(`
2
+ var b=import.meta.require;import"@stacksjs/validation";import{log as le}from"@stacksjs/cli";import{db as Qe}from"@stacksjs/database";async function Wt(e,n={}){let{olderThanDays:t=30,column:r="created_at",query:o}=n;try{if(o){let u=Qe.deleteFrom(e);u=o(u);let l=await u.execute(),f=Array.isArray(l)?l:[l],d=Number(f[0]?.numDeletedRows??f.length??0);return le.info(`Pruned ${d} records from ${e}`),d}let a=new Date;a.setDate(a.getDate()-t);let i=await Qe.deleteFrom(e).where(r,"<",a.toISOString()).execute(),s=Array.isArray(i)?i:[i],c=Number(s[0]?.numDeletedRows??s.length??0);return le.info(`Pruned ${c} records from ${e} older than ${t} days`),c}catch(a){throw le.error(`Failed to prune ${e}:`,a),a}}async function Ha(e,n={}){return Wt(e,n)}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 Vt,createDecipheriv as Ht,createHash as zt,randomBytes as Gt}from"crypto";import{log as Z}from"@stacksjs/logging";var We="enc:",Ve="aes-256-gcm",Jt=12,X=null;async function He(){if(X)return X;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 X=zt("sha256").update(e).digest(),X}function U(e){return typeof e==="string"&&e.startsWith(We)}async function de(e){if(e==null)return e;if(U(e))return e;if(typeof e!=="string")return e;let n=await He();if(!n)return Z.warn("[orm] encrypted attribute: APP_KEY not set - storing value in plaintext"),e;let t=Gt(Jt),r=Vt(Ve,n,t),o=Buffer.concat([r.update(e,"utf8"),r.final()]),a=r.getAuthTag();return`${We}${t.toString("base64")}:${a.toString("base64")}:${o.toString("base64")}`}async function fe(e){if(e==null)return e;if(typeof e!=="string")return e;if(!U(e))return e;try{let n=await He();if(!n)return Z.warn("[orm] encrypted attribute: APP_KEY not set - cannot decrypt"),null;let[,t,r,o]=e.split(":");if(!t||!r||!o)return Z.warn("[orm] encrypted attribute: malformed envelope, returning null"),null;let a=Buffer.from(t,"base64"),i=Buffer.from(r,"base64"),s=Buffer.from(o,"base64"),c=Ht(Ve,n,a);return c.setAuthTag(i),Buffer.concat([c.update(s),c.final()]).toString("utf8")}catch(n){return Z.warn("[orm] encrypted attribute: decrypt failed (key rotation? corrupted ciphertext?)",{error:n}),null}}function pe(e){let n=e.attributes;if(!n||typeof n!=="object")return[];let t=[];for(let[r,o]of Object.entries(n))if(o&&typeof o==="object"&&o.encrypted===!0)t.push(r);return t}import{sqlDateTime as Yt}from"@stacksjs/database";import{log as Q}from"@stacksjs/logging";var Xt=[/^password$/i,/^password_hash$/i,/^api_key$/i,/_token$/i,/_secret$/i,/^remember_token$/i],Ge="model_audits",ye=null;function Zt(e){ye=e}async function me(){if(ye!=null)return ye;try{let e=await import("@stacksjs/router").catch(()=>null);if(!e)return null;let n=e.getCurrentRequest;if(typeof n!=="function")return null;let t=n();if(!t)return null;return(t.user??t._user)?.id??null}catch{return null}}function ee(e){if(!e||typeof e!=="object")return null;let n={};for(let[t,r]of Object.entries(e)){if(Xt.some((o)=>o.test(t)))continue;n[t]=r}return n}function L(e){if(!e||typeof e!=="object")return null;let n=e;if(n._attributes&&typeof n._attributes==="object")return{...n._attributes};return{...e}}function en(e,n){if(!e||!n)return{old:e,next:n};let t={},r={},o=new Set([...Object.keys(e),...Object.keys(n)]);for(let a of o)if(e[a]!==n[a])t[a]=e[a],r[a]=n[a];return{old:t,next:r}}async function ge(e,n=!1){try{let{db:t}=await import("@stacksjs/database");await t.insertInto(Ge).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:Yt()}).executeTakeFirst()}catch(t){if(Q.warn(`[orm] audit row write failed for ${e.auditable_type}#${String(e.auditable_id)} (${e.event})`,{error:t}),n)throw t}}function Je(e){return{async audits(n){try{let{db:t}=await import("@stacksjs/database");return(await t.selectFrom(Ge).selectAll().where("auditable_type","=",e).where("auditable_id","=",n).orderBy("created_at","desc").execute()??[]).map((o)=>({...o,old_values:typeof o.old_values==="string"?ze(o.old_values):o.old_values,new_values:typeof o.new_values==="string"?ze(o.new_values):o.new_values}))}catch(t){return Q.warn(`[orm] audits() lookup failed for ${e}#${String(n)}`,{error:t}),[]}}}}function ze(e){try{return JSON.parse(e)}catch{return e}}function Ye(e){if(e&&typeof e==="object"&&"transactional"in e)return{transactional:e.transactional===!0};return{transactional:!1}}function Xe(e,n,t="id",r={}){let o=r.transactional===!0,a=e;if(typeof e.audits!=="function")e.audits=Je(n).audits;let i=async(l)=>{if(!o)return await l();let{db:f}=await import("@stacksjs/database");return await f.transaction(async()=>l())},s=e.create;if(typeof s==="function")e.create=async function(...l){return await i(async()=>{let f=await s.apply(this,l);try{let d=L(f),m=d?.[t];if(m!=null){let p=await me();await ge({auditable_type:n,auditable_id:m,event:"created",old_values:null,new_values:ee(d),user_id:p},o)}}catch(d){if(Q.warn(`[orm] audit(create) failed for ${n}`,{error:d}),o)throw d}return f})};let c=e.update;if(typeof c==="function")e.update=async function(l,f){return await i(async()=>{let d=a.find,m=typeof d==="function"?L(await d.call(a,l)):null,p=await c.call(this,l,f);try{let y=L(p)??(typeof d==="function"?L(await d.call(a,l)):null),{old:h,next:w}=en(m,y);if(w&&Object.keys(w).length>0){let T=await me();await ge({auditable_type:n,auditable_id:l,event:"updated",old_values:ee(h),new_values:ee(w),user_id:T},o)}}catch(y){if(Q.warn(`[orm] audit(update) failed for ${n}#${String(l)}`,{error:y}),o)throw y}return p})};let u=(l)=>{let f=e[l];if(typeof f!=="function")return;e[l]=async function(d){return await i(async()=>{let m=a.find,p=typeof m==="function"?L(await m.call(a,d)):null,y=await f.call(this,d);try{if(y!==!1&&p){let h=await me();await ge({auditable_type:n,auditable_id:d,event:"deleted",old_values:ee(p),new_values:null,user_id:h},o)}}catch(h){if(Q.warn(`[orm] audit(${l}) failed for ${n}#${String(d)}`,{error:h}),o)throw h}return y})}};u("delete"),u("softDelete")}import{db as tn,sql as nn,sqlDateTime as be}from"@stacksjs/database";function C(e,n){if(typeof e!=="number"||!Number.isFinite(e)||e<=0)throw Error(`[orm/commentable] ${n} requires a positive numeric id (received ${String(e)})`)}var W="commentable_upvotes",V="commentables";function rn(e){let n=e;return n.code==="SQLITE_CONSTRAINT_UNIQUE"||n.code==="SQLITE_CONSTRAINT"||n.code==="23505"||n.errno===1062||/unique|duplicate/i.test(n.message??"")}function we(e){let n=tn;return{async comments(t){return C(t,"comments"),await n.selectFrom("commentables").where("commentables_id","=",t).where("commentables_type","=",e).selectAll().execute()},async commentCount(t){let r=await n.selectFrom("commentables").select(nn`count(*) as count`).where("commentables_id","=",t).where("commentables_type","=",e).executeTakeFirst();return Number(r?.count)||0},async addComment(t,r){if(C(t,"addComment"),!r||typeof r.title!=="string"||r.title.trim().length===0)throw Error("[orm/commentable] addComment requires a non-empty comment.title");if(typeof r.body!=="string"||r.body.trim().length===0)throw Error("[orm/commentable] addComment requires a non-empty comment.body");let o=await n.insertInto("commentables").values({...r,commentables_id:t,commentables_type:e,status:"pending",created_at:be(),updated_at:be()}).returningAll().executeTakeFirst();if(o&&typeof o==="object"&&"id"in o)return o;let a=o?.lastInsertRowid;if(a==null)return o;return await n.selectFrom("commentables").where("id","=",Number(a)).selectAll().executeTakeFirst()},async approvedComments(t){return await n.selectFrom("commentables").where("commentables_id","=",t).where("commentables_type","=",e).where("status","=","approved").selectAll().execute()},async pendingComments(t){return await n.selectFrom("commentables").where("commentables_id","=",t).where("commentables_type","=",e).where("status","=","pending").selectAll().execute()},async rejectedComments(t){return await n.selectFrom("commentables").where("commentables_id","=",t).where("commentables_type","=",e).where("status","=","rejected").selectAll().execute()},async upvoteComment(t,r){C(t,"upvoteComment"),C(r,"upvoteComment");let o=()=>n.selectFrom(W).where("upvoteable_id","=",t).where("upvoteable_type","=",V).where("user_id","=",r).selectAll().executeTakeFirst(),a=await o();if(a)return a;try{await n.insertInto(W).values({upvoteable_id:t,upvoteable_type:V,user_id:r,created_at:be()}).execute()}catch(i){if(!rn(i))throw i}return await o()},async removeCommentUpvote(t,r){C(t,"removeCommentUpvote"),C(r,"removeCommentUpvote"),await n.deleteFrom(W).where("upvoteable_id","=",t).where("upvoteable_type","=",V).where("user_id","=",r).execute()},async commentUpvoteCount(t){C(t,"commentUpvoteCount");let r=await n.selectFrom(W).select("count(*) as count").where("upvoteable_id","=",t).where("upvoteable_type","=",V).executeTakeFirst();return Number(r?.count)||0},async hasUpvotedComment(t,r){return C(t,"hasUpvotedComment"),C(r,"hasUpvotedComment"),!!await n.selectFrom(W).where("upvoteable_id","=",t).where("upvoteable_type","=",V).where("user_id","=",r).selectAll().executeTakeFirst()}}}import{db as on,sql as an,sqlDateTime as Ze}from"@stacksjs/database";function he(e,n){if(typeof e!=="number"||!Number.isFinite(e)||e<=0)throw Error(`[orm/taggable] ${n} requires a positive numeric id (received ${String(e)})`)}function Te(e){let n=on;return{async tags(t){return he(t,"tags"),await n.selectFrom("taggables").where("taggable_id","=",t).where("taggable_type","=",e).selectAll().execute()},async tagCount(t){he(t,"tagCount");let r=await n.selectFrom("taggables").select(an`count(*) as count`).where("taggable_id","=",t).where("taggable_type","=",e).executeTakeFirst();return Number(r?.count)||0},async addTag(t,r){if(he(t,"addTag"),!r||typeof r.name!=="string"||r.name.trim().length===0)throw Error("[orm/taggable] addTag requires a non-empty tag.name");return await n.insertInto("taggables").values({...r,taggable_id:t,taggable_type:e,slug:r.name.toLowerCase().replace(/[^a-z0-9]+/g,"-"),is_active:!0,created_at:Ze(),updated_at:Ze()}).execute(),await n.selectFrom("taggables").where("taggable_id","=",t).where("taggable_type","=",e).where("name","=",r.name).selectAll().executeTakeFirst()},async activeTags(t){return await n.selectFrom("taggables").where("taggable_id","=",t).where("taggable_type","=",e).where("is_active","=",!0).selectAll().execute()},async inactiveTags(t){return await n.selectFrom("taggables").where("taggable_id","=",t).where("taggable_type","=",e).where("is_active","=",!1).selectAll().execute()},async removeTag(t,r){await n.deleteFrom("taggables").where("taggable_id","=",t).where("taggable_type","=",e).where("id","=",r).execute()}}}import{db as sn,sqlDateTime as te}from"@stacksjs/database";function ke(e){let n=sn;async function t(r){return(await n.selectFrom("categorizable_models").where("categorizable_id","=",r).where("categorizable_type","=",e).selectAll().execute()).map((a)=>a.category_id)}return{async categories(r){let o=await t(r);if(o.length===0)return[];return await n.selectFrom("categorizables").where("id","in",o).selectAll().execute()},async categoryCount(r){return(await t(r)).length},async addCategory(r,o){let a=()=>n.selectFrom("categorizables").where("name","=",o.name).where("categorizable_type","=",e).selectAll().executeTakeFirst(),i=await a();if(!i)await n.insertInto("categorizables").values({name:o.name,description:o.description,slug:o.name.toLowerCase().replace(/[^a-z0-9]+/g,"-"),categorizable_type:e,is_active:!0,created_at:te(),updated_at:te()}).execute(),i=await a();return await n.insertInto("categorizable_models").values({categorizable_id:r,categorizable_type:e,category_id:i?.id,created_at:te(),updated_at:te()}).execute(),i},async activeCategories(r){let o=await t(r);if(o.length===0)return[];return await n.selectFrom("categorizables").where("id","in",o).where("is_active","=",!0).selectAll().execute()},async inactiveCategories(r){let o=await t(r);if(o.length===0)return[];return await n.selectFrom("categorizables").where("id","in",o).where("is_active","=",!1).selectAll().execute()},async removeCategory(r,o){await n.deleteFrom("categorizable_models").where("categorizable_id","=",r).where("categorizable_type","=",e).where("category_id","=",o).execute()}}}import{db as un,sqlDateTime as cn}from"@stacksjs/database";function _e(e,n){let t=un,r=n?.table||`${e}_likes`,o=n?.foreignKey||`${e.replace(/s$/,"")}_id`;return{async likes(a){return await t.selectFrom(r).where(o,"=",a).selectAll().execute()},async likeCount(a){let i=await t.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=cn();try{return await t.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 f=await t.selectFrom(r).where(o,"=",a).where("user_id","=",i).selectAll().executeTakeFirst();if(f)return f;throw c}},async unlike(a,i){await t.deleteFrom(r).where(o,"=",a).where("user_id","=",i).execute()},async isLiked(a,i){return!!await t.selectFrom(r).where(o,"=",a).where("user_id","=",i).selectAll().executeTakeFirst()},async likedBy(a){return(await t.selectFrom(r).select([o]).where("user_id","=",a).execute()).map((s)=>Number(s[o])).filter(Boolean)}}}function nt(e){let n=e;return n?.code==="SQLITE_CONSTRAINT_UNIQUE"||n?.code==="SQLITE_CONSTRAINT"||n?.code==="23505"||n?.errno===1062||/unique|duplicate/i.test(n?.message??"")}function ln(e,n,t){let r=e;if(e instanceof Error&&typeof r.status==="number"&&Number.isInteger(r.status)&&r.status>=400&&r.status<600){let o={error:e.message};if(r.details!==void 0)o.details=r.details;return{status:r.status,body:o}}if(nt(e))return{status:409,body:{error:`${n} already exists`}};return{status:500,body:{error:`Failed to ${t} ${n}`,detail:String(e)}}}function R(e){return e.replace(/([a-z\d])([A-Z])/g,"$1_$2").replace(/([A-Z])([A-Z][a-z])/g,"$1_$2").toLowerCase()}function dn(e){let n={};for(let[t,r]of Object.entries(e))n[R(t)]=r;return n}function li(e,n){let t=String(n||"").replace(/^\/+|\/+$/g,""),r=String(e).replace(/^\/+/,"");return`/api/${t?`${t}/`:""}${r}`}function rt(e){if(!e)return null;let n=e.attributes??{};if(Object.prototype.hasOwnProperty.call(n,"teamId")||Object.prototype.hasOwnProperty.call(n,"team_id"))return"team_id";return e.belongsTo?.some((t)=>t==="Team")?"team_id":null}function ot(e){if(!e)return null;let n=e.attributes??{};if(Object.prototype.hasOwnProperty.call(n,"userId")||Object.prototype.hasOwnProperty.call(n,"user_id"))return"user_id";return e.belongsTo?.some((t)=>t==="User")?"user_id":null}function di(e){return e?.ownership===!1}function fi(e,n,t){let r=Object.keys(e).find((a)=>R(a)===R(n));if(Array.isArray(t)){if(r===void 0)return{data:e,error:"Ownership value is required"};if(!t.some((a)=>String(a)===String(e[r])))return{data:e,error:"Ownership value is not available to this caller"};return{data:{...e,[n]:e[r]}}}if(t===null||t===void 0)return{data:e,error:"Caller has no ownership identity"};let o={...e};for(let a of Object.keys(o))if(R(a)===R(n))delete o[a];return o[n]=t,{data:o}}function fn(e){if(!e)return[];let n=Object.entries(e.attributes??{}).filter(([,t])=>t?.fillable===!0).map(([t])=>t);for(let t of e.belongsTo??[]){if(typeof t!=="string"||!t.trim())continue;let r=R(t.trim()).split("_").filter(Boolean);if(r.length===0)continue;let o=`${r[0]}${r.slice(1).map((a)=>`${a[0]?.toUpperCase()}${a.slice(1)}`).join("")}Id`;n.push(o)}return[...new Set(n)]}function pn(e,n){if(!e||n.length===0)return{};let t={};for(let r of n){if(r in e){t[r]=e[r];continue}let o=R(r);if(o!==r&&o in e)t[r]=e[o]}return t}function mn(e,n){if(e?.name!=="date"||n instanceof Date||typeof n!=="string")return n;let t=/^(\d{4})-(\d{2})-(\d{2})$/.exec(n);if(!t)return n;let r=Number(t[1]),o=Number(t[2]),a=Number(t[3]),i=new Date(Date.UTC(r,o-1,a));if(i.getUTCFullYear()!==r||i.getUTCMonth()!==o-1||i.getUTCDate()!==a)return n;return i}function pi(e,n){if(!n.length)return e;let t={...e};for(let r of n)delete t[r],delete t[R(r)];return t}function mi(e,n){if(!e||n.length===0)return e;let t={...e};for(let r of n)delete t[r],delete t[R(r)];return t}var gn=["id","uuid","created_at","updated_at","deleted_at"];function gi(e,n){let t=new Map;for(let r of[...Object.keys(e??{}),...gn]){let o=R(r);if(!/^\w+$/.test(o))continue;t.set(r,o),t.set(o,o)}for(let r of n)t.delete(r),t.delete(R(r));return t}function yi(e,n,t){if(!n)return e;let r=String(n).split(",").map((a)=>a.trim()).filter(Boolean),o=e;for(let a of r){let i=a.startsWith("-"),s=i?a.slice(1):a;if(!/^\w+$/.test(s))continue;let c=t.get(s);if(!c)continue;o=o.orderBy(c,i?"desc":"asc")}return o}var yn={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"?bn(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"?wn(e):[],set:(e)=>e==null?null:Array.isArray(e)?JSON.stringify(e):e}};function bn(e){try{return JSON.parse(e)}catch{return e}}function wn(e){try{return JSON.parse(e)}catch{return[]}}function bi(e,n,t){if(!e||typeof e!=="object"||!n||Object.keys(n).length===0)return e;let r={...e};for(let[o,a]of Object.entries(n)){let i=typeof a==="string"?yn[a]:a;if(!i||typeof i[t]!=="function")continue;if(Object.prototype.hasOwnProperty.call(r,o))r[o]=i[t](r[o]);let s=R(o);if(s!==o&&Object.prototype.hasOwnProperty.call(r,s))r[s]=i[t](r[s])}return r}function at(e,n,t){let r=n?.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&&t==="updating")continue;let u=i!==null&&typeof i==="object"&&Object.prototype.hasOwnProperty.call(i,"default"),l=c?e[a]:u?i.default:void 0,f=mn(s,l),d=s.validate(f);if(!d?.valid&&Array.isArray(d?.errors)&&d.errors.length>0)o[a]=d.errors.map((m)=>i?.validation?.message?.[m?.code]??m?.message??"invalid")}return Object.keys(o).length===0?{valid:!0}:{valid:!1,errors:o}}function wi(e,n,t){let r=et(t);return e.find((o)=>o.method===n&&et(String(o.path??""))===r)}function et(e){return e.replace(/\{[^}]*\}/g,"{}").replace(/:[^/]+/g,"{}")}function Re(e){if(Array.isArray(e))return e.filter((n)=>typeof n==="string"&&n.length>0);return typeof e==="string"&&e?[e]:[]}function hi(e){let n=typeof e==="object"&&e!==null&&"middleware"in e,t=e?.middleware;if(!n)return{read:["auth"],write:["auth"],declared:!1};if(t&&typeof t==="object"&&!Array.isArray(t)){let o=t;return{read:"read"in o?Re(o.read):["auth"],write:"write"in o?Re(o.write):["auth"],declared:!0}}let r=Re(t);return{read:r,write:r,declared:!0}}var tt=15,hn=100;function Ti(e){let n=Number.parseInt(e.get("page")||String(1),10),t=Number.isFinite(n)?Math.max(1,n):1,r=Number.parseInt(e.get("per_page")||String(tt),10),o=Math.min(Number.isFinite(r)?Math.max(1,r):tt,hn);return{page:t,perPage:o,offset:(t-1)*o}}function ne(e,n){let t=new URL(e.toString());return t.searchParams.set("page",String(n)),`${t.pathname}${t.search}`}function Tn(e,n,t,r,o,a){let i=(n-1)*t,s=r===0,c={page:n,per_page:t,from:s?null:i+1,to:s?null:i+r,has_more_pages:o,prev_page_url:n>1?ne(e,n-1):null,next_page_url:o?ne(e,n+1):null};if(a!==void 0&&!Number.isNaN(a)){let u=Math.max(1,Math.ceil(a/t));c.total=a,c.last_page=u,c.first_page_url=ne(e,1),c.last_page_url=ne(e,u)}return c}function ki(e,n,t,r,o,a){let{page:i,...s}=Tn(e,n,t,r,o,a);return{current_page:i,...s}}function _i(e,n){return(n??e??"").toString().trim().toLowerCase()==="warn"?"warn":"deny"}function Ri(e,n){if(e.length===0)return null;let t=[...e].sort().join(", ");if(n==="deny")return`[orm] security.api.rowScoping is 'deny': NOT registering store/update/destroy for ${e.length} model(s) `+`with no row-level scoping \u2014 ${t}. Give a model an \`ownership\` config or a \`team_id\` column to restore its writes.`;return`[orm] ${e.length} model(s) publish mutating routes with no row-level scoping, so an authenticated caller can write any row \u2014 `+`${t}. Scope one with an \`ownership\` config or a \`team_id\` column; intended for public catalog tables. Set \`security.api.rowScoping: 'deny'\` (config/security.ts) to stop generating these routes instead.`}function kn(e){if(e?.ownership===!1)return null;if(e?.ownership)return e.ownership;let n=rt(e);if(n)return{field:n,resolve:async(r,o)=>{let{resolveAuthenticatedTeamId:a}=await import("@stacksjs/auth");return a(Se(o))}};let t=ot(e);if(t)return{field:t,resolve:async(r)=>r?.id??null};return null}function Se(e){let n=e?.headers?.get?.("authorization"),t=n&&/^Bearer\s+/i.test(n)?n.replace(/^Bearer\s+/i,"").trim():null,r=e?.headers?.get?.("cookie")||"";return{bearerToken:()=>t,cookies:{get:(o)=>{for(let a of r.split(";")){let i=a.indexOf("=");if(i===-1)continue;if(a.slice(0,i).trim()===o)return decodeURIComponent(a.slice(i+1).trim())}return null}}}}function _n(e="customer_id"){return{field:e,resolve:async(n)=>{let t=n?.id;if(t==null)return null;try{let{Customer:r}=await import("@stacksjs/orm");return(await r.where("user_id",t).first())?.id??null}catch{return null}}}}function Rn(e="id"){return{field:e,resolve:async(n)=>n?.id??null}}function Sn(e="site_id"){return{field:e,resolve:async(n,t)=>{try{let[{resolveAuthenticatedTeamId:r},{Site:o}]=await Promise.all([import("@stacksjs/auth"),import("@stacksjs/orm")]),a=await r(Se(t));if(a==null)return[];return(await o.where("team_id",a).get()??[]).map((s)=>s.id).filter((s)=>s!=null)}catch{return[]}}}}function Pn(e="id"){return{field:e,resolve:async(n,t)=>{try{let{resolveAuthenticatedTeamId:r}=await import("@stacksjs/auth");return await r(Se(t))}catch{return null}}}}function xn(e,n){return{field:n,resolve:async(t,r)=>{try{let o=await import("@stacksjs/orm"),a=o.models?.[e]??o[e]?.definition??null,i=kn(a);if(!i?.field||typeof i.resolve!=="function")return[];let s=await i.resolve(t,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{cacheRequestQuery as An}from"@stacksjs/router";var re=new WeakMap;function Mi(e,n){return An(`batchLoad:${e.name??"model"}:${String(n)}`,async()=>new Promise((t,r)=>{let o=re.get(e);if(!o)o={keys:[],resolvers:[],scheduled:!1},re.set(e,o);if(o.keys.push(n),o.resolvers.push({key:n,resolve:t,reject:r}),o.scheduled)return;o.scheduled=!0,Promise.resolve().then(async()=>{let a=re.get(e);if(!a)return;re.delete(e);let i=Array.from(new Set(a.keys));try{let s=typeof e.findMany==="function"?await e.findMany(i):await Promise.all(i.map((u)=>e.find?.(u))),c=new Map;for(let u of s??[]){let l=u?.id;if(l!==void 0)c.set(l,u)}for(let u of a.resolvers)u.resolve(c.get(u.key))}catch(s){for(let c of a.resolvers)c.reject(s)}})}))}import{db as Di}from"@stacksjs/database";class Mn{conditions=[];where(e,...n){let[t,r]=n,o=r===void 0?"=":t,a=r===void 0?t:r;this.addCondition("and","where",e,o,a)}orWhere(e,...n){let[t,r]=n,o=r===void 0?"=":t,a=r===void 0?t:r;this.addCondition("or","where",e,o,a)}whereIn(e,n){this.conditions.push({type:"and",method:"whereIn",column:e,values:n})}whereNotIn(e,n){this.conditions.push({type:"and",method:"whereIn",column:e,values:n,operator:"not in"})}whereNull(e){this.conditions.push({type:"and",method:"whereNull",column:e})}whereNotNull(e){this.conditions.push({type:"and",method:"whereNotNull",column:e})}whereBetween(e,n){this.conditions.push({type:"and",method:"whereBetween",column:e,range:n})}whereExists(e){this.conditions.push({type:"and",method:"whereExists",column:"",callback:e})}addCondition(e,n,t,r,o){this.conditions.push({type:e,method:n,column:t,operator:r,value:o})}getConditions(){return this.conditions}}import{db as Pe,runInTransactionScope as Cn}from"@stacksjs/database";async function $i(e,n){return await Cn(async()=>await Pe.transaction(e,n))}async function Ni(e){return await Pe.savepoint(e)}function ji(e,n){return Pe.transactional(e,n)}import{path as O}from"@stacksjs/path";import{fs as B,globSync as Ce}from"@stacksjs/storage";import{plural as lt,singular as it,snakeCase as k}from"@stacksjs/strings";import{isString as oe}from"@stacksjs/validation";function dt(e){let n=e.belongsToMany;if(!n)return[];if(Array.isArray(n))return n.map((t)=>({relationName:typeof t==="string"?k(t):k(String(t.model)),relation:t}));return Object.entries(n).map(([t,r])=>{if(typeof r==="string")return{relationName:t,relation:r};return{relationName:t,relation:{model:r.model,pivotTable:r.table,firstForeignKey:r.foreignKey,secondForeignKey:r.relatedKey}}})}async function Li(e){if(typeof e==="string")e=(await import(e)).default;return e.table??k(lt(e?.name||""))}function H(e,n){if(e.name)return e.name;return O.basename(n).replace(/\.ts$/,"")}function A(e,n){if(e.table)return e.table;return k(lt(H(e,n)))}function On(e,n){let t=[e,n];return t.sort(),t.join("_")}function Qi(e,n){return n in e}async function vn(e,n){let t=[];if(e.hasOne)for(let r of e.hasOne)t.push(await xe(r,e,n,"hasOne"));if(e.hasMany)for(let r of e.hasMany)t.push(await xe(r,e,n,"hasMany"));if(e.belongsTo)for(let r of e.belongsTo)t.push(await xe(r,e,n,"belongsTo"));if(e.hasOneThrough)for(let r of e.hasOneThrough)t.push(await ut(r,e,n,"hasOneThrough"));if(e.hasManyThrough)for(let r of e.hasManyThrough)t.push(await ut(r,e,n,"hasManyThrough"));if(e.belongsToMany)for(let{relationName:r,relation:o}of dt(e))t.push(await En(o,e,n,"belongsToMany",r));if(e.morphOne)t.push(await ct(e.morphOne,e,n,"morphOne"));if(e.morphMany){let r=Array.isArray(e.morphMany)?e.morphMany:[e.morphMany];for(let o of r)t.push(await ct(o,e,n,"morphMany"))}if(e.morphTo){let r=e.morphTo,o=Array.isArray(r)?r:typeof r==="object"&&r!==null?[r]:[];for(let a of o)t.push(Dn(a,e,n))}if(e.morphToMany){let r=Array.isArray(e.morphToMany)?e.morphToMany:[e.morphToMany];for(let o of r)t.push(st(o,e,n,"morphToMany"))}if(e.morphedByMany){let r=Array.isArray(e.morphedByMany)?e.morphedByMany:[e.morphedByMany];for(let o of r)t.push(st(o,e,n,"morphedByMany"))}return t}function Dn(e,n,t){let r=e&&typeof e==="object"&&e.name?String(e.name):`${k(t)}able`,o=e?.type||`${r}_type`;return{relationship:"morphTo",model:"",table:"",relationTable:"",foreignKey:e?.id||`${r}_id`,modelKey:o,relationName:r,relationModel:t,throughModel:"",throughForeignKey:"",pivotForeign:"",pivotKey:"",pivotTable:""}}function st(e,n,t,r){let o=typeof e==="object"&&e!==null,a=o?String(e.model||""):String(e),i=o&&e.morphName?String(e.morphName):`${k(t)}able`,s=o&&e.pivotTable?String(e.pivotTable):i,c=o&&e.id||`${i}_id`,u=o&&e.type||`${i}_type`;return{relationship:r,model:a,table:"",relationTable:"",foreignKey:c,modelKey:u,relationName:i,relationModel:t,throughModel:"",throughForeignKey:"",pivotForeign:c,pivotKey:u,pivotTable:s}}async function ae(e,n){let t=Me(`${n}.ts`),r=Me(`${e}.ts`),o=Ae(`${e}.ts`),a=Ae(`${n}.ts`);if(!t&&!a)throw Error(`Model not found: ${n}`);if(!r&&!o)throw Error(`Model not found: ${e}`);let i;try{if(B.existsSync(t))i=(await import(t)).default;else i=(await import(a)).default}catch(c){throw Error(`Failed to load model: ${n}. Error: ${c?.message||"Unknown error"}`)}let s=B.existsSync(r)?r:o;return{modelRelation:i,modelPath:s,modelRelationPath:B.existsSync(t)?t:a}}async function ut(e,n,t,r){let o="",a="",i="",s="";if(oe(e))o=e;else o=e.model,a=e.relationName||"",i=e.through,s=e.throughForeignKey||"";let{modelRelation:c,modelPath:u,modelRelationPath:l}=await ae(t,o),f=A(c,l),d=A(n,u),m=k(H(c,l)),p=k(t);return{relationship:r,model:o,table:f,relationTable:d,foreignKey:`${p}_id`,modelKey:`${m}_id`,relationName:a,relationModel:t,throughModel:i,throughForeignKey:s,pivotForeign:`${p}_id`,pivotKey:`${m}_id`,pivotTable:d}}async function En(e,n,t,r,o){let a="",i="",s="",c=k(t);if(oe(e))a=e;else a=e.model,i=e.pivotTable||"",s=e.firstForeignKey||`${c}_id`;let{modelRelation:u,modelPath:l,modelRelationPath:f}=await ae(t,a),d=A(u,f),m=A(n,l),p=k(H(u,f));return{relationship:r,model:a,table:d,relationTable:m,foreignKey:typeof e==="string"?`${c}_id`:e.firstForeignKey||`${c}_id`,modelKey:typeof e==="string"?`${p}_id`:e.secondForeignKey||`${p}_id`,relationName:o,relationModel:t,throughModel:"",throughForeignKey:"",pivotForeign:s,pivotKey:`${p}_id`,pivotTable:i}}async function ct(e,n,t,r){let o="",a="",i="",s="";if(oe(e))o=e,a=`${k(t)}able`;else o=e.model,a=e.morphName||`${k(t)}able`,i=e.type||`${a}_type`,s=e.id||`${a}_id`;let{modelRelation:c,modelPath:u,modelRelationPath:l}=await ae(t,o),f=A(c,l),d=A(n,u);return{relationship:r,model:o,table:f,relationTable:d,foreignKey:s||`${a}_id`,modelKey:i||`${a}_type`,relationName:a,relationModel:t,throughModel:"",throughForeignKey:"",pivotForeign:"",pivotKey:"",pivotTable:d}}async function xe(e,n,t,r){let o="",a="";if(oe(e))o=e;else o=e.model,a=e.relationName||"";let{modelRelation:i,modelPath:s,modelRelationPath:c}=await ae(t,o),u=A(i,c),l=A(n,s),f=k(H(i,c)),d=k(t),m=typeof e==="string"?"":e.foreignKey||"",p={relationship:r,model:o,table:u,relationTable:l,foreignKey:m||`${d}_id`,modelKey:`${f}_id`,relationName:a,relationModel:t,throughModel:"",throughForeignKey:"",pivotForeign:`${d}_id`,pivotKey:`${f}_id`,pivotTable:l};if(r==="belongsTo"){if(p.foreignKey="",m)p.modelKey=m}return p}function Wi(e){let n=/belongs/,t=/has/,r=/Through/,o=/morph/;if(r.test(e))return"throughType";if(n.test(e))return"belongsType";if(t.test(e))return"hasType";if(o.test(e))return"morphType";return""}function Vi(e){let n=/One/;if(/Many/.test(e))return"many";if(n.test(e))return"one";return""}async function Hi(e,n){let t=[];if("belongsToMany"in e){for(let{relation:r}of dt(e)){let o,a;if(typeof r==="string")a=r;else a=r.model;let i=Me(`${a}.ts`),s=Ae(`${a}.ts`);if(B.existsSync(i))o=(await import(i)).default;else o=(await import(s)).default;let c=A(o,i),u=A(e,n),l=typeof r==="object"&&"firstForeignKey"in r?r.firstForeignKey:`${it(u)}_${e.primaryKey}`,f=typeof r==="object"&&"secondForeignKey"in r?r.secondForeignKey:`${it(c)}_${e.primaryKey}`;t.push({table:(typeof r==="object"&&"pivotTable"in r?r.pivotTable:void 0)??On(u,c),firstForeignKey:l,secondForeignKey:f})}return t}return[]}async function zi(e){let n=Ce([O.userModelsPath("*.ts"),O.storagePath("framework/defaults/app/Models/**/*.ts")],{absolute:!0}),t=[];for(let r=0;r<n.length;r++){let o=n[r],a=await import(o);if(e===a.default.name)continue;let i=H(a,o),s=await vn(a.default,i);if(!s.length)continue;let c=s.find((u)=>u.model===e);if(c)t.push(c)}return t}function Gi(e){if(e===void 0)return[];return Object.keys(e).filter((n)=>e[n]?.hidden===!0)}function Ji(e){let n=e.attributes;if(n===void 0)return[];return Object.keys(n).filter((t)=>n[t]?.guarded===!0).map((t)=>k(t))}function Yi(e,n){let t=e.attributes,r=[];if(t===void 0)return[];let o=typeof e.traits?.billable==="object"||typeof e.traits?.billable==="boolean",a=typeof e.traits?.useAuth==="object"?e.traits?.useAuth.usePasskey:!1,i=e.traits?.useUuid||!1;if(o)r.push("stripe_id");if(i)r.push("uuid");if(a)r.push(...["two_factor_secret","public_key"]);let s=n.map((c)=>c.foreignKey).filter((c)=>c);return[...Object.keys(t).filter((c)=>{if(t===void 0)return!1;return t[c]?.fillable===!0}).map((c)=>k(c)),...r,...s]}async function Xi(e,n){let t=e.attributes;if(!t)t={};let r=Object.keys(t),o=[],a=Bun.file(n),i="";try{if(await a.exists())i=await a.text()}catch{i=""}let s=/rule:.*$/gm,c;c=s.exec(i);while(c!==null)o.push(c[0]),c=s.exec(i);return r.map((l,f)=>{let d=t[l],m=null,p=!1,y=!1,h=!1,w=!1;if(d)m=d||null,p=d.unique||!1,y=d.hidden||!1,h=d.fillable||!1;let T=o[f]??"";return w=(d.validation?.rule).isRequired??!1,{field:l,default:m,unique:p,hidden:y,fillable:h,required:w,fieldArray:Fn(T)}})}function Fn(e){let n=e.split("rule: schema.");if(n.length!==2)return null;if(!n[1])n[1]="";let t=n[1].replace(/,/g,"");if(!t)return null;let r=t.split("."),o=/\(([^)]+)\)/;return r.map((a)=>{let i=o.exec(a),s=i?i[1]:null;return{entity:a.replace(o,"").replace(/\(|\)/g,""),charValue:s}})[0]||null}function Zi(e){let n=e.fieldArray?.entity;switch(n){case"enum":return"string | string[]";case"date":return"Date | string";case"timestamp":return"Date | string";case"datetime":return"Date | string";case"float":return"number";case"double":return"number";case"decimal":return"number";case"integer":return"number";case"bigint":return"number";default:return n}}function Ae(e){let n=O.join(O.storagePath("framework/defaults/app/Models"),"/"),t=O.join(n,e);if(B.existsSync(t))return t;return Ce(`${n}**/${e}`,{absolute:!0})[0]??""}function Me(e){let n=O.join(O.userModelsPath("/"),"/"),t=O.join(n,e);if(B.existsSync(t))return t;return Ce(`${n}**/${e}`,{absolute:!0})[0]??""}function es(e){let n=typeof e==="number"?new Date(e):typeof e==="string"?new Date(e):e;if(Number.isNaN(n.getTime()))throw Error(`Invalid date value: ${String(e)}`);return n.toISOString().replace("T"," ").split(".")[0]??""}function ts(e){return e.toISOString().split("T")[0]??""}function ns(e){return e.getTime()}import{createModel as Un,registerModel as Ln}from"@stacksjs/query-builder";import{log as _}from"@stacksjs/logging";import{snakeCase as v}from"@stacksjs/strings";import{AsyncLocalStorage as xt}from"async_hooks";function $n(e){if(e===null||typeof e!=="object")return!1;let n=e;return Array.isArray(n.data)&&typeof n.current_page==="number"&&typeof n.per_page==="number"&&typeof n.total==="number"&&typeof n.last_page==="number"}function Nn(e){if(e===null||typeof e!=="object")return!1;let n=e;return Array.isArray(n.data)&&typeof n.current_page==="number"&&typeof n.per_page==="number"&&typeof n.has_more_pages==="boolean"&&!("total"in n)}function jn(e){if(e===null||typeof e!=="object")return!1;let n=e;return Array.isArray(n.data)&&(typeof n.next_cursor==="string"||n.next_cursor===null)}function Oe(e){let{data:n}=e,{perPage:t,page:r,total:o,lastPage:a}=e.meta,i=n.length===0,s=i?null:(r-1)*t+1,c=i?null:s+n.length-1;return{data:n,current_page:r,per_page:t,total:o,last_page:a,from:s,to:c,has_more_pages:r<a}}function ve(e){return{data:e.data,current_page:e.meta.page,per_page:e.meta.perPage,has_more_pages:e.meta.hasMore}}function De(e){return{data:e.data,per_page:e.meta.perPage,next_cursor:ft(e.meta.nextCursor),prev_cursor:ft(e.meta.prevCursor),has_more_pages:e.meta.nextCursor!==null&&e.meta.nextCursor!==void 0}}function ft(e){if(e===null||e===void 0)return null;if(typeof e==="string")return e;return JSON.stringify(e)}function Fe(e,n){let t=je(),r=t?Ee(t,"per_page"):void 0,o=t?Ee(t,"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(n??o??1));return{perPage:a,page:i}}function $e(e,n){let t=je(),r=t?mt(t,"cursor"):void 0,o=t?Ee(t,"per_page"):void 0,a=e!==void 0?Math.max(1,Math.floor(e)):Math.min(100,Math.max(1,o??15)),s=pt(n!==void 0?n:r??null);return{perPage:a,cursor:s}}function pt(e){if(e===null||e===void 0)return null;if(Array.isArray(e))return e;if(typeof e==="string"&&e.startsWith("["))try{let n=JSON.parse(e);if(Array.isArray(n))return n}catch{}return e}function Ne(e){let n=je();if(!n)return e;let t=(()=>{try{return new URL(n.url)}catch{return null}})();if(!t)return e;let r=t.pathname;if(e.path=r,"next_cursor"in e)return e.next_page_url=e.next_cursor!==null?F(t,{cursor:e.next_cursor}):null,e.prev_page_url=e.prev_cursor!==null?F(t,{cursor:e.prev_cursor}):null,e;let o=e.current_page;if(e.prev_page_url=o>1?F(t,{page:o-1}):null,"total"in e){let a=e.last_page;e.next_page_url=o<a?F(t,{page:o+1}):null,e.first_page_url=F(t,{page:1}),e.last_page_url=F(t,{page:a})}else e.next_page_url=e.has_more_pages?F(t,{page:o+1}):null;return e}function F(e,n){let t=new URL(e.toString());for(let[r,o]of Object.entries(n))t.searchParams.set(r,String(o));return`${t.pathname}${t.search}`}var I;function je(){if(I===null)return;if(I===void 0)try{let n=b("@stacksjs/router");if(typeof n.getCurrentRequest==="function")I=n.getCurrentRequest;else{I=null;return}}catch{I=null;return}return I()}function Ee(e,n){let t=mt(e,n);if(t===void 0)return;let r=Number(t);return Number.isFinite(r)?r:void 0}function mt(e,n){let t=e.query?.[n];if(t===void 0)return;return Array.isArray(t)?t[0]:t}import{db as Bn}from"@stacksjs/database";function gt(e){let n=Bn;return{async createStripeUser(t,r){let{manageCustomer:o}=await import("@stacksjs/payments");return await o.createStripeCustomer(t,r)},async updateStripeUser(t,r){let{manageCustomer:o}=await import("@stacksjs/payments");return await o.updateStripeCustomer(t,r)},async deleteStripeUser(t){let{manageCustomer:r}=await import("@stacksjs/payments");return await r.deleteStripeUser(t)},async createOrGetStripeUser(t,r){let{manageCustomer:o}=await import("@stacksjs/payments");return await o.createOrGetStripeUser(t,r)},async retrieveStripeUser(t){let{manageCustomer:r}=await import("@stacksjs/payments");return await r.retrieveStripeUser(t)},async defaultPaymentMethod(t){let{managePaymentMethod:r}=await import("@stacksjs/payments");return await r.retrieveDefaultPaymentMethod(t)},async setDefaultPaymentMethod(t,r){let{managePaymentMethod:o}=await import("@stacksjs/payments");return await o.setDefaultPaymentMethod(t,r)},async addPaymentMethod(t,r){let{managePaymentMethod:o}=await import("@stacksjs/payments");return await o.addPaymentMethod(t,r)},async paymentMethods(t,r){let{managePaymentMethod:o}=await import("@stacksjs/payments");return await o.listPaymentMethods(t,r)},async newSubscription(t,r,o,a={}){let{manageSubscription:i}=await import("@stacksjs/payments"),s=await i.create(t,r,o,a),u=s.latest_invoice?.payment_intent;return{subscription:s,paymentIntent:u}},async updateSubscription(t,r,o,a={}){let{manageSubscription:i}=await import("@stacksjs/payments"),s=await i.update(t,r,o,a),u=s.latest_invoice?.payment_intent;return{subscription:s,paymentIntent:u}},async cancelSubscription(t,r,o={}){let{manageSubscription:a}=await import("@stacksjs/payments");return{subscription:await a.cancel(r,o)}},async activeSubscription(t){let{manageSubscription:r}=await import("@stacksjs/payments"),o=await n.selectFrom("subscriptions").where("user_id","=",t.id).where("provider_status","=","active").selectAll().executeTakeFirst();if(o){let a=await r.retrieve(t,o.provider_id||"");return{subscription:o,providerSubscription:a}}return},async checkout(t,r,o={}){let{manageCheckout:a,manageCustomer: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(t,{})).id,line_items:r.map((f)=>({price:f.priceId,quantity:f.quantity||1}))},...s,...o};return await a.create(t,l)},async createSetupIntent(t,r={}){let{manageSetupIntent:o}=await import("@stacksjs/payments");return await o.create(t,r)},async subscriptionHistory(t){let{manageInvoice:r}=await import("@stacksjs/payments");return await r.list(t)},async transactionHistory(t){let{manageTransaction:r}=await import("@stacksjs/payments");return await r.list(t)},async connectAccount(t,r={}){let o=r.accountColumn||"stripe_account_id",a=(t._attributes??t)[o];if(!a)return null;let i=await z();try{return await i.accounts.retrieve(a)}catch{return null}},async createConnectAccount(t,r={}){let o=r.accountColumn||"stripe_account_id",a=t._attributes??t,i=a[o],s=await z();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 n.updateTable(u).set({[o]:i}).where("id","=",Number(a.id)).execute(),l}return await s.accounts.retrieve(i)},async connectOnboardLink(t,r){let o=r.accountColumn||"stripe_account_id",i=(t._attributes??t)[o];if(!i)throw Error("connectOnboardLink: model has no Stripe Connect account; call createConnectAccount first");return{url:(await(await z()).accountLinks.create({account:i,refresh_url:r.refreshUrl,return_url:r.returnUrl,type:r.type??"account_onboarding"})).url,accountId:i}},async syncConnectStatus(t,r={}){let o=r.accountColumn||"stripe_account_id",a=r.chargesColumn||"charges_enabled",i=r.payoutsColumn||"payouts_enabled",s=t._attributes??t,c=s[o];if(!c)return{chargesEnabled:!1,payoutsEnabled:!1};let l=await(await z()).accounts.retrieve(c),f=!!l.charges_enabled,d=!!l.payouts_enabled,m=r.modelTable||e;return await n.updateTable(m).set({[a]:f,[i]:d}).where("id","=",Number(s.id)).execute(),{chargesEnabled:f,payoutsEnabled:d}},async chargeWithSplit(t,r){let o=await z(),a=r.accountColumn||"stripe_account_id",i=t._attributes??t,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)})}}}async function z(){let e=globalThis.process?.env?.STRIPE_SECRET_KEY;if(!e)throw Error("Stripe Connect: STRIPE_SECRET_KEY not configured");return new(await import("stripe")).default(e,{apiVersion:"2026-06-24.dahlia"})}function yt(){return{async generateTwoFactorForModel(e){let{generateTwoFactorSecret:n}=await import("@stacksjs/auth"),t=n();await e.update({two_factor_secret:t})},async verifyTwoFactorCode(e,n){let t=e.get("two_factor_secret");if(typeof t!=="string")return!1;let{verifyTwoFactorCode:r,RateLimiter:o}=await import("@stacksjs/auth"),a=String(e.id??e.get?.("id")??e.get?.("email")??t),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(n,t))return await o.recordFailedAttempt(i),!1;try{let{cache:c}=await import("@stacksjs/cache"),u=`2fa:used:${a}:${n}`;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{sqlDateTime as In}from"@stacksjs/database";import{log as q}from"@stacksjs/logging";var ie="deleted_at";function bt(e,n="id"){return{async softDelete(t){let r=In(),o=e.where(n,t);if(typeof o?.update==="function")return await o.update({[ie]:r}),!0;return!1},async restore(t){let r=e.where(n,t);if(typeof r?.update==="function")return await r.update({[ie]:null}),!0;return!1},async forceDelete(t){let r=e.where(n,t);if(typeof r?.delete==="function")return await r.delete(),!0;return!1},withTrashed(){return typeof e.query==="function"?e.query():e},onlyTrashed(){let t=typeof e.query==="function"?e.query():e;if(typeof t?.whereNotNull==="function")return t.whereNotNull(ie);return t?.where?.(ie,"!=",null)??t}}}function wt(e){if(e===!0||e==null)return{};if(typeof e==="object"&&!Array.isArray(e)){let n=e;if(Array.isArray(n.cascade)){let t=n.cascade.filter((r)=>typeof r==="string");return t.length?{cascade:t}:{}}return{}}return{}}function qn(e,n){let t=e.hasMany??[],r=e.hasOne??[],o=t.some((l)=>Be(l,n,!0)),a=r.some((l)=>Be(l,n,!1));if(!o&&!a)return q.warn(`[orm] soft-delete cascade: '${n}' is not a declared hasMany/hasOne relation - skipping`),null;let s=(o?t:r).find((l)=>Be(l,n,o))??null;if(!s)return null;let u=globalThis[s];if(!u)return q.warn(`[orm] soft-delete cascade: model '${s}' is not yet on globalThis - skipping cascade for '${n}'`),null;return{className:s,model:u}}function Be(e,n,t){let r=e.toLowerCase();if(n===r)return!0;if(t&&n===`${r}s`)return!0;if(t&&r.endsWith("y")&&n===`${r.slice(0,-1)}ies`)return!0;return!1}async function Kn(e,n,t,r,o){try{let a=t.where;if(typeof a!=="function"){q.warn(`[orm] cascade ${o}: child model has no .where()`);return}if(o==="softDelete"){let i=t.softDelete;if(typeof i==="function"){let c=a.call(t,r,n),u=typeof c?.get==="function"?await c.get():Array.isArray(c)?c:[],l=t.primaryKey||"id";for(let f of u){let d=f?.[l];if(d!=null)await i.call(t,d)}return}let s=a.call(t,r,n);if(typeof s?.delete==="function"){q.debug(`[orm] cascade soft-delete: child has no softDeletes trait, hard-deleting from ${String(t.table??"?")}`),await s.delete();return}}else{let i=t.restore;if(typeof i!=="function"){q.debug("[orm] cascade restore: child has no restore() - nothing to do");return}let s=t.withTrashed,u=(typeof s==="function"?s.call(t):t).where?.(r,n),l=typeof u?.get==="function"?await u.get():[],f=t.primaryKey||"id";for(let d of l){let m=d?.[f];if(m!=null)await i.call(t,m)}}}catch(a){if(q.warn(`[orm] soft-delete cascade ${o} on ${e}#${String(n)} failed`,{error:a}),process.env.STACKS_ORM_CASCADE_SWALLOW!=="true")throw a}}async function G(e,n,t,r){let o=n.cascade;if(!o||o.length===0)return;let a=`${e.name.toLowerCase()}_id`;for(let i of o){let s=qn(e,i);if(!s)continue;await Kn(s.className,t,s.model,a,r)}}var At=new xt;function j(){return At.getStore()?.suppressed===!0}function N(e){return Promise.resolve(At.run({suppressed:!0},e))}var Mt=new xt;function Qn(){return Mt.getStore()?.suppressed===!0}function Wn(e){return Promise.resolve(Mt.run({suppressed:!0},e))}var Le=Symbol.for("stacks.orm.modelDefinition");class Ct extends Error{status=422;errors;constructor(e,n){let t=Object.keys(n).join(", ");super(`${e} validation failed: ${t}`);this.name="ModelValidationError",this.errors=n}}var ht=new Set;function Vn(e,n){let t=typeof e==="string"?e.slice(0,80):String(e),r=`${typeof e}:${t}`;if(ht.has(r))return;ht.add(r);let o=n instanceof Error?n.message:String(n);console.error(`[orm] JSON cast failed to parse value (returning null): ${o} - value preview: ${JSON.stringify(t)}`)}var Hn={string:{get:(e)=>e!=null?String(e):null,set:(e)=>e!=null?String(e):null},number:{get:(e)=>e!=null?Number(e):null,set:(e)=>e!=null?Number(e):null},integer:{get:(e)=>e!=null?Math.trunc(Number(e)):null,set:(e)=>e!=null?Math.trunc(Number(e)):null},float:{get:(e)=>e!=null?Number.parseFloat(String(e)):null,set:(e)=>e!=null?Number.parseFloat(String(e)):null},boolean:{get:(e)=>e===1||e==="1"||e===!0||e==="true",set:(e)=>e===!0||e===1||e==="1"||e==="true"?1:0},json:{get:(e)=>{if(e==null)return null;if(typeof e==="string")try{return JSON.parse(e)}catch(n){return Vn(e,n),null}return e},set:(e)=>{if(e==null)return null;return typeof e==="string"?e:JSON.stringify(e)}},datetime:{get:(e)=>e?new Date(e):null,set:(e)=>e instanceof Date?e.toISOString():e},date:{get:(e)=>e?new Date(e):null,set:(e)=>e instanceof Date?e.toISOString().split("T")[0]:e},array:{get:(e)=>{if(e==null)return[];if(Array.isArray(e))return e;if(typeof e==="string")try{return JSON.parse(e)}catch{return[]}return[]},set:(e)=>{if(e==null)return null;return Array.isArray(e)?JSON.stringify(e):e}}};function Ot(e){return typeof e==="string"?Hn[e]:e}function Tt(e,n,t){if(!e||typeof e!=="object")return e;let r={...e};for(let[o,a]of Object.entries(n))if(o in r){let i=Ot(a);r[o]=i[t](r[o])}return r}var se=new Set(["_attributes","_original","_definition","_hasSaved","_relations"]),kt=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 Gn(e,n){if(!e||!n)return null;let t=n.split("."),r=e;for(let o of t){if(r==null||typeof r!=="object")return null;let a=r;if("_attributes"in a&&a._attributes&&typeof a._attributes==="object"){let 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 P(e,n){if(!e||typeof e!=="object")return e;let t=e;if(t[kt])return e;let r=t._attributes;if(!r||typeof r!=="object")return e;if(n&&Object.keys(n).length>0){for(let[o,a]of Object.entries(n))if(Object.prototype.hasOwnProperty.call(r,o))r[o]=Ot(a).get(r[o])}return new Proxy(e,{get(o,a,i){let s=o;if(a===kt)return!0;if(a==="saveAsync")return async function(){let u=s._definition,l=u?.set;if(l&&typeof s.isDirty==="function"){for(let[d,m]of Object.entries(l)){if(typeof m!=="function")continue;if(!s.isDirty(d))continue;let p=m(s._attributes),y=p&&typeof p.then==="function"?await p:p;s._attributes[d]=y}let f=u.set;u.set={};try{return s.save()}finally{u.set=f}}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[d,m]of Object.entries(l)){if(typeof m!=="function")continue;if(!s.isDirty(d))continue;let p=m(s._attributes);if(p&&typeof p.then==="function")throw Error(`Setter for "${d}" returned a Promise - use \`saveAsync()\` instead of \`save()\` when a model has async setters.`);s._attributes[d]=p}let f=u.set;u.set={};try{return s.save()}finally{u.set=f}}return s.save()};if(a==="updateAsync")return async function(u){if(u&&typeof u==="object"&&!Array.isArray(u))for(let[l,f]of Object.entries(u))i[l]=f;return i.saveAsync()};if(a==="saveQuietly")return function(){return N(()=>s.save())};if(a==="saveAsyncQuietly")return function(){return N(()=>i.saveAsync())};if(a==="updateQuietly")return function(u){return N(()=>s.update(u))};if(a==="updateAsyncQuietly")return function(u){return N(()=>i.updateAsync(u))};if(a==="deleteQuietly")return function(){return N(()=>s.delete())};if(a==="toSearchableObject")return function(){let f=s._definition?.traits?.useSearch;if(!f)return null;let d=s._attributes;if(!d)return null;if(f===!0){let w={...d};if(d.id!=null)w.id=String(d.id);return w}let m={},p=f.displayable?.length?f.displayable:[...f.searchable??[],...f.filterable??[],...f.sortable??[],"id"],y=f.denormalize??{},h=s._relations;for(let w of p){let T=v(w),S=d[T]??d[w];if(S!==void 0){m[T]=S;continue}let M=y[w]??y[T];if(M){m[T]=Gn(h,M);continue}m[T]=void 0}if(d.id!=null)m.id=String(d.id);return m};if(typeof a==="string"&&!se.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 d=l[a];if(Array.isArray(d))return d.map((m)=>P(m,n));return d&&typeof d==="object"?P(d,n):d}let f=zn[a];if(f){let p=s._definition?.__traitMethods?.[f.bag]?.[a];if(typeof p==="function")return f.mode==="model"?(...y)=>p(i,...y):(...y)=>p(s.id,...y)}if(u){let d=v(a);if(d!==a&&Object.prototype.hasOwnProperty.call(u,d))return u[d]}}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"&&!se.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 f=v(a);if(f!==a&&Object.prototype.hasOwnProperty.call(u,f)){if(typeof l==="function")l.call(c,f,i);else u[f]=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"&&!se.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=v(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"&&!se.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 Jn=new Set(["get","first","last","firstOrFail","find","findOrFail","all","paginate","simplePaginate","cursorPaginate"]),Yn={paginate:Oe,simplePaginate:ve,cursorPaginate:De},_t=Symbol.for("stacks.queryBuilderProxy");function vt(e,n){if(!e||typeof e!=="object")return e;if(e[_t])return e;return new Proxy(e,{get(t,r,o){if(r===_t)return!0;let a=Reflect.get(t,r,o);if(typeof a!=="function")return a;return function(...i){let s=i,c=String(r);if(c==="paginate"||c==="simplePaginate"){let{perPage:f,page:d}=Fe(i[0],i[1]);s=[f,d]}else if(c==="cursorPaginate"){let{perPage:f,cursor:d}=$e(i[0],i[1]);s=[f,d,i[2],i[3]]}let u=a.apply(t,s),l=(f)=>{if(Jn.has(c)){if(Array.isArray(f))return f.map((m)=>P(m,n));let d=Yn[c];if(d&&f&&Array.isArray(f.data)){let m=f.data.map((y)=>P(y,n)),p=d({...f,data:m});return Ne(p)}if(f&&Array.isArray(f.data))return{...f,data:f.data.map((m)=>P(m,n))};return P(f,n)}if(f&&typeof f==="object"&&typeof f.get==="function")return vt(f,n);return f};if(u&&typeof u.then==="function")return u.then(l);return l(u)}}})}function Xn(e,n){let t=["find","first","last","all","firstOrFail","findOrFail","findMany"];for(let a of t){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((f)=>P(f,n)):P(l,n);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((f)=>P(f,n)):P(l,n);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 vt(c,n)}}}class Dt extends Error{model;id;constructor(e,n){super(n!=null?`[ORM] ${e} not found for id=${String(n)}`:`[ORM] No matching ${e} row`);this.name="ModelNotFoundError",this.model=e,this.id=n}}class qe extends Error{model;attribute;reason;constructor(e,n,t){let r=t==="guarded"?`'${n}' is marked guarded`:`'${n}' is not in the fillable allowlist`;super(`[ORM] Mass assignment to ${e} forbidden: ${r}. Use ${e}.forceCreate(...) / .forceUpdate(...) to bypass.`);this.name="MassAssignmentException",this.model=e,this.attribute=n,this.reason=t}}var Zn=new Set(["id","created_at","updated_at","deleted_at","uuid"]);function J(e,n,t={}){if(t.force)return n;if(!n||typeof n!=="object"||Array.isArray(n))return n;let r=e.attributes;if(!r)return n;let o=new Set,a=new Set,i=new Set;for(let[c,u]of Object.entries(r)){let l=v(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(n)){let u=v(c);if(Zn.has(u))continue;if(i.has(u))throw new qe(e.name,c,"guarded");if(u.endsWith("_id"))continue;if(!s.has(u))throw new qe(e.name,c,"not-fillable")}return n}async function Ke(e,n){let t=e.set;if(!t||typeof t!=="object")return n;let r={...n};for(let[o,a]of Object.entries(t)){if(typeof a!=="function"||!(o in r))continue;try{r[o]=await a(r)}catch(i){_.error(`[orm] ${e.name}.set.${o} threw - skipping setter`,i)}}return r}function er(e,n){let t=n.primaryKey||"id",r=e.create;function o(u){let l=e.where;if(typeof l!=="function")throw Error(`[ORM] ${n.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] ${n.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] ${n.name}.${u} cannot create: the underlying query builder did not expose create()`);return l}if(typeof e.update!=="function")e.update=async function(u,l){if(u==null)throw Error(`[ORM] ${n.name}.update requires an id as the first argument`);if(!l||typeof l!=="object"||Array.isArray(l))throw Error(`[ORM] ${n.name}.update requires a data object as the second argument`);if(Object.keys(l).length===0){_.debug(`[orm] ${n.name}.update called with empty data - short-circuiting and returning current row`);let m=e.find;return typeof m==="function"?await m.call(e,u):null}J(n,l);let f=await Ke(n,l);await o("update").call(e,t,u).update(f);let d=e.find;return typeof d==="function"?await d.call(e,u):null};if(typeof e.forceUpdate!=="function")e.forceUpdate=async function(u,l){if(u==null)throw Error(`[ORM] ${n.name}.forceUpdate requires an id as the first argument`);if(!l||typeof l!=="object"||Array.isArray(l))throw Error(`[ORM] ${n.name}.forceUpdate requires a data object as the second argument`);let f=await Ke(n,l);await o("forceUpdate").call(e,t,u).update(f);let d=e.find;return typeof d==="function"?await d.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] ${n.name}.forceCreate requires a data object`);let l=e.make;if(typeof l==="function"){let f=await l.call(e);if(f&&typeof f.forceFill==="function"&&typeof f.save==="function")return f.forceFill(u),await f.save()??f}if(typeof r!=="function")throw Error(`[ORM] ${n.name}.forceCreate cannot create: the underlying query builder did not expose create()`);return await r.call(e,u)};if(typeof e.delete!=="function")e.delete=async function(u){if(u==null)throw Error(`[ORM] ${n.name}.delete requires an id as the first argument`);if(!await a("delete").call(e,u))return!1;return await o("delete").call(e,t,u).delete(),!0};if(typeof e.findOrFail!=="function")e.findOrFail=async function(u){let l=await a("findOrFail").call(e,u);if(l==null)throw new Dt(n.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,t,u);if(typeof l.count==="function"){let d=await l.count();return Number(d)>0}let f=e.find;return typeof f==="function"?await f.call(e,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] ${n.name}.firstOrCreate requires a where-attrs object`);let f=o("firstOrCreate").call(e,u),d=typeof f.first==="function"?await f.first():await f;if(d)return d;let m={...u,...l};return J(n,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] ${n.name}.updateOrCreate requires a where-attrs object`);if(!l||typeof l!=="object"||Array.isArray(l))throw Error(`[ORM] ${n.name}.updateOrCreate requires a values object`);let f=o("updateOrCreate").call(e,u),d=typeof f.first==="function"?await f.first():await f;if(d){J(n,l);let p=d[t];await o("updateOrCreate").call(e,t,p).update(l);let y=e.find;return typeof y==="function"?await y.call(e,p):{...d,...l}}let m={...u,...l};return J(n,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 d=u.query();if(typeof d?.count==="function"){let m=await d.count();return Number(m)||0}}let{all:l,get:f}=e;if(typeof l==="function")return(await l.call(e)||[]).length;if(typeof f==="function")return(await f.call(e)||[]).length;return 0};if(typeof e.pluck!=="function")e.pluck=async function(u){if(!u||typeof u!=="string")throw Error(`[ORM] ${n.name}.pluck requires a column name`);let l=e.all;return((typeof l==="function"?await l.call(e):[])||[]).map((d)=>d?.[u])};if(typeof e.whereIn!=="function")e.whereIn=async function(u,l){if(!u||typeof u!=="string")throw Error(`[ORM] ${n.name}.whereIn requires a column name`);if(!Array.isArray(l))throw Error(`[ORM] ${n.name}.whereIn requires an array of values`);if(l.length===0)return[];let f=e.where;if(typeof f!=="function")return[];let d=f.call(e,u,"in",l);if(d&&typeof d.get==="function")return await d.get();return await d};let s=[["latest","desc"],["oldest","asc"]];for(let[u,l]of s)if(typeof e[u]!=="function")e[u]=async function(f="created_at"){let d=e,m=typeof d.query==="function"?d.query():d;if(typeof m?.orderBy==="function"){let w=m.orderBy(f,l);if(typeof w.first==="function")return await w.first();if(typeof w.get==="function")return(await w.get())?.[0]??null}let p=e.all;if(typeof p!=="function")return null;return[...await p.call(e)||[]].sort((w,T)=>{let S=w?.[f],M=T?.[f];if(S===M)return 0;return(S>M?1:-1)*(l==="desc"?-1:1)})[0]??null};let c=$t(n.traits?.useSearch,n);if(c){let u=c.index??n.table??v(`${n.name}s`);if(typeof e.search!=="function")e.search=function(l,f){return or(e,u,l,f,c.searchable)};if(typeof e.makeAllSearchable!=="function")e.makeAllSearchable=async function(l=500){let f=e.all;if(typeof f!=="function")throw Error(`[ORM] ${n.name}.makeAllSearchable cannot run: the underlying query builder did not expose all()`);let{useSearchEngine:d}=await import("@stacksjs/search-engine"),m=d(),p=0,y=e.query;if(typeof y==="function")try{let T=y.call(e);if(T&&typeof T.chunk==="function")return await T.chunk(l,async(S)=>{let M=await Ue(S,c);if(M.length>0)await m.addDocuments(u,M);p+=M.length}),p}catch{}let h=await f.call(e)||[],w=await Ue(h,c);if(w.length>0)await m.addDocuments(u,w);return w.length};if(typeof e.removeAllFromSearch!=="function")e.removeAllFromSearch=async function(){let{useSearchEngine:l}=await import("@stacksjs/search-engine"),f=l();if(typeof f.deleteAllDocuments==="function"){await f.deleteAllDocuments(u);return}let d=e.all,m=typeof d==="function"?await d.call(e)||[]:[],p=l();for(let y of m){let h=y?.id??y?._attributes?.id;if(h!=null)await p.deleteDocument(u,Number(h))}}}}async function Ue(e,n){if(e.length===0)return[];if(typeof n.shapeMany==="function"){let r=await n.shapeMany(e);if(!Array.isArray(r)||r.length!==e.length)throw TypeError(`[orm/search] shapeMany returned ${Array.isArray(r)?r.length:typeof r} documents for ${e.length} rows. It must return one document per row, in order, or documents are indexed under the wrong ids.`);return r.filter(Boolean)}return(await Promise.all(e.map((r)=>rr(r,n)))).filter(Boolean)}function tr(e){let n=new Set,t=e.attributes??{};for(let[r,o]of Object.entries(t))if(o?.hidden)n.add(r);return n}function nr(e,n){if(!e||n.size===0)return e;let t={};for(let[r,o]of Object.entries(e))if(!n.has(r))t[r]=o;return t}async function rr(e,n){if(typeof n.shape==="function")try{return await n.shape(e)}catch{return}let t=e?.toSearchableObject?.();if(t!==void 0)return t;return nr(e?._attributes??(typeof e?.toJSON==="function"?e.toJSON():null),n.hidden??new Set)}function or(e,n,t,r,o){let a=o&&o.length>0?{query_by:[...o].join(",")}:{},i={q:t,...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(n,i))?.hits??[]},async paginate(c,u=1){let{useSearchEngine:l}=await import("@stacksjs/search-engine"),d=await l().search(n,{...i,limit:c,offset:(u-1)*c});return{hits:d.hits??[],total:Number(d.estimatedTotalHits??d.nbHits??d.total??0),page:u,perPage:c}},async raw(){let{useSearchEngine:c}=await import("@stacksjs/search-engine");return await c().search(n,i)}};return s}function Et(e){let n=v(e);return n===e?[e]:[e,n]}async function Ie(e,n){if(!e||typeof e!=="object")return;let t=e._attributes??e;for(let r of n)for(let o of Et(r)){if(!(o in t))continue;let a=t[o];if(!U(a))continue;t[o]=await fe(a)}}function ar(e,n){if(n.length===0)return;let t=async(s)=>{if(Array.isArray(s)){for(let c of s)await Ie(c,n);return s}if(s&&typeof s==="object"&&Array.isArray(s.data)){for(let c of s.data)await Ie(c,n);return s}if(s)await Ie(s,n);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 t(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 t(l)}}for(let s of["update","forceUpdate"]){let c=e[s];if(typeof c!=="function")continue;e[s]=async function(u,l){let f=await c.call(this,u,l);return await t(f)}}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(...f){return await t(await l.apply(this,f))}}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(...f){return i(l.apply(this,f))}}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 ir(e,n){if(n.length===0)return;let t=async(o)=>{if(!o||typeof o!=="object"||Array.isArray(o))return o;let a={...o};for(let i of n)for(let s of Et(i))if(s in a)a[s]=await de(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 t(i[0]),i[1])i[1]=await t(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 t(s);return await a.call(this,i,c)}}}function sr(e,n){let t=e.create;if(typeof t==="function")e.create=async function(r,...o){J(n,r);let a=await Ke(n,r);return await t.call(this,a,...o)};for(let r of["firstOrCreate","updateOrCreate"]){let o=e[r];if(typeof o!=="function")continue}}function ur(e,n){let t=String(n?.name??e.name??"Model"),r=(i,s)=>{if(Qn())return;if(!i||typeof i!=="object"||Array.isArray(i))return;let c=at(i,n,s);if(!c.valid)throw new Ct(t,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 cr(e,n){let t=["create","firstOrCreate","updateOrCreate"];for(let o of t){let a=e[o];if(typeof a==="function")e[o]=async function(...i){if(_.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]=Tt(i[0],n,"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)?Tt(a,n,"set"):a;return await r.call(this,o,i)}}function Ft(e){_.debug(`[orm] Defining model: ${e.name} (table: ${e.table})`);let n=lr(e),t=fr(e),r=dr(n,t),o=pr(e);e.__traitMethods=o;let a=r?{...e,hooks:{...e.hooks,...r}}:e,s=Un(a);if(Xn(s,e.casts),er(s,a),sr(s,a),e.casts&&Object.keys(e.casts).length>0)cr(s,e.casts);let c=pe(e);if(c.length>0)ir(s,c),ar(s,c);let u=e.traits?.useSoftDeletes;if(u)mr(s,a,u);let l=e.traits?.useAudit;if(l){let m=Ye(l);Xe(s,e.name,e.primaryKey||"id",m)}ur(s,a);let f=s;f.withoutValidation=function(m){return Wn(m)},f.withoutEvents=function(m){return N(m)};for(let m of["create","update","firstOrCreate","updateOrCreate","forceCreate","forceUpdate","delete","forceDelete","softDelete","restore"]){let p=s[m];if(typeof p!=="function")continue;let y=`${m}Quietly`;if(typeof s[y]==="function")continue;s[y]=function(...h){return N(()=>p.apply(s,h))}}let d=Object.assign(s,o,{...e,getDefinition:()=>e,_isStacksModel:!0});return Ln(e.name,d),Object.defineProperty(d,Le,{value:e,enumerable:!1,configurable:!0}),d}function lr(e){let n=e.traits?.observe;if(!n)return;let t=e.name.toLowerCase(),r=(d)=>{let m=d?.attributes;if(!m||typeof m!=="object")return d;let p=e.primaryKey||"id",y={...m};if(y[p]===void 0&&d[p]!==void 0)y[p]=d[p];return y},o=async(d,m)=>{if(j())return;try{let{dispatch:p}=await import("@stacksjs/events");await p(d,m)}catch(p){if(p&&typeof p==="object"&&"code"in p&&p.code==="MODULE_NOT_FOUND")return;if(console.error(`[ORM] Event '${d}' handler error:`,p),process.env.STACKS_ORM_EVENT_ERRORS!=="swallow")throw p}},a=e.traits?.broadcastOn,i=e.traits?.broadcastWith,s=typeof a==="function"&&typeof i==="function",c=async(d,m)=>{if(!s)return;if(j())return;try{let p=a(m),y=Array.isArray(p)?p:[p],h=i(m),T=(await import("@stacksjs/realtime").catch(()=>null))?.broadcast;if(typeof T!=="function")return;for(let S of y){if(typeof S!=="string"||S.length===0)continue;await T(S,d,h)}}catch(p){if(p&&typeof p==="object"&&"code"in p&&p.code==="MODULE_NOT_FOUND")return;if(console.error(`[ORM] Broadcast '${d}' handler error:`,p),process.env.STACKS_ORM_BROADCAST_ERRORS==="throw")throw p}},u=async(d,m)=>{if(j())return!0;try{let{dispatchAsync:p}=await import("@stacksjs/events"),y=await p(d,m);if(Array.isArray(y)&&y.some((h)=>h===!1))return!1}catch(p){if(p&&typeof p==="object"&&"code"in p&&p.code==="MODULE_NOT_FOUND")return!0;if(console.error(`[ORM] Before-event '${d}' handler error:`,p),process.env.STACKS_ORM_EVENT_ERRORS!=="swallow")throw p}return!0},l=n===!0?["create","update","delete"]:Array.isArray(n)?n:[],f={};if(l.includes("create"))f.beforeCreate=async(d)=>{if(_.debug(`[orm] Create ${t}`,d),!await u(`${t}:saving`,d))throw Error(`[ORM] ${t}:saving event cancelled the operation`);if(!await u(`${t}:creating`,d))throw Error(`[ORM] ${t}:creating event cancelled the operation`)},f.afterCreate=async(d)=>{let m=r(d);await o(`${t}:created`,m),await o(`${t}:saved`,m),await c(`${t}:created`,d)};if(l.includes("update"))f.beforeUpdate=async(d)=>{if(_.debug(`[orm] Update ${t}#${d?.id??"unknown"}`,d),!await u(`${t}:saving`,d))throw Error(`[ORM] ${t}:saving event cancelled the operation`);if(!await u(`${t}:updating`,d))throw Error(`[ORM] ${t}:updating event cancelled the operation`)},f.afterUpdate=async(d)=>{let m=r(d);await o(`${t}:updated`,m),await o(`${t}:saved`,m),await c(`${t}:updated`,d)};if(l.includes("delete"))f.beforeDelete=async(d)=>{if(_.debug(`[orm] Delete ${t}#${d?.id??"unknown"}`),!await u(`${t}:deleting`,d))throw Error(`[ORM] ${t}:deleting event cancelled the operation`)},f.afterDelete=async(d)=>{await o(`${t}:deleted`,r(d)),await c(`${t}:deleted`,d)};return f}function dr(...e){let n={},t=new Set;for(let r of e){if(!r)continue;for(let o of Object.keys(r))t.add(o)}for(let r of t){let o=e.map((a)=>a?.[r]).filter((a)=>typeof a==="function");if(!o.length)continue;n[r]=async(...a)=>{for(let i of o)await i(...a)}}return Object.keys(n).length?n:void 0}function $t(e,n){if(!e)return null;let t=e===!0?{}:typeof e==="object"?{...e}:null;if(!t)return null;if(n)t.hidden=tr(n);return t}function fr(e){let n=$t(e.traits?.useSearch,e);if(!n)return;let t=n,r=t.index??e.table??v(`${e.name}s`);async function o(s){if(typeof t.shapeMany==="function")try{let[l]=await Ue([s],t);return l}catch(l){_.warn(`[orm/search] shapeMany() threw for ${e.name}: ${l.message}`);return}if(typeof t.shape==="function")try{return await t.shape(s)}catch(l){_.warn(`[orm/search] shape() threw for ${e.name}: ${l.message}`);return}let u=P(s).toSearchableObject?.();if(u!==void 0)return u;return s?._attributes??(typeof s?.toJSON==="function"?s.toJSON():null)}let a=async(s)=>{if(j())return;let c=await o(s);if(!c)return;if(n.queueable){try{let{Jobs:u}=await import("@stacksjs/queue");await u.dispatch("SyncSearchIndexJob",{index:r,op:"upsert",doc:c})}catch(u){_.warn(`[orm/search] queue dispatch failed for ${e.name}; falling back to inline: ${u.message}`),await St(r,c,e.name)}return}await St(r,c,e.name)};return{afterCreate:a,afterUpdate:a,afterDelete:async(s)=>{if(j())return;let c=s?.id??s?._attributes?.id;if(c==null)return;if(n.queueable){try{let{Jobs:u}=await import("@stacksjs/queue");await u.dispatch("SyncSearchIndexJob",{index:r,op:"delete",id:Number(c)})}catch(u){_.warn(`[orm/search] queue dispatch failed for ${e.name}#${c}; falling back to inline: ${u.message}`),await Pt(r,Number(c),e.name)}return}await Pt(r,Number(c),e.name)}}}var Rt=new Map;function Nt(e,n){let t=Rt.get(e)??0;if(Rt.set(e,t+1),t===0)_.warn(`[orm/search] ${n}`);else if(t===9)_.warn(`[orm/search] ${e} is still failing; further identical warnings suppressed for this process.`)}async function St(e,n,t){try{let{useSearchEngine:r}=await import("@stacksjs/search-engine");await r().addDocument(e,n)}catch(r){Nt(`index:${t}`,`Failed to index ${t}: ${r.message}`)}}async function Pt(e,n,t){try{let{useSearchEngine:r}=await import("@stacksjs/search-engine");await r().deleteDocument(e,n)}catch(r){Nt(`remove:${t}`,`Failed to remove ${t}#${n}: ${r.message}`)}}function pr(e){let n={},t=e.table,r=e.traits;if(!r)return n;if(r.taggable)n._taggable=Te(t);if(r.categorizable)n._categorizable=ke(t);if(r.commentable)n._commentable=we(t);if(r.billable)n._billable=gt(t);if(r.likeable){let a=typeof r.likeable==="object"?r.likeable:void 0;n._likeable=_e(t,a)}let o=r.useAuth||r.authenticatable;if(typeof o==="object"&&o&&"useTwoFactor"in o&&o.useTwoFactor)n._twoFactor=yt();return n}function mr(e,n,t){let r=bt(e,n.primaryKey||"id"),o=wt(t),a=n,i=n.name.toLowerCase(),s=n.traits?.observe!=null&&n.traits?.observe!==!1,c=async(m)=>{if(!s||j())return!0;try{let{dispatchAsync:p}=await import("@stacksjs/events"),y=await p(`${i}:restoring`,{id:m});if(Array.isArray(y)&&y.some((h)=>h===!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||j())return;try{let{dispatch:p}=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",f=async(m)=>{if(!o.cascade?.length||!l){let y=await r.softDelete(m);if(y&&o.cascade?.length)await G(a,o,m,"softDelete");return y}let{db:p}=await import("@stacksjs/database");return await p.transaction(async()=>{let y=await r.softDelete(m);if(y)await G(a,o,m,"softDelete");return y})},d=async(m)=>{if(!await c(m))return!1;if(!o.cascade?.length||!l){let w=await r.restore(m);if(w){if(o.cascade?.length)await G(a,o,m,"restore");await u(m)}return w}let{db:y}=await import("@stacksjs/database"),h=await y.transaction(async()=>{let w=await r.restore(m);if(w)await G(a,o,m,"restore");return w});if(h)await u(m);return h};e.softDelete=f,e.restore=d,e.forceDelete=r.forceDelete,e.withTrashed=r.withTrashed,e.onlyTrashed=r.onlyTrashed,e.delete=f}function gr(e){if(e==null)return e;if(Array.isArray(e))return e.map((t)=>gr(t));if(typeof e!=="object")return e;let n=e;if(typeof n.toJSON==="function")return n.toJSON();if(n._attributes&&typeof n._attributes==="object")return n._attributes;return e}var yr=["belongsTo","hasOne","hasMany","belongsToMany","morphMany","morphOne"],br=["traits","dashboard"];function wr(e){let n=e?.[Le];if(n&&typeof n==="object")return n;if(e&&typeof e==="object"&&"name"in e&&"attributes"in e)return e;throw TypeError("extendModel() expects a model created by defineModel(), or a model definition. Import the framework model itself rather than its table name.")}function hr(e,n){let t=Array.isArray(e)?e:[],r=Array.isArray(n)?n:[];if(!t.length&&!r.length)return;return[...new Set([...t,...r])]}function Tr(e){if(!e)return 0;return Object.values(e).reduce((n,t)=>{let r=Number(t?.order);return Number.isFinite(r)&&r>n?r:n},0)}function kr(e,n){let t={...e,...n},r=e.attributes??{},o=n.attributes??{};if(n.attributes){let a=Tr(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]}));t.attributes={...r,...i}}for(let a of yr){let i=hr(e[a],n[a]);if(i)t[a]=i}for(let a of br){let i=e[a],s=n[a];if(i&&s&&typeof i==="object"&&typeof s==="object")t[a]={...i,...s}}return t}function Os(e,n){return Ft(kr(wr(e),n))}import Cr from"process";import{log as Or}from"@stacksjs/logging";import{path as x}from"@stacksjs/path";import{fs as Y}from"@stacksjs/storage";import{Database as _r}from"bun:sqlite";import{existsSync as Rr,readdirSync as Sr,readFileSync as Pr}from"fs";function xr(e){return e.startsWith("sqlite_")||e.startsWith("_qb_tmp_")}function Ar(e,n){let t=e.toUpperCase();if(t.includes("BOOL"))return n==="postgres"?"boolean":"number";if(t.includes("DATE")||t.includes("TIME"))return"string";if(t.includes("INT"))return"number";if(t.includes("CHAR")||t.includes("CLOB")||t.includes("TEXT"))return"string";if(t.includes("REAL")||t.includes("FLOA")||t.includes("DOUB")||t.includes("NUMERIC")||t.includes("DEC"))return"number";if(t.includes("BLOB"))return"Uint8Array";return"unknown"}function Mr(e,n){try{return e.exec(n),{ok:!0}}catch(t){if(/CREATE\s+TRIGGER/i.test(n))return{ok:!1,error:t.message};let r=0;for(let o of n.split(/;\s*$/m)){if(!o.trim())continue;try{e.exec(o),r++}catch{}}return r>0?{ok:!0}:{ok:!1,error:t.message}}}function jt(e,n="sqlite"){let t=[];if(!Rr(e))return{tables:[],errors:t};let r;try{r=Sr(e).filter((a)=>a.endsWith(".sql")).sort()}catch(a){return{tables:[],errors:[{file:e,error:a.message}]}}let o=new _r(":memory:");try{for(let s of r){let c=`${e}/${s}`,u;try{u=Pr(c,"utf-8")}catch(f){t.push({file:c,error:f.message});continue}let l=Mr(o,u);if(!l.ok)t.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)=>!xr(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 f=Ar(l.type??"",n),d=l.notnull===0&&l.pk===0;u[l.name]=d&&f!=="unknown"?`${f} | null`:f}i.push({table:s,columns:u})}return{tables:i,errors:t}}finally{o.close()}}function vr(e){if(e)return e;let n=String(Cr.env.DB_CONNECTION??"").toLowerCase();return n==="postgres"||n==="mysql"?n:"sqlite"}function ue(e){return e==="postgres"?"boolean":"number"}function D(e){return e.replace(/([A-Z]+)([A-Z][a-z])/g,"$1_$2").replace(/([a-z\d])([A-Z])/g,"$1_$2").toLowerCase()}function Dr(e,n){let t=e.default;if(typeof t==="boolean")return ue(n);if(typeof t==="number")return"number";if(typeof t==="string")return"string";return"unknown"}function Er(e){let n=e.validation;if(!n||typeof n!=="object")return null;let t=n.rule;return t&&typeof t==="object"?t:null}function Fr(e){if(!e||String(e.name??"")!=="enum")return null;let t=(Array.isArray(e.allowedValues)?e.allowedValues:[]).filter((r)=>typeof r==="string"||typeof r==="number").map((r)=>typeof r==="number"?String(r):JSON.stringify(r));return t.length>0?t.join(" | "):null}function $r(e,n){let t=Er(e),r=Fr(t);if(r!==null)return e.nullable===!0?`${r} | null`:r;let o=typeof e.type==="string"?e.type.toLowerCase():String(t?.name??"").toLowerCase(),a=(()=>{switch(o){case"string":case"text":case"longtext":case"mediumtext":case"tinytext":case"char":case"varchar":case"enum":case"uuid":case"date":case"datetime":case"timestamp":case"timestamptz":case"password":case"time":case"year":return"string";case"number":case"integer":case"int":case"tinyint":case"smallint":case"mediumint":case"float":case"double":case"decimal":case"numeric":return"number";case"bigint":return"number | bigint";case"boolean":case"bool":return ue(n);case"json":case"jsonb":return"unknown";case"binary":case"blob":case"bytea":return"Uint8Array";case"unix":return"number";case"array":return"unknown[]";case"object":return"Record<string, unknown>";default:return Dr(e,n)}})();return e.nullable===!0?`${a} | null`:a}function Nr(e){let n={},t=e.belongsTo;if(!t)return n;let r=Array.isArray(t)?t:Object.values(t);for(let o of r){if(typeof o==="string"){n[`${D(o)}_id`]="number";continue}if(o&&typeof o==="object"){let a=o;if(typeof a.foreignKey==="string"){n[a.foreignKey]="number";continue}if(typeof a.model==="string")n[`${D(a.model)}_id`]="number"}}return n}function jr(e,n){let[t,r]=[D(e),D(n)].sort();return`${t}_${r}`}function Br(e,n){let t=e.default,r=typeof t==="string"?"string":typeof t==="number"?"number":typeof t==="boolean"?ue(n):t instanceof Date?"string":"unknown";return e.nullable?`${r} | null`:r}function Ir(e,n,t){let r=n.belongsToMany;if(!r)return[];let o=[],a=Array.isArray(r)?r:Object.values(r);for(let i of a){let s,c,u,l,f={},d=!0;if(typeof i==="string")s=i;else if(i&&typeof i==="object"&&"model"in i){let w=i;if(s=w.model,"pivotTable"in w||"firstForeignKey"in w||"secondForeignKey"in w)c=w.pivotTable,u=w.firstForeignKey,l=w.secondForeignKey;else{let T=i;c=T.table,u=T.foreignKey,l=T.relatedKey,f=T.pivot?.columns??{},d=Boolean(T.pivot?.timestamps)}}else continue;let m=c??jr(e,s),p=u??`${D(e)}_id`,y=l??`${D(s)}_id`,h={id:"number",[p]:"number",[y]:"number"};for(let[w,T]of Object.entries(f))h[w]=Br(T,t);if(d)h.created_at="string",h.updated_at="string | null";o.push({table:m,columns:h})}return o}function qr(e){return{email_verified_at:"string | null",password_changed_at:"string | null",two_factor_secret:"string | null",two_factor_enabled:`${ue(e)} | null`,two_factor_last_used_step:"number | null",stripe_id:"string | null"}}function Kr(e,n){let t={id:"number"},r=e.traits??{};if(r.useUuid)t.uuid="string";if((r.useTimestamps??r.timestampable)!==!1)t.created_at="string",t.updated_at="string | null";if(r.useSoftDeletes??r.softDeletable)t.deleted_at="string | null";if((e.table??"")==="users"||e.name==="User")Object.assign(t,qr(n));return t}function Ur(e,n){let t={},r=e.attributes??{};for(let[o,a]of Object.entries(r))t[D(o)]=$r(a,n);return t}function Bt(e,n,t=2){let r=" ".repeat(t),o=" ".repeat(t+1),a=Object.entries(n).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}
6
- ${r}}`}var xr=`/* eslint-disable */
6
+ ${r}}`}var Lr=`/* eslint-disable */
7
7
  // AUTO-GENERATED by \`buddy generate:db-types\` \u2014 do not edit.
8
8
  // Regenerate after adding/removing a model or changing its attributes.
9
9
  // See stacksjs/stacks#1923.
10
10
 
11
11
  declare module '@stacksjs/database' {
12
12
  interface DatabaseSchema {
13
- `,Ar=` }
13
+ `,Qr=` }
14
14
  }
15
15
 
16
16
  export {}
17
- `,Mr="/* eslint-disable */\n// AUTO-GENERATED by `buddy generate:db-types --framework` \u2014 do not edit.\n//\n// The shapes of the tables the framework itself ships, so framework code gets\n// real rows from `db.selectFrom(...)` without asserting them. An application's\n// own tables (and its overrides of these) live in `DatabaseSchema`, which takes\n// precedence - see `RowOf` in `./utils`.\n\nexport interface FrameworkSchema {\n",Cr=`}
18
- `;function $t(e){return e==="framework"?Mr:xr}function Nt(e){return e==="framework"?Cr:Ar}async function jt(e,n,t=[]){let r=[];if(!Y.existsSync(e))return r;let o=Y.readdirSync(e,{withFileTypes:!0});for(let a of o){let i=v.join(e,a.name);if(a.isDirectory()){if(n){let s=await jt(i,!0,t);r.push(...s)}continue}if(!a.name.endsWith(".ts"))continue;if(a.name.startsWith("_")||a.name.startsWith("index"))continue;try{let s=await(v.isAbsolute(i)?import(i):import(v.resolve(i))),c=s.default||s;if(c?.name&&(c.attributes||c.table))r.push({filePath:i,model:c})}catch(s){t.push({file:i,error:s.message})}}return r}async function Or(e={}){let n=mr(e.dialect),t=e.modelsDir??v.userModelsPath(),r=e.defaultsDir??v.frameworkPath("defaults/app/Models"),o=e.outFile??v.projectPath("database/types.d.ts"),a=[],i=[];for(let[p,y]of[[t,!1],[r,!0]])try{let w=await jt(p,y,a);i.push(...w)}catch(w){a.push({file:p,error:w.message})}let s=new Map;for(let p of i)s.set(p.model.name??v.basename(p.filePath).replace(/\.ts$/,""),p);for(let p of i)if(p.filePath.startsWith(t))s.set(p.model.name??v.basename(p.filePath).replace(/\.ts$/,""),p);let c=[];for(let[p,{model:y}]of s){let w=y.table??`${D(p)}s`,h={...Sr(y,n),...Pr(y,n),...hr(y)};c.push({table:w,model:p,columns:h})}let u=new Map;for(let[p,{model:y}]of s)for(let w of kr(p,y,n)){if(u.has(w.table))continue;u.set(w.table,{table:w.table,model:`(${w.table} pivot)`,columns:w.columns})}c.push(...u.values()),c.sort((p,y)=>p.table.localeCompare(y.table));let l=e.target??"app",f=l==="framework"?1:2,d=c.map((p)=>Ft(p.table,p.columns,f)).join(`
19
- `),m=`${$t(l)}${d}
20
- ${Nt(l)}`;if(!e.dryRun){let p=v.dirname(o);if(!Y.existsSync(p))Y.mkdirSync(p,{recursive:!0});Y.writeFileSync(o,m,"utf-8"),pr.success(`[generate:db-types] wrote ${c.length} table(s) to ${o}`)}return{outFile:o,tables:c,errors:a,content:m}}function vr(e,n="app"){let t=[...e].sort((r,o)=>r.table.localeCompare(o.table)).map((r)=>Ft(r.table,r.columns,n==="framework"?1:2)).join(`
21
- `);return`${$t(n)}${t}
22
- ${Nt(n)}`}import{configureOrm as Dr}from"@stacksjs/query-builder";function Er(){try{let e=process.env.DB_DATABASE_PATH||"database/stacks.sqlite";if((process.env.DB_CONNECTION||"sqlite")==="sqlite")Dr({database:e})}catch{}}Er();async function Bt(e){for(let n=0;;n++){let t=await import(e);try{return t.default}catch(r){if(n<5&&r instanceof ReferenceError&&/before initialization/.test(r.message)){await new Promise((o)=>setTimeout(o,0));continue}throw r}}}async function ce(e,n=[""]){let{path:t}=await import("@stacksjs/path"),r=t.userModelsPath(`${e}.ts`);try{if(await Bun.file(r).exists())return await Bt(r)}catch(o){console.error(`[orm] Failed to import userland model ${e} from ${r} - falling back to framework default. Reason:`,o)}for(let o of n){let a=o?`${o}/`:"",i=t.frameworkPath(`defaults/app/Models/${a}${e}.ts`);try{if(await Bun.file(i).exists())return await Bt(i)}catch(s){console.error(`[orm] Failed to import framework default model ${e} from ${i} - trying next subdir. Reason:`,s)}}return null}var E={},It=()=>{},Ts=new Promise((e)=>{It=e});function g(e){return new Proxy(function(){},{get(n,t){if(t==="then")return;let r=E[e];if(r==null)return;let o=r[t];return typeof o==="function"?o.bind(r):o},set(n,t,r){let o=E[e];if(o==null)return!1;return o[t]=r,!0},has(n,t){let r=E[e];return r==null?!1:(t in r)},apply(n,t,r){let o=E[e];if(o==null||typeof o!=="function")return;return o.apply(t,r)}})}var Fr=g("User"),$r=g("Job"),Nr=g("FailedJob"),jr=[["Team",[""],"auth"],["TeamInvitation",[""],"auth"],["TeamMember",[""],"auth"],["SocialAccount",[""],"auth"],["Subscriber",[""],"auth"],["SubscriberEmail",[""],"auth"],["Subscription",[""],"auth"],["Post",["Content"],"cms"],["Page",["Content"],"cms"],["PageRevision",["Content"],"cms"],["Redirect",["Content"],"cms"],["Menu",["Content"],"cms"],["MenuItem",["Content"],"cms"],["Author",["Content"],"cms"],["Comment",[""],"cms"],["Tag",[""],"cms"],["Site",[""],"auth"],["SiteDomain",[""],"auth"],["MagicLinkToken",[""],"auth"],["SmsOptOut",[""],"auth"],["Form",["Forms"],"forms"],["FormField",["Forms"],"forms"],["FormSubmission",["Forms"],"forms"],["Activity",[""],"dashboard"],["Board",[""],"dashboard"],["BoardColumn",[""],"dashboard"],["Card",[""],"dashboard"],["CardComment",[""],"dashboard"],["Deployment",[""],"dashboard"],["Label",[""],"dashboard"],["Release",[""],"dashboard"],["Notification",[""],"dashboard"],["NotificationDelivery",[""],"dashboard"],["MailPreference",[""],"dashboard"],["Log",[""],"dashboard"],["Request",[""],"dashboard"],["AnalyticsEvent",[""],"dashboard"],["QueryLog",[""],"dashboard"],["Error",[""],"monitoring"],["Websocket",["realtime"],"realtime"],["Campaign",[""],"marketing"],["CampaignSend",[""],"marketing"],["EmailList",[""],"marketing"],["EmailListSubscriber",[""],"marketing"],["EmailIdempotency",[""],"marketing"],["EmailSuppression",[""],"marketing"],["EmailWebhookEvent",[""],"marketing"],["SocialPost",[""],"marketing"],["Automation",[""],"marketing"],["AutomationRun",[""],"marketing"],["CampaignVariant",[""],"marketing"],["CommunicationSuppression",[""],"marketing"],["ConsentEvent",[""],"marketing"],["SenderDomain",[""],"marketing"],["UsageEvent",[""],"marketing"],["PaymentMethod",[""],"commerce"],["PaymentProduct",[""],"commerce"],["PaymentTransaction",[""],"commerce"],["Order",["commerce"],"commerce"],["OrderIdempotency",["commerce"],"commerce"],["OrderItem",["commerce"],"commerce"],["Cart",["commerce"],"commerce"],["CartItem",["commerce"],"commerce"],["Customer",["commerce"],"commerce"],["Product",["commerce"],"commerce"],["ProductVariant",["commerce"],"commerce"],["ProductUnit",["commerce"],"commerce"],["Manufacturer",["commerce"],"commerce"],["Category",["commerce"],"commerce"],["Coupon",["commerce"],"commerce"],["GiftCard",["commerce"],"commerce"],["LicenseKey",["commerce"],"commerce"],["Review",["commerce"],"commerce"],["Receipt",["commerce"],"commerce"],["PrintDevice",["commerce"],"commerce"],["ShippingMethod",["commerce"],"commerce"],["ShippingRate",["commerce"],"commerce"],["ShippingZone",["commerce"],"commerce"],["DeliveryRoute",["commerce"],"commerce"],["DeliveryStop",["commerce"],"commerce"],["DigitalDelivery",["commerce"],"commerce"],["Courier",["commerce"],"commerce"],["CourierPing",["commerce"],"commerce"],["TaxRate",["commerce"],"commerce"],["WaitlistProduct",["commerce"],"commerce"],["WaitlistRestaurant",["commerce"],"commerce"],["Auction",["commerce"],"commerce"],["AuctionItem",["commerce"],"commerce"],["Bid",["commerce"],"commerce"],["Pledge",["commerce"],"commerce"],["LoyaltyPoint",["commerce"],"commerce"],["LoyaltyReward",["commerce"],"commerce"],["Payment",["commerce"],"commerce"],["Transaction",["commerce"],"commerce"]];queueMicrotask(async()=>{try{let{feature:e}=await import("@stacksjs/config"),n=await ce("User");if(n)E.User=n;if(e("queue")){let t=await ce("Job");if(t)E.Job=t;let r=await ce("FailedJob");if(r)E.FailedJob=r}for(let[t,r,o]of jr){if(!e(o))continue;let a=await ce(t,r);if(a)E[t]=a}}catch(e){console.error("[orm] deferred model load failed:",e)}finally{It()}});var Br=g("Activity"),Ir=g("AnalyticsEvent"),Kr=g("Automation"),qr=g("AutomationRun"),Ur=g("Auction"),Lr=g("CampaignVariant"),Qr=g("CommunicationSuppression"),Vr=g("ConsentEvent"),Wr=g("SenderDomain"),zr=g("UsageEvent"),Hr=g("AuctionItem"),Gr=g("Author"),Jr=g("Bid"),Yr=g("Board"),Zr=g("BoardColumn"),Xr=g("Campaign"),eo=g("Card"),to=g("CardComment"),no=g("Cart"),ro=g("CartItem"),oo=g("Category"),ao=g("Comment"),io=g("Coupon"),so=g("Customer"),uo=g("DeliveryRoute"),co=g("DeliveryStop"),lo=g("Deployment"),fo=g("DigitalDelivery"),po=g("Courier"),mo=g("CourierPing"),go=g("CampaignSend"),yo=g("EmailList"),bo=g("EmailListSubscriber"),wo=g("Form"),ho=g("FormField"),To=g("FormSubmission"),_o=g("MagicLinkToken"),ko=g("Menu"),Ro=g("MenuItem"),So=g("PageRevision"),Po=g("Pledge"),xo=g("Redirect"),Ao=g("Site"),Mo=g("SiteDomain"),Co=g("SmsOptOut"),Oo=g("EmailIdempotency"),vo=g("EmailSuppression"),Do=g("EmailWebhookEvent"),Eo=g("Error"),Fo=g("GiftCard"),$o=g("Label"),No=g("LicenseKey"),jo=g("Log"),Bo=g("LoyaltyPoint"),Io=g("LoyaltyReward"),Ko=g("MailPreference"),qo=g("Manufacturer"),Uo=g("Notification"),Lo=g("NotificationDelivery"),Qo=g("Order"),Vo=g("OrderIdempotency"),Wo=g("OrderItem"),zo=g("Page"),Ho=g("Payment"),Go=g("PaymentMethod"),Jo=g("PaymentProduct"),Yo=g("PaymentTransaction"),Zo=g("Post"),Xo=g("PrintDevice"),ea=g("Product"),ta=g("ProductUnit"),na=g("ProductVariant"),ra=g("QueryLog"),oa=g("Receipt"),aa=g("Release"),ia=g("Request"),sa=g("Review"),ua=g("ShippingMethod"),ca=g("ShippingRate"),la=g("ShippingZone"),da=g("SocialPost"),fa=g("SocialAccount"),pa=g("Subscriber"),ma=g("SubscriberEmail"),ga=g("Subscription"),ya=g("Tag"),ba=g("TaxRate"),wa=g("Team"),ha=g("TeamInvitation"),Ta=g("TeamMember"),_a=g("Transaction"),ka=g("WaitlistProduct"),Ra=g("WaitlistRestaurant"),Sa=g("Websocket"),Kt={User:Fr,Job:$r,FailedJob:Nr,Activity:Br,AnalyticsEvent:Ir,Automation:Kr,AutomationRun:qr,Auction:Ur,AuctionItem:Hr,Author:Gr,Bid:Jr,Board:Yr,BoardColumn:Zr,Campaign:Xr,CampaignSend:go,CampaignVariant:Lr,Card:eo,CardComment:to,Cart:no,CartItem:ro,Category:oo,Comment:ao,Coupon:io,Customer:so,CommunicationSuppression:Qr,ConsentEvent:Vr,DeliveryRoute:uo,DeliveryStop:co,Deployment:lo,DigitalDelivery:fo,Courier:po,CourierPing:mo,EmailList:yo,EmailListSubscriber:bo,EmailIdempotency:Oo,EmailSuppression:vo,EmailWebhookEvent:Do,ErrorModel:Eo,Form:wo,FormField:ho,FormSubmission:To,GiftCard:Fo,Label:$o,LicenseKey:No,Log:jo,LoyaltyPoint:Bo,LoyaltyReward:Io,MailPreference:Ko,Manufacturer:qo,Notification:Uo,MagicLinkToken:_o,Menu:ko,MenuItem:Ro,NotificationDelivery:Lo,Order:Qo,OrderIdempotency:Vo,OrderItem:Wo,Page:zo,PageRevision:So,Payment:Ho,PaymentMethod:Go,PaymentProduct:Jo,PaymentTransaction:Yo,Pledge:Po,Post:Zo,PrintDevice:Xo,Product:ea,ProductUnit:ta,ProductVariant:na,QueryLog:ra,Receipt:oa,Release:aa,Request:ia,Review:sa,ShippingMethod:ua,Redirect:xo,SenderDomain:Wr,ShippingRate:ca,ShippingZone:la,Site:Ao,SiteDomain:Mo,SmsOptOut:Co,SocialAccount:fa,SocialPost:da,Subscriber:pa,SubscriberEmail:ma,Subscription:ga,Tag:ya,TaxRate:ba,Team:wa,TeamInvitation:ha,TeamMember:Ta,Transaction:_a,UsageEvent:zr,WaitlistProduct:ka,WaitlistRestaurant:Ra,Websocket:Sa},q=globalThis;for(let[e,n]of Object.entries(Kt))if(n&&q[e]===void 0)q[e]=n;var _s=Object.keys(Kt);async function Pa(e){if(!e)return[];try{if(typeof e.all==="function"){let n=await e.all();return Array.isArray(n)?n:[]}if(typeof e.get==="function"){let n=await e.get();return Array.isArray(n)?n:[]}}catch{}return[]}function xa(e,n,t=""){if(!e)return t;try{if(typeof e.get==="function"){let o=e.get(n);if(o!==void 0&&o!==null)return o}}catch{}let r=e?.[n];return r!==void 0&&r!==null?r:t}if(q.safeAll===void 0)q.safeAll=Pa;if(q.safeGet===void 0)q.safeGet=xa;export{Br as Activity,Ir as AnalyticsEvent,Ur as Auction,Hr as AuctionItem,Gr as Author,Kr as Automation,qr as AutomationRun,Jr as Bid,Yr as Board,Zr as BoardColumn,Xr as Campaign,go as CampaignSend,Lr as CampaignVariant,eo as Card,to as CardComment,no as Cart,ro as CartItem,oo as Category,ao as Comment,Qr as CommunicationSuppression,Vr as ConsentEvent,io as Coupon,po as Courier,mo as CourierPing,so as Customer,uo as DeliveryRoute,co as DeliveryStop,lo as Deployment,fo as DigitalDelivery,Oo as EmailIdempotency,yo as EmailList,bo as EmailListSubscriber,vo as EmailSuppression,Do as EmailWebhookEvent,Eo as ErrorModel,Nr as FailedJob,wo as Form,ho as FormField,To as FormSubmission,Fo as GiftCard,$r as Job,$o as Label,No as LicenseKey,jo as Log,Bo as LoyaltyPoint,Io as LoyaltyReward,Ue as MODEL_DEFINITION,_o as MagicLinkToken,Ko as MailPreference,qo as Manufacturer,Ie as MassAssignmentException,ko as Menu,Ro as MenuItem,Ct as ModelNotFoundError,xt as ModelValidationError,Uo as Notification,Lo as NotificationDelivery,Qo as Order,Vo as OrderIdempotency,Wo as OrderItem,zo as Page,So as PageRevision,Ho as Payment,Go as PaymentMethod,Jo as PaymentProduct,Yo as PaymentTransaction,Po as Pledge,Zo as Post,Xo as PrintDevice,ea as Product,ta as ProductUnit,na as ProductVariant,ra as QueryLog,oa as Receipt,xo as Redirect,aa as Release,ia as Request,sa as Review,Wr as SenderDomain,ua as ShippingMethod,ca as ShippingRate,la as ShippingZone,Ao as Site,Mo as SiteDomain,Co as SmsOptOut,fa as SocialAccount,da as SocialPost,wn as SubqueryBuilder,pa as Subscriber,ma as SubscriberEmail,ga as Subscription,ya as Tag,ba as TaxRate,wa as Team,ha as TeamInvitation,Ta as TeamMember,_a as Transaction,zr as UsageEvent,Fr as User,ka as WaitlistProduct,Ra as WaitlistRestaurant,Sa as Websocket,ci as batchLoad,Or as buildDatabaseSchema,pe as collectEncryptedAttributes,Ge as createAuditMethods,_e as createCategorizableMethods,we as createCommentableMethods,ke as createLikeableMethods,Te as createTaggableMethods,pi as db,fe as decryptValue,vt as defineModel,de as encryptValue,$e as enrichPaginatorUrls,ds as extendModel,Ni as extractDate,Ei as extractFields,Ci as fetchOtherModelRelations,cn as filterFillable,xe as findCoreModel,Ae as findUserModel,$i as formatDate,Di as getFillableAttributes,vi as getGuardedAttributes,Oi as getHiddenAttributes,z as getModelName,Tn as getPivotTableName,Mi as getPivotTables,va as getPrunableConfig,Ai as getRelationCount,xi as getRelationType,_n as getRelations,x as getTableName,un as getWritableFields,Pi as hasRelations,An as isCursorPaginator,U as isEncrypted,Pn as isPaginator,xn as isSimplePaginator,tt as isUniqueViolation,Fi as mapEntity,an as mapWriteError,Oa as massPrunable,dr as mergeModelDefinition,_s as modelGlobalNames,Si as modelTableName,Ts as ormReady,lt as parseCursor,qe as projectDocumentsFromTrait,qt as prunable,vr as renderDatabaseTypeFile,Fe as resolveCursorArgs,Ee as resolvePageArgs,bi as savepoint,Gt as setAuditUser,ar as toAttrs,ve as toCursorPaginator,Ce as toPaginator,Oe as toSimplePaginator,sn as toSnakeCaseKeys,ji as toTimestamp,yi as transaction,wi as transactional,N as withoutEvents,$n as withoutValidation};
17
+ `,Wr="/* eslint-disable */\n// AUTO-GENERATED by `buddy generate:db-types --framework` \u2014 do not edit.\n//\n// The shapes of the tables the framework itself ships, so framework code gets\n// real rows from `db.selectFrom(...)` without asserting them. An application's\n// own tables (and its overrides of these) live in `DatabaseSchema`, which takes\n// precedence - see `RowOf` in `./utils`.\n\nexport interface FrameworkSchema {\n",Vr=`}
18
+ `;function It(e){return e==="framework"?Wr:Lr}function qt(e){return e==="framework"?Vr:Qr}async function Kt(e,n,t=[]){let r=[];if(!Y.existsSync(e))return r;let o=Y.readdirSync(e,{withFileTypes:!0});for(let a of o){let i=x.join(e,a.name);if(a.isDirectory()){if(n){let s=await Kt(i,!0,t);r.push(...s)}continue}if(!a.name.endsWith(".ts"))continue;if(a.name.startsWith("_")||a.name.startsWith("index"))continue;try{let s=await(x.isAbsolute(i)?import(i):import(x.resolve(i))),c=s.default||s;if(c?.name&&(c.attributes||c.table))r.push({filePath:i,model:c})}catch(s){t.push({file:i,error:s.message})}}return r}async function Hr(e={}){let n=vr(e.dialect),t=e.modelsDir??x.userModelsPath(),r=e.defaultsDir??x.frameworkPath("defaults/app/Models"),o=e.outFile??x.projectPath("database/types.d.ts"),a=[],i=[];for(let[p,y]of[[t,!1],[r,!0]])try{let h=await Kt(p,y,a);i.push(...h)}catch(h){a.push({file:p,error:h.message})}let s=new Map;for(let p of i)s.set(p.model.name??x.basename(p.filePath).replace(/\.ts$/,""),p);for(let p of i)if(p.filePath.startsWith(t))s.set(p.model.name??x.basename(p.filePath).replace(/\.ts$/,""),p);let c=[];for(let[p,{model:y}]of s){let h=y.table??`${D(p)}s`,w={...Kr(y,n),...Ur(y,n),...Nr(y)};c.push({table:h,model:p,columns:w})}let u=new Map;for(let[p,{model:y}]of s)for(let h of Ir(p,y,n)){if(u.has(h.table))continue;u.set(h.table,{table:h.table,model:`(${h.table} pivot)`,columns:h.columns})}if(c.push(...u.values()),e.migrationsDir!==!1){let p=e.migrationsDir??x.resolve(x.dirname(o),"migrations"),y=new Set(c.map((w)=>w.table)),h=jt(p,n);for(let w of h.tables){if(y.has(w.table))continue;y.add(w.table),c.push({table:w.table,model:`(${w.table} migration)`,columns:w.columns})}a.push(...h.errors)}c.sort((p,y)=>p.table.localeCompare(y.table));let l=e.target??"app",f=l==="framework"?1:2,d=c.map((p)=>Bt(p.table,p.columns,f)).join(`
19
+ `),m=`${It(l)}${d}
20
+ ${qt(l)}`;if(!e.dryRun){let p=x.dirname(o);if(!Y.existsSync(p))Y.mkdirSync(p,{recursive:!0});Y.writeFileSync(o,m,"utf-8"),Or.success(`[generate:db-types] wrote ${c.length} table(s) to ${o}`)}return{outFile:o,tables:c,errors:a,content:m}}function zr(e,n="app"){let t=[...e].sort((r,o)=>r.table.localeCompare(o.table)).map((r)=>Bt(r.table,r.columns,n==="framework"?1:2)).join(`
21
+ `);return`${It(n)}${t}
22
+ ${qt(n)}`}import{configureOrm as Gr}from"@stacksjs/query-builder";function Jr(){try{let e=process.env.DB_DATABASE_PATH||"database/stacks.sqlite";if((process.env.DB_CONNECTION||"sqlite")==="sqlite")Gr({database:e})}catch{}}Jr();async function Ut(e){for(let n=0;;n++){let t=await import(e);try{return t.default}catch(r){if(n<5&&r instanceof ReferenceError&&/before initialization/.test(r.message)){await new Promise((o)=>setTimeout(o,0));continue}throw r}}}async function ce(e,n=[""]){let{path:t}=await import("@stacksjs/path"),r=t.userModelsPath(`${e}.ts`);try{if(await Bun.file(r).exists())return await Ut(r)}catch(o){console.error(`[orm] Failed to import userland model ${e} from ${r} - falling back to framework default. Reason:`,o)}for(let o of n){let a=o?`${o}/`:"",i=t.frameworkPath(`defaults/app/Models/${a}${e}.ts`);try{if(await Bun.file(i).exists())return await Ut(i)}catch(s){console.error(`[orm] Failed to import framework default model ${e} from ${i} - trying next subdir. Reason:`,s)}}return null}var E={},Lt=()=>{},Ls=new Promise((e)=>{Lt=e});function g(e){return new Proxy(function(){},{get(n,t){if(t==="then")return;let r=E[e];if(r==null)return;let o=r[t];return typeof o==="function"?o.bind(r):o},set(n,t,r){let o=E[e];if(o==null)return!1;return o[t]=r,!0},has(n,t){let r=E[e];return r==null?!1:(t in r)},apply(n,t,r){let o=E[e];if(o==null||typeof o!=="function")return;return o.apply(t,r)}})}var Yr=g("User"),Xr=g("Job"),Zr=g("FailedJob"),eo=[["Team",[""],"auth"],["TeamInvitation",[""],"auth"],["TeamMember",[""],"auth"],["SocialAccount",[""],"auth"],["Subscriber",[""],"auth"],["SubscriberEmail",[""],"auth"],["Subscription",[""],"auth"],["Post",["Content"],"cms"],["Page",["Content"],"cms"],["PageRevision",["Content"],"cms"],["Redirect",["Content"],"cms"],["Menu",["Content"],"cms"],["MenuItem",["Content"],"cms"],["Author",["Content"],"cms"],["Comment",[""],"cms"],["Tag",[""],"cms"],["Site",[""],"auth"],["SiteDomain",[""],"auth"],["MagicLinkToken",[""],"auth"],["SmsOptOut",[""],"auth"],["Form",["Forms"],"forms"],["FormField",["Forms"],"forms"],["FormSubmission",["Forms"],"forms"],["Activity",[""],"dashboard"],["Board",[""],"dashboard"],["BoardColumn",[""],"dashboard"],["Card",[""],"dashboard"],["CardComment",[""],"dashboard"],["Deployment",[""],"dashboard"],["Label",[""],"dashboard"],["Release",[""],"dashboard"],["Notification",[""],"dashboard"],["NotificationDelivery",[""],"dashboard"],["MailPreference",[""],"dashboard"],["Log",[""],"dashboard"],["Request",[""],"dashboard"],["AnalyticsEvent",[""],"dashboard"],["QueryLog",[""],"dashboard"],["Error",[""],"monitoring"],["Websocket",["realtime"],"realtime"],["Campaign",[""],"marketing"],["CampaignSend",[""],"marketing"],["EmailList",[""],"marketing"],["EmailListSubscriber",[""],"marketing"],["EmailIdempotency",[""],"marketing"],["EmailSuppression",[""],"marketing"],["EmailWebhookEvent",[""],"marketing"],["SocialPost",[""],"marketing"],["Automation",[""],"marketing"],["AutomationRun",[""],"marketing"],["CampaignVariant",[""],"marketing"],["CommunicationSuppression",[""],"marketing"],["ConsentEvent",[""],"marketing"],["SenderDomain",[""],"marketing"],["UsageEvent",[""],"marketing"],["PaymentMethod",[""],"commerce"],["PaymentProduct",[""],"commerce"],["PaymentTransaction",[""],"commerce"],["Order",["commerce"],"commerce"],["OrderIdempotency",["commerce"],"commerce"],["OrderItem",["commerce"],"commerce"],["Cart",["commerce"],"commerce"],["CartItem",["commerce"],"commerce"],["Customer",["commerce"],"commerce"],["Product",["commerce"],"commerce"],["ProductVariant",["commerce"],"commerce"],["ProductUnit",["commerce"],"commerce"],["Manufacturer",["commerce"],"commerce"],["Category",["commerce"],"commerce"],["Coupon",["commerce"],"commerce"],["GiftCard",["commerce"],"commerce"],["LicenseKey",["commerce"],"commerce"],["Review",["commerce"],"commerce"],["Receipt",["commerce"],"commerce"],["PrintDevice",["commerce"],"commerce"],["ShippingMethod",["commerce"],"commerce"],["ShippingRate",["commerce"],"commerce"],["ShippingZone",["commerce"],"commerce"],["DeliveryRoute",["commerce"],"commerce"],["DeliveryStop",["commerce"],"commerce"],["DigitalDelivery",["commerce"],"commerce"],["Courier",["commerce"],"commerce"],["CourierPing",["commerce"],"commerce"],["TaxRate",["commerce"],"commerce"],["WaitlistProduct",["commerce"],"commerce"],["WaitlistRestaurant",["commerce"],"commerce"],["Auction",["commerce"],"commerce"],["AuctionItem",["commerce"],"commerce"],["Bid",["commerce"],"commerce"],["Pledge",["commerce"],"commerce"],["LoyaltyPoint",["commerce"],"commerce"],["LoyaltyReward",["commerce"],"commerce"],["Payment",["commerce"],"commerce"],["Transaction",["commerce"],"commerce"]];queueMicrotask(async()=>{try{let{feature:e}=await import("@stacksjs/config"),n=await ce("User");if(n)E.User=n;if(e("queue")){let t=await ce("Job");if(t)E.Job=t;let r=await ce("FailedJob");if(r)E.FailedJob=r}for(let[t,r,o]of eo){if(!e(o))continue;let a=await ce(t,r);if(a)E[t]=a}}catch(e){console.error("[orm] deferred model load failed:",e)}finally{Lt()}});var to=g("Activity"),no=g("AnalyticsEvent"),ro=g("Automation"),oo=g("AutomationRun"),ao=g("Auction"),io=g("CampaignVariant"),so=g("CommunicationSuppression"),uo=g("ConsentEvent"),co=g("SenderDomain"),lo=g("UsageEvent"),fo=g("AuctionItem"),po=g("Author"),mo=g("Bid"),go=g("Board"),yo=g("BoardColumn"),bo=g("Campaign"),wo=g("Card"),ho=g("CardComment"),To=g("Cart"),ko=g("CartItem"),_o=g("Category"),Ro=g("Comment"),So=g("Coupon"),Po=g("Customer"),xo=g("DeliveryRoute"),Ao=g("DeliveryStop"),Mo=g("Deployment"),Co=g("DigitalDelivery"),Oo=g("Courier"),vo=g("CourierPing"),Do=g("CampaignSend"),Eo=g("EmailList"),Fo=g("EmailListSubscriber"),$o=g("Form"),No=g("FormField"),jo=g("FormSubmission"),Bo=g("MagicLinkToken"),Io=g("Menu"),qo=g("MenuItem"),Ko=g("PageRevision"),Uo=g("Pledge"),Lo=g("Redirect"),Qo=g("Site"),Wo=g("SiteDomain"),Vo=g("SmsOptOut"),Ho=g("EmailIdempotency"),zo=g("EmailSuppression"),Go=g("EmailWebhookEvent"),Jo=g("Error"),Yo=g("GiftCard"),Xo=g("Label"),Zo=g("LicenseKey"),ea=g("Log"),ta=g("LoyaltyPoint"),na=g("LoyaltyReward"),ra=g("MailPreference"),oa=g("Manufacturer"),aa=g("Notification"),ia=g("NotificationDelivery"),sa=g("Order"),ua=g("OrderIdempotency"),ca=g("OrderItem"),la=g("Page"),da=g("Payment"),fa=g("PaymentMethod"),pa=g("PaymentProduct"),ma=g("PaymentTransaction"),ga=g("Post"),ya=g("PrintDevice"),ba=g("Product"),wa=g("ProductUnit"),ha=g("ProductVariant"),Ta=g("QueryLog"),ka=g("Receipt"),_a=g("Release"),Ra=g("Request"),Sa=g("Review"),Pa=g("ShippingMethod"),xa=g("ShippingRate"),Aa=g("ShippingZone"),Ma=g("SocialPost"),Ca=g("SocialAccount"),Oa=g("Subscriber"),va=g("SubscriberEmail"),Da=g("Subscription"),Ea=g("Tag"),Fa=g("TaxRate"),$a=g("Team"),Na=g("TeamInvitation"),ja=g("TeamMember"),Ba=g("Transaction"),Ia=g("WaitlistProduct"),qa=g("WaitlistRestaurant"),Ka=g("Websocket"),Qt={User:Yr,Job:Xr,FailedJob:Zr,Activity:to,AnalyticsEvent:no,Automation:ro,AutomationRun:oo,Auction:ao,AuctionItem:fo,Author:po,Bid:mo,Board:go,BoardColumn:yo,Campaign:bo,CampaignSend:Do,CampaignVariant:io,Card:wo,CardComment:ho,Cart:To,CartItem:ko,Category:_o,Comment:Ro,Coupon:So,Customer:Po,CommunicationSuppression:so,ConsentEvent:uo,DeliveryRoute:xo,DeliveryStop:Ao,Deployment:Mo,DigitalDelivery:Co,Courier:Oo,CourierPing:vo,EmailList:Eo,EmailListSubscriber:Fo,EmailIdempotency:Ho,EmailSuppression:zo,EmailWebhookEvent:Go,ErrorModel:Jo,Form:$o,FormField:No,FormSubmission:jo,GiftCard:Yo,Label:Xo,LicenseKey:Zo,Log:ea,LoyaltyPoint:ta,LoyaltyReward:na,MailPreference:ra,Manufacturer:oa,Notification:aa,MagicLinkToken:Bo,Menu:Io,MenuItem:qo,NotificationDelivery:ia,Order:sa,OrderIdempotency:ua,OrderItem:ca,Page:la,PageRevision:Ko,Payment:da,PaymentMethod:fa,PaymentProduct:pa,PaymentTransaction:ma,Pledge:Uo,Post:ga,PrintDevice:ya,Product:ba,ProductUnit:wa,ProductVariant:ha,QueryLog:Ta,Receipt:ka,Release:_a,Request:Ra,Review:Sa,ShippingMethod:Pa,Redirect:Lo,SenderDomain:co,ShippingRate:xa,ShippingZone:Aa,Site:Qo,SiteDomain:Wo,SmsOptOut:Vo,SocialAccount:Ca,SocialPost:Ma,Subscriber:Oa,SubscriberEmail:va,Subscription:Da,Tag:Ea,TaxRate:Fa,Team:$a,TeamInvitation:Na,TeamMember:ja,Transaction:Ba,UsageEvent:lo,WaitlistProduct:Ia,WaitlistRestaurant:qa,Websocket:Ka},K=globalThis;for(let[e,n]of Object.entries(Qt))if(n&&K[e]===void 0)K[e]=n;var Qs=Object.keys(Qt);async function Ua(e){if(!e)return[];try{if(typeof e.all==="function"){let n=await e.all();return Array.isArray(n)?n:[]}if(typeof e.get==="function"){let n=await e.get();return Array.isArray(n)?n:[]}}catch{}return[]}function La(e,n,t=""){if(!e)return t;try{if(typeof e.get==="function"){let o=e.get(n);if(o!==void 0&&o!==null)return o}}catch{}let r=e?.[n];return r!==void 0&&r!==null?r:t}if(K.safeAll===void 0)K.safeAll=Ua;if(K.safeGet===void 0)K.safeGet=La;export{to as Activity,no as AnalyticsEvent,ao as Auction,fo as AuctionItem,po as Author,ro as Automation,oo as AutomationRun,mo as Bid,go as Board,yo as BoardColumn,bo as Campaign,Do as CampaignSend,io as CampaignVariant,wo as Card,ho as CardComment,To as Cart,ko as CartItem,_o as Category,Ro as Comment,so as CommunicationSuppression,uo as ConsentEvent,So as Coupon,Oo as Courier,vo as CourierPing,Po as Customer,xo as DeliveryRoute,Ao as DeliveryStop,Mo as Deployment,Co as DigitalDelivery,Ho as EmailIdempotency,Eo as EmailList,Fo as EmailListSubscriber,zo as EmailSuppression,Go as EmailWebhookEvent,Jo as ErrorModel,Zr as FailedJob,$o as Form,No as FormField,jo as FormSubmission,Yo as GiftCard,Xr as Job,Xo as Label,Zo as LicenseKey,ea as Log,ta as LoyaltyPoint,na as LoyaltyReward,Le as MODEL_DEFINITION,Bo as MagicLinkToken,ra as MailPreference,oa as Manufacturer,qe as MassAssignmentException,Io as Menu,qo as MenuItem,Dt as ModelNotFoundError,Ct as ModelValidationError,aa as Notification,ia as NotificationDelivery,sa as Order,ua as OrderIdempotency,ca as OrderItem,la as Page,Ko as PageRevision,da as Payment,fa as PaymentMethod,pa as PaymentProduct,ma as PaymentTransaction,Uo as Pledge,ga as Post,ya as PrintDevice,ba as Product,wa as ProductUnit,ha as ProductVariant,Ta as QueryLog,ka as Receipt,Lo as Redirect,_a as Release,Ra as Request,Sa as Review,co as SenderDomain,Pa as ShippingMethod,xa as ShippingRate,Aa as ShippingZone,Qo as Site,Wo as SiteDomain,Vo as SmsOptOut,Ca as SocialAccount,Ma as SocialPost,Mn as SubqueryBuilder,Oa as Subscriber,va as SubscriberEmail,Da as Subscription,Ea as Tag,Fa as TaxRate,$a as Team,Na as TeamInvitation,ja as TeamMember,Ba as Transaction,lo as UsageEvent,Yr as User,Ia as WaitlistProduct,qa as WaitlistRestaurant,Ka as Websocket,Mi as batchLoad,Hr as buildDatabaseSchema,pe as collectEncryptedAttributes,Je as createAuditMethods,ke as createCategorizableMethods,we as createCommentableMethods,_e as createLikeableMethods,Te as createTaggableMethods,_n as customerOwnership,Di as db,fe as decryptValue,Ft as defineModel,de as encryptValue,Ne as enrichPaginatorUrls,Os as extendModel,ts as extractDate,Xi as extractFields,zi as fetchOtherModelRelations,pn as filterFillable,Ae as findCoreModel,Me as findUserModel,es as formatDate,Yi as getFillableAttributes,Ji as getGuardedAttributes,Gi as getHiddenAttributes,H as getModelName,On as getPivotTableName,Hi as getPivotTables,za as getPrunableConfig,Vi as getRelationCount,Wi as getRelationType,vn as getRelations,A as getTableName,fn as getWritableFields,Qi as hasRelations,jn as isCursorPaginator,U as isEncrypted,$n as isPaginator,Nn as isSimplePaginator,nt as isUniqueViolation,Zi as mapEntity,ln as mapWriteError,Ha as massPrunable,kr as mergeModelDefinition,Qs as modelGlobalNames,Li as modelTableName,Ls as ormReady,xn as parentOwnership,pt as parseCursor,Ue as projectDocumentsFromTrait,Wt as prunable,zr as renderDatabaseTypeFile,$e as resolveCursorArgs,Fe as resolvePageArgs,Ni as savepoint,Rn as selfOwnership,Zt as setAuditUser,Sn as siteOwnership,Pn as teamMembershipOwnership,gr as toAttrs,De as toCursorPaginator,Oe as toPaginator,ve as toSimplePaginator,dn as toSnakeCaseKeys,ns as toTimestamp,$i as transaction,ji as transactional,N as withoutEvents,Wn as withoutValidation};
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Replay `migrationsDir` into an in-memory database and report the shape of
3
+ * every table it creates.
4
+ *
5
+ * Non-fatal throughout: a corpus that cannot be replayed at all yields no
6
+ * tables and the model-derived schema stands, which is what shipped before
7
+ * this existed.
8
+ */
9
+ export declare function deriveMigrationTables(migrationsDir: string, dialect?: MigrationDialect): DeriveMigrationTablesResult;
10
+ export declare interface MigrationTable {
11
+ table: string
12
+ columns: Record<string, string>
13
+ }
14
+ export declare interface DeriveMigrationTablesResult {
15
+ tables: MigrationTable[]
16
+ errors: Array<{ file: string, error: string }>
17
+ }
18
+ export type MigrationDialect = 'sqlite' | 'mysql' | 'postgres';
@@ -7,6 +7,11 @@ export default defineModel({
7
7
  primaryKey: 'id',
8
8
  autoIncrement: true,
9
9
 
10
+ // An infrastructure table: rows are written by the system, not on behalf of a
11
+ // caller, so no row has a per-caller owner to scope by. Writes are gated by
12
+ // `middleware` instead. Declared rather than left silent (stacksjs/stacks#2375).
13
+ ownership: false,
14
+
10
15
  traits: {
11
16
  useUuid: true,
12
17
  useTimestamps: true,