@stacksjs/orm 0.75.41 → 0.75.42

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 (57) hide show
  1. package/dist/define-model.d.ts +8 -0
  2. package/dist/gdpr/engine.d.ts +82 -0
  3. package/dist/gdpr/index.d.ts +20 -0
  4. package/dist/gdpr/models.d.ts +9 -0
  5. package/dist/gdpr/plan.d.ts +12 -0
  6. package/dist/gdpr/register.d.ts +30 -0
  7. package/dist/gdpr/types.d.ts +88 -0
  8. package/dist/index.d.ts +5 -0
  9. package/dist/index.js +16 -11
  10. package/dist/model-registry.js +1 -1
  11. package/dist/models/Activity.ts +2 -0
  12. package/dist/models/CampaignSend.ts +2 -0
  13. package/dist/models/Card.ts +1 -0
  14. package/dist/models/CardComment.ts +1 -0
  15. package/dist/models/Comment.ts +5 -0
  16. package/dist/models/CommunicationSuppression.ts +2 -1
  17. package/dist/models/ConsentEvent.ts +4 -3
  18. package/dist/models/Content/Author.ts +5 -0
  19. package/dist/models/EmailListSubscriber.ts +1 -0
  20. package/dist/models/EmailSuppression.ts +2 -0
  21. package/dist/models/Forms/FormSubmission.ts +5 -0
  22. package/dist/models/GdprRequest.ts +77 -0
  23. package/dist/models/MagicLinkToken.ts +2 -0
  24. package/dist/models/Notification.ts +2 -0
  25. package/dist/models/NotificationDelivery.ts +4 -0
  26. package/dist/models/PaymentMethod.ts +5 -0
  27. package/dist/models/PaymentTransaction.ts +1 -0
  28. package/dist/models/PersonalAccessToken.ts +3 -0
  29. package/dist/models/Referral.ts +4 -1
  30. package/dist/models/ReferralCode.ts +4 -1
  31. package/dist/models/Request.ts +3 -0
  32. package/dist/models/SmsOptOut.ts +2 -0
  33. package/dist/models/SocialAccount.ts +3 -0
  34. package/dist/models/SocialPost.ts +2 -0
  35. package/dist/models/StorageItemTask.ts +14 -8
  36. package/dist/models/Subscriber.ts +2 -0
  37. package/dist/models/SubscriberEmail.ts +2 -0
  38. package/dist/models/Subscription.ts +1 -0
  39. package/dist/models/TeamInvitation.ts +2 -0
  40. package/dist/models/TeamMember.ts +1 -0
  41. package/dist/models/User.ts +5 -0
  42. package/dist/models/commerce/Bid.ts +3 -0
  43. package/dist/models/commerce/Cart.ts +2 -0
  44. package/dist/models/commerce/Courier.ts +7 -0
  45. package/dist/models/commerce/CourierPing.ts +3 -0
  46. package/dist/models/commerce/Customer.ts +5 -0
  47. package/dist/models/commerce/DeliveryStop.ts +7 -0
  48. package/dist/models/commerce/GiftCard.ts +4 -0
  49. package/dist/models/commerce/Order.ts +5 -0
  50. package/dist/models/commerce/OrderItem.ts +2 -0
  51. package/dist/models/commerce/Payment.ts +5 -0
  52. package/dist/models/commerce/Pledge.ts +3 -0
  53. package/dist/models/commerce/Transaction.ts +2 -0
  54. package/dist/models/commerce/WaitlistProduct.ts +5 -0
  55. package/dist/models/commerce/WaitlistRestaurant.ts +4 -0
  56. package/dist/routes.js +1 -1
  57. package/package.json +24 -24
package/dist/index.js CHANGED
@@ -1,22 +1,27 @@
1
1
  // @bun
2
- var tn=import.meta.require;import"@stacksjs/validation";import{log as ce}from"@stacksjs/cli";import{db as Be,mutationCount as Ne}from"@stacksjs/database/runtime";async function nn(e,n={}){let{olderThanDays:t=30,column:r="created_at",query:o}=n;try{if(o){let u=Be.deleteFrom(e);u=o(u);let c=Ne(await u.execute());return ce.info(`Pruned ${c} records from ${e}`),c}let a=new Date;a.setDate(a.getDate()-t);let i=await Be.deleteFrom(e).where(r,"<",a.toISOString()).execute(),s=Ne(i);return ce.info(`Pruned ${s} records from ${e} older than ${t} days`),s}catch(a){throw ce.error(`Failed to prune ${e}:`,a),a}}async function ki(e,n={}){return nn(e,n)}function Ti(e){if(!e?.prunable)return null;if(typeof e.prunable==="boolean")return{olderThanDays:30,column:"created_at"};return e.prunable}import{createCipheriv as rn,createDecipheriv as on,createHash as an,randomBytes as sn}from"crypto";import{log as G}from"@stacksjs/logging";var qe="enc:",Le="aes-256-gcm",un=12,H=null;async function Ue(){if(H)return H;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 H=an("sha256").update(e).digest(),H}function N(e){return typeof e==="string"&&e.startsWith(qe)}async function le(e){if(e==null)return e;if(N(e))return e;if(typeof e!=="string")return e;let n=await Ue();if(!n)return G.warn("[orm] encrypted attribute: APP_KEY not set - storing value in plaintext"),e;let t=sn(un),r=rn(Le,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 de(e){if(e==null)return e;if(typeof e!=="string")return e;if(!N(e))return e;try{let n=await Ue();if(!n)return G.warn("[orm] encrypted attribute: APP_KEY not set - cannot decrypt"),null;let[,t,r,o]=e.split(":");if(!t||!r||!o)return G.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"),u=on(Le,n,a);return u.setAuthTag(i),Buffer.concat([u.update(s),u.final()]).toString("utf8")}catch(n){return G.warn("[orm] encrypted attribute: decrypt failed (key rotation? corrupted ciphertext?)",{error:n}),null}}function fe(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 cn}from"@stacksjs/database/runtime";import{log as E}from"@stacksjs/logging";var ln=[/^password$/i,/^password_hash$/i,/^api_key$/i,/_token$/i,/_secret$/i,/^remember_token$/i],We="model_audits",pe=null;function dn(e){pe=e}async function J(){if(pe!=null)return pe;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 q(e){if(!e||typeof e!=="object")return null;let n={};for(let[t,r]of Object.entries(e)){if(ln.some((o)=>o.test(t)))continue;n[t]=r}return n}function D(e){if(!e||typeof e!=="object")return null;let n=e;if(n._attributes&&typeof n._attributes==="object")return{...n._attributes};return{...e}}function fn(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 Y(e,n=!1){try{let{db:t}=await import("@stacksjs/database/runtime");await t.insertInto(We).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:cn()}).executeTakeFirst()}catch(t){if(E.warn(`[orm] audit row write failed for ${e.auditable_type}#${String(e.auditable_id)} (${e.event})`,{error:t}),n)throw t}}function Ve(e){return{async audits(n){try{let{db:t}=await import("@stacksjs/database/runtime");return(await t.selectFrom(We).selectAll().where("auditable_type","=",e).where("auditable_id","=",n).orderBy("created_at","desc").execute()??[]).map((o)=>({...o,old_values:typeof o.old_values==="string"?Ke(o.old_values):o.old_values,new_values:typeof o.new_values==="string"?Ke(o.new_values):o.new_values}))}catch(t){return E.warn(`[orm] audits() lookup failed for ${e}#${String(n)}`,{error:t}),[]}}}}function Ke(e){try{return JSON.parse(e)}catch{return e}}function Qe(e){if(e&&typeof e==="object"&&"transactional"in e)return{transactional:e.transactional===!0};return{transactional:!1}}function ze(e,n,t="id",r={}){let o=r.transactional===!0,a=e;if(typeof e.audits!=="function")e.audits=Ve(n).audits;let i=async(f)=>{if(!o)return await f();let{db:d}=await import("@stacksjs/database/runtime");return await d.transaction(async()=>f())},s=e.create;if(typeof s==="function")e.create=async function(...f){return await i(async()=>{let d=await s.apply(this,f);try{let p=D(d),m=p?.[t];if(m!=null){let g=await J();await Y({auditable_type:n,auditable_id:m,event:"created",old_values:null,new_values:q(p),user_id:g},o)}}catch(p){if(E.warn(`[orm] audit(create) failed for ${n}`,{error:p}),o)throw p}return d})};let u=e.createMany;if(typeof u==="function")e.createMany=async function(...f){return await i(async()=>{let d=await u.apply(this,f);try{let p=Array.isArray(d)&&d.length?await J():null;for(let m of Array.isArray(d)?d:[]){let g=D(m),w=g?.[t];if(w==null)continue;await Y({auditable_type:n,auditable_id:w,event:"created",old_values:null,new_values:q(g),user_id:p},o)}}catch(p){if(E.warn(`[orm] audit(createMany) failed for ${n}`,{error:p}),o)throw p}return d})};let c=e.update;if(typeof c==="function")e.update=async function(f,d){return await i(async()=>{let p=a.find,m=typeof p==="function"?D(await p.call(a,f)):null,g=await c.call(this,f,d);try{let w=D(g)??(typeof p==="function"?D(await p.call(a,f)):null),{old:b,next:h}=fn(m,w);if(h&&Object.keys(h).length>0){let k=await J();await Y({auditable_type:n,auditable_id:f,event:"updated",old_values:q(b),new_values:q(h),user_id:k},o)}}catch(w){if(E.warn(`[orm] audit(update) failed for ${n}#${String(f)}`,{error:w}),o)throw w}return g})};let l=(f)=>{let d=e[f];if(typeof d!=="function")return;e[f]=async function(p){return await i(async()=>{let m=a.find,g=typeof m==="function"?D(await m.call(a,p)):null,w=await d.call(this,p);try{if(w!==!1&&g){let b=await J();await Y({auditable_type:n,auditable_id:p,event:"deleted",old_values:q(g),new_values:null,user_id:b},o)}}catch(b){if(E.warn(`[orm] audit(${f}) failed for ${n}#${String(p)}`,{error:b}),o)throw b}return w})}};l("delete"),l("softDelete")}import{db as pn,sql as mn,sqlDateTime as me}from"@stacksjs/database/runtime";function A(e,n){if(typeof e!=="number"||!Number.isFinite(e)||e<=0)throw Error(`[orm/commentable] ${n} requires a positive numeric id (received ${String(e)})`)}var L="commentable_upvotes",U="commentables";function yn(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??"")}var He=["pending","approved"];function ye(e){let n=pn;return{async comments(t){return A(t,"comments"),await n.selectFrom("commentables").where("commentables_id","=",t).where("commentables_type","=",e).selectAll().orderBy("id","asc").execute()},async commentCount(t){let r=await n.selectFrom("commentables").select(mn`count(*) as count`).where("commentables_id","=",t).where("commentables_type","=",e).executeTakeFirst();return Number(r?.count)||0},async addComment(t,r,o={}){if(A(t,"addComment"),!r||typeof r.body!=="string"||r.body.trim().length===0)throw Error("[orm/commentable] addComment requires a non-empty comment.body");if(r.title!=null&&typeof r.title!=="string")throw Error("[orm/commentable] addComment requires comment.title to be a string when given");let a=o.status??"pending";if(!He.includes(a))throw Error(`[orm/commentable] addComment status must be one of ${He.join(", ")} (received ${String(a)})`);let i={title:r.title?.trim()??"",body:r.body,commentables_id:t,commentables_type:e,status:a,approved_at:a==="approved"?Date.now():null,created_at:me(),updated_at:me()};for(let c of["author_name","author_email","user_id"])if(r[c]!=null)i[c]=r[c];let s=await n.insertInto("commentables").values(i).returningAll().executeTakeFirst();if(s&&typeof s==="object"&&"id"in s)return s;let u=s?.lastInsertRowid;if(u==null)return s;return await n.selectFrom("commentables").where("id","=",Number(u)).selectAll().executeTakeFirst()},async approvedComments(t){return await n.selectFrom("commentables").where("commentables_id","=",t).where("commentables_type","=",e).where("status","=","approved").selectAll().orderBy("id","asc").execute()},async pendingComments(t){return await n.selectFrom("commentables").where("commentables_id","=",t).where("commentables_type","=",e).where("status","=","pending").selectAll().orderBy("id","asc").execute()},async rejectedComments(t){return await n.selectFrom("commentables").where("commentables_id","=",t).where("commentables_type","=",e).where("status","=","rejected").selectAll().orderBy("id","asc").execute()},async upvoteComment(t,r){A(t,"upvoteComment"),A(r,"upvoteComment");let o=()=>n.selectFrom(L).where("upvoteable_id","=",t).where("upvoteable_type","=",U).where("user_id","=",r).selectAll().executeTakeFirst(),a=await o();if(a)return a;try{await n.insertInto(L).values({upvoteable_id:t,upvoteable_type:U,user_id:r,created_at:me()}).execute()}catch(i){if(!yn(i))throw i}return await o()},async removeCommentUpvote(t,r){A(t,"removeCommentUpvote"),A(r,"removeCommentUpvote"),await n.deleteFrom(L).where("upvoteable_id","=",t).where("upvoteable_type","=",U).where("user_id","=",r).execute()},async commentUpvoteCount(t){A(t,"commentUpvoteCount");let r=await n.selectFrom(L).select("count(*) as count").where("upvoteable_id","=",t).where("upvoteable_type","=",U).executeTakeFirst();return Number(r?.count)||0},async hasUpvotedComment(t,r){return A(t,"hasUpvotedComment"),A(r,"hasUpvotedComment"),!!await n.selectFrom(L).where("upvoteable_id","=",t).where("upvoteable_type","=",U).where("user_id","=",r).selectAll().executeTakeFirst()}}}import{db as gn,sql as wn,sqlDateTime as Ge}from"@stacksjs/database/runtime";function ge(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 we(e){let n=gn;return{async tags(t){return ge(t,"tags"),await n.selectFrom("taggables").where("taggable_id","=",t).where("taggable_type","=",e).selectAll().execute()},async tagCount(t){ge(t,"tagCount");let r=await n.selectFrom("taggables").select(wn`count(*) as count`).where("taggable_id","=",t).where("taggable_type","=",e).executeTakeFirst();return Number(r?.count)||0},async addTag(t,r){if(ge(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:Ge(),updated_at:Ge()}).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 bn,sqlDateTime as X}from"@stacksjs/database/runtime";function be(e){let n=bn;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:X(),updated_at:X()}).execute(),i=await a();return await n.insertInto("categorizable_models").values({categorizable_id:r,categorizable_type:e,category_id:i?.id,created_at:X(),updated_at:X()}).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 hn,sqlDateTime as kn}from"@stacksjs/database/runtime";function he(e,n){let t=hn,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=kn();try{return await t.insertInto(r).values({[o]:a,user_id:i,created_at:s,updated_at:s}).returningAll().executeTakeFirst()}catch(u){let c=u;if(!(c.code==="SQLITE_CONSTRAINT_UNIQUE"||c.code==="SQLITE_CONSTRAINT"||c.code==="23505"||c.errno===1062||/unique|duplicate/i.test(c.message??"")))throw u;let f=await t.selectFrom(r).where(o,"=",a).where("user_id","=",i).selectAll().executeTakeFirst();if(f)return f;throw u}},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)}}}import{createRequire as Tn}from"module";import{db as _n}from"@stacksjs/database/runtime";var Rn=Tn(import.meta.url);class ke extends Error{constructor(e){super(`No subscription ${e} belongs to this user`);this.name="SubscriptionNotOwnedError"}}function Je(e){let n=_n;return{async syncStripeCustomerDetails(t,r){let{manageCustomer:o}=await import("@stacksjs/payments");return await o.syncStripeCustomerDetails(t,r)},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 typeof r==="string"?await o.setUserDefaultPayment(t,r):await o.setDefaultPaymentMethod(t,r)},async deletePaymentMethod(t,r){let{managePaymentMethod:o}=await import("@stacksjs/payments");return await o.deletePaymentMethod(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),c=s.latest_invoice?.payment_intent;return{subscription:s,paymentIntent:c}},async updateSubscription(t,r,o,a={}){let{manageSubscription:i}=await import("@stacksjs/payments"),s=await i.update(t,r,o,a),c=s.latest_invoice?.payment_intent;return{subscription:s,paymentIntent:c}},async cancelSubscription(t,r,o={}){if(!await n.selectFrom("subscriptions").where("provider_id","=",r).where("user_id","=",t.id).select(["id"]).executeTakeFirst())throw new ke(r);let{manageSubscription:i}=await import("@stacksjs/payments");return{subscription:await i.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 createPayment(t,r,o={}){let{manageCharge:a}=await import("@stacksjs/payments");return await a.createPayment(t,r,o)},async storeTransaction(t,r,o){let{manageTransaction:a}=await import("@stacksjs/payments");return await a.store(t,r,o)},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 K();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 K();if(!i){let{stacksIdempotencyKey:u}=await import("@stacksjs/payments"),c=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:u("connect.account.create",c,a.id)});return i=l.id,await n.updateTable(c).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 K()).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,u=s[o];if(!u)return{chargesEnabled:!1,payoutsEnabled:!1};let l=await(await K()).accounts.retrieve(u),f=!!l.charges_enabled,d=!!l.payouts_enabled,p=r.modelTable||e;return await n.updateTable(p).set({[a]:f,[i]:d}).where("id","=",Number(s.id)).execute(),{chargesEnabled:f,payoutsEnabled:d}},async chargeWithSplit(t,r){let o=await K(),a=r.accountColumn||"stripe_account_id",i=t._attributes??t,s=r.connectAccountId||i[a],u={amount:r.amountCents,currency:r.currency||"usd",automatic_payment_methods:{enabled:!0},metadata:r.metadata};if(s){if(u.transfer_data={destination:s},r.platformFeeCents)u.application_fee_amount=r.platformFeeCents}let{freshIdempotencyKey:c}=await import("@stacksjs/payments");return await o.paymentIntents.create(u,{idempotencyKey:c("payment_intent.create",i.id,r.amountCents)})}}}var Sn={syncStripeCustomerDetails:!0,createStripeUser:!0,updateStripeUser:!0,deleteStripeUser:!0,createOrGetStripeUser:!0,retrieveStripeUser:!0,defaultPaymentMethod:!0,setDefaultPaymentMethod:!0,deletePaymentMethod:!0,addPaymentMethod:!0,paymentMethods:!0,newSubscription:!0,updateSubscription:!0,cancelSubscription:!0,activeSubscription:!0,checkout:!0,createSetupIntent:!0,createPayment:!0,storeTransaction:!0,subscriptionHistory:!0,transactionHistory:!0,connectAccount:!0,createConnectAccount:!0,connectOnboardLink:!0,syncConnectStatus:!0,chargeWithSplit:!0},Z=Object.freeze(Object.keys(Sn));function An(e){return Z.every((n)=>typeof Reflect.get(e,n)==="function")}function K(){let e=globalThis.process?.env?.STRIPE_SECRET_KEY;if(!e)throw Error("Stripe Connect: STRIPE_SECRET_KEY not configured");let n;try{n=Rn("stripe")}catch{throw Error("Stripe Connect is being used but the `stripe` package is not installed. It is an opt-in dependency - run `bun add stripe` to enable Stripe Connect.")}return new n(e,{apiVersion:n.API_VERSION})}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 Pn(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){let n=!1;for(let r=0;r<e.length;r++){let o=e.charCodeAt(r);if(o>127)return e.replace(/([a-z\d])([A-Z])/g,"$1_$2").replace(/([A-Z])([A-Z][a-z])/g,"$1_$2").toLowerCase();if(o>=65&&o<=90)n=!0}if(!n)return e;let t="";for(let r=0;r<e.length;r++){let o=e.charCodeAt(r);if(o<65||o>90){t+=e[r];continue}let a=r>0?e.charCodeAt(r-1):0,i=r+1<e.length?e.charCodeAt(r+1):0,s=a>=97&&a<=122||a>=48&&a<=57,u=a>=65&&a<=90&&i>=97&&i<=122;if(r>0&&(s||u))t+="_";t+=String.fromCharCode(o+32)}return t}function xn(e){let n={};for(let[t,r]of Object.entries(e))n[R(t)]=r;return n}function qi(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 Li(e){return e?.ownership===!1}function Ui(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 Cn(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 vn(e,n){if(!e||n.length===0)return{};let t={},r;for(let o of n){if(o in e){t[o]=e[o];continue}r??=Mn(n);let a=r.get(o);if(a!==o&&a in e)t[o]=e[a]}return t}function On(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}var Ye=new WeakMap,Xe=new WeakMap;function _e(e){let n=Ye.get(e);if(n&&n.length===e.length){let r=!0;for(let o=0;o<e.length;o++)if(n[o]?.field!==e[o]){r=!1;break}if(r)return n}let t=e.map((r)=>({field:r,snake:R(r)}));return Ye.set(e,t),t}function Mn(e){let n=_e(e),t=Xe.get(n);if(t)return t;let r=new Map(n.map(({field:o,snake:a})=>[o,a]));return Xe.set(n,r),r}function Ki(e,n){if(!n.length)return e;let t={...e};for(let{field:r,snake:o}of _e(n))if(delete t[r],o!==r)delete t[o];return t}function Wi(e,n){if(!e||n.length===0)return e;let t={...e};for(let{field:r,snake:o}of _e(n))if(delete t[r],o!==r)delete t[o];return t}var Dn=["id","uuid","created_at","updated_at","deleted_at"];function Vi(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 Qi(e,n,t){if(!n)return e;let r=e;for(let o of String(n).split(",")){let a=o.trim();if(!a)continue;let i=a.startsWith("-"),s=i?a.slice(1):a;if(!/^\w+$/.test(s))continue;let u=t.get(s);if(!u)continue;r=r.orderBy(u,i?"desc":"asc")}return r}var En={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"?In(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"?$n(e):[],set:(e)=>e==null?null:Array.isArray(e)?JSON.stringify(e):e}},Ze=new WeakMap;function Fn(e,n){let t=Ze.get(e);if(t&&t.length===n.length){let o=!0;for(let a=0;a<n.length;a++){let i=n[a];if(t[a]?.attr!==i||t[a]?.definition!==e[i]){o=!1;break}}if(o)return t}let r=[];for(let o of n){let a=e[o],i=typeof a==="string"?En[a]:a;r.push({attr:o,snake:R(o),definition:a,caster:i})}return Ze.set(e,r),r}function In(e){try{return JSON.parse(e)}catch{return e}}function $n(e){try{return JSON.parse(e)}catch{return[]}}function zi(e,n,t){if(!e||typeof e!=="object"||!n)return e;let r=Object.keys(n);if(r.length===0)return e;let o=Fn(n,r);if(o.length===0)return e;let a={...e};for(let{attr:i,caster:s,snake:u}of o){if(!s)continue;let c=s[t];if(typeof c!=="function")continue;if(Object.prototype.hasOwnProperty.call(a,i))a[i]=c.call(s,a[i]);if(u!==i&&Object.prototype.hasOwnProperty.call(a,u))a[u]=c.call(s,a[u])}return a}var et=new WeakMap;function jn(e){let n=et.get(e);if(n)return n;let t=[];for(let[r,o]of Object.entries(e)){let a=o?.validation?.rule;if(!a||typeof a.validate!=="function")continue;t.push({definition:o,field:r,hasDefault:o!==null&&typeof o==="object"&&Object.prototype.hasOwnProperty.call(o,"default"),rule:a})}return et.set(e,t),t}function at(e){let n=e?.attributes;if(!n||typeof n!=="object")return!1;for(let t of Object.values(n)){let r=t?.validation?.rule;if(r&&typeof r.validate==="function")return!0}return!1}function it(e,n,t){let r=n?.attributes;if(!r||typeof r!=="object")return{valid:!0};let o=jn(r);if(o.length===0)return{valid:!0};let a={},i=!1;for(let s of o){let{definition:u,field:c,hasDefault:l,rule:f}=s,d=Object.prototype.hasOwnProperty.call(e,c);if(!d&&t==="updating")continue;let p=d?e[c]:l?u.default:void 0,m=On(f,p),g=f.validate(m);if(!g?.valid&&Array.isArray(g?.errors)&&g.errors.length>0)i=!0,a[c]=g.errors.map((w)=>u.validation?.message?.[w?.code]??w?.message??"invalid")}return i?{valid:!1,errors:a}:{valid:!0}}function Bn(e,n){return`${e}\x00${Nn(n)}`}function Hi(e){let n=new Map;for(let t of e){let r=Bn(String(t.method??""),String(t.path??""));if(!n.has(r))n.set(r,t)}return n}function Nn(e){return e.replace(/\{[^}]*\}/g,"{}").replace(/:[^/]+/g,"{}")}function Te(e){if(Array.isArray(e))return e.filter((n)=>typeof n==="string"&&n.length>0);return typeof e==="string"&&e?[e]:[]}function Gi(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?Te(o.read):["auth"],write:"write"in o?Te(o.write):["auth"],declared:!0}}let r=Te(t);return{read:r,write:r,declared:!0}}var tt=15,qn=100;function Ji(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,qn);return{page:t,perPage:o,offset:(t-1)*o}}function ee(e,n){let t=new URL(e.toString());return t.searchParams.set("page",String(n)),`${t.pathname}${t.search}`}function Ln(e,n,t,r,o,a){let i=(n-1)*t,s=r===0,u={page:n,per_page:t,from:s?null:i+1,to:s?null:i+r,has_more_pages:o,prev_page_url:n>1?ee(e,n-1):null,next_page_url:o?ee(e,n+1):null};if(a!==void 0&&!Number.isNaN(a)){let c=Math.max(1,Math.ceil(a/t));u.total=a,u.last_page=c,u.first_page_url=ee(e,1),u.last_page_url=ee(e,c)}return u}function Yi(e,n,t,r,o,a){let{page:i,...s}=Ln(e,n,t,r,o,a);return{current_page:i,...s}}function Xi(e,n){return(n??e??"").toString().trim().toLowerCase()==="warn"?"warn":"deny"}function Zi(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 Un(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(Re(o))}};let t=ot(e);if(t)return{field:t,resolve:async(r)=>r?.id??null};return null}function Re(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 Kn(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 Wn(e="id"){return{field:e,resolve:async(n)=>n?.id??null}}function Vn(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(Re(t));if(a==null)return[];return(await o.where("team_id",a).get()??[]).map((s)=>s.id).filter((s)=>s!=null)}catch{return[]}}}}function Qn(e="id"){return{field:e,resolve:async(n,t)=>{try{let{resolveAuthenticatedTeamId:r}=await import("@stacksjs/auth");return await r(Re(t))}catch{return null}}}}function zn(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=Un(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 u=o[e];if(!u)return[];return((Array.isArray(s)?await u.whereIn(i.field,s).get():await u.where(i.field,s).get())??[]).map((l)=>l.id).filter((l)=>l!=null)}catch{return[]}}}}import{getCurrentRequest as Hn}from"@stacksjs/router";var st=new WeakMap;function ut(e){let n=new Map;for(let t of e){let r=t?.id;if(r!==void 0)n.set(r,t)}return n}async function Gn(e,n){if(typeof e.find==="function")return e.find(n);let t=await e.findMany?.([n]);return ut(t??[]).get(n)}async function Jn(e,n,t){n.pending=void 0;try{let r=typeof e.findMany==="function"?await e.findMany(t.keys):await Promise.all(t.keys.map((a)=>e.find?.(a))),o=ut(r??[]);for(let a of t.resolvers)a.resolve(o.get(a.key))}catch(r){for(let o of t.resolvers)o.reject(r)}}function os(e,n){let t=Hn();if(!t)return Gn(e,n);let r=st.get(t);if(!r)r=new WeakMap,st.set(t,r);let o=r.get(e);if(!o)o={cache:new Map},r.set(e,o);let a=o.cache.get(n);if(a)return a.then();let i=o.pending;if(!i){i={keys:[],resolvers:[]},o.pending=i;let c=i,l=o;queueMicrotask(()=>{Jn(e,l,c)})}let s=new Promise((c,l)=>{i.keys.push(n),i.resolvers.push({key:n,resolve:c,reject:l})});o.cache.set(n,s);let u=o.cache;return s.catch(()=>u.delete(n)),s.then()}import{db as us}from"@stacksjs/database/runtime";class Yn{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}from"@stacksjs/database/runtime";async function ds(e,n){return await Se.transaction(e,n)}async function fs(e){return await Se.savepoint(e)}function ps(e,n){return Se.transactional(e,n)}export*from"@stacksjs/model-meta";import{createModel as lr,registerModel as dr}from"@stacksjs/query-builder";import{log as T}from"@stacksjs/logging/runtime";import{snakeCase as Q}from"@stacksjs/strings";import{AsyncLocalStorage as Ft}from"async_hooks";import{toCursorPaginator as fr,toPaginator as pr,toSimplePaginator as mr}from"@stacksjs/pagination";function Pe(e,n){let t=ve(),r=t?Ae(t,"per_page"):void 0,o=t?Ae(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 xe(e,n){let t=ve(),r=t?lt(t,"cursor"):void 0,o=t?Ae(t,"per_page"):void 0,a=e!==void 0?Math.max(1,Math.floor(e)):Math.min(100,Math.max(1,o??15)),s=ct(n!==void 0?n:r??null);return{perPage:a,cursor:s}}function ct(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 Ce(e){let n=ve();if(!n)return e;let t=(()=>{try{return new URL(n.url)}catch{return null}})();if(!t)return e;let r=t.pathname;if(e.path=r,"next_cursor"in e)return e.next_page_url=e.next_cursor!==null?v(t,{cursor:e.next_cursor}):null,e.prev_page_url=e.prev_cursor!==null?v(t,{cursor:e.prev_cursor}):null,e;let o=e.current_page;if(e.prev_page_url=o>1?v(t,{page:o-1}):null,"total"in e){let a=e.last_page;e.next_page_url=o<a?v(t,{page:o+1}):null,e.first_page_url=v(t,{page:1}),e.last_page_url=v(t,{page:a})}else e.next_page_url=e.has_more_pages?v(t,{page:o+1}):null;return e}function v(e,n){let t=new URL(e.toString());for(let[r,o]of Object.entries(n))t.searchParams.set(r,String(o));return`${t.pathname}${t.search}`}var F;function ve(){if(F===null)return;if(F===void 0)try{let n=tn("@stacksjs/router");if(typeof n.getCurrentRequest==="function")F=n.getCurrentRequest;else{F=null;return}}catch{F=null;return}return F()}function Ae(e,n){let t=lt(e,n);if(t===void 0)return;let r=Number(t);return Number.isFinite(r)?r:void 0}function lt(e,n){let t=e.query?.[n];if(t===void 0)return;return Array.isArray(t)?t[0]:t}function dt(){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:u}=await import("@stacksjs/error-handling");throw new u(429,"Too many verification attempts. Please try again later.")}if(!await r(n,t))return await o.recordFailedAttempt(i),!1;try{let{cache:u}=await import("@stacksjs/cache"),c=`2fa:used:${a}:${n}`;if(await u.has(c))return await o.recordFailedAttempt(i),!1;await u.set(c,"1",90)}catch{}return await o.resetAttempts(i),!0}}}import{mutationCount as Xn,sqlDateTime as Zn}from"@stacksjs/database/runtime";import{log as I}from"@stacksjs/logging";var te="deleted_at";function ft(e,n="id"){return{async softDelete(t){let r=Zn(),o=e.where(n,t);if(typeof o?.update==="function")return await o.update({[te]:r}),!0;return!1},async restore(t){let r=e.where(n,t).withTrashed();if(typeof r?.update==="function")return await r.update({[te]:null}),!0;return!1},async forceDelete(t){let r=e.where(n,t),o=typeof r?.withTrashed==="function"?r.withTrashed():r;if(typeof o?.forceDelete==="function")return Xn(await o.forceDelete())>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(te);return t?.where?.(te,"!=",null)??t}}}function pt(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 er(e,n){let t=e.hasMany??[],r=e.hasOne??[],o=t.some((l)=>Oe(l,n,!0)),a=r.some((l)=>Oe(l,n,!1));if(!o&&!a)return I.warn(`[orm] soft-delete cascade: '${n}' is not a declared hasMany/hasOne relation - skipping`),null;let s=(o?t:r).find((l)=>Oe(l,n,o))??null;if(!s)return null;let c=globalThis[s];if(!c)return I.warn(`[orm] soft-delete cascade: model '${s}' is not yet on globalThis - skipping cascade for '${n}'`),null;return{className:s,model:c}}function Oe(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 tr(e,n,t,r,o){try{let a=t.where;if(typeof a!=="function"){I.warn(`[orm] cascade ${o}: child model has no .where()`);return}if(o==="softDelete"){let i=t.softDelete;if(typeof i==="function"){let u=a.call(t,r,n),c=typeof u?.get==="function"?await u.get():Array.isArray(u)?u:[],l=t.primaryKey||"id";for(let f of c){let d=f?.[l];if(d!=null)await i.call(t,d)}return}let s=a.call(t,r,n);if(typeof s?.delete==="function"){I.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"){I.debug("[orm] cascade restore: child has no restore() - nothing to do");return}let s=t.withTrashed,c=(typeof s==="function"?s.call(t):t).where?.(r,n),l=typeof c?.get==="function"?await c.get():[],f=t.primaryKey||"id";for(let d of l){let p=d?.[f];if(p!=null)await i.call(t,p)}}}catch(a){if(I.warn(`[orm] soft-delete cascade ${o} on ${e}#${String(n)} failed`,{error:a}),process.env.STACKS_ORM_CASCADE_SWALLOW!=="true")throw a}}async function W(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=er(e,i);if(!s)continue;await tr(s.className,t,s.model,a,r)}}import{sqlDateTime as or}from"@stacksjs/database/runtime";import{log as nr}from"@stacksjs/logging";var rr=[/^password$/i,/^password_hash$/i,/^api_key$/i,/_token$/i,/_secret$/i,/^remember_token$/i],mt=null;async function yt(){if(mt!=null)return mt;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();return t?.user?.id??t?._user?.id??null}catch{return null}}async function gt(){try{let n=(await import("@stacksjs/router").catch(()=>null))?.getCurrentRequest;if(typeof n!=="function")return null;let t=n();return typeof t?.ip==="function"?t.ip()??null:null}catch{return null}}function wt(e){if(!e||typeof e!=="object")return null;let n={};for(let[t,r]of Object.entries(e)){if(rr.some((o)=>o.test(t)))continue;n[t]=r}return n}function bt(e,n,t){nr.warn(`[orm] ${e} row write failed for ${n}: ${t?.message??String(t)}`)}var ar="activities";function ht(e){if(!e)return null;if(e===!0)return{};if(typeof e!=="object")return null;let n=e;return{logOnly:Array.isArray(n.logOnly)?n.logOnly:void 0,include:Array.isArray(n.include)?n.include:void 0,exclude:Array.isArray(n.exclude)?n.exclude:void 0}}function ir(e,n,t=[]){let r=wt(e);if(!r)return null;let o=new Set(t),a=n.logOnly??n.include,i=new Set(n.exclude??[]),s={};for(let[u,c]of Object.entries(r)){if(o.has(u)||i.has(u))continue;if(a&&!a.includes(u))continue;s[u]=c}return s}function sr(e,n,t){return t==null?`${e} was ${n}`:`${e} ${String(t)} was ${n}`}async function ur(e){try{let{db:n}=await import("@stacksjs/database/runtime");await n.insertInto(ar).values({type:e.type,description:e.description,subject_type:e.subject_type,subject_id:e.subject_id,causer:e.causer,properties:e.properties?JSON.stringify(e.properties):null,ip_address:e.ip_address,user_id:e.user_id,created_at:or()}).executeTakeFirst()}catch(n){bt("activity",`${e.subject_type}#${String(e.subject_id)}`,n)}}async function cr(e){let{attributes:n,event:t,modelName:r,options:o,primaryKey:a}=e,i=n?.[a]??null,s=await yt();await ur({type:`${r.toLowerCase()}.${t}`,description:sr(r,t,i),subject_type:r,subject_id:i,properties:ir(n,o,e.hidden),causer:s==null?null:`User:${String(s)}`,user_id:s,ip_address:await gt()})}function ne(e){if(!e||typeof e!=="object")return null;let n=e;if(n.attributes&&typeof n.attributes==="object")return{...n.attributes};if(n._attributes&&typeof n._attributes==="object")return{...n._attributes};return{...e}}function kt(e,n,t,r,o=[]){if(n==="Activity")return;let a=e,i=async(d)=>typeof a.find==="function"?ne(await a.find(d)):null,s=async(d,p)=>{await cr({modelName:n,event:d,attributes:p,primaryKey:t,options:r,hidden:o})},u=e.create;if(typeof u==="function")e.create=async function(...d){let p=await u.apply(this,d);return await s("created",ne(p)),p};let c=e.createMany;if(typeof c==="function")e.createMany=async function(...d){let p=await c.apply(this,d);for(let m of Array.isArray(p)?p:[])await s("created",ne(m));return p};let l=e.update;if(typeof l==="function")e.update=async function(d,p){let m=await l.call(this,d,p);return await s("updated",ne(m)??await i(d)),m};let f=e.delete;if(typeof f==="function")e.delete=async function(d){let p=await i(d),m=await f.call(this,d);return await s("deleted",p??{[t]:d}),m}}var ae,It=new Ft;function M(){return It.getStore()?.suppressed===!0}function O(e){return Promise.resolve(It.run({suppressed:!0},e))}var $t=new Ft;function yr(){return $t.getStore()?.suppressed===!0}function gr(e){return Promise.resolve($t.run({suppressed:!0},e))}var $e=Symbol.for("stacks.orm.modelDefinition");class jt 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 Tt=new Set,wr=4096,_t=Object.create(null),Rt=0;function V(e){let n=_t[e];if(n!==void 0)return n;let t=Q(e);if(Rt<wr)_t[e]=t,Rt++;return t}function br(e,n){let t=typeof e==="string"?e.slice(0,80):String(e),r=`${typeof e}:${t}`;if(Tt.has(r))return;Tt.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 hr={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 br(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 kr(e){return typeof e==="string"?hr[e]:e}var St=new WeakMap;function Bt(e){let n=Object.keys(e),t=St.get(e);if(t&&t.length===n.length){let o=!0;for(let a=0;a<n.length;a++){let i=n[a];if(t[a]?.attr!==i||t[a]?.definition!==e[i]){o=!1;break}}if(o)return t}let r=n.map((o)=>{let a=e[o];return{attr:o,definition:a,caster:kr(a)}});return St.set(e,r),r}function Me(e,n,t){if(!e||typeof e!=="object")return e;let r={...e};for(let{attr:o,caster:a}of Bt(n))if(o in r)r[o]=a[t].call(a,r[o]);return r}function re(e){return e==="_attributes"||e==="_original"||e==="_definition"||e==="_hasSaved"||e==="_relations"}var Ee=Symbol.for("stacks.modelInstanceProxy"),At,Pt=new WeakMap,Tr={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"},...Object.fromEntries(Z.map((e)=>[e,{bag:"_billable",mode:"model"}])),generateTwoFactorForModel:{bag:"_twoFactor",mode:"model"},verifyTwoFactorCode:{bag:"_twoFactor",mode:"model"}};function _r(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 oe(e,n,t){if(e&&typeof e.then==="function")return e.then((r)=>r===n?t:r);return e===n?t:e}function P(e,n){if(!e||typeof e!=="object")return e;let t=e;if(t[Ee])return e;let r=t._attributes;if(!r||typeof r!=="object")return e;if(n){for(let{attr:a,caster:i}of Bt(n))if(Object.hasOwn(r,a))r[a]=i.get.call(i,r[a])}let o=n?Pt.get(n):At;if(!o)if(o={get(a,i,s){let u=a;if(i===Ee)return!0;if(i==="saveAsync")return async function(){let l=u._definition,f=l?.set;if(f&&typeof u.isDirty==="function"){for(let[p,m]of Object.entries(f)){if(typeof m!=="function")continue;if(!u.isDirty(p))continue;let g=m(u._attributes),w=g&&typeof g.then==="function"?await g:g;u._attributes[p]=w}let d=l.set;l.set={};try{return oe(u.save(),a,s)}finally{l.set=d}}return oe(u.save(),a,s)};if(i==="save")return function(){let l=u._definition,f=l?.set;if(f&&Object.keys(f).length>0&&typeof u.isDirty==="function"){for(let[p,m]of Object.entries(f)){if(typeof m!=="function")continue;if(!u.isDirty(p))continue;let g=m(u._attributes);if(g&&typeof g.then==="function")throw Error(`Setter for "${p}" returned a Promise - use \`saveAsync()\` instead of \`save()\` when a model has async setters.`);u._attributes[p]=g}let d=l.set;l.set={};try{return oe(u.save(),a,s)}finally{l.set=d}}return oe(u.save(),a,s)};if(i==="updateAsync")return async function(l){if(l&&typeof l==="object"&&!Array.isArray(l))for(let[f,d]of Object.entries(l))s[f]=d;return s.saveAsync()};if(i==="saveQuietly")return function(){return O(()=>u.save())};if(i==="saveAsyncQuietly")return function(){return O(()=>s.saveAsync())};if(i==="updateQuietly")return function(l){return O(()=>u.update(l))};if(i==="updateAsyncQuietly")return function(l){return O(()=>s.updateAsync(l))};if(i==="deleteQuietly")return function(){return O(()=>u.delete())};if(i==="toSearchableObject")return function(){let d=u._definition?.traits?.useSearch;if(!d)return null;let p=u._attributes;if(!p)return null;if(d===!0){let h={...p};if(p.id!=null)h.id=String(p.id);return h}let m={},g=d.displayable?.length?d.displayable:[...d.searchable??[],...d.filterable??[],...d.sortable??[],"id"],w=d.denormalize??{},b=u._relations;for(let h of g){let k=Q(h),S=p[k]??p[h];if(S!==void 0){m[k]=S;continue}let je=w[h]??w[k];if(je){m[k]=_r(b,je);continue}m[k]=void 0}if(p.id!=null)m.id=String(p.id);return m};if(typeof i==="string"&&!re(i)){let l=u._attributes;if(l&&Object.hasOwn(l,i))return l[i];let f=u._relations;if(f&&Object.hasOwn(f,i)){let p=f[i];if(Array.isArray(p))return p.map((m)=>P(m,n));return p&&typeof p==="object"?P(p,n):p}let d=Tr[i];if(d){let g=u._definition?.__traitMethods?.[d.bag]?.[i];if(typeof g==="function")return d.mode==="model"?(...w)=>g(s,...w):(...w)=>g(u.id,...w)}if(l){let p=V(i);if(p!==i&&Object.hasOwn(l,p))return l[p]}}let c=Reflect.get(u,i,u);return typeof c==="function"?c.bind(u):c},set(a,i,s,u){let c=a;if(typeof i==="string"&&!re(i)){let{_attributes:l,set:f}=c;if(l&&Object.hasOwn(l,i)){if(typeof f==="function")f.call(c,i,s);else l[i]=s;return!0}if(l){let d=V(i);if(d!==i&&Object.hasOwn(l,d)){if(typeof f==="function")f.call(c,d,s);else l[d]=s;return!0}}if(l&&!(i in c)){if(typeof f==="function")f.call(c,i,s);else l[i]=s;return!0}}return Reflect.set(c,i,s,u)},has(a,i){let s=a;if(typeof i==="string"&&!re(i)){let u=s._attributes;if(u&&Object.hasOwn(u,i))return!0;let c=s._relations;if(c&&Object.hasOwn(c,i))return!0;if(u){let l=V(i);if(l!==i&&Object.hasOwn(u,l))return!0}}return Reflect.has(s,i)},deleteProperty(a,i){let s=a;if(typeof i==="string"&&!re(i)){let u=s._attributes;if(u&&Object.hasOwn(u,i))return delete u[i],!0}return Reflect.deleteProperty(s,i)},ownKeys(a){let s=a._attributes;return s?Object.keys(s):[]},getOwnPropertyDescriptor(a,i){let s=a;if(typeof i==="string"){let u=s._attributes;if(u&&Object.hasOwn(u,i))return{configurable:!0,enumerable:!0,value:u[i],writable:!0}}return Object.getOwnPropertyDescriptor(s,i)}},n)Pt.set(n,o);else At=o;return new Proxy(e,o)}var Nt=Object.assign(Object.create(null),{get:!0,first:!0,last:!0,firstOrFail:!0,find:!0,findOrFail:!0,all:!0,paginate:!0,simplePaginate:!0,cursorPaginate:!0}),Rr={paginate:pr,simplePaginate:mr,cursorPaginate:fr},xt=Symbol.for("stacks.queryBuilderProxy");function Ct(e,n,t){if(Nt[n]){if(Array.isArray(e))return e.map((o)=>P(o,t));let r=Rr[n];if(r&&e&&Array.isArray(e.data)){let o=e.data.map((i)=>P(i,t)),a=r({...e,data:o});return Ce(a)}if(e&&Array.isArray(e.data))return{...e,data:e.data.map((o)=>P(o,t))};return P(e,t)}if(e&&typeof e==="object"&&typeof e.get==="function")return qt(e,t);return e}function qt(e,n){if(!e||typeof e!=="object")return e;if(e[xt])return e;return new Proxy(e,{get(t,r,o){if(r===xt)return!0;let a=Reflect.get(t,r,o);if(typeof a!=="function")return a;let i=String(r);return function(...s){let u=s;if(i==="paginate"||i==="simplePaginate"){let{perPage:l,page:f}=Pe(s[0],s[1]);u=[l,f]}else if(i==="cursorPaginate"){let{perPage:l,cursor:f}=xe(s[0],s[1]);u=[l,f,s[2],s[3]]}let c=a.apply(t,u);if(!Nt[i]&&c===t)return o;if(c&&typeof c.then==="function")return c.then((l)=>Ct(l,i,n));return Ct(c,i,n)}}})}function Sr(e,n){let t=(i)=>Array.isArray(i)?i.map((s)=>P(s,n)):P(i,n),r=["find","first","last","all","firstOrFail","findOrFail","findMany"];for(let i of r){let s=e[i];if(typeof s!=="function")continue;e[i]=function(...u){let c=s.apply(this,u);if(c&&typeof c.then==="function")return c.then(t);return t(c)}}let o=["create","createMany","firstOrCreate","updateOrCreate","make"];for(let i of o){let s=e[i];if(typeof s!=="function")continue;e[i]=function(...u){let c=s.apply(this,u);if(c&&typeof c.then==="function")return c.then(t);return t(c)}}let a=["query","where","orWhere","whereIn","whereNotIn","whereNull","whereNotNull","whereLike","whereBetween","whereNotBetween","orderBy","orderByDesc","select","with","limit","take","skip","latest","oldest"];for(let i of a){let s=e[i];if(typeof s!=="function")continue;e[i]=function(...u){let c=s.apply(this,u);return qt(c,n)}}}class Lt extends Error{model;id;constructor(e,n){super(n!=null?`[ORM] ${e} not found for id=${String(n)}`:`[ORM] No matching ${e} row`);this.name="ModelNotFoundError",this.model=e,this.id=n}}class Fe 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 Ar=new Set(["id","created_at","updated_at","deleted_at","uuid"]),vt=new WeakMap;function Pr(e){let n=vt.get(e);if(n)return n;let t=new Set,r=new Set,o=new Set;for(let[i,s]of Object.entries(e)){let u=V(i);if(t.add(u),s?.fillable===!0)r.add(u);if(s?.guarded===!0)o.add(u)}let a={allowed:r.size>0?r:t,guarded:o};return vt.set(e,a),a}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{allowed:o,guarded:a}=Pr(r);for(let i in n){if(!Object.hasOwn(n,i))continue;let s=V(i);if(Ar.has(s))continue;if(a.has(s))throw new Fe(e.name,i,"guarded");if(s.endsWith("_id"))continue;if(!o.has(s))throw new Fe(e.name,i,"not-fillable")}return n}async function ie(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){T.error(`[orm] ${e.name}.set.${o} threw - skipping setter`,i)}}return r}function xr(e,n){let t=n.primaryKey||"id",r=e.create;function o(c){let l=e.where;if(typeof l!=="function")throw Error(`[ORM] ${n.name}.${c} needs a working where(): the underlying query builder did not expose one`);return l}function a(c){let l=e.find;if(typeof l!=="function")throw Error(`[ORM] ${n.name}.${c} needs a working find(): the underlying query builder did not expose one`);return l}function i(c){let l=e.create;if(typeof l!=="function")throw Error(`[ORM] ${n.name}.${c} cannot create: the underlying query builder did not expose create()`);return l}if(e.update=async function(c,l){if(c==null)throw Error(`[ORM] ${n.name}.update requires an id as the first argument`);if(!l||typeof l!=="object"||Array.isArray(l))throw Error(`[ORM] ${n.name}.update requires a data object as the second argument`);if(Object.keys(l).length===0){T.debug(`[orm] ${n.name}.update called with empty data - short-circuiting and returning current row`);let p=e.find;return typeof p==="function"?await p.call(e,c):null}j(n,l);let f=await ie(n,l);await o("update").call(e,t,c).update(f);let d=e.find;return typeof d==="function"?await d.call(e,c):null},typeof e.forceUpdate!=="function")e.forceUpdate=async function(c,l){if(c==null)throw Error(`[ORM] ${n.name}.forceUpdate requires an id as the first argument`);if(!l||typeof l!=="object"||Array.isArray(l))throw Error(`[ORM] ${n.name}.forceUpdate requires a data object as the second argument`);let f=await ie(n,l);await o("forceUpdate").call(e,t,c).update(f);let d=e.find;return typeof d==="function"?await d.call(e,c):null};if(typeof e.forceCreate!=="function")e.forceCreate=async function(c){if(!c||typeof c!=="object"||Array.isArray(c))throw Error(`[ORM] ${n.name}.forceCreate requires a data object`);let l=e.make;if(typeof l==="function"){let f=await l.call(e);if(f&&typeof f.forceFill==="function"&&typeof f.save==="function"){f.forceFill(c);let d=await f.save();return d&&typeof d==="object"&&d!==f&&!d[Ee]?f:d??f}}if(typeof r!=="function")throw Error(`[ORM] ${n.name}.forceCreate cannot create: the underlying query builder did not expose create()`);return await r.call(e,c)};if(e.delete=async function(c){if(c==null)throw Error(`[ORM] ${n.name}.delete requires an id as the first argument`);if(!await a("delete").call(e,c))return!1;return await o("delete").call(e,t,c).delete(),!0},typeof e.findOrFail!=="function")e.findOrFail=async function(c){let l=await a("findOrFail").call(e,c);if(l==null)throw new Lt(n.name,c);return l};if(typeof e.exists!=="function")e.exists=async function(c){if(c==null)return!1;let l=o("exists").call(e,t,c);if(typeof l.count==="function"){let d=await l.count();return Number(d)>0}let f=e.find;return typeof f==="function"?await f.call(e,c)!=null:!1};if(typeof e.firstOrCreate!=="function")e.firstOrCreate=async function(c,l={}){if(!c||typeof c!=="object"||Array.isArray(c))throw Error(`[ORM] ${n.name}.firstOrCreate requires a where-attrs object`);let f=o("firstOrCreate").call(e,c),d=typeof f.first==="function"?await f.first():await f;if(d)return d;let p={...c,...l};return j(n,p),await i("firstOrCreate").call(e,p)};if(typeof e.updateOrCreate!=="function")e.updateOrCreate=async function(c,l){if(!c||typeof c!=="object"||Array.isArray(c))throw Error(`[ORM] ${n.name}.updateOrCreate requires a where-attrs object`);if(!l||typeof l!=="object"||Array.isArray(l))throw Error(`[ORM] ${n.name}.updateOrCreate requires a values object`);let f=o("updateOrCreate").call(e,c),d=typeof f.first==="function"?await f.first():await f;if(d){j(n,l);let m=d[t];await o("updateOrCreate").call(e,t,m).update(l);let g=e.find;return typeof g==="function"?await g.call(e,m):{...d,...l}}let p={...c,...l};return j(n,p),await i("updateOrCreate").call(e,p)};if(typeof e.count!=="function")e.count=async function(){let c=e;if(typeof c.query==="function"){let d=c.query();if(typeof d?.count==="function"){let p=await d.count();return Number(p)||0}}let{all:l,get:f}=e;if(typeof l==="function")return(await l.call(e)||[]).length;if(typeof f==="function")return(await f.call(e)||[]).length;return 0};if(typeof e.pluck!=="function")e.pluck=async function(c){if(!c||typeof c!=="string")throw Error(`[ORM] ${n.name}.pluck requires a column name`);let l=e.all;return((typeof l==="function"?await l.call(e):[])||[]).map((d)=>d?.[c])};if(typeof e.whereIn!=="function")e.whereIn=async function(c,l){if(!c||typeof c!=="string")throw Error(`[ORM] ${n.name}.whereIn requires a column name`);if(!Array.isArray(l))throw Error(`[ORM] ${n.name}.whereIn requires an array of values`);if(l.length===0)return[];let f=e.where;if(typeof f!=="function")return[];let d=f.call(e,c,"in",l);if(d&&typeof d.get==="function")return await d.get();return await d};let s=[["latest","desc"],["oldest","asc"]];for(let[c,l]of s)if(typeof e[c]!=="function")e[c]=async function(f="created_at"){let d=e,p=typeof d.query==="function"?d.query():d;if(typeof p?.orderBy==="function"){let b=p.orderBy(f,l);if(typeof b.first==="function")return await b.first();if(typeof b.get==="function")return(await b.get())?.[0]??null}let m=e.all;if(typeof m!=="function")return null;return[...await m.call(e)||[]].sort((b,h)=>{let k=b?.[f],S=h?.[f];if(k===S)return 0;return(k>S?1:-1)*(l==="desc"?-1:1)})[0]??null};let u=Vt(n.traits?.useSearch,n);if(u){let c=u.index??n.table??Q(`${n.name}s`);if(typeof e.search!=="function")e.search=function(l,f){return Or(e,c,l,f,u.searchable)};if(typeof e.makeAllSearchable!=="function")e.makeAllSearchable=async function(l=500){let f=e.all;if(typeof f!=="function")throw Error(`[ORM] ${n.name}.makeAllSearchable cannot run: the underlying query builder did not expose all()`);let{useSearchEngine:d}=await import("@stacksjs/search-engine"),p=d(),m=0,g=e.query;if(typeof g==="function")try{let h=g.call(e);if(h&&typeof h.chunk==="function")return await h.chunk(l,async(k)=>{let S=await Ie(k,u);if(S.length>0)await p.addDocuments(c,S);m+=S.length}),m}catch{}let w=await f.call(e)||[],b=await Ie(w,u);if(b.length>0)await p.addDocuments(c,b);return b.length};if(typeof e.removeAllFromSearch!=="function")e.removeAllFromSearch=async function(){let{useSearchEngine:l}=await import("@stacksjs/search-engine"),f=l();if(typeof f.deleteAllDocuments==="function"){await f.deleteAllDocuments(c);return}let d=e.all,p=typeof d==="function"?await d.call(e)||[]:[],m=l();for(let g of p){let w=g?.id??g?._attributes?.id;if(w!=null)await m.deleteDocument(c,Number(w))}}}}async function Ie(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)=>vr(r,n)))).filter(Boolean)}function Ut(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 Cr(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 vr(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 Cr(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(u){return i={...i,...u},s},where(u){return i={...i,filter:u},s},async get(){let{useSearchEngine:u}=await import("@stacksjs/search-engine");return(await u().search(n,i))?.hits??[]},async paginate(u,c=1){let{useSearchEngine:l}=await import("@stacksjs/search-engine"),d=await l().search(n,{...i,limit:u,offset:(c-1)*u});return{hits:d.hits??[],total:Number(d.estimatedTotalHits??d.nbHits??d.total??0),page:c,perPage:u}},async raw(){let{useSearchEngine:u}=await import("@stacksjs/search-engine");return await u().search(n,i)}};return s}function Kt(e){let n=Q(e);return n===e?[e]:[e,n]}async function De(e,n){if(!e||typeof e!=="object")return;let t=e._attributes??e;for(let r of n)for(let o of Kt(r)){if(!(o in t))continue;let a=t[o];if(!N(a))continue;t[o]=await de(a)}}function Mr(e,n){if(n.length===0)return;let t=async(s)=>{if(Array.isArray(s)){for(let u of s)await De(u,n);return s}if(s&&typeof s==="object"&&Array.isArray(s.data)){for(let u of s.data)await De(u,n);return s}if(s)await De(s,n);return s},r=["find","first","last","all","firstOrFail","findOrFail","findMany"];for(let s of r){let u=e[s];if(typeof u!=="function")continue;e[s]=async function(...c){let l=await u.apply(this,c);return await t(l)}}let o=["create","createMany","firstOrCreate","updateOrCreate","make"];for(let s of o){let u=e[s];if(typeof u!=="function")continue;e[s]=async function(...c){let l=await u.apply(this,c);return await t(l)}}for(let s of["update","forceUpdate"]){let u=e[s];if(typeof u!=="function")continue;e[s]=async function(c,l){let f=await u.call(this,c,l);return await t(f)}}let a=["first","firstOrFail","get","all","find","findOrFail","last","paginate","simplePaginate"],i=(s)=>{if(!s||typeof s!=="object")return s;let u=s;if(u.__stacksEncryptedReads)return s;for(let c of a){let l=u[c];if(typeof l!=="function")continue;u[c]=async function(...f){return await t(await l.apply(this,f))}}for(let c of["where","whereIn","whereNull","whereNotNull","orWhere","orderBy","orderByDesc","limit","offset","with"]){let l=u[c];if(typeof l!=="function")continue;u[c]=function(...f){return i(l.apply(this,f))}}return Object.defineProperty(u,"__stacksEncryptedReads",{value:!0,enumerable:!1}),s};for(let s of["where","whereIn","whereNull","whereNotNull","orderBy","orderByDesc","limit","query"]){let u=e[s];if(typeof u!=="function")continue;e[s]=function(...c){return i(u.apply(this,c))}}}function Dr(e,n){if(n.length===0)return;let t=async(a)=>{if(!a||typeof a!=="object"||Array.isArray(a))return a;let i={...a};for(let s of n)for(let u of Kt(s))if(u in i)i[u]=await le(i[u]);return i},r=["create","firstOrCreate","updateOrCreate","forceCreate"],o=e.createMany;if(typeof o==="function")e.createMany=async function(a,...i){let s=Array.isArray(a)?await Promise.all(a.map(t)):a;return await o.call(this,s,...i)};for(let a of r){let i=e[a];if(typeof i!=="function")continue;e[a]=async function(...s){if(s[0]=await t(s[0]),s[1])s[1]=await t(s[1]);return await i.apply(this,s)}}for(let a of["update","forceUpdate"]){let i=e[a];if(typeof i!=="function")continue;e[a]=async function(s,u){let c=await t(u);return await i.call(this,s,c)}}}function Er(e,n){let t=e.create;if(typeof t==="function")e.create=async function(o,...a){j(n,o);let i=await ie(n,o);return await t.call(this,i,...a)};let r=e.createMany;if(typeof r==="function")e.createMany=async function(o,...a){let i=[];for(let s of o)j(n,s),i.push(await ie(n,s));return await r.call(this,i,...a)};for(let o of["firstOrCreate","updateOrCreate"]){let a=e[o];if(typeof a!=="function")continue}}function Fr(e,n){if(!at(n))return;let t=String(n?.name??e.name??"Model"),r=(s,u)=>{if(yr())return;if(!s||typeof s!=="object"||Array.isArray(s))return;let c=it(s,n,u);if(!c.valid)throw new jt(t,c.errors)},o=e.create;if(typeof o==="function")e.create=async function(s,...u){return r(s,"creating"),await o.call(this,s,...u)};let a=e.createMany;if(typeof a==="function")e.createMany=async function(s,...u){if(Array.isArray(s))for(let c of s)r(c,"creating");return await a.call(this,s,...u)};let i=e.update;if(typeof i==="function")e.update=async function(s,u,...c){return r(u,"updating"),await i.call(this,s,u,...c)}}function Ir(e,n){let t=["create","firstOrCreate","updateOrCreate"],r=e.createMany;if(typeof r==="function")e.createMany=async function(a,...i){let s=Array.isArray(a)?a.map((u)=>u&&typeof u==="object"&&!Array.isArray(u)?Me(u,n,"set"):u):a;return await r.call(this,s,...i)};for(let a of t){let i=e[a];if(typeof i==="function")e[a]=async function(...s){if(T.debug(`[orm] ${a.charAt(0).toUpperCase()+a.slice(1)} ${String(e.name||"unknown")}`,s[0]),s[0]&&typeof s[0]==="object"&&!Array.isArray(s[0]))s[0]=Me(s[0],n,"set");return await i.apply(this,s)}}let o=e.update;if(typeof o==="function")e.update=async function(a,i){let s=i&&typeof i==="object"&&!Array.isArray(i)?Me(i,n,"set"):i;return await o.call(this,a,s)}}var Ot=new Set(["useUuid","useTimestamps","timestampable","useSoftDeletes","softDeletable","useApi","useAuth","authenticatable","useSearch","searchable","useSeeder","seedable","useSocials","billable","observe","useAudit","useActivityLog","prunable","sharding","likeable","taggable","categorizable","commentable","commentables","broadcastOn","broadcastWith"]);function Wt(e){T.debug(`[orm] Defining model: ${e.name} (table: ${e.table})`);for(let g of Object.keys(e.traits??{}))if(!Ot.has(g))T.warn(`[orm] Model '${e.name}' declares an unknown trait '${g}'. It does nothing. Known traits: ${[...Ot].sort().join(", ")}.`);let n=$r(e),t=Br(e),r=jr(n,t),o=Nr(e);e.__traitMethods=o;let a=e.traits;if((a?.useAuth||a?.authenticatable)&&e.name!=="PersonalAccessToken"){let g=e.morphMany;if(!g||!("tokenable"in g))e.morphMany={...g??{},tokenable:"PersonalAccessToken"}}let i=r?{...e,hooks:{...e.hooks,...r}}:e,u=lr(i);if(Sr(u,e.casts),xr(u,i),Er(u,i),e.casts&&Object.keys(e.casts).length>0)Ir(u,e.casts);let c=fe(e);if(c.length>0)Dr(u,c),Mr(u,c);let l=e.traits?.useSoftDeletes;if(l)qr(u,i,l);let f=e.traits?.useAudit;if(f){let g=Qe(f);ze(u,e.name,e.primaryKey||"id",g)}let d=ht(e.traits?.useActivityLog);if(d)kt(u,e.name,e.primaryKey||"id",d,[...Ut(e)]);Fr(u,i);let p=u;p.withoutValidation=function(g){return gr(g)},p.withoutEvents=function(g){return O(g)};for(let g of["create","createMany","update","firstOrCreate","updateOrCreate","forceCreate","forceUpdate","delete","forceDelete","softDelete","restore"]){let w=u[g];if(typeof w!=="function")continue;let b=`${g}Quietly`;if(typeof u[b]==="function")continue;u[b]=function(...h){return O(()=>w.apply(u,h))}}let m=Object.assign(u,o,{...e,getDefinition:()=>e,_isStacksModel:!0});return dr(e.name,m),Object.defineProperty(m,$e,{value:e,enumerable:!1,configurable:!0}),m}function $r(e){let n=e.traits?.observe;if(!n)return;let t=e.name.toLowerCase(),r=(d)=>{let p=d?.attributes;if(!p||typeof p!=="object")return d;let m=e.primaryKey||"id",g={...p};if(g[m]===void 0&&d[m]!==void 0)g[m]=d[m];return g},o=async(d,p)=>{if(M())return;try{let{dispatch:m}=ae??=await import("@stacksjs/events");await m(d,p)}catch(m){if(m&&typeof m==="object"&&"code"in m&&m.code==="MODULE_NOT_FOUND")return;if(console.error(`[ORM] Event '${d}' handler error:`,m),process.env.STACKS_ORM_EVENT_ERRORS!=="swallow")throw m}},a=e.traits?.broadcastOn,i=e.traits?.broadcastWith,s=typeof a==="function"&&typeof i==="function",u=async(d,p)=>{if(!s)return;if(M())return;try{let m=a(p),g=Array.isArray(m)?m:[m],w=i(p),h=(await import("@stacksjs/realtime").catch(()=>null))?.broadcast;if(typeof h!=="function")return;for(let k of g){if(typeof k!=="string"||k.length===0)continue;await h(k,d,w)}}catch(m){if(m&&typeof m==="object"&&"code"in m&&m.code==="MODULE_NOT_FOUND")return;if(console.error(`[ORM] Broadcast '${d}' handler error:`,m),process.env.STACKS_ORM_BROADCAST_ERRORS==="throw")throw m}},c=async(d,p)=>{if(M())return!0;let m;try{m=ae??=await import("@stacksjs/events");let{dispatchAndCollect:g}=m,w=await g(d,p);if(w.some((h)=>h.ok&&h.value===!1))return!1;let b=w.find((h)=>!h.ok);if(b&&!b.ok)throw b.error}catch(g){if(!m&&g&&typeof g==="object"&&"code"in g&&g.code==="MODULE_NOT_FOUND")return!0;if(console.error(`[ORM] Before-event '${d}' handler error:`,g),process.env.STACKS_ORM_EVENT_ERRORS!=="swallow")throw g}return!0},l=n===!0?["create","update","delete"]:Array.isArray(n)?n:[],f={};if(l.includes("create"))f.beforeCreate=async(d)=>{if(T.debug(`[orm] Create ${t}`,d),!await c(`${t}:saving`,d))throw Error(`[ORM] ${t}:saving event cancelled the operation`);if(!await c(`${t}:creating`,d))throw Error(`[ORM] ${t}:creating event cancelled the operation`)},f.afterCreate=async(d)=>{let p=r(d);await o(`${t}:created`,p),await o(`${t}:saved`,p),await u(`${t}:created`,d)};if(l.includes("update"))f.beforeUpdate=async(d)=>{if(T.debug(`[orm] Update ${t}#${d?.id??"unknown"}`,d),!await c(`${t}:saving`,d))throw Error(`[ORM] ${t}:saving event cancelled the operation`);if(!await c(`${t}:updating`,d))throw Error(`[ORM] ${t}:updating event cancelled the operation`)},f.afterUpdate=async(d)=>{let p=r(d);await o(`${t}:updated`,p),await o(`${t}:saved`,p),await u(`${t}:updated`,d)};if(l.includes("delete"))f.beforeDelete=async(d)=>{if(T.debug(`[orm] Delete ${t}#${d?.id??"unknown"}`),!await c(`${t}:deleting`,d))throw Error(`[ORM] ${t}:deleting event cancelled the operation`)},f.afterDelete=async(d)=>{await o(`${t}:deleted`,r(d)),await u(`${t}:deleted`,d)};return f}function jr(...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 Vt(e,n){if(!e)return null;let t=e===!0?{}:typeof e==="object"?{...e}:null;if(!t)return null;if(n)t.hidden=Ut(n);return t}function Br(e){let n=Vt(e.traits?.useSearch,e);if(!n)return;let t=n,r=t.index??e.table??Q(`${e.name}s`);async function o(s){if(typeof t.shapeMany==="function")try{let[l]=await Ie([s],t);return l}catch(l){T.warn(`[orm/search] shapeMany() threw for ${e.name}: ${l.message}`);return}if(typeof t.shape==="function")try{return await t.shape(s)}catch(l){T.warn(`[orm/search] shape() threw for ${e.name}: ${l.message}`);return}let c=P(s).toSearchableObject?.();if(c!==void 0)return c;return s?._attributes??(typeof s?.toJSON==="function"?s.toJSON():null)}let a=async(s)=>{if(M())return;let u=await o(s);if(!u)return;if(n.queueable){try{let{Jobs:c}=await import("@stacksjs/queue");await c.dispatch("SyncSearchIndexJob",{index:r,op:"upsert",doc:u})}catch(c){T.warn(`[orm/search] queue dispatch failed for ${e.name}; falling back to inline: ${c.message}`),await Dt(r,u,e.name)}return}await Dt(r,u,e.name)};return{afterCreate:a,afterUpdate:a,afterDelete:async(s)=>{if(M())return;let u=s?.id??s?._attributes?.id;if(u==null)return;if(n.queueable){try{let{Jobs:c}=await import("@stacksjs/queue");await c.dispatch("SyncSearchIndexJob",{index:r,op:"delete",id:Number(u)})}catch(c){T.warn(`[orm/search] queue dispatch failed for ${e.name}#${u}; falling back to inline: ${c.message}`),await Et(r,Number(u),e.name)}return}await Et(r,Number(u),e.name)}}}var Mt=new Map;function Qt(e,n){let t=Mt.get(e)??0;if(Mt.set(e,t+1),t===0)T.warn(`[orm/search] ${n}`);else if(t===9)T.warn(`[orm/search] ${e} is still failing; further identical warnings suppressed for this process.`)}async function Dt(e,n,t){try{let{useSearchEngine:r}=await import("@stacksjs/search-engine");await r().addDocument(e,n)}catch(r){Qt(`index:${t}`,`Failed to index ${t}: ${r.message}`)}}async function Et(e,n,t){try{let{useSearchEngine:r}=await import("@stacksjs/search-engine");await r().deleteDocument(e,n)}catch(r){Qt(`remove:${t}`,`Failed to remove ${t}#${n}: ${r.message}`)}}function Nr(e){let n={},{table:t,traits:r}=e;if(!r)return n;if(r.taggable)n._taggable=we(t);if(r.categorizable)n._categorizable=be(t);if(r.commentable)n._commentable=ye(t);if(r.billable)n._billable=Je(t);if(r.likeable){let a=typeof r.likeable==="object"?r.likeable:void 0;n._likeable=he(t,a)}let o=r.useAuth||r.authenticatable;if(typeof o==="object"&&o&&"useTwoFactor"in o&&o.useTwoFactor)n._twoFactor=dt();return n}function qr(e,n,t){let r=ft(e,n.primaryKey||"id"),o=pt(t),a=n,i=n.name.toLowerCase(),s=n.traits?.observe!=null&&n.traits?.observe!==!1,u=async(p)=>{if(!s||M())return!0;try{let{dispatchAsync:m}=ae??=await import("@stacksjs/events"),g=await m(`${i}:restoring`,{id:p});if(Array.isArray(g)&&g.some((w)=>w===!1))return!1}catch(m){if(m?.code!=="MODULE_NOT_FOUND")console.error(`[ORM] Before-event '${i}:restoring' handler error:`,m)}return!0},c=async(p)=>{if(!s||M())return;try{let{dispatch:m}=ae??=await import("@stacksjs/events");await m(`${i}:restored`,{id:p})}catch(m){if(m?.code!=="MODULE_NOT_FOUND")console.error(`[ORM] Event '${i}:restored' handler error:`,m)}},l=process.env.STACKS_ORM_CASCADE_SWALLOW!=="true",f=async(p)=>{if(!o.cascade?.length||!l){let g=await r.softDelete(p);if(g&&o.cascade?.length)await W(a,o,p,"softDelete");return g}let{db:m}=await import("@stacksjs/database/runtime");return await m.transaction(async()=>{let g=await r.softDelete(p);if(g)await W(a,o,p,"softDelete");return g})},d=async(p)=>{if(!await u(p))return!1;if(!o.cascade?.length||!l){let b=await r.restore(p);if(b){if(o.cascade?.length)await W(a,o,p,"restore");await c(p)}return b}let{db:g}=await import("@stacksjs/database/runtime"),w=await g.transaction(async()=>{let b=await r.restore(p);if(b)await W(a,o,p,"restore");return b});if(w)await c(p);return w};e.softDelete=f,e.restore=d,e.forceDelete=r.forceDelete,e.withTrashed=r.withTrashed,e.onlyTrashed=r.onlyTrashed,e.delete=f}function Lr(e){if(e==null)return e;if(Array.isArray(e))return e.map((t)=>Lr(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 Ur=["belongsTo","hasOne","hasMany","belongsToMany","morphMany","morphOne"],Kr=["traits","dashboard"];function Wr(e){let n=e?.[$e];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 Vr(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 Qr(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 zr(e,n){let t={...e,...n},r=e.attributes??{},o=n.attributes??{};if(n.attributes){let a=Qr(r),i=Object.fromEntries(Object.entries(o).map(([s,u])=>{let c=!(s in r),l=Number.isFinite(Number(u?.order));if(c&&!l)return[s,{...u,order:++a}];return[s,u]}));t.attributes={...r,...i}}for(let a of Ur){let i=Vr(e[a],n[a]);if(i)t[a]=i}for(let a of Kr){let i=e[a],s=n[a];if(i&&s&&typeof i==="object"&&typeof s==="object")t[a]={...i,...s}}return t}function Ws(e,n){return Wt(zr(Wr(e),n))}import to from"process";import{log as no}from"@stacksjs/logging";import{path as _}from"@stacksjs/path";import{fs as z}from"@stacksjs/storage";import{Database as Hr}from"bun:sqlite";import{existsSync as Gr,readdirSync as Jr,readFileSync as Yr}from"fs";function Xr(e){return e.startsWith("sqlite_")||e.startsWith("_qb_tmp_")}function Zr(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 eo(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 zt(e,n="sqlite"){let t=[];if(!Gr(e))return{tables:[],errors:t};let r;try{r=Jr(e).filter((a)=>a.endsWith(".sql")).sort()}catch(a){return{tables:[],errors:[{file:e,error:a.message}]}}let o=new Hr(":memory:");try{for(let s of r){let u=`${e}/${s}`,c;try{c=Yr(u,"utf-8")}catch(f){t.push({file:u,error:f.message});continue}let l=eo(o,c);if(!l.ok)t.push({file:u,error:l.error??"could not be applied"})}let a=o.query("SELECT name FROM sqlite_master WHERE type = 'table' ORDER BY name").all().map((s)=>s.name).filter((s)=>!Xr(s)),i=[];for(let s of a){let u=o.query(`PRAGMA table_info("${s.replace(/"/g,'""')}")`).all();if(u.length===0)continue;let c={};for(let l of u){let f=Zr(l.type??"",n),d=l.notnull===0&&l.pk===0;c[l.name]=d&&f!=="unknown"?`${f} | null`:f}i.push({table:s,columns:c})}return{tables:i,errors:t}}finally{o.close()}}function ro(e){if(e)return e;let n=String(to.env.DB_CONNECTION??"").toLowerCase();return n==="postgres"||n==="mysql"?n:"sqlite"}function se(e){return e==="postgres"?"boolean":"number"}function x(e){return e.replace(/([A-Z]+)([A-Z][a-z])/g,"$1_$2").replace(/([a-z\d])([A-Z])/g,"$1_$2").toLowerCase()}function oo(e,n){let t=e.default;if(typeof t==="boolean")return se(n);if(typeof t==="number")return"number";if(typeof t==="string")return"string";return"unknown"}function ao(e){let n=e.validation;if(!n||typeof n!=="object")return null;let t=n.rule;return t&&typeof t==="object"?t:null}function io(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 so(e,n){let t=ao(e),r=io(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 se(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 oo(e,n)}})();return e.nullable===!0?`${a} | null`:a}function uo(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[`${x(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[`${x(a.model)}_id`]="number"}}return n}function co(e,n){let[t,r]=[x(e),x(n)].sort();return`${t}_${r}`}function lo(e,n){let t=e.default,r=typeof t==="string"?"string":typeof t==="number"?"number":typeof t==="boolean"?se(n):t instanceof Date?"string":"unknown";return e.nullable?`${r} | null`:r}function fo(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,u,c,l,f={},d=!0;if(typeof i==="string")s=i;else if(i&&typeof i==="object"&&"model"in i){let b=i;if(s=b.model,"pivotTable"in b||"firstForeignKey"in b||"secondForeignKey"in b)u=b.pivotTable,c=b.firstForeignKey,l=b.secondForeignKey;else{let h=i;u=h.table,c=h.foreignKey,l=h.relatedKey,f=h.pivot?.columns??{},d=Boolean(h.pivot?.timestamps)}}else continue;let p=u??co(e,s),m=c??`${x(e)}_id`,g=l??`${x(s)}_id`,w={id:"number",[m]:"number",[g]:"number"};for(let[b,h]of Object.entries(f))w[b]=lo(h,t);if(d)w.created_at="string",w.updated_at="string | null";o.push({table:p,columns:w})}return o}function po(e){return{email_verified_at:"string | null",password_changed_at:"string | null",two_factor_secret:"string | null",two_factor_enabled:`${se(e)} | null`,two_factor_last_used_step:"number | null",stripe_id:"string | null"}}function mo(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,po(n));return t}function yo(e,n){let t={},r=e.attributes??{};for(let[o,a]of Object.entries(r))t[x(o)]=so(a,n);return t}function Ht(e,n,t=2){let r=" ".repeat(t),o=" ".repeat(t+1),a=Object.entries(n).map(([s,u])=>`${o}${s}: ${u}`).join(`
3
- `),i=/^[A-Z_a-z]\w*$/.test(e)?e:`'${e}'`;return`${r}${i}: {
2
+ var dt=(e,t,n)=>()=>{if(e)try{t=e(e=0)}catch(r){n=[r]}if(n)throw n[0];return t};var Vn=import.meta.require;import{readdirSync as Qr}from"fs";import{basename as zr,extname as Gt,join as Hr}from"path";function Jr(e){let t=[],n=(r)=>{let o;try{o=Qr(r,{withFileTypes:!0})}catch{return}for(let i of o){let a=Hr(r,i.name);if(i.isDirectory()){n(a);continue}if(![".ts",".js"].includes(Gt(i.name)))continue;if(i.name.startsWith(".")||i.name.startsWith("index"))continue;t.push(a)}};return n(e),t.sort()}async function qt(e,t,n){for(let r of Jr(e))try{let o=Gt(r),i=await import(`${r}?t=${Date.now()}`),a=i.default??i,s=a.name??zr(r,o);t[s]={...a,name:s}}catch(o){n?.(r,o)}}async function Ut(e){let t={};return await qt(e.defaultsRoot,t,e.onImportError),await qt(e.userRoot,t,e.onImportError),t}var Kt=()=>{};import{path as Wt}from"@stacksjs/path";async function Ue(){return Ut({defaultsRoot:Wt.frameworkPath("defaults/app/Models"),userRoot:Wt.userModelsPath()})}var Ke=dt(()=>{Kt()});import"@stacksjs/validation";import{log as Ae}from"@stacksjs/cli";import{db as ft,mutationCount as pt}from"@stacksjs/database/runtime";async function Qn(e,t={}){let{olderThanDays:n=30,column:r="created_at",query:o}=t;try{if(o){let u=ft.deleteFrom(e);u=o(u);let c=pt(await u.execute());return Ae.info(`Pruned ${c} records from ${e}`),c}let i=new Date;i.setDate(i.getDate()-n);let a=await ft.deleteFrom(e).where(r,"<",i.toISOString()).execute(),s=pt(a);return Ae.info(`Pruned ${s} records from ${e} older than ${n} days`),s}catch(i){throw Ae.error(`Failed to prune ${e}:`,i),i}}async function Bs(e,t={}){return Qn(e,t)}function Ns(e){if(!e?.prunable)return null;if(typeof e.prunable==="boolean")return{olderThanDays:30,column:"created_at"};return e.prunable}import{createCipheriv as zn,createDecipheriv as Hn,createHash as Jn,randomBytes as Yn}from"crypto";import{log as oe}from"@stacksjs/logging";var mt="enc:",gt="aes-256-gcm",Xn=12,re=null;async function yt(){if(re)return re;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 re=Jn("sha256").update(e).digest(),re}function K(e){return typeof e==="string"&&e.startsWith(mt)}async function Pe(e){if(e==null)return e;if(K(e))return e;if(typeof e!=="string")return e;let t=await yt();if(!t)return oe.warn("[orm] encrypted attribute: APP_KEY not set - storing value in plaintext"),e;let n=Yn(Xn),r=zn(gt,t,n),o=Buffer.concat([r.update(e,"utf8"),r.final()]),i=r.getAuthTag();return`${mt}${n.toString("base64")}:${i.toString("base64")}:${o.toString("base64")}`}async function xe(e){if(e==null)return e;if(typeof e!=="string")return e;if(!K(e))return e;try{let t=await yt();if(!t)return oe.warn("[orm] encrypted attribute: APP_KEY not set - cannot decrypt"),null;let[,n,r,o]=e.split(":");if(!n||!r||!o)return oe.warn("[orm] encrypted attribute: malformed envelope, returning null"),null;let i=Buffer.from(n,"base64"),a=Buffer.from(r,"base64"),s=Buffer.from(o,"base64"),u=Hn(gt,t,i);return u.setAuthTag(a),Buffer.concat([u.update(s),u.final()]).toString("utf8")}catch(t){return oe.warn("[orm] encrypted attribute: decrypt failed (key rotation? corrupted ciphertext?)",{error:t}),null}}function Ce(e){let t=e.attributes;if(!t||typeof t!=="object")return[];let n=[];for(let[r,o]of Object.entries(t))if(o&&typeof o==="object"&&o.encrypted===!0)n.push(r);return n}import{sqlDateTime as Zn}from"@stacksjs/database/runtime";import{log as B}from"@stacksjs/logging";var er=[/^password$/i,/^password_hash$/i,/^api_key$/i,/_token$/i,/_secret$/i,/^remember_token$/i],bt="model_audits",ve=null;function tr(e){ve=e}async function ie(){if(ve!=null)return ve;try{let e=await import("@stacksjs/router").catch(()=>null);if(!e)return null;let t=e.getCurrentRequest;if(typeof t!=="function")return null;let n=t();if(!n)return null;return(n.user??n._user)?.id??null}catch{return null}}function W(e){if(!e||typeof e!=="object")return null;let t={};for(let[n,r]of Object.entries(e)){if(er.some((o)=>o.test(n)))continue;t[n]=r}return t}function I(e){if(!e||typeof e!=="object")return null;let t=e;if(t._attributes&&typeof t._attributes==="object")return{...t._attributes};return{...e}}function nr(e,t){if(!e||!t)return{old:e,next:t};let n={},r={},o=new Set([...Object.keys(e),...Object.keys(t)]);for(let i of o)if(e[i]!==t[i])n[i]=e[i],r[i]=t[i];return{old:n,next:r}}async function ae(e,t=!1){try{let{db:n}=await import("@stacksjs/database/runtime");await n.insertInto(bt).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:Zn()}).executeTakeFirst()}catch(n){if(B.warn(`[orm] audit row write failed for ${e.auditable_type}#${String(e.auditable_id)} (${e.event})`,{error:n}),t)throw n}}function ht(e){return{async audits(t){try{let{db:n}=await import("@stacksjs/database/runtime");return(await n.selectFrom(bt).selectAll().where("auditable_type","=",e).where("auditable_id","=",t).orderBy("created_at","desc").execute()??[]).map((o)=>({...o,old_values:typeof o.old_values==="string"?wt(o.old_values):o.old_values,new_values:typeof o.new_values==="string"?wt(o.new_values):o.new_values}))}catch(n){return B.warn(`[orm] audits() lookup failed for ${e}#${String(t)}`,{error:n}),[]}}}}function wt(e){try{return JSON.parse(e)}catch{return e}}function kt(e){if(e&&typeof e==="object"&&"transactional"in e)return{transactional:e.transactional===!0};return{transactional:!1}}function Tt(e,t,n="id",r={}){let o=r.transactional===!0,i=e;if(typeof e.audits!=="function")e.audits=ht(t).audits;let a=async(f)=>{if(!o)return await f();let{db:d}=await import("@stacksjs/database/runtime");return await d.transaction(async()=>f())},s=e.create;if(typeof s==="function")e.create=async function(...f){return await a(async()=>{let d=await s.apply(this,f);try{let p=I(d),m=p?.[n];if(m!=null){let g=await ie();await ae({auditable_type:t,auditable_id:m,event:"created",old_values:null,new_values:W(p),user_id:g},o)}}catch(p){if(B.warn(`[orm] audit(create) failed for ${t}`,{error:p}),o)throw p}return d})};let u=e.createMany;if(typeof u==="function")e.createMany=async function(...f){return await a(async()=>{let d=await u.apply(this,f);try{let p=Array.isArray(d)&&d.length?await ie():null;for(let m of Array.isArray(d)?d:[]){let g=I(m),w=g?.[n];if(w==null)continue;await ae({auditable_type:t,auditable_id:w,event:"created",old_values:null,new_values:W(g),user_id:p},o)}}catch(p){if(B.warn(`[orm] audit(createMany) failed for ${t}`,{error:p}),o)throw p}return d})};let c=e.update;if(typeof c==="function")e.update=async function(f,d){return await a(async()=>{let p=i.find,m=typeof p==="function"?I(await p.call(i,f)):null,g=await c.call(this,f,d);try{let w=I(g)??(typeof p==="function"?I(await p.call(i,f)):null),{old:h,next:b}=nr(m,w);if(b&&Object.keys(b).length>0){let k=await ie();await ae({auditable_type:t,auditable_id:f,event:"updated",old_values:W(h),new_values:W(b),user_id:k},o)}}catch(w){if(B.warn(`[orm] audit(update) failed for ${t}#${String(f)}`,{error:w}),o)throw w}return g})};let l=(f)=>{let d=e[f];if(typeof d!=="function")return;e[f]=async function(p){return await a(async()=>{let m=i.find,g=typeof m==="function"?I(await m.call(i,p)):null,w=await d.call(this,p);try{if(w!==!1&&g){let h=await ie();await ae({auditable_type:t,auditable_id:p,event:"deleted",old_values:W(g),new_values:null,user_id:h},o)}}catch(h){if(B.warn(`[orm] audit(${f}) failed for ${t}#${String(p)}`,{error:h}),o)throw h}return w})}};l("delete"),l("softDelete")}import{db as rr,sql as or,sqlDateTime as Me}from"@stacksjs/database/runtime";function C(e,t){if(typeof e!=="number"||!Number.isFinite(e)||e<=0)throw Error(`[orm/commentable] ${t} requires a positive numeric id (received ${String(e)})`)}var V="commentable_upvotes",Q="commentables";function ir(e){let t=e;return t.code==="SQLITE_CONSTRAINT_UNIQUE"||t.code==="SQLITE_CONSTRAINT"||t.code==="23505"||t.errno===1062||/unique|duplicate/i.test(t.message??"")}var Rt=["pending","approved"];function Oe(e){let t=rr;return{async comments(n){return C(n,"comments"),await t.selectFrom("commentables").where("commentables_id","=",n).where("commentables_type","=",e).selectAll().orderBy("id","asc").execute()},async commentCount(n){let r=await t.selectFrom("commentables").select(or`count(*) as count`).where("commentables_id","=",n).where("commentables_type","=",e).executeTakeFirst();return Number(r?.count)||0},async addComment(n,r,o={}){if(C(n,"addComment"),!r||typeof r.body!=="string"||r.body.trim().length===0)throw Error("[orm/commentable] addComment requires a non-empty comment.body");if(r.title!=null&&typeof r.title!=="string")throw Error("[orm/commentable] addComment requires comment.title to be a string when given");let i=o.status??"pending";if(!Rt.includes(i))throw Error(`[orm/commentable] addComment status must be one of ${Rt.join(", ")} (received ${String(i)})`);let a={title:r.title?.trim()??"",body:r.body,commentables_id:n,commentables_type:e,status:i,approved_at:i==="approved"?Date.now():null,created_at:Me(),updated_at:Me()};for(let c of["author_name","author_email","user_id"])if(r[c]!=null)a[c]=r[c];let s=await t.insertInto("commentables").values(a).returningAll().executeTakeFirst();if(s&&typeof s==="object"&&"id"in s)return s;let u=s?.lastInsertRowid;if(u==null)return s;return await t.selectFrom("commentables").where("id","=",Number(u)).selectAll().executeTakeFirst()},async approvedComments(n){return await t.selectFrom("commentables").where("commentables_id","=",n).where("commentables_type","=",e).where("status","=","approved").selectAll().orderBy("id","asc").execute()},async pendingComments(n){return await t.selectFrom("commentables").where("commentables_id","=",n).where("commentables_type","=",e).where("status","=","pending").selectAll().orderBy("id","asc").execute()},async rejectedComments(n){return await t.selectFrom("commentables").where("commentables_id","=",n).where("commentables_type","=",e).where("status","=","rejected").selectAll().orderBy("id","asc").execute()},async upvoteComment(n,r){C(n,"upvoteComment"),C(r,"upvoteComment");let o=()=>t.selectFrom(V).where("upvoteable_id","=",n).where("upvoteable_type","=",Q).where("user_id","=",r).selectAll().executeTakeFirst(),i=await o();if(i)return i;try{await t.insertInto(V).values({upvoteable_id:n,upvoteable_type:Q,user_id:r,created_at:Me()}).execute()}catch(a){if(!ir(a))throw a}return await o()},async removeCommentUpvote(n,r){C(n,"removeCommentUpvote"),C(r,"removeCommentUpvote"),await t.deleteFrom(V).where("upvoteable_id","=",n).where("upvoteable_type","=",Q).where("user_id","=",r).execute()},async commentUpvoteCount(n){C(n,"commentUpvoteCount");let r=await t.selectFrom(V).select("count(*) as count").where("upvoteable_id","=",n).where("upvoteable_type","=",Q).executeTakeFirst();return Number(r?.count)||0},async hasUpvotedComment(n,r){return C(n,"hasUpvotedComment"),C(r,"hasUpvotedComment"),!!await t.selectFrom(V).where("upvoteable_id","=",n).where("upvoteable_type","=",Q).where("user_id","=",r).selectAll().executeTakeFirst()}}}import{db as ar,sql as sr,sqlDateTime as _t}from"@stacksjs/database/runtime";function De(e,t){if(typeof e!=="number"||!Number.isFinite(e)||e<=0)throw Error(`[orm/taggable] ${t} requires a positive numeric id (received ${String(e)})`)}function Ee(e){let t=ar;return{async tags(n){return De(n,"tags"),await t.selectFrom("taggables").where("taggable_id","=",n).where("taggable_type","=",e).selectAll().execute()},async tagCount(n){De(n,"tagCount");let r=await t.selectFrom("taggables").select(sr`count(*) as count`).where("taggable_id","=",n).where("taggable_type","=",e).executeTakeFirst();return Number(r?.count)||0},async addTag(n,r){if(De(n,"addTag"),!r||typeof r.name!=="string"||r.name.trim().length===0)throw Error("[orm/taggable] addTag requires a non-empty tag.name");return await t.insertInto("taggables").values({...r,taggable_id:n,taggable_type:e,slug:r.name.toLowerCase().replace(/[^a-z0-9]+/g,"-"),is_active:!0,created_at:_t(),updated_at:_t()}).execute(),await t.selectFrom("taggables").where("taggable_id","=",n).where("taggable_type","=",e).where("name","=",r.name).selectAll().executeTakeFirst()},async activeTags(n){return await t.selectFrom("taggables").where("taggable_id","=",n).where("taggable_type","=",e).where("is_active","=",!0).selectAll().execute()},async inactiveTags(n){return await t.selectFrom("taggables").where("taggable_id","=",n).where("taggable_type","=",e).where("is_active","=",!1).selectAll().execute()},async removeTag(n,r){await t.deleteFrom("taggables").where("taggable_id","=",n).where("taggable_type","=",e).where("id","=",r).execute()}}}import{db as ur,sqlDateTime as se}from"@stacksjs/database/runtime";function je(e){let t=ur;async function n(r){return(await t.selectFrom("categorizable_models").where("categorizable_id","=",r).where("categorizable_type","=",e).selectAll().execute()).map((i)=>i.category_id)}return{async categories(r){let o=await n(r);if(o.length===0)return[];return await t.selectFrom("categorizables").where("id","in",o).selectAll().execute()},async categoryCount(r){return(await n(r)).length},async addCategory(r,o){let i=()=>t.selectFrom("categorizables").where("name","=",o.name).where("categorizable_type","=",e).selectAll().executeTakeFirst(),a=await i();if(!a)await t.insertInto("categorizables").values({name:o.name,description:o.description,slug:o.name.toLowerCase().replace(/[^a-z0-9]+/g,"-"),categorizable_type:e,is_active:!0,created_at:se(),updated_at:se()}).execute(),a=await i();return await t.insertInto("categorizable_models").values({categorizable_id:r,categorizable_type:e,category_id:a?.id,created_at:se(),updated_at:se()}).execute(),a},async activeCategories(r){let o=await n(r);if(o.length===0)return[];return await t.selectFrom("categorizables").where("id","in",o).where("is_active","=",!0).selectAll().execute()},async inactiveCategories(r){let o=await n(r);if(o.length===0)return[];return await t.selectFrom("categorizables").where("id","in",o).where("is_active","=",!1).selectAll().execute()},async removeCategory(r,o){await t.deleteFrom("categorizable_models").where("categorizable_id","=",r).where("categorizable_type","=",e).where("category_id","=",o).execute()}}}import{db as cr,sqlDateTime as lr}from"@stacksjs/database/runtime";function Fe(e,t){let n=cr,r=t?.table||`${e}_likes`,o=t?.foreignKey||`${e.replace(/s$/,"")}_id`;return{async likes(i){return await n.selectFrom(r).where(o,"=",i).selectAll().execute()},async likeCount(i){let a=await n.selectFrom(r).select("count(*) as count").where(o,"=",i).executeTakeFirst();return Number(a?.count)||0},async like(i,a){if(typeof i!=="number"||!Number.isFinite(i)||i<=0)throw Error(`[orm/likeable] like requires a positive numeric id (received ${String(i)})`);if(typeof a!=="number"||!Number.isFinite(a)||a<=0)throw Error(`[orm/likeable] like requires a positive numeric userId (received ${String(a)})`);let s=lr();try{return await n.insertInto(r).values({[o]:i,user_id:a,created_at:s,updated_at:s}).returningAll().executeTakeFirst()}catch(u){let c=u;if(!(c.code==="SQLITE_CONSTRAINT_UNIQUE"||c.code==="SQLITE_CONSTRAINT"||c.code==="23505"||c.errno===1062||/unique|duplicate/i.test(c.message??"")))throw u;let f=await n.selectFrom(r).where(o,"=",i).where("user_id","=",a).selectAll().executeTakeFirst();if(f)return f;throw u}},async unlike(i,a){await n.deleteFrom(r).where(o,"=",i).where("user_id","=",a).execute()},async isLiked(i,a){return!!await n.selectFrom(r).where(o,"=",i).where("user_id","=",a).selectAll().executeTakeFirst()},async likedBy(i){return(await n.selectFrom(r).select([o]).where("user_id","=",i).execute()).map((s)=>Number(s[o])).filter(Boolean)}}}import{createRequire as dr}from"module";import{db as fr}from"@stacksjs/database/runtime";var pr=dr(import.meta.url);class $e extends Error{constructor(e){super(`No subscription ${e} belongs to this user`);this.name="SubscriptionNotOwnedError"}}function St(e){let t=fr;return{async syncStripeCustomerDetails(n,r){let{manageCustomer:o}=await import("@stacksjs/payments");return await o.syncStripeCustomerDetails(n,r)},async createStripeUser(n,r){let{manageCustomer:o}=await import("@stacksjs/payments");return await o.createStripeCustomer(n,r)},async updateStripeUser(n,r){let{manageCustomer:o}=await import("@stacksjs/payments");return await o.updateStripeCustomer(n,r)},async deleteStripeUser(n){let{manageCustomer:r}=await import("@stacksjs/payments");return await r.deleteStripeUser(n)},async createOrGetStripeUser(n,r){let{manageCustomer:o}=await import("@stacksjs/payments");return await o.createOrGetStripeUser(n,r)},async retrieveStripeUser(n){let{manageCustomer:r}=await import("@stacksjs/payments");return await r.retrieveStripeUser(n)},async defaultPaymentMethod(n){let{managePaymentMethod:r}=await import("@stacksjs/payments");return await r.retrieveDefaultPaymentMethod(n)},async setDefaultPaymentMethod(n,r){let{managePaymentMethod:o}=await import("@stacksjs/payments");return typeof r==="string"?await o.setUserDefaultPayment(n,r):await o.setDefaultPaymentMethod(n,r)},async deletePaymentMethod(n,r){let{managePaymentMethod:o}=await import("@stacksjs/payments");return await o.deletePaymentMethod(n,r)},async addPaymentMethod(n,r){let{managePaymentMethod:o}=await import("@stacksjs/payments");return await o.addPaymentMethod(n,r)},async paymentMethods(n,r){let{managePaymentMethod:o}=await import("@stacksjs/payments");return await o.listPaymentMethods(n,r)},async newSubscription(n,r,o,i={}){let{manageSubscription:a}=await import("@stacksjs/payments"),s=await a.create(n,r,o,i),c=s.latest_invoice?.payment_intent;return{subscription:s,paymentIntent:c}},async updateSubscription(n,r,o,i={}){let{manageSubscription:a}=await import("@stacksjs/payments"),s=await a.update(n,r,o,i),c=s.latest_invoice?.payment_intent;return{subscription:s,paymentIntent:c}},async cancelSubscription(n,r,o={}){if(!await t.selectFrom("subscriptions").where("provider_id","=",r).where("user_id","=",n.id).select(["id"]).executeTakeFirst())throw new $e(r);let{manageSubscription:a}=await import("@stacksjs/payments");return{subscription:await a.cancel(r,o)}},async activeSubscription(n){let{manageSubscription:r}=await import("@stacksjs/payments"),o=await t.selectFrom("subscriptions").where("user_id","=",n.id).where("provider_status","=","active").selectAll().executeTakeFirst();if(o){let i=await r.retrieve(n,o.provider_id||"");return{subscription:o,providerSubscription:i}}return},async checkout(n,r,o={}){let{manageCheckout:i,manageCustomer:a}=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 a.createOrGetStripeUser(n,{})).id,line_items:r.map((f)=>({price:f.priceId,quantity:f.quantity||1}))},...s,...o};return await i.create(n,l)},async createSetupIntent(n,r={}){let{manageSetupIntent:o}=await import("@stacksjs/payments");return await o.create(n,r)},async createPayment(n,r,o={}){let{manageCharge:i}=await import("@stacksjs/payments");return await i.createPayment(n,r,o)},async storeTransaction(n,r,o){let{manageTransaction:i}=await import("@stacksjs/payments");return await i.store(n,r,o)},async subscriptionHistory(n){let{manageInvoice:r}=await import("@stacksjs/payments");return await r.list(n)},async transactionHistory(n){let{manageTransaction:r}=await import("@stacksjs/payments");return await r.list(n)},async connectAccount(n,r={}){let o=r.accountColumn||"stripe_account_id",i=(n._attributes??n)[o];if(!i)return null;let a=await z();try{return await a.accounts.retrieve(i)}catch{return null}},async createConnectAccount(n,r={}){let o=r.accountColumn||"stripe_account_id",i=n._attributes??n,a=i[o],s=await z();if(!a){let{stacksIdempotencyKey:u}=await import("@stacksjs/payments"),c=r.modelTable||e,l=await s.accounts.create({type:r.type??"express",email:r.email??i.email,country:r.country??"US",capabilities:r.capabilities??{card_payments:{requested:!0},transfers:{requested:!0}}},{idempotencyKey:u("connect.account.create",c,i.id)});return a=l.id,await t.updateTable(c).set({[o]:a}).where("id","=",Number(i.id)).execute(),l}return await s.accounts.retrieve(a)},async connectOnboardLink(n,r){let o=r.accountColumn||"stripe_account_id",a=(n._attributes??n)[o];if(!a)throw Error("connectOnboardLink: model has no Stripe Connect account; call createConnectAccount first");return{url:(await(await z()).accountLinks.create({account:a,refresh_url:r.refreshUrl,return_url:r.returnUrl,type:r.type??"account_onboarding"})).url,accountId:a}},async syncConnectStatus(n,r={}){let o=r.accountColumn||"stripe_account_id",i=r.chargesColumn||"charges_enabled",a=r.payoutsColumn||"payouts_enabled",s=n._attributes??n,u=s[o];if(!u)return{chargesEnabled:!1,payoutsEnabled:!1};let l=await(await z()).accounts.retrieve(u),f=!!l.charges_enabled,d=!!l.payouts_enabled,p=r.modelTable||e;return await t.updateTable(p).set({[i]:f,[a]:d}).where("id","=",Number(s.id)).execute(),{chargesEnabled:f,payoutsEnabled:d}},async chargeWithSplit(n,r){let o=await z(),i=r.accountColumn||"stripe_account_id",a=n._attributes??n,s=r.connectAccountId||a[i],u={amount:r.amountCents,currency:r.currency||"usd",automatic_payment_methods:{enabled:!0},metadata:r.metadata};if(s){if(u.transfer_data={destination:s},r.platformFeeCents)u.application_fee_amount=r.platformFeeCents}let{freshIdempotencyKey:c}=await import("@stacksjs/payments");return await o.paymentIntents.create(u,{idempotencyKey:c("payment_intent.create",a.id,r.amountCents)})}}}var mr={syncStripeCustomerDetails:!0,createStripeUser:!0,updateStripeUser:!0,deleteStripeUser:!0,createOrGetStripeUser:!0,retrieveStripeUser:!0,defaultPaymentMethod:!0,setDefaultPaymentMethod:!0,deletePaymentMethod:!0,addPaymentMethod:!0,paymentMethods:!0,newSubscription:!0,updateSubscription:!0,cancelSubscription:!0,activeSubscription:!0,checkout:!0,createSetupIntent:!0,createPayment:!0,storeTransaction:!0,subscriptionHistory:!0,transactionHistory:!0,connectAccount:!0,createConnectAccount:!0,connectOnboardLink:!0,syncConnectStatus:!0,chargeWithSplit:!0},ue=Object.freeze(Object.keys(mr));function gr(e){return ue.every((t)=>typeof Reflect.get(e,t)==="function")}function z(){let e=globalThis.process?.env?.STRIPE_SECRET_KEY;if(!e)throw Error("Stripe Connect: STRIPE_SECRET_KEY not configured");let t;try{t=pr("stripe")}catch{throw Error("Stripe Connect is being used but the `stripe` package is not installed. It is an opt-in dependency - run `bun add stripe` to enable Stripe Connect.")}return new t(e,{apiVersion:t.API_VERSION})}function Mt(e){let t=e;return t?.code==="SQLITE_CONSTRAINT_UNIQUE"||t?.code==="SQLITE_CONSTRAINT"||t?.code==="23505"||t?.errno===1062||/unique|duplicate/i.test(t?.message??"")}function yr(e,t,n){let r=e;if(e instanceof Error&&typeof r.status==="number"&&Number.isInteger(r.status)&&r.status>=400&&r.status<600){let o={error:e.message};if(r.details!==void 0)o.details=r.details;return{status:r.status,body:o}}if(Mt(e))return{status:409,body:{error:`${t} already exists`}};return{status:500,body:{error:`Failed to ${n} ${t}`,detail:String(e)}}}function P(e){let t=!1;for(let r=0;r<e.length;r++){let o=e.charCodeAt(r);if(o>127)return e.replace(/([a-z\d])([A-Z])/g,"$1_$2").replace(/([A-Z])([A-Z][a-z])/g,"$1_$2").toLowerCase();if(o>=65&&o<=90)t=!0}if(!t)return e;let n="";for(let r=0;r<e.length;r++){let o=e.charCodeAt(r);if(o<65||o>90){n+=e[r];continue}let i=r>0?e.charCodeAt(r-1):0,a=r+1<e.length?e.charCodeAt(r+1):0,s=i>=97&&i<=122||i>=48&&i<=57,u=i>=65&&i<=90&&a>=97&&a<=122;if(r>0&&(s||u))n+="_";n+=String.fromCharCode(o+32)}return n}function wr(e){let t={};for(let[n,r]of Object.entries(e))t[P(n)]=r;return t}function ou(e,t){let n=String(t||"").replace(/^\/+|\/+$/g,""),r=String(e).replace(/^\/+/,"");return`/api/${n?`${n}/`:""}${r}`}function Ot(e){if(!e)return null;let t=e.attributes??{};if(Object.prototype.hasOwnProperty.call(t,"teamId")||Object.prototype.hasOwnProperty.call(t,"team_id"))return"team_id";return e.belongsTo?.some((n)=>n==="Team")?"team_id":null}function Dt(e){if(!e)return null;let t=e.attributes??{};if(Object.prototype.hasOwnProperty.call(t,"userId")||Object.prototype.hasOwnProperty.call(t,"user_id"))return"user_id";return e.belongsTo?.some((n)=>n==="User")?"user_id":null}function iu(e){return e?.ownership===!1}function au(e,t,n){let r=Object.keys(e).find((i)=>P(i)===P(t));if(Array.isArray(n)){if(r===void 0)return{data:e,error:"Ownership value is required"};if(!n.some((i)=>String(i)===String(e[r])))return{data:e,error:"Ownership value is not available to this caller"};return{data:{...e,[t]:e[r]}}}if(n===null||n===void 0)return{data:e,error:"Caller has no ownership identity"};let o={...e};for(let i of Object.keys(o))if(P(i)===P(t))delete o[i];return o[t]=n,{data:o}}function br(e){if(!e)return[];let t=Object.entries(e.attributes??{}).filter(([,n])=>n?.fillable===!0).map(([n])=>n);for(let n of e.belongsTo??[]){if(typeof n!=="string"||!n.trim())continue;let r=P(n.trim()).split("_").filter(Boolean);if(r.length===0)continue;let o=`${r[0]}${r.slice(1).map((i)=>`${i[0]?.toUpperCase()}${i.slice(1)}`).join("")}Id`;t.push(o)}return[...new Set(t)]}function hr(e,t){if(!e||t.length===0)return{};let n={},r;for(let o of t){if(o in e){n[o]=e[o];continue}r??=Tr(t);let i=r.get(o);if(i!==o&&i in e)n[o]=e[i]}return n}function kr(e,t){if(e?.name!=="date"||t instanceof Date||typeof t!=="string")return t;let n=/^(\d{4})-(\d{2})-(\d{2})$/.exec(t);if(!n)return t;let r=Number(n[1]),o=Number(n[2]),i=Number(n[3]),a=new Date(Date.UTC(r,o-1,i));if(a.getUTCFullYear()!==r||a.getUTCMonth()!==o-1||a.getUTCDate()!==i)return t;return a}var At=new WeakMap,Pt=new WeakMap;function Be(e){let t=At.get(e);if(t&&t.length===e.length){let r=!0;for(let o=0;o<e.length;o++)if(t[o]?.field!==e[o]){r=!1;break}if(r)return t}let n=e.map((r)=>({field:r,snake:P(r)}));return At.set(e,n),n}function Tr(e){let t=Be(e),n=Pt.get(t);if(n)return n;let r=new Map(t.map(({field:o,snake:i})=>[o,i]));return Pt.set(t,r),r}function su(e,t){if(!t.length)return e;let n={...e};for(let{field:r,snake:o}of Be(t))if(delete n[r],o!==r)delete n[o];return n}function uu(e,t){if(!e||t.length===0)return e;let n={...e};for(let{field:r,snake:o}of Be(t))if(delete n[r],o!==r)delete n[o];return n}var Rr=["id","uuid","created_at","updated_at","deleted_at"];function cu(e,t){let n=new Map;for(let r of[...Object.keys(e??{}),...Rr]){let o=P(r);if(!/^\w+$/.test(o))continue;n.set(r,o),n.set(o,o)}for(let r of t)n.delete(r),n.delete(P(r));return n}function lu(e,t,n){if(!t)return e;let r=e;for(let o of String(t).split(",")){let i=o.trim();if(!i)continue;let a=i.startsWith("-"),s=a?i.slice(1):i;if(!/^\w+$/.test(s))continue;let u=n.get(s);if(!u)continue;r=r.orderBy(u,a?"desc":"asc")}return r}var _r={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"?Ar(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"?Pr(e):[],set:(e)=>e==null?null:Array.isArray(e)?JSON.stringify(e):e}},xt=new WeakMap;function Sr(e,t){let n=xt.get(e);if(n&&n.length===t.length){let o=!0;for(let i=0;i<t.length;i++){let a=t[i];if(n[i]?.attr!==a||n[i]?.definition!==e[a]){o=!1;break}}if(o)return n}let r=[];for(let o of t){let i=e[o],a=typeof i==="string"?_r[i]:i;r.push({attr:o,snake:P(o),definition:i,caster:a})}return xt.set(e,r),r}function Ar(e){try{return JSON.parse(e)}catch{return e}}function Pr(e){try{return JSON.parse(e)}catch{return[]}}function du(e,t,n){if(!e||typeof e!=="object"||!t)return e;let r=Object.keys(t);if(r.length===0)return e;let o=Sr(t,r);if(o.length===0)return e;let i={...e};for(let{attr:a,caster:s,snake:u}of o){if(!s)continue;let c=s[n];if(typeof c!=="function")continue;if(Object.prototype.hasOwnProperty.call(i,a))i[a]=c.call(s,i[a]);if(u!==a&&Object.prototype.hasOwnProperty.call(i,u))i[u]=c.call(s,i[u])}return i}var Ct=new WeakMap;function xr(e){let t=Ct.get(e);if(t)return t;let n=[];for(let[r,o]of Object.entries(e)){let i=o?.validation?.rule;if(!i||typeof i.validate!=="function")continue;n.push({definition:o,field:r,hasDefault:o!==null&&typeof o==="object"&&Object.prototype.hasOwnProperty.call(o,"default"),rule:i})}return Ct.set(e,n),n}function Et(e){let t=e?.attributes;if(!t||typeof t!=="object")return!1;for(let n of Object.values(t)){let r=n?.validation?.rule;if(r&&typeof r.validate==="function")return!0}return!1}function jt(e,t,n){let r=t?.attributes;if(!r||typeof r!=="object")return{valid:!0};let o=xr(r);if(o.length===0)return{valid:!0};let i={},a=!1;for(let s of o){let{definition:u,field:c,hasDefault:l,rule:f}=s,d=Object.prototype.hasOwnProperty.call(e,c);if(!d&&n==="updating")continue;let p=d?e[c]:l?u.default:void 0,m=kr(f,p),g=f.validate(m);if(!g?.valid&&Array.isArray(g?.errors)&&g.errors.length>0)a=!0,i[c]=g.errors.map((w)=>u.validation?.message?.[w?.code]??w?.message??"invalid")}return a?{valid:!1,errors:i}:{valid:!0}}function Cr(e,t){return`${e}\x00${vr(t)}`}function fu(e){let t=new Map;for(let n of e){let r=Cr(String(n.method??""),String(n.path??""));if(!t.has(r))t.set(r,n)}return t}function vr(e){return e.replace(/\{[^}]*\}/g,"{}").replace(/:[^/]+/g,"{}")}function Ie(e){if(Array.isArray(e))return e.filter((t)=>typeof t==="string"&&t.length>0);return typeof e==="string"&&e?[e]:[]}function pu(e){let t=typeof e==="object"&&e!==null&&"middleware"in e,n=e?.middleware;if(!t)return{read:["auth"],write:["auth"],declared:!1};if(n&&typeof n==="object"&&!Array.isArray(n)){let o=n;return{read:"read"in o?Ie(o.read):["auth"],write:"write"in o?Ie(o.write):["auth"],declared:!0}}let r=Ie(n);return{read:r,write:r,declared:!0}}var vt=15,Mr=100;function mu(e){let t=Number.parseInt(e.get("page")||String(1),10),n=Number.isFinite(t)?Math.max(1,t):1,r=Number.parseInt(e.get("per_page")||String(vt),10),o=Math.min(Number.isFinite(r)?Math.max(1,r):vt,Mr);return{page:n,perPage:o,offset:(n-1)*o}}function ce(e,t){let n=new URL(e.toString());return n.searchParams.set("page",String(t)),`${n.pathname}${n.search}`}function Or(e,t,n,r,o,i){let a=(t-1)*n,s=r===0,u={page:t,per_page:n,from:s?null:a+1,to:s?null:a+r,has_more_pages:o,prev_page_url:t>1?ce(e,t-1):null,next_page_url:o?ce(e,t+1):null};if(i!==void 0&&!Number.isNaN(i)){let c=Math.max(1,Math.ceil(i/n));u.total=i,u.last_page=c,u.first_page_url=ce(e,1),u.last_page_url=ce(e,c)}return u}function gu(e,t,n,r,o,i){let{page:a,...s}=Or(e,t,n,r,o,i);return{current_page:a,...s}}function yu(e,t){return(t??e??"").toString().trim().toLowerCase()==="warn"?"warn":"deny"}function wu(e,t){if(e.length===0)return null;let n=[...e].sort().join(", ");if(t==="deny")return`[orm] security.api.rowScoping is 'deny': NOT registering store/update/destroy for ${e.length} model(s) `+`with no row-level scoping \u2014 ${n}. Give a model an \`ownership\` config or a \`team_id\` column to restore its writes.`;return`[orm] ${e.length} model(s) publish mutating routes with no row-level scoping, so an authenticated caller can write any row \u2014 `+`${n}. Scope one with an \`ownership\` config or a \`team_id\` column; intended for public catalog tables. Set \`security.api.rowScoping: 'deny'\` (config/security.ts) to stop generating these routes instead.`}function Dr(e){if(e?.ownership===!1)return null;if(e?.ownership)return e.ownership;let t=Ot(e);if(t)return{field:t,resolve:async(r,o)=>{let{resolveAuthenticatedTeamId:i}=await import("@stacksjs/auth");return i(Ne(o))}};let n=Dt(e);if(n)return{field:n,resolve:async(r)=>r?.id??null};return null}function Ne(e){let t=e?.headers?.get?.("authorization"),n=t&&/^Bearer\s+/i.test(t)?t.replace(/^Bearer\s+/i,"").trim():null,r=e?.headers?.get?.("cookie")||"";return{bearerToken:()=>n,cookies:{get:(o)=>{for(let i of r.split(";")){let a=i.indexOf("=");if(a===-1)continue;if(i.slice(0,a).trim()===o)return decodeURIComponent(i.slice(a+1).trim())}return null}}}}function Er(e="customer_id"){return{field:e,resolve:async(t)=>{let n=t?.id;if(n==null)return null;try{let{Customer:r}=await import("@stacksjs/orm");return(await r.where("user_id",n).first())?.id??null}catch{return null}}}}function jr(e="id"){return{field:e,resolve:async(t)=>t?.id??null}}function Fr(e="site_id"){return{field:e,resolve:async(t,n)=>{try{let[{resolveAuthenticatedTeamId:r},{Site:o}]=await Promise.all([import("@stacksjs/auth"),import("@stacksjs/orm")]),i=await r(Ne(n));if(i==null)return[];return(await o.where("team_id",i).get()??[]).map((s)=>s.id).filter((s)=>s!=null)}catch{return[]}}}}function $r(e="id"){return{field:e,resolve:async(t,n)=>{try{let{resolveAuthenticatedTeamId:r}=await import("@stacksjs/auth");return await r(Ne(n))}catch{return null}}}}function Ir(e,t){return{field:t,resolve:async(n,r)=>{try{let o=await import("@stacksjs/orm"),i=o.models?.[e]??o[e]?.definition??null,a=Dr(i);if(!a?.field||typeof a.resolve!=="function")return[];let s=await a.resolve(n,r);if(s==null||Array.isArray(s)&&s.length===0)return[];let u=o[e];if(!u)return[];return((Array.isArray(s)?await u.whereIn(a.field,s).get():await u.where(a.field,s).get())??[]).map((l)=>l.id).filter((l)=>l!=null)}catch{return[]}}}}import{getCurrentRequest as Br}from"@stacksjs/router";var Ft=new WeakMap;function $t(e){let t=new Map;for(let n of e){let r=n?.id;if(r!==void 0)t.set(r,n)}return t}async function Nr(e,t){if(typeof e.find==="function")return e.find(t);let n=await e.findMany?.([t]);return $t(n??[]).get(t)}async function Lr(e,t,n){t.pending=void 0;try{let r=typeof e.findMany==="function"?await e.findMany(n.keys):await Promise.all(n.keys.map((i)=>e.find?.(i))),o=$t(r??[]);for(let i of n.resolvers)i.resolve(o.get(i.key))}catch(r){for(let o of n.resolvers)o.reject(r)}}function Ru(e,t){let n=Br();if(!n)return Nr(e,t);let r=Ft.get(n);if(!r)r=new WeakMap,Ft.set(n,r);let o=r.get(e);if(!o)o={cache:new Map},r.set(e,o);let i=o.cache.get(t);if(i)return i.then();let a=o.pending;if(!a){a={keys:[],resolvers:[]},o.pending=a;let c=a,l=o;queueMicrotask(()=>{Lr(e,l,c)})}let s=new Promise((c,l)=>{a.keys.push(t),a.resolvers.push({key:t,resolve:c,reject:l})});o.cache.set(t,s);let u=o.cache;return s.catch(()=>u.delete(t)),s.then()}import{db as Pu}from"@stacksjs/database/runtime";class qr{conditions=[];where(e,...t){let[n,r]=t,o=r===void 0?"=":n,i=r===void 0?n:r;this.addCondition("and","where",e,o,i)}orWhere(e,...t){let[n,r]=t,o=r===void 0?"=":n,i=r===void 0?n:r;this.addCondition("or","where",e,o,i)}whereIn(e,t){this.conditions.push({type:"and",method:"whereIn",column:e,values:t})}whereNotIn(e,t){this.conditions.push({type:"and",method:"whereIn",column:e,values:t,operator:"not in"})}whereNull(e){this.conditions.push({type:"and",method:"whereNull",column:e})}whereNotNull(e){this.conditions.push({type:"and",method:"whereNotNull",column:e})}whereBetween(e,t){this.conditions.push({type:"and",method:"whereBetween",column:e,range:t})}whereExists(e){this.conditions.push({type:"and",method:"whereExists",column:"",callback:e})}addCondition(e,t,n,r,o){this.conditions.push({type:e,method:t,column:n,operator:r,value:o})}getConditions(){return this.conditions}}import{db as Le}from"@stacksjs/database/runtime";async function qe(e,t){return await Le.transaction(e,t)}async function vu(e){return await Le.savepoint(e)}function Mu(e,t){return Le.transactional(e,t)}import{randomUUID as Yr}from"crypto";import{db as x,getDatabaseDialect as Xr,parseSqlDateTime as Zr,sqlDateTime as zt}from"@stacksjs/database/runtime";import{plural as Gr,snakeCase as H}from"@stacksjs/strings";var It=new Set(["anonymize","delete","keep"]),Bt=new Set(["anonymize","delete"]),Nt=new Set(["consent","contract","legal_obligation","vital_interests","public_task","legitimate_interests"]),M="User";class Ge extends Error{problems;constructor(e){super(`GDPR declarations cannot be honoured:
3
+ ${e.map((t)=>` - ${t.model}: ${t.message}`).join(`
4
+ `)}`);this.name="GdprDeclarationError",this.problems=e}}function Ur(e){return(Array.isArray(e)?e.map((n)=>[n.name??"",n]):Object.entries(e)).map(([n,r])=>({name:String(r?.name??n),definition:r})).filter((n)=>n.name&&n.definition&&typeof n.definition==="object").sort((n,r)=>n.name.localeCompare(r.name))}function Lt(e,t){return t.table??H(Gr(e))}function Kr(e){let t=e.belongsTo,n=Array.isArray(t)?t:t&&typeof t==="object"?Object.values(t):[],r=[];for(let o of n){if(typeof o==="string"){r.push({model:o,foreignKey:`${H(o)}_id`});continue}if(o&&typeof o==="object"&&typeof o.model==="string"){let i=o;r.push({model:i.model,foreignKey:i.foreignKey??`${H(i.model)}_id`})}}return r}function Wr(e){if(e===!0)return{};if(e&&typeof e==="object")return e;return null}function Vr(e,t){if(t.anonymize!==void 0)return{perRow:!1,value:t.anonymize};if(!(e.required===!0&&e.nullable!==!0))return{perRow:!1,value:null};let r=e.validation?.rule?.name??e.type??"string";if(r==="string"||r==="text")return e.unique?{perRow:!0,value:null}:{perRow:!1,value:"[erased]"};if(e.unique)return{problem:`is a NOT NULL unique ${r} column; declare personal: { anonymize: <value> } or make it nullable`};if(r==="number"||r==="integer"||r==="float"||r==="decimal")return{perRow:!1,value:0};if(r==="boolean")return{perRow:!1,value:!1};if(r==="json")return{perRow:!1,value:"{}"};return{problem:`is a NOT NULL ${r} column with no safe placeholder; declare personal: { anonymize: <value> }`}}function le(e){let t=new Map,n=new Map,r=[],o=[],i=(s,u)=>{o.push({model:s,message:u})};for(let{name:s,definition:u}of Ur(e)){let c=u.attributes??{},l=u.traits?.gdpr,f=Kr(u),d=f.find((T)=>T.model===M),p=Object.entries(c).map(([T,A])=>({attribute:T,shape:A,options:Wr(A?.personal)})).filter((T)=>T.options!==null);if(!l&&p.length===0){if(d&&s!==M)r.push(s);continue}if(l!==void 0&&(l===null||typeof l!=="object")){i(s,"`traits.gdpr` must be an object");continue}let m=Lt(s,u),g=u.primaryKey??"id",w=null,h,b=l?.subject;if(b===void 0){if(s===M)w={kind:"column",columns:[g],where:{}};else if(d)w={kind:"column",columns:[d.foreignKey],where:{}}}else if(typeof b==="string")w={kind:"column",columns:[b],where:{}};else if(Array.isArray(b))w={kind:"column",columns:[...b].map(String),where:{}};else if(b&&typeof b==="object"&&"column"in b)w={kind:"column",columns:Array.isArray(b.column)?[...b.column].map(String):[String(b.column)],where:{...b.where??{}}};else if(b&&typeof b==="object"&&"via"in b){let T=f.find((A)=>A.model===b.via);if(!T)i(s,`subject { via: '${b.via}' } names a model this one does not declare in belongsTo`);else h=T.model,w={kind:"via",model:T.model,foreignKey:T.foreignKey}}else if(b&&typeof b==="object"&&"email"in b)w={kind:"email",column:String(b.email)};else i(s,"subject must be a column name, a list of columns, { column, where }, { via } or { email }");if(w?.kind==="column"&&w.columns.length===0)i(s,"subject names no column");let k=l?.erasure??"anonymize";if(!It.has(k))i(s,`erasure must be one of ${[...It].join(", ")}, got '${String(k)}'`);let R=null;if(l?.retention!==void 0){let T=l.retention,A=T?.action??"delete";if(!T||typeof T!=="object"||!Number.isInteger(T.days)||T.days<=0)i(s,"retention.days must be a positive whole number of days");else if(!Bt.has(A))i(s,`retention.action must be one of ${[...Bt].join(", ")}, got '${String(A)}'`);else R={days:T.days,column:T.column??"created_at",action:A}}if(l?.basis!==void 0&&!Nt.has(l.basis))i(s,`basis must be one of ${[...Nt].join(", ")}, got '${String(l.basis)}'`);let te=k==="anonymize"&&w!==null||R?.action==="anonymize",U=[];for(let{attribute:T,shape:A,options:Se}of p){let ne=Vr(A,Se);if("problem"in ne){if(te)i(s,`personal attribute '${T}' ${ne.problem}`);U.push({attribute:T,column:H(T),export:Se.export!==!1,perRow:!1,anonymizeTo:null});continue}U.push({attribute:T,column:H(T),export:Se.export!==!1,perRow:ne.perRow,anonymizeTo:ne.value})}if(w!==null&&k==="anonymize"&&U.length===0)i(s,"declares a subject but no personal attributes, so 'anonymize' would change nothing; mark the personal attributes, or declare erasure 'keep' or 'delete'");if(R?.action==="anonymize"&&U.length===0)i(s,"retention anonymizes, but no attribute is marked personal");if(t.set(s,{model:s,table:m,primaryKey:g,subject:w,personal:U,erasure:k,retention:R,purpose:l?.purpose??null,basis:l?.basis??null,depth:0,exportColumns:[...new Set([g,"uuid","created_at","updated_at"])]}),h)n.set(s,h)}let a=(s,u)=>{let c=n.get(s);if(!c)return 0;if(u.has(s))return null;if(!t.get(c)?.subject)return null;u.add(s);let f=a(c,u);return f===null?null:f+1};for(let s of t.values()){let u=n.get(s.model);if(!u)continue;if(!t.get(u)?.subject){i(s.model,`subject { via: '${u}' } points at a model that declares no subject of its own`);continue}let l=a(s.model,new Set);if(l===null)i(s.model,`subject { via: '${u}' } is part of a cycle`);else s.depth=l}return{models:[...t.values()],unclassified:r.sort(),problems:o}}function de(e){if(e.problems.length)throw new Ge(e.problems);return e}var fe="gdpr_requests",We=500;class pe extends Error{constructor(e){super(`No user matches '${String(e)}'.`);this.name="GdprSubjectNotFoundError"}}async function me(e){if(e)return de(le(e));await Promise.resolve().then(() => Ke());return de(le(await Ue()))}async function Ht(e=x){let t=String(Xr()),n=t==="sqlite"?"SELECT name FROM sqlite_master WHERE type = 'table'":t==="mysql"?"SELECT TABLE_NAME AS name FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE()":t==="postgres"?"SELECT table_name AS name FROM information_schema.tables WHERE table_schema = current_schema()":null;if(!n)return null;let r=await e.unsafe(n).execute();return new Set(r.map((o)=>String(o.name??o.NAME??"").toLowerCase()).filter(Boolean))}var eo=/no such table|does not exist|doesn't exist|unknown table|undefined table|ER_NO_SUCH_TABLE/i;async function ge(e,t=x){let n=await Ht(t);if(n)return n.has(e.toLowerCase());try{return await t.selectFrom(e).selectAll().limit(1).execute(),!0}catch(r){if(eo.test(r instanceof Error?r.message:String(r)))return!1;throw r}}function to(e){let t=e.models.find((n)=>n.model===M);return{table:t?.table??"users",primaryKey:t?.primaryKey??"id"}}function no(e){if(typeof e==="number")return{kind:"id",value:e};let t=String(e).trim();if(/^\d+$/.test(t))return{kind:"id",value:Number(t)};if(t.includes("@"))return{kind:"email",value:t};return{kind:"uuid",value:t}}async function ro(e,t={},n=x){let r=await me(t.models);return Qe(r,e,n)}async function Qe(e,t,n){let{table:r,primaryKey:o}=to(e),i=no(t),a;if(i.kind==="id")a=(await n.selectFrom(r).selectAll().where(o,"=",i.value).limit(1).execute())[0];else if(i.kind==="email"){for(let s of new Set([i.value,i.value.toLowerCase()]))if(a=(await n.selectFrom(r).selectAll().where("email","=",s).limit(1).execute())[0],a)break}else a=(await n.selectFrom(r).selectAll().where("uuid","=",i.value).limit(1).execute())[0];if(!a)return null;return{id:a[o],email:typeof a.email==="string"?a.email:null}}function ze(e,t=We){let n=[];for(let r=0;r<e.length;r+=t)n.push(e.slice(r,r+t));return n}function oo(e,t){let n=new Map;for(let r of e)n.set(String(r[t]),r);return[...n.values()].sort((r,o)=>String(r[t]).localeCompare(String(o[t]),void 0,{numeric:!0}))}async function He(e,t,n,r,o){let i=o.get(n.model);if(i)return i;let a=n.subject,s=[];if(a?.kind==="column")for(let u of a.columns){let c=e.selectFrom(n.table).selectAll().where(u,"=",r.id);for(let[l,f]of Object.entries(a.where))c=c.where(l,"=",f);s.push(...await c.execute())}else if(a?.kind==="email"){if(r.email)for(let u of new Set([r.email,r.email.toLowerCase()]))s.push(...await e.selectFrom(n.table).selectAll().where(a.column,"=",u).execute())}else if(a?.kind==="via"){let u=t.get(a.model),l=(await He(e,t,u,r,o)).map((f)=>f[u.primaryKey]).filter((f)=>f!==null&&f!==void 0);for(let f of ze(l))s.push(...await e.selectFrom(n.table).selectAll().where(a.foreignKey,"in",f).execute())}return s=oo(s,n.primaryKey),o.set(n.model,s),s}function Vt(e){if(typeof e==="bigint")return Number.isSafeInteger(Number(e))?Number(e):e.toString();if(e instanceof Date)return e.toISOString();return e}function io(e,t){let n={};for(let r of e.exportColumns)if(r in t)n[r]=Vt(t[r]);for(let r of e.personal)if(r.export&&r.column in t)n[r.column]=Vt(t[r.column]);return n}function Ve(e,t){let n={};for(let r of e.personal)n[r.column]=r.perRow?`erased-${String(t[e.primaryKey])}`:r.anonymizeTo;return n}function ao(e,t){if(e===t)return!0;if(e===null||e===void 0||t===null||t===void 0)return(e===null||e===void 0)&&(t===null||t===void 0);if(typeof t==="boolean")return Number(e)===Number(t);return String(e)===String(t)}function Jt(e,t){let n=Ve(e,t);return Object.entries(n).some(([r,o])=>!ao(t[r],o))}async function Yt(e,t,n){if(!n.length)return;if(t.personal.some((o)=>o.perRow)){for(let o of n)await e.updateTable(t.table).set(Ve(t,o)).where(t.primaryKey,"=",o[t.primaryKey]).execute();return}let r=Ve(t,n[0]);for(let o of ze(n.map((i)=>i[t.primaryKey])))await e.updateTable(t.table).set(r).where(t.primaryKey,"in",o).execute()}async function Xt(e,t,n){for(let r of ze(n.map((o)=>o[t.primaryKey])))await e.deleteFrom(t.table).where(t.primaryKey,"in",r).execute()}async function Je(e,t,n,r,o){let i=zt(new Date);await e.insertInto(fe).values({uuid:Yr(),type:t,subject_id:n!==null&&Number.isSafeInteger(Number(n))?Number(n):null,actor:r,status:"completed",summary:JSON.stringify(n!==null&&!Number.isSafeInteger(Number(n))?{subject:String(n),...o}:o),occurred_at:i,created_at:i}).execute()}async function Ye(){if(!await ge(fe))throw Error(`The '${fe}' table does not exist, so this request cannot be recorded. Run \`buddy migrate\` first.`)}async function Xe(e){let t=[],n=[],r=await Ht(),o=new Map;for(let i of e){if(!o.has(i.table))o.set(i.table,r?r.has(i.table.toLowerCase()):await ge(i.table));if(o.get(i.table))t.push(i);else n.push(i.table)}return{present:t,skipped:[...new Set(n)].sort()}}async function so(e,t={}){let n=await me(t.models),r=await Qe(n,e,x);if(!r)throw new pe(e);await Ye();let o=n.models.filter((l)=>l.subject),{present:i}=await Xe(o),a=new Map(i.map((l)=>[l.model,l]));for(let l of i)if(l.subject?.kind==="via"&&!a.has(l.subject.model))a.delete(l.model);let s=new Map,u={},c={};for(let l of[...a.values()].sort((f,d)=>f.model.localeCompare(d.model))){let f=await He(x,a,l,r,s);if(!f.length)continue;u[l.model]=f.map((d)=>io(l,d)),c[l.model]={purpose:l.purpose,basis:l.basis,retentionDays:l.retention?.days??null}}return await Je(x,"access",r.id,t.actor??"system",{models:Object.fromEntries(Object.entries(u).map(([l,f])=>[l,f.length]))}),{subject:{id:r.id},generatedAt:new Date().toISOString(),data:u,processing:c}}function uo(e){return[...e].sort((t,n)=>{let r=t.model===M?1:0,o=n.model===M?1:0;if(r!==o)return r-o;if(t.depth!==n.depth)return n.depth-t.depth;return t.model.localeCompare(n.model)})}async function co(e,t={}){let n=t.dryRun===!0,r=await me(t.models),o=await Qe(r,e,x);if(!o)throw new pe(e);if(!n)await Ye();let i=r.models.filter((d)=>d.subject),{present:a,skipped:s}=await Xe(i),u=new Map(a.map((d)=>[d.model,d]));for(let d of a)if(d.subject?.kind==="via"&&!u.has(d.subject.model))u.delete(d.model);let c=async(d)=>{let p=new Map;for(let g of u.values())await He(d,u,g,o,p);let m=[];for(let g of uo([...u.values()])){let w=p.get(g.model)??[];if(g.erasure==="delete"){if(!n)await Xt(d,g,w);m.push({model:g.model,table:g.table,action:"delete",matched:w.length,changed:w.length,fields:[]})}else if(g.erasure==="anonymize"){let h=w.filter((b)=>Jt(g,b));if(!n)await Yt(d,g,h);m.push({model:g.model,table:g.table,action:"anonymize",matched:w.length,changed:h.length,fields:g.personal.map((b)=>b.column)})}else m.push({model:g.model,table:g.table,action:"keep",matched:w.length,changed:0,fields:[]})}if(!n)await Je(d,"erasure",o.id,t.actor??"system",{changes:m.map(({model:g,action:w,matched:h,changed:b})=>({model:g,action:w,matched:h,changed:b})),skipped:s});return m},l=n?await c(x):await qe(c),f=!1;if(!n&&t.revokeCredentials!==!1)f=await lo(o.id);return{subject:{id:o.id},dryRun:n,changes:l.sort((d,p)=>d.model.localeCompare(p.model)),skipped:s,credentialsRevoked:f}}async function lo(e){let t;try{t=await import("@stacksjs/auth")}catch{return!1}let n=Number(e);if(!Number.isSafeInteger(n))return!1;if(t.revokeAllTokens&&await ge("oauth_access_tokens"))await t.revokeAllTokens(n);if(t.sessionDestroyAll)await t.sessionDestroyAll(n);return!0}var Qt=86400000;async function fo(e={}){let t=e.dryRun===!0,n=e.now??new Date,o=(await me(e.models)).models.filter((c)=>c.retention);if(!o.length)return{dryRun:t,cutoffs:{},changes:[],skipped:[]};if(!t)await Ye();let{present:i,skipped:a}=await Xe(o),s=[],u={};for(let c of i){let l=c.retention,f=new Date(n.getTime()-l.days*Qt),d=zt(new Date(f.getTime()+Qt));u[c.model]=f.toISOString();let p=[],m;for(;;){let h=x.selectFrom(c.table).selectAll().where(l.column,"<",d);if(m!==void 0)h=h.where(c.primaryKey,">",m);let b=await h.orderBy(c.primaryKey,"asc").limit(We).execute();if(!b.length)break;for(let k of b){let R=Zr(k[l.column]);if(R&&R.getTime()<f.getTime())p.push(k)}if(m=b[b.length-1][c.primaryKey],b.length<We)break}let g=l.action==="delete"?p:p.filter((w)=>Jt(c,w));if(!t&&g.length)await qe(async(w)=>{if(l.action==="delete")await Xt(w,c,g);else await Yt(w,c,g)});s.push({model:c.model,table:c.table,action:l.action,matched:p.length,changed:g.length,fields:l.action==="anonymize"?c.personal.map((w)=>w.column):[]})}if(!t&&s.some((c)=>c.changed>0))await Je(x,"retention",null,e.actor??"scheduler",{changes:s.map(({model:c,action:l,matched:f,changed:d})=>({model:c,action:l,matched:f,changed:d})),cutoffs:u});return{dryRun:t,cutoffs:u,changes:s.sort((c,l)=>c.model.localeCompare(l.model)),skipped:a}}Ke();function po(e){let t=e.subject;if(!t)return"none (not reachable by access or erasure)";if(t.kind==="via")return`via ${t.model} (\`${t.foreignKey}\`)`;if(t.kind==="email")return`email address in \`${t.column}\``;let n=t.columns.map((o)=>`\`${o}\``).join(" or "),r=Object.entries(t.where).map(([o,i])=>`${o} = ${String(i)}`).join(", ");return r?`${n} where ${r}`:n}function mo(e){return{entries:e.models.map((n)=>({model:n.model,table:n.table,subject:po(n),personal:n.personal.map((r)=>r.column),notExported:n.personal.filter((r)=>!r.export).map((r)=>r.column),erasure:n.subject?n.erasure:null,retention:n.retention?`${n.retention.action} after ${n.retention.days} days (\`${n.retention.column}\`)`:null,basis:n.basis,purpose:n.purpose})).sort((n,r)=>n.model.localeCompare(r.model)),unclassified:[...e.unclassified].sort()}}function J(e){return(e??"-").replaceAll("|","\\|").replaceAll(`
5
+ `," ")}function go(e,t="markdown"){if(t==="json")return`${JSON.stringify(e,null,2)}
6
+ `;let n=["# Processing register","","<!-- Generated by `buddy gdpr:register` from the model declarations. Do not edit by hand. -->","","Every model that declares personal data or a `gdpr` trait, what erasure does to its rows, and how long they are kept. Change the model, then regenerate this file.","","| Model | Table | Subject | Personal data | Erasure | Retention | Basis | Purpose |","| --- | --- | --- | --- | --- | --- | --- | --- |"];for(let r of e.entries){let o=r.personal.length?r.personal.map((i)=>r.notExported.includes(i)?`\`${i}\` (not exported)`:`\`${i}\``).join(", "):"-";n.push(`| ${[r.model,`\`${r.table}\``,J(r.subject),o,J(r.erasure),J(r.retention),J(r.basis),J(r.purpose)].join(" | ")} |`)}if(n.push(""),n.push("## Unclassified"),n.push(""),e.unclassified.length){n.push("These models belong to a user but declare neither personal attributes nor a `gdpr` trait, so access and erasure do not reach them. Classify each one, even if only as `erasure: 'keep'`."),n.push("");for(let r of e.unclassified)n.push(`- ${r}`)}else n.push("None. Every model that belongs to a user is classified.");return n.push(""),n.join(`
7
+ `)}export*from"@stacksjs/model-meta";import{createModel as Co,registerModel as vo}from"@stacksjs/query-builder";import{log as _}from"@stacksjs/logging/runtime";import{snakeCase as Z}from"@stacksjs/strings";import{AsyncLocalStorage as An}from"async_hooks";import{toCursorPaginator as Mo,toPaginator as Oo,toSimplePaginator as Do}from"@stacksjs/pagination";function et(e,t){let n=rt(),r=n?Ze(n,"per_page"):void 0,o=n?Ze(n,"page"):void 0,i=e!==void 0?Math.max(1,Math.floor(e)):Math.min(100,Math.max(1,r??15)),a=Math.max(1,Math.floor(t??o??1));return{perPage:i,page:a}}function tt(e,t){let n=rt(),r=n?en(n,"cursor"):void 0,o=n?Ze(n,"per_page"):void 0,i=e!==void 0?Math.max(1,Math.floor(e)):Math.min(100,Math.max(1,o??15)),s=Zt(t!==void 0?t:r??null);return{perPage:i,cursor:s}}function Zt(e){if(e===null||e===void 0)return null;if(Array.isArray(e))return e;if(typeof e==="string"&&e.startsWith("["))try{let t=JSON.parse(e);if(Array.isArray(t))return t}catch{}return e}function nt(e){let t=rt();if(!t)return e;let n=(()=>{try{return new URL(t.url)}catch{return null}})();if(!n)return e;let r=n.pathname;if(e.path=r,"next_cursor"in e)return e.next_page_url=e.next_cursor!==null?E(n,{cursor:e.next_cursor}):null,e.prev_page_url=e.prev_cursor!==null?E(n,{cursor:e.prev_cursor}):null,e;let o=e.current_page;if(e.prev_page_url=o>1?E(n,{page:o-1}):null,"total"in e){let i=e.last_page;e.next_page_url=o<i?E(n,{page:o+1}):null,e.first_page_url=E(n,{page:1}),e.last_page_url=E(n,{page:i})}else e.next_page_url=e.has_more_pages?E(n,{page:o+1}):null;return e}function E(e,t){let n=new URL(e.toString());for(let[r,o]of Object.entries(t))n.searchParams.set(r,String(o));return`${n.pathname}${n.search}`}var N;function rt(){if(N===null)return;if(N===void 0)try{let t=Vn("@stacksjs/router");if(typeof t.getCurrentRequest==="function")N=t.getCurrentRequest;else{N=null;return}}catch{N=null;return}return N()}function Ze(e,t){let n=en(e,t);if(n===void 0)return;let r=Number(n);return Number.isFinite(r)?r:void 0}function en(e,t){let n=e.query?.[t];if(n===void 0)return;return Array.isArray(n)?n[0]:n}function tn(){return{async generateTwoFactorForModel(e){let{generateTwoFactorSecret:t}=await import("@stacksjs/auth"),n=t();await e.update({two_factor_secret:n})},async verifyTwoFactorCode(e,t){let n=e.get("two_factor_secret");if(typeof n!=="string")return!1;let{verifyTwoFactorCode:r,RateLimiter:o}=await import("@stacksjs/auth"),i=String(e.id??e.get?.("id")??e.get?.("email")??n),a=`2fa:${i}`;if(await o.isRateLimited(a)){let{HttpError:u}=await import("@stacksjs/error-handling");throw new u(429,"Too many verification attempts. Please try again later.")}if(!await r(t,n))return await o.recordFailedAttempt(a),!1;try{let{cache:u}=await import("@stacksjs/cache"),c=`2fa:used:${i}:${t}`;if(await u.has(c))return await o.recordFailedAttempt(a),!1;await u.set(c,"1",90)}catch{}return await o.resetAttempts(a),!0}}}import{mutationCount as yo,sqlDateTime as wo}from"@stacksjs/database/runtime";import{log as L}from"@stacksjs/logging";var ye="deleted_at";function nn(e,t="id"){return{async softDelete(n){let r=wo(),o=e.where(t,n);if(typeof o?.update==="function")return await o.update({[ye]:r}),!0;return!1},async restore(n){let r=e.where(t,n).withTrashed();if(typeof r?.update==="function")return await r.update({[ye]:null}),!0;return!1},async forceDelete(n){let r=e.where(t,n),o=typeof r?.withTrashed==="function"?r.withTrashed():r;if(typeof o?.forceDelete==="function")return yo(await o.forceDelete())>0;return!1},withTrashed(){return typeof e.query==="function"?e.query():e},onlyTrashed(){let n=typeof e.query==="function"?e.query():e;if(typeof n?.whereNotNull==="function")return n.whereNotNull(ye);return n?.where?.(ye,"!=",null)??n}}}function rn(e){if(e===!0||e==null)return{};if(typeof e==="object"&&!Array.isArray(e)){let t=e;if(Array.isArray(t.cascade)){let n=t.cascade.filter((r)=>typeof r==="string");return n.length?{cascade:n}:{}}return{}}return{}}function bo(e,t){let n=e.hasMany??[],r=e.hasOne??[],o=n.some((l)=>ot(l,t,!0)),i=r.some((l)=>ot(l,t,!1));if(!o&&!i)return L.warn(`[orm] soft-delete cascade: '${t}' is not a declared hasMany/hasOne relation - skipping`),null;let s=(o?n:r).find((l)=>ot(l,t,o))??null;if(!s)return null;let c=globalThis[s];if(!c)return L.warn(`[orm] soft-delete cascade: model '${s}' is not yet on globalThis - skipping cascade for '${t}'`),null;return{className:s,model:c}}function ot(e,t,n){let r=e.toLowerCase();if(t===r)return!0;if(n&&t===`${r}s`)return!0;if(n&&r.endsWith("y")&&t===`${r.slice(0,-1)}ies`)return!0;return!1}async function ho(e,t,n,r,o){try{let i=n.where;if(typeof i!=="function"){L.warn(`[orm] cascade ${o}: child model has no .where()`);return}if(o==="softDelete"){let a=n.softDelete;if(typeof a==="function"){let u=i.call(n,r,t),c=typeof u?.get==="function"?await u.get():Array.isArray(u)?u:[],l=n.primaryKey||"id";for(let f of c){let d=f?.[l];if(d!=null)await a.call(n,d)}return}let s=i.call(n,r,t);if(typeof s?.delete==="function"){L.debug(`[orm] cascade soft-delete: child has no softDeletes trait, hard-deleting from ${String(n.table??"?")}`),await s.delete();return}}else{let a=n.restore;if(typeof a!=="function"){L.debug("[orm] cascade restore: child has no restore() - nothing to do");return}let s=n.withTrashed,c=(typeof s==="function"?s.call(n):n).where?.(r,t),l=typeof c?.get==="function"?await c.get():[],f=n.primaryKey||"id";for(let d of l){let p=d?.[f];if(p!=null)await a.call(n,p)}}}catch(i){if(L.warn(`[orm] soft-delete cascade ${o} on ${e}#${String(t)} failed`,{error:i}),process.env.STACKS_ORM_CASCADE_SWALLOW!=="true")throw i}}async function Y(e,t,n,r){let o=t.cascade;if(!o||o.length===0)return;let i=`${e.name.toLowerCase()}_id`;for(let a of o){let s=bo(e,a);if(!s)continue;await ho(s.className,n,s.model,i,r)}}import{sqlDateTime as Ro}from"@stacksjs/database/runtime";import{log as ko}from"@stacksjs/logging";var To=[/^password$/i,/^password_hash$/i,/^api_key$/i,/_token$/i,/_secret$/i,/^remember_token$/i],on=null;async function an(){if(on!=null)return on;try{let e=await import("@stacksjs/router").catch(()=>null);if(!e)return null;let t=e.getCurrentRequest;if(typeof t!=="function")return null;let n=t();return n?.user?.id??n?._user?.id??null}catch{return null}}async function sn(){try{let t=(await import("@stacksjs/router").catch(()=>null))?.getCurrentRequest;if(typeof t!=="function")return null;let n=t();return typeof n?.ip==="function"?n.ip()??null:null}catch{return null}}function un(e){if(!e||typeof e!=="object")return null;let t={};for(let[n,r]of Object.entries(e)){if(To.some((o)=>o.test(n)))continue;t[n]=r}return t}function cn(e,t,n){ko.warn(`[orm] ${e} row write failed for ${t}: ${n?.message??String(n)}`)}var _o="activities";function ln(e){if(!e)return null;if(e===!0)return{};if(typeof e!=="object")return null;let t=e;return{logOnly:Array.isArray(t.logOnly)?t.logOnly:void 0,include:Array.isArray(t.include)?t.include:void 0,exclude:Array.isArray(t.exclude)?t.exclude:void 0}}function So(e,t,n=[]){let r=un(e);if(!r)return null;let o=new Set(n),i=t.logOnly??t.include,a=new Set(t.exclude??[]),s={};for(let[u,c]of Object.entries(r)){if(o.has(u)||a.has(u))continue;if(i&&!i.includes(u))continue;s[u]=c}return s}function Ao(e,t,n){return n==null?`${e} was ${t}`:`${e} ${String(n)} was ${t}`}async function Po(e){try{let{db:t}=await import("@stacksjs/database/runtime");await t.insertInto(_o).values({type:e.type,description:e.description,subject_type:e.subject_type,subject_id:e.subject_id,causer:e.causer,properties:e.properties?JSON.stringify(e.properties):null,ip_address:e.ip_address,user_id:e.user_id,created_at:Ro()}).executeTakeFirst()}catch(t){cn("activity",`${e.subject_type}#${String(e.subject_id)}`,t)}}async function xo(e){let{attributes:t,event:n,modelName:r,options:o,primaryKey:i}=e,a=t?.[i]??null,s=await an();await Po({type:`${r.toLowerCase()}.${n}`,description:Ao(r,n,a),subject_type:r,subject_id:a,properties:So(t,o,e.hidden),causer:s==null?null:`User:${String(s)}`,user_id:s,ip_address:await sn()})}function we(e){if(!e||typeof e!=="object")return null;let t=e;if(t.attributes&&typeof t.attributes==="object")return{...t.attributes};if(t._attributes&&typeof t._attributes==="object")return{...t._attributes};return{...e}}function dn(e,t,n,r,o=[]){if(t==="Activity")return;let i=e,a=async(d)=>typeof i.find==="function"?we(await i.find(d)):null,s=async(d,p)=>{await xo({modelName:t,event:d,attributes:p,primaryKey:n,options:r,hidden:o})},u=e.create;if(typeof u==="function")e.create=async function(...d){let p=await u.apply(this,d);return await s("created",we(p)),p};let c=e.createMany;if(typeof c==="function")e.createMany=async function(...d){let p=await c.apply(this,d);for(let m of Array.isArray(p)?p:[])await s("created",we(m));return p};let l=e.update;if(typeof l==="function")e.update=async function(d,p){let m=await l.call(this,d,p);return await s("updated",we(m)??await a(d)),m};let f=e.delete;if(typeof f==="function")e.delete=async function(d){let p=await a(d),m=await f.call(this,d);return await s("deleted",p??{[n]:d}),m}}var ke,Pn=new An;function F(){return Pn.getStore()?.suppressed===!0}function j(e){return Promise.resolve(Pn.run({suppressed:!0},e))}var xn=new An;function Eo(){return xn.getStore()?.suppressed===!0}function jo(e){return Promise.resolve(xn.run({suppressed:!0},e))}var lt=Symbol.for("stacks.orm.modelDefinition");class Cn extends Error{status=422;errors;constructor(e,t){let n=Object.keys(t).join(", ");super(`${e} validation failed: ${n}`);this.name="ModelValidationError",this.errors=t}}var fn=new Set,Fo=4096,pn=Object.create(null),mn=0;function X(e){let t=pn[e];if(t!==void 0)return t;let n=Z(e);if(mn<Fo)pn[e]=n,mn++;return n}function $o(e,t){let n=typeof e==="string"?e.slice(0,80):String(e),r=`${typeof e}:${n}`;if(fn.has(r))return;fn.add(r);let o=t instanceof Error?t.message:String(t);console.error(`[orm] JSON cast failed to parse value (returning null): ${o} - value preview: ${JSON.stringify(n)}`)}var Io={string:{get:(e)=>e!=null?String(e):null,set:(e)=>e!=null?String(e):null},number:{get:(e)=>e!=null?Number(e):null,set:(e)=>e!=null?Number(e):null},integer:{get:(e)=>e!=null?Math.trunc(Number(e)):null,set:(e)=>e!=null?Math.trunc(Number(e)):null},float:{get:(e)=>e!=null?Number.parseFloat(String(e)):null,set:(e)=>e!=null?Number.parseFloat(String(e)):null},boolean:{get:(e)=>e===1||e==="1"||e===!0||e==="true",set:(e)=>e===!0||e===1||e==="1"||e==="true"?1:0},json:{get:(e)=>{if(e==null)return null;if(typeof e==="string")try{return JSON.parse(e)}catch(t){return $o(e,t),null}return e},set:(e)=>{if(e==null)return null;return typeof e==="string"?e:JSON.stringify(e)}},datetime:{get:(e)=>e?new Date(e):null,set:(e)=>e instanceof Date?e.toISOString():e},date:{get:(e)=>e?new Date(e):null,set:(e)=>e instanceof Date?e.toISOString().split("T")[0]:e},array:{get:(e)=>{if(e==null)return[];if(Array.isArray(e))return e;if(typeof e==="string")try{return JSON.parse(e)}catch{return[]}return[]},set:(e)=>{if(e==null)return null;return Array.isArray(e)?JSON.stringify(e):e}}};function Bo(e){return typeof e==="string"?Io[e]:e}var gn=new WeakMap;function vn(e){let t=Object.keys(e),n=gn.get(e);if(n&&n.length===t.length){let o=!0;for(let i=0;i<t.length;i++){let a=t[i];if(n[i]?.attr!==a||n[i]?.definition!==e[a]){o=!1;break}}if(o)return n}let r=t.map((o)=>{let i=e[o];return{attr:o,definition:i,caster:Bo(i)}});return gn.set(e,r),r}function it(e,t,n){if(!e||typeof e!=="object")return e;let r={...e};for(let{attr:o,caster:i}of vn(t))if(o in r)r[o]=i[n].call(i,r[o]);return r}function be(e){return e==="_attributes"||e==="_original"||e==="_definition"||e==="_hasSaved"||e==="_relations"}var st=Symbol.for("stacks.modelInstanceProxy"),yn,wn=new WeakMap,No={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"},...Object.fromEntries(ue.map((e)=>[e,{bag:"_billable",mode:"model"}])),generateTwoFactorForModel:{bag:"_twoFactor",mode:"model"},verifyTwoFactorCode:{bag:"_twoFactor",mode:"model"}};function Lo(e,t){if(!e||!t)return null;let n=t.split("."),r=e;for(let o of n){if(r==null||typeof r!=="object")return null;let i=r;if("_attributes"in i&&i._attributes&&typeof i._attributes==="object"){let a=i._attributes;if(o in a){r=a[o];continue}}if(o in i){r=i[o];continue}return null}return r??null}function he(e,t,n){if(e&&typeof e.then==="function")return e.then((r)=>r===t?n:r);return e===t?n:e}function v(e,t){if(!e||typeof e!=="object")return e;let n=e;if(n[st])return e;let r=n._attributes;if(!r||typeof r!=="object")return e;if(t){for(let{attr:i,caster:a}of vn(t))if(Object.hasOwn(r,i))r[i]=a.get.call(a,r[i])}let o=t?wn.get(t):yn;if(!o)if(o={get(i,a,s){let u=i;if(a===st)return!0;if(a==="saveAsync")return async function(){let l=u._definition,f=l?.set;if(f&&typeof u.isDirty==="function"){for(let[p,m]of Object.entries(f)){if(typeof m!=="function")continue;if(!u.isDirty(p))continue;let g=m(u._attributes),w=g&&typeof g.then==="function"?await g:g;u._attributes[p]=w}let d=l.set;l.set={};try{return he(u.save(),i,s)}finally{l.set=d}}return he(u.save(),i,s)};if(a==="save")return function(){let l=u._definition,f=l?.set;if(f&&Object.keys(f).length>0&&typeof u.isDirty==="function"){for(let[p,m]of Object.entries(f)){if(typeof m!=="function")continue;if(!u.isDirty(p))continue;let g=m(u._attributes);if(g&&typeof g.then==="function")throw Error(`Setter for "${p}" returned a Promise - use \`saveAsync()\` instead of \`save()\` when a model has async setters.`);u._attributes[p]=g}let d=l.set;l.set={};try{return he(u.save(),i,s)}finally{l.set=d}}return he(u.save(),i,s)};if(a==="updateAsync")return async function(l){if(l&&typeof l==="object"&&!Array.isArray(l))for(let[f,d]of Object.entries(l))s[f]=d;return s.saveAsync()};if(a==="saveQuietly")return function(){return j(()=>u.save())};if(a==="saveAsyncQuietly")return function(){return j(()=>s.saveAsync())};if(a==="updateQuietly")return function(l){return j(()=>u.update(l))};if(a==="updateAsyncQuietly")return function(l){return j(()=>s.updateAsync(l))};if(a==="deleteQuietly")return function(){return j(()=>u.delete())};if(a==="toSearchableObject")return function(){let d=u._definition?.traits?.useSearch;if(!d)return null;let p=u._attributes;if(!p)return null;if(d===!0){let b={...p};if(p.id!=null)b.id=String(p.id);return b}let m={},g=d.displayable?.length?d.displayable:[...d.searchable??[],...d.filterable??[],...d.sortable??[],"id"],w=d.denormalize??{},h=u._relations;for(let b of g){let k=Z(b),R=p[k]??p[b];if(R!==void 0){m[k]=R;continue}let te=w[b]??w[k];if(te){m[k]=Lo(h,te);continue}m[k]=void 0}if(p.id!=null)m.id=String(p.id);return m};if(typeof a==="string"&&!be(a)){let l=u._attributes;if(l&&Object.hasOwn(l,a))return l[a];let f=u._relations;if(f&&Object.hasOwn(f,a)){let p=f[a];if(Array.isArray(p))return p.map((m)=>v(m,t));return p&&typeof p==="object"?v(p,t):p}let d=No[a];if(d){let g=u._definition?.__traitMethods?.[d.bag]?.[a];if(typeof g==="function")return d.mode==="model"?(...w)=>g(s,...w):(...w)=>g(u.id,...w)}if(l){let p=X(a);if(p!==a&&Object.hasOwn(l,p))return l[p]}}let c=Reflect.get(u,a,u);return typeof c==="function"?c.bind(u):c},set(i,a,s,u){let c=i;if(typeof a==="string"&&!be(a)){let{_attributes:l,set:f}=c;if(l&&Object.hasOwn(l,a)){if(typeof f==="function")f.call(c,a,s);else l[a]=s;return!0}if(l){let d=X(a);if(d!==a&&Object.hasOwn(l,d)){if(typeof f==="function")f.call(c,d,s);else l[d]=s;return!0}}if(l&&!(a in c)){if(typeof f==="function")f.call(c,a,s);else l[a]=s;return!0}}return Reflect.set(c,a,s,u)},has(i,a){let s=i;if(typeof a==="string"&&!be(a)){let u=s._attributes;if(u&&Object.hasOwn(u,a))return!0;let c=s._relations;if(c&&Object.hasOwn(c,a))return!0;if(u){let l=X(a);if(l!==a&&Object.hasOwn(u,l))return!0}}return Reflect.has(s,a)},deleteProperty(i,a){let s=i;if(typeof a==="string"&&!be(a)){let u=s._attributes;if(u&&Object.hasOwn(u,a))return delete u[a],!0}return Reflect.deleteProperty(s,a)},ownKeys(i){let s=i._attributes;return s?Object.keys(s):[]},getOwnPropertyDescriptor(i,a){let s=i;if(typeof a==="string"){let u=s._attributes;if(u&&Object.hasOwn(u,a))return{configurable:!0,enumerable:!0,value:u[a],writable:!0}}return Object.getOwnPropertyDescriptor(s,a)}},t)wn.set(t,o);else yn=o;return new Proxy(e,o)}var Mn=Object.assign(Object.create(null),{get:!0,first:!0,last:!0,firstOrFail:!0,find:!0,findOrFail:!0,all:!0,paginate:!0,simplePaginate:!0,cursorPaginate:!0}),qo={paginate:Oo,simplePaginate:Do,cursorPaginate:Mo},bn=Symbol.for("stacks.queryBuilderProxy");function hn(e,t,n){if(Mn[t]){if(Array.isArray(e))return e.map((o)=>v(o,n));let r=qo[t];if(r&&e&&Array.isArray(e.data)){let o=e.data.map((a)=>v(a,n)),i=r({...e,data:o});return nt(i)}if(e&&Array.isArray(e.data))return{...e,data:e.data.map((o)=>v(o,n))};return v(e,n)}if(e&&typeof e==="object"&&typeof e.get==="function")return On(e,n);return e}function On(e,t){if(!e||typeof e!=="object")return e;if(e[bn])return e;return new Proxy(e,{get(n,r,o){if(r===bn)return!0;let i=Reflect.get(n,r,o);if(typeof i!=="function")return i;let a=String(r);return function(...s){let u=s;if(a==="paginate"||a==="simplePaginate"){let{perPage:l,page:f}=et(s[0],s[1]);u=[l,f]}else if(a==="cursorPaginate"){let{perPage:l,cursor:f}=tt(s[0],s[1]);u=[l,f,s[2],s[3]]}let c=i.apply(n,u);if(!Mn[a]&&c===n)return o;if(c&&typeof c.then==="function")return c.then((l)=>hn(l,a,t));return hn(c,a,t)}}})}function Go(e,t){let n=(a)=>Array.isArray(a)?a.map((s)=>v(s,t)):v(a,t),r=["find","first","last","all","firstOrFail","findOrFail","findMany"];for(let a of r){let s=e[a];if(typeof s!=="function")continue;e[a]=function(...u){let c=s.apply(this,u);if(c&&typeof c.then==="function")return c.then(n);return n(c)}}let o=["create","createMany","firstOrCreate","updateOrCreate","make"];for(let a of o){let s=e[a];if(typeof s!=="function")continue;e[a]=function(...u){let c=s.apply(this,u);if(c&&typeof c.then==="function")return c.then(n);return n(c)}}let i=["query","where","orWhere","whereIn","whereNotIn","whereNull","whereNotNull","whereLike","whereBetween","whereNotBetween","orderBy","orderByDesc","select","with","limit","take","skip","latest","oldest"];for(let a of i){let s=e[a];if(typeof s!=="function")continue;e[a]=function(...u){let c=s.apply(this,u);return On(c,t)}}}class Dn extends Error{model;id;constructor(e,t){super(t!=null?`[ORM] ${e} not found for id=${String(t)}`:`[ORM] No matching ${e} row`);this.name="ModelNotFoundError",this.model=e,this.id=t}}class ut extends Error{model;attribute;reason;constructor(e,t,n){let r=n==="guarded"?`'${t}' is marked guarded`:`'${t}' is not in the fillable allowlist`;super(`[ORM] Mass assignment to ${e} forbidden: ${r}. Use ${e}.forceCreate(...) / .forceUpdate(...) to bypass.`);this.name="MassAssignmentException",this.model=e,this.attribute=t,this.reason=n}}var Uo=new Set(["id","created_at","updated_at","deleted_at","uuid"]),kn=new WeakMap;function Ko(e){let t=kn.get(e);if(t)return t;let n=new Set,r=new Set,o=new Set;for(let[a,s]of Object.entries(e)){let u=X(a);if(n.add(u),s?.fillable===!0)r.add(u);if(s?.guarded===!0)o.add(u)}let i={allowed:r.size>0?r:n,guarded:o};return kn.set(e,i),i}function q(e,t,n={}){if(n.force)return t;if(!t||typeof t!=="object"||Array.isArray(t))return t;let r=e.attributes;if(!r)return t;let{allowed:o,guarded:i}=Ko(r);for(let a in t){if(!Object.hasOwn(t,a))continue;let s=X(a);if(Uo.has(s))continue;if(i.has(s))throw new ut(e.name,a,"guarded");if(s.endsWith("_id"))continue;if(!o.has(s))throw new ut(e.name,a,"not-fillable")}return t}async function Te(e,t){let n=e.set;if(!n||typeof n!=="object")return t;let r={...t};for(let[o,i]of Object.entries(n)){if(typeof i!=="function"||!(o in r))continue;try{r[o]=await i(r)}catch(a){_.error(`[orm] ${e.name}.set.${o} threw - skipping setter`,a)}}return r}function Wo(e,t){let n=t.primaryKey||"id",r=e.create;function o(c){let l=e.where;if(typeof l!=="function")throw Error(`[ORM] ${t.name}.${c} needs a working where(): the underlying query builder did not expose one`);return l}function i(c){let l=e.find;if(typeof l!=="function")throw Error(`[ORM] ${t.name}.${c} needs a working find(): the underlying query builder did not expose one`);return l}function a(c){let l=e.create;if(typeof l!=="function")throw Error(`[ORM] ${t.name}.${c} cannot create: the underlying query builder did not expose create()`);return l}if(e.update=async function(c,l){if(c==null)throw Error(`[ORM] ${t.name}.update requires an id as the first argument`);if(!l||typeof l!=="object"||Array.isArray(l))throw Error(`[ORM] ${t.name}.update requires a data object as the second argument`);if(Object.keys(l).length===0){_.debug(`[orm] ${t.name}.update called with empty data - short-circuiting and returning current row`);let p=e.find;return typeof p==="function"?await p.call(e,c):null}q(t,l);let f=await Te(t,l);await o("update").call(e,n,c).update(f);let d=e.find;return typeof d==="function"?await d.call(e,c):null},typeof e.forceUpdate!=="function")e.forceUpdate=async function(c,l){if(c==null)throw Error(`[ORM] ${t.name}.forceUpdate requires an id as the first argument`);if(!l||typeof l!=="object"||Array.isArray(l))throw Error(`[ORM] ${t.name}.forceUpdate requires a data object as the second argument`);let f=await Te(t,l);await o("forceUpdate").call(e,n,c).update(f);let d=e.find;return typeof d==="function"?await d.call(e,c):null};if(typeof e.forceCreate!=="function")e.forceCreate=async function(c){if(!c||typeof c!=="object"||Array.isArray(c))throw Error(`[ORM] ${t.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"){f.forceFill(c);let d=await f.save();return d&&typeof d==="object"&&d!==f&&!d[st]?f:d??f}}if(typeof r!=="function")throw Error(`[ORM] ${t.name}.forceCreate cannot create: the underlying query builder did not expose create()`);return await r.call(e,c)};if(e.delete=async function(c){if(c==null)throw Error(`[ORM] ${t.name}.delete requires an id as the first argument`);if(!await i("delete").call(e,c))return!1;return await o("delete").call(e,n,c).delete(),!0},typeof e.findOrFail!=="function")e.findOrFail=async function(c){let l=await i("findOrFail").call(e,c);if(l==null)throw new Dn(t.name,c);return l};if(typeof e.exists!=="function")e.exists=async function(c){if(c==null)return!1;let l=o("exists").call(e,n,c);if(typeof l.count==="function"){let d=await l.count();return Number(d)>0}let f=e.find;return typeof f==="function"?await f.call(e,c)!=null:!1};if(typeof e.firstOrCreate!=="function")e.firstOrCreate=async function(c,l={}){if(!c||typeof c!=="object"||Array.isArray(c))throw Error(`[ORM] ${t.name}.firstOrCreate requires a where-attrs object`);let f=o("firstOrCreate").call(e,c),d=typeof f.first==="function"?await f.first():await f;if(d)return d;let p={...c,...l};return q(t,p),await a("firstOrCreate").call(e,p)};if(typeof e.updateOrCreate!=="function")e.updateOrCreate=async function(c,l){if(!c||typeof c!=="object"||Array.isArray(c))throw Error(`[ORM] ${t.name}.updateOrCreate requires a where-attrs object`);if(!l||typeof l!=="object"||Array.isArray(l))throw Error(`[ORM] ${t.name}.updateOrCreate requires a values object`);let f=o("updateOrCreate").call(e,c),d=typeof f.first==="function"?await f.first():await f;if(d){q(t,l);let m=d[n];await o("updateOrCreate").call(e,n,m).update(l);let g=e.find;return typeof g==="function"?await g.call(e,m):{...d,...l}}let p={...c,...l};return q(t,p),await a("updateOrCreate").call(e,p)};if(typeof e.count!=="function")e.count=async function(){let c=e;if(typeof c.query==="function"){let d=c.query();if(typeof d?.count==="function"){let p=await d.count();return Number(p)||0}}let{all:l,get:f}=e;if(typeof l==="function")return(await l.call(e)||[]).length;if(typeof f==="function")return(await f.call(e)||[]).length;return 0};if(typeof e.pluck!=="function")e.pluck=async function(c){if(!c||typeof c!=="string")throw Error(`[ORM] ${t.name}.pluck requires a column name`);let l=e.all;return((typeof l==="function"?await l.call(e):[])||[]).map((d)=>d?.[c])};if(typeof e.whereIn!=="function")e.whereIn=async function(c,l){if(!c||typeof c!=="string")throw Error(`[ORM] ${t.name}.whereIn requires a column name`);if(!Array.isArray(l))throw Error(`[ORM] ${t.name}.whereIn requires an array of values`);if(l.length===0)return[];let f=e.where;if(typeof f!=="function")return[];let d=f.call(e,c,"in",l);if(d&&typeof d.get==="function")return await d.get();return await d};let s=[["latest","desc"],["oldest","asc"]];for(let[c,l]of s)if(typeof e[c]!=="function")e[c]=async function(f="created_at"){let d=e,p=typeof d.query==="function"?d.query():d;if(typeof p?.orderBy==="function"){let h=p.orderBy(f,l);if(typeof h.first==="function")return await h.first();if(typeof h.get==="function")return(await h.get())?.[0]??null}let m=e.all;if(typeof m!=="function")return null;return[...await m.call(e)||[]].sort((h,b)=>{let k=h?.[f],R=b?.[f];if(k===R)return 0;return(k>R?1:-1)*(l==="desc"?-1:1)})[0]??null};let u=$n(t.traits?.useSearch,t);if(u){let c=u.index??t.table??Z(`${t.name}s`);if(typeof e.search!=="function")e.search=function(l,f){return zo(e,c,l,f,u.searchable)};if(typeof e.makeAllSearchable!=="function")e.makeAllSearchable=async function(l=500){let f=e.all;if(typeof f!=="function")throw Error(`[ORM] ${t.name}.makeAllSearchable cannot run: the underlying query builder did not expose all()`);let{useSearchEngine:d}=await import("@stacksjs/search-engine"),p=d(),m=0,g=e.query;if(typeof g==="function")try{let b=g.call(e);if(b&&typeof b.chunk==="function")return await b.chunk(l,async(k)=>{let R=await ct(k,u);if(R.length>0)await p.addDocuments(c,R);m+=R.length}),m}catch{}let w=await f.call(e)||[],h=await ct(w,u);if(h.length>0)await p.addDocuments(c,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(c);return}let d=e.all,p=typeof d==="function"?await d.call(e)||[]:[],m=l();for(let g of p){let w=g?.id??g?._attributes?.id;if(w!=null)await m.deleteDocument(c,Number(w))}}}}async function ct(e,t){if(e.length===0)return[];if(typeof t.shapeMany==="function"){let r=await t.shapeMany(e);if(!Array.isArray(r)||r.length!==e.length)throw TypeError(`[orm/search] shapeMany returned ${Array.isArray(r)?r.length:typeof r} documents for ${e.length} rows. It must return one document per row, in order, or documents are indexed under the wrong ids.`);return r.filter(Boolean)}return(await Promise.all(e.map((r)=>Qo(r,t)))).filter(Boolean)}function En(e){let t=new Set,n=e.attributes??{};for(let[r,o]of Object.entries(n))if(o?.hidden)t.add(r);return t}function Vo(e,t){if(!e||t.size===0)return e;let n={};for(let[r,o]of Object.entries(e))if(!t.has(r))n[r]=o;return n}async function Qo(e,t){if(typeof t.shape==="function")try{return await t.shape(e)}catch{return}let n=e?.toSearchableObject?.();if(n!==void 0)return n;return Vo(e?._attributes??(typeof e?.toJSON==="function"?e.toJSON():null),t.hidden??new Set)}function zo(e,t,n,r,o){let i=o&&o.length>0?{query_by:[...o].join(",")}:{},a={q:n,...i,...r??{}},s={with(u){return a={...a,...u},s},where(u){return a={...a,filter:u},s},async get(){let{useSearchEngine:u}=await import("@stacksjs/search-engine");return(await u().search(t,a))?.hits??[]},async paginate(u,c=1){let{useSearchEngine:l}=await import("@stacksjs/search-engine"),d=await l().search(t,{...a,limit:u,offset:(c-1)*u});return{hits:d.hits??[],total:Number(d.estimatedTotalHits??d.nbHits??d.total??0),page:c,perPage:u}},async raw(){let{useSearchEngine:u}=await import("@stacksjs/search-engine");return await u().search(t,a)}};return s}function jn(e){let t=Z(e);return t===e?[e]:[e,t]}async function at(e,t){if(!e||typeof e!=="object")return;let n=e._attributes??e;for(let r of t)for(let o of jn(r)){if(!(o in n))continue;let i=n[o];if(!K(i))continue;n[o]=await xe(i)}}function Ho(e,t){if(t.length===0)return;let n=async(s)=>{if(Array.isArray(s)){for(let u of s)await at(u,t);return s}if(s&&typeof s==="object"&&Array.isArray(s.data)){for(let u of s.data)await at(u,t);return s}if(s)await at(s,t);return s},r=["find","first","last","all","firstOrFail","findOrFail","findMany"];for(let s of r){let u=e[s];if(typeof u!=="function")continue;e[s]=async function(...c){let l=await u.apply(this,c);return await n(l)}}let o=["create","createMany","firstOrCreate","updateOrCreate","make"];for(let s of o){let u=e[s];if(typeof u!=="function")continue;e[s]=async function(...c){let l=await u.apply(this,c);return await n(l)}}for(let s of["update","forceUpdate"]){let u=e[s];if(typeof u!=="function")continue;e[s]=async function(c,l){let f=await u.call(this,c,l);return await n(f)}}let i=["first","firstOrFail","get","all","find","findOrFail","last","paginate","simplePaginate"],a=(s)=>{if(!s||typeof s!=="object")return s;let u=s;if(u.__stacksEncryptedReads)return s;for(let c of i){let l=u[c];if(typeof l!=="function")continue;u[c]=async function(...f){return await n(await l.apply(this,f))}}for(let c of["where","whereIn","whereNull","whereNotNull","orWhere","orderBy","orderByDesc","limit","offset","with"]){let l=u[c];if(typeof l!=="function")continue;u[c]=function(...f){return a(l.apply(this,f))}}return Object.defineProperty(u,"__stacksEncryptedReads",{value:!0,enumerable:!1}),s};for(let s of["where","whereIn","whereNull","whereNotNull","orderBy","orderByDesc","limit","query"]){let u=e[s];if(typeof u!=="function")continue;e[s]=function(...c){return a(u.apply(this,c))}}}function Jo(e,t){if(t.length===0)return;let n=async(i)=>{if(!i||typeof i!=="object"||Array.isArray(i))return i;let a={...i};for(let s of t)for(let u of jn(s))if(u in a)a[u]=await Pe(a[u]);return a},r=["create","firstOrCreate","updateOrCreate","forceCreate"],o=e.createMany;if(typeof o==="function")e.createMany=async function(i,...a){let s=Array.isArray(i)?await Promise.all(i.map(n)):i;return await o.call(this,s,...a)};for(let i of r){let a=e[i];if(typeof a!=="function")continue;e[i]=async function(...s){if(s[0]=await n(s[0]),s[1])s[1]=await n(s[1]);return await a.apply(this,s)}}for(let i of["update","forceUpdate"]){let a=e[i];if(typeof a!=="function")continue;e[i]=async function(s,u){let c=await n(u);return await a.call(this,s,c)}}}function Yo(e,t){let n=e.create;if(typeof n==="function")e.create=async function(o,...i){q(t,o);let a=await Te(t,o);return await n.call(this,a,...i)};let r=e.createMany;if(typeof r==="function")e.createMany=async function(o,...i){let a=[];for(let s of o)q(t,s),a.push(await Te(t,s));return await r.call(this,a,...i)};for(let o of["firstOrCreate","updateOrCreate"]){let i=e[o];if(typeof i!=="function")continue}}function Xo(e,t){if(!Et(t))return;let n=String(t?.name??e.name??"Model"),r=(s,u)=>{if(Eo())return;if(!s||typeof s!=="object"||Array.isArray(s))return;let c=jt(s,t,u);if(!c.valid)throw new Cn(n,c.errors)},o=e.create;if(typeof o==="function")e.create=async function(s,...u){return r(s,"creating"),await o.call(this,s,...u)};let i=e.createMany;if(typeof i==="function")e.createMany=async function(s,...u){if(Array.isArray(s))for(let c of s)r(c,"creating");return await i.call(this,s,...u)};let a=e.update;if(typeof a==="function")e.update=async function(s,u,...c){return r(u,"updating"),await a.call(this,s,u,...c)}}function Zo(e,t){let n=["create","firstOrCreate","updateOrCreate"],r=e.createMany;if(typeof r==="function")e.createMany=async function(i,...a){let s=Array.isArray(i)?i.map((u)=>u&&typeof u==="object"&&!Array.isArray(u)?it(u,t,"set"):u):i;return await r.call(this,s,...a)};for(let i of n){let a=e[i];if(typeof a==="function")e[i]=async function(...s){if(_.debug(`[orm] ${i.charAt(0).toUpperCase()+i.slice(1)} ${String(e.name||"unknown")}`,s[0]),s[0]&&typeof s[0]==="object"&&!Array.isArray(s[0]))s[0]=it(s[0],t,"set");return await a.apply(this,s)}}let o=e.update;if(typeof o==="function")e.update=async function(i,a){let s=a&&typeof a==="object"&&!Array.isArray(a)?it(a,t,"set"):a;return await o.call(this,i,s)}}var Tn=new Set(["useUuid","useTimestamps","timestampable","useSoftDeletes","softDeletable","useApi","useAuth","authenticatable","useSearch","searchable","useSeeder","seedable","useSocials","billable","observe","useAudit","useActivityLog","prunable","sharding","likeable","taggable","categorizable","commentable","commentables","broadcastOn","broadcastWith","gdpr"]);function Fn(e){_.debug(`[orm] Defining model: ${e.name} (table: ${e.table})`);for(let g of Object.keys(e.traits??{}))if(!Tn.has(g))_.warn(`[orm] Model '${e.name}' declares an unknown trait '${g}'. It does nothing. Known traits: ${[...Tn].sort().join(", ")}.`);let t=ei(e),n=ni(e),r=ti(t,n),o=ri(e);e.__traitMethods=o;let i=e.traits;if((i?.useAuth||i?.authenticatable)&&e.name!=="PersonalAccessToken"){let g=e.morphMany;if(!g||!("tokenable"in g))e.morphMany={...g??{},tokenable:"PersonalAccessToken"}}let a=r?{...e,hooks:{...e.hooks,...r}}:e,u=Co(a);if(Go(u,e.casts),Wo(u,a),Yo(u,a),e.casts&&Object.keys(e.casts).length>0)Zo(u,e.casts);let c=Ce(e);if(c.length>0)Jo(u,c),Ho(u,c);let l=e.traits?.useSoftDeletes;if(l)oi(u,a,l);let f=e.traits?.useAudit;if(f){let g=kt(f);Tt(u,e.name,e.primaryKey||"id",g)}let d=ln(e.traits?.useActivityLog);if(d)dn(u,e.name,e.primaryKey||"id",d,[...En(e)]);Xo(u,a);let p=u;p.withoutValidation=function(g){return jo(g)},p.withoutEvents=function(g){return j(g)};for(let g of["create","createMany","update","firstOrCreate","updateOrCreate","forceCreate","forceUpdate","delete","forceDelete","softDelete","restore"]){let w=u[g];if(typeof w!=="function")continue;let h=`${g}Quietly`;if(typeof u[h]==="function")continue;u[h]=function(...b){return j(()=>w.apply(u,b))}}let m=Object.assign(u,o,{...e,getDefinition:()=>e,_isStacksModel:!0});return vo(e.name,m),Object.defineProperty(m,lt,{value:e,enumerable:!1,configurable:!0}),m}function ei(e){let t=e.traits?.observe;if(!t)return;let n=e.name.toLowerCase(),r=(d)=>{let p=d?.attributes;if(!p||typeof p!=="object")return d;let m=e.primaryKey||"id",g={...p};if(g[m]===void 0&&d[m]!==void 0)g[m]=d[m];return g},o=async(d,p)=>{if(F())return;try{let{dispatch:m}=ke??=await import("@stacksjs/events");await m(d,p)}catch(m){if(m&&typeof m==="object"&&"code"in m&&m.code==="MODULE_NOT_FOUND")return;if(console.error(`[ORM] Event '${d}' handler error:`,m),process.env.STACKS_ORM_EVENT_ERRORS!=="swallow")throw m}},i=e.traits?.broadcastOn,a=e.traits?.broadcastWith,s=typeof i==="function"&&typeof a==="function",u=async(d,p)=>{if(!s)return;if(F())return;try{let m=i(p),g=Array.isArray(m)?m:[m],w=a(p),b=(await import("@stacksjs/realtime").catch(()=>null))?.broadcast;if(typeof b!=="function")return;for(let k of g){if(typeof k!=="string"||k.length===0)continue;await b(k,d,w)}}catch(m){if(m&&typeof m==="object"&&"code"in m&&m.code==="MODULE_NOT_FOUND")return;if(console.error(`[ORM] Broadcast '${d}' handler error:`,m),process.env.STACKS_ORM_BROADCAST_ERRORS==="throw")throw m}},c=async(d,p)=>{if(F())return!0;let m;try{m=ke??=await import("@stacksjs/events");let{dispatchAndCollect:g}=m,w=await g(d,p);if(w.some((b)=>b.ok&&b.value===!1))return!1;let h=w.find((b)=>!b.ok);if(h&&!h.ok)throw h.error}catch(g){if(!m&&g&&typeof g==="object"&&"code"in g&&g.code==="MODULE_NOT_FOUND")return!0;if(console.error(`[ORM] Before-event '${d}' handler error:`,g),process.env.STACKS_ORM_EVENT_ERRORS!=="swallow")throw g}return!0},l=t===!0?["create","update","delete"]:Array.isArray(t)?t:[],f={};if(l.includes("create"))f.beforeCreate=async(d)=>{if(_.debug(`[orm] Create ${n}`,d),!await c(`${n}:saving`,d))throw Error(`[ORM] ${n}:saving event cancelled the operation`);if(!await c(`${n}:creating`,d))throw Error(`[ORM] ${n}:creating event cancelled the operation`)},f.afterCreate=async(d)=>{let p=r(d);await o(`${n}:created`,p),await o(`${n}:saved`,p),await u(`${n}:created`,d)};if(l.includes("update"))f.beforeUpdate=async(d)=>{if(_.debug(`[orm] Update ${n}#${d?.id??"unknown"}`,d),!await c(`${n}:saving`,d))throw Error(`[ORM] ${n}:saving event cancelled the operation`);if(!await c(`${n}:updating`,d))throw Error(`[ORM] ${n}:updating event cancelled the operation`)},f.afterUpdate=async(d)=>{let p=r(d);await o(`${n}:updated`,p),await o(`${n}:saved`,p),await u(`${n}:updated`,d)};if(l.includes("delete"))f.beforeDelete=async(d)=>{if(_.debug(`[orm] Delete ${n}#${d?.id??"unknown"}`),!await c(`${n}:deleting`,d))throw Error(`[ORM] ${n}:deleting event cancelled the operation`)},f.afterDelete=async(d)=>{await o(`${n}:deleted`,r(d)),await u(`${n}:deleted`,d)};return f}function ti(...e){let t={},n=new Set;for(let r of e){if(!r)continue;for(let o of Object.keys(r))n.add(o)}for(let r of n){let o=e.map((i)=>i?.[r]).filter((i)=>typeof i==="function");if(!o.length)continue;t[r]=async(...i)=>{for(let a of o)await a(...i)}}return Object.keys(t).length?t:void 0}function $n(e,t){if(!e)return null;let n=e===!0?{}:typeof e==="object"?{...e}:null;if(!n)return null;if(t)n.hidden=En(t);return n}function ni(e){let t=$n(e.traits?.useSearch,e);if(!t)return;let n=t,r=n.index??e.table??Z(`${e.name}s`);async function o(s){if(typeof n.shapeMany==="function")try{let[l]=await ct([s],n);return l}catch(l){_.warn(`[orm/search] shapeMany() threw for ${e.name}: ${l.message}`);return}if(typeof n.shape==="function")try{return await n.shape(s)}catch(l){_.warn(`[orm/search] shape() threw for ${e.name}: ${l.message}`);return}let c=v(s).toSearchableObject?.();if(c!==void 0)return c;return s?._attributes??(typeof s?.toJSON==="function"?s.toJSON():null)}let i=async(s)=>{if(F())return;let u=await o(s);if(!u)return;if(t.queueable){try{let{Jobs:c}=await import("@stacksjs/queue");await c.dispatch("SyncSearchIndexJob",{index:r,op:"upsert",doc:u})}catch(c){_.warn(`[orm/search] queue dispatch failed for ${e.name}; falling back to inline: ${c.message}`),await _n(r,u,e.name)}return}await _n(r,u,e.name)};return{afterCreate:i,afterUpdate:i,afterDelete:async(s)=>{if(F())return;let u=s?.id??s?._attributes?.id;if(u==null)return;if(t.queueable){try{let{Jobs:c}=await import("@stacksjs/queue");await c.dispatch("SyncSearchIndexJob",{index:r,op:"delete",id:Number(u)})}catch(c){_.warn(`[orm/search] queue dispatch failed for ${e.name}#${u}; falling back to inline: ${c.message}`),await Sn(r,Number(u),e.name)}return}await Sn(r,Number(u),e.name)}}}var Rn=new Map;function In(e,t){let n=Rn.get(e)??0;if(Rn.set(e,n+1),n===0)_.warn(`[orm/search] ${t}`);else if(n===9)_.warn(`[orm/search] ${e} is still failing; further identical warnings suppressed for this process.`)}async function _n(e,t,n){try{let{useSearchEngine:r}=await import("@stacksjs/search-engine");await r().addDocument(e,t)}catch(r){In(`index:${n}`,`Failed to index ${n}: ${r.message}`)}}async function Sn(e,t,n){try{let{useSearchEngine:r}=await import("@stacksjs/search-engine");await r().deleteDocument(e,t)}catch(r){In(`remove:${n}`,`Failed to remove ${n}#${t}: ${r.message}`)}}function ri(e){let t={},{table:n,traits:r}=e;if(!r)return t;if(r.taggable)t._taggable=Ee(n);if(r.categorizable)t._categorizable=je(n);if(r.commentable)t._commentable=Oe(n);if(r.billable)t._billable=St(n);if(r.likeable){let i=typeof r.likeable==="object"?r.likeable:void 0;t._likeable=Fe(n,i)}let o=r.useAuth||r.authenticatable;if(typeof o==="object"&&o&&"useTwoFactor"in o&&o.useTwoFactor)t._twoFactor=tn();return t}function oi(e,t,n){let r=nn(e,t.primaryKey||"id"),o=rn(n),i=t,a=t.name.toLowerCase(),s=t.traits?.observe!=null&&t.traits?.observe!==!1,u=async(p)=>{if(!s||F())return!0;try{let{dispatchAsync:m}=ke??=await import("@stacksjs/events"),g=await m(`${a}:restoring`,{id:p});if(Array.isArray(g)&&g.some((w)=>w===!1))return!1}catch(m){if(m?.code!=="MODULE_NOT_FOUND")console.error(`[ORM] Before-event '${a}:restoring' handler error:`,m)}return!0},c=async(p)=>{if(!s||F())return;try{let{dispatch:m}=ke??=await import("@stacksjs/events");await m(`${a}:restored`,{id:p})}catch(m){if(m?.code!=="MODULE_NOT_FOUND")console.error(`[ORM] Event '${a}:restored' handler error:`,m)}},l=process.env.STACKS_ORM_CASCADE_SWALLOW!=="true",f=async(p)=>{if(!o.cascade?.length||!l){let g=await r.softDelete(p);if(g&&o.cascade?.length)await Y(i,o,p,"softDelete");return g}let{db:m}=await import("@stacksjs/database/runtime");return await m.transaction(async()=>{let g=await r.softDelete(p);if(g)await Y(i,o,p,"softDelete");return g})},d=async(p)=>{if(!await u(p))return!1;if(!o.cascade?.length||!l){let h=await r.restore(p);if(h){if(o.cascade?.length)await Y(i,o,p,"restore");await c(p)}return h}let{db:g}=await import("@stacksjs/database/runtime"),w=await g.transaction(async()=>{let h=await r.restore(p);if(h)await Y(i,o,p,"restore");return h});if(w)await c(p);return w};e.softDelete=f,e.restore=d,e.forceDelete=r.forceDelete,e.withTrashed=r.withTrashed,e.onlyTrashed=r.onlyTrashed,e.delete=f}function ii(e){if(e==null)return e;if(Array.isArray(e))return e.map((n)=>ii(n));if(typeof e!=="object")return e;let t=e;if(typeof t.toJSON==="function")return t.toJSON();if(t._attributes&&typeof t._attributes==="object")return t._attributes;return e}var ai=["belongsTo","hasOne","hasMany","belongsToMany","morphMany","morphOne"],si=["traits","dashboard"];function ui(e){let t=e?.[lt];if(t&&typeof t==="object")return t;if(e&&typeof e==="object"&&"name"in e&&"attributes"in e)return e;throw TypeError("extendModel() expects a model created by defineModel(), or a model definition. Import the framework model itself rather than its table name.")}function ci(e,t){let n=Array.isArray(e)?e:[],r=Array.isArray(t)?t:[];if(!n.length&&!r.length)return;return[...new Set([...n,...r])]}function li(e){if(!e)return 0;return Object.values(e).reduce((t,n)=>{let r=Number(n?.order);return Number.isFinite(r)&&r>t?r:t},0)}function di(e,t){let n={...e,...t},r=e.attributes??{},o=t.attributes??{};if(t.attributes){let i=li(r),a=Object.fromEntries(Object.entries(o).map(([s,u])=>{let c=!(s in r),l=Number.isFinite(Number(u?.order));if(c&&!l)return[s,{...u,order:++i}];return[s,u]}));n.attributes={...r,...a}}for(let i of ai){let a=ci(e[i],t[i]);if(a)n[i]=a}for(let i of si){let a=e[i],s=t[i];if(a&&s&&typeof a==="object"&&typeof s==="object")n[i]={...a,...s}}return n}function Pc(e,t){return Fn(di(ui(e),t))}import hi from"process";import{log as ki}from"@stacksjs/logging";import{path as S}from"@stacksjs/path";import{fs as ee}from"@stacksjs/storage";import{Database as fi}from"bun:sqlite";import{existsSync as pi,readdirSync as mi,readFileSync as gi}from"fs";function yi(e){return e.startsWith("sqlite_")||e.startsWith("_qb_tmp_")}function wi(e,t){let n=e.toUpperCase();if(n.includes("BOOL"))return t==="postgres"?"boolean":"number";if(n.includes("DATE")||n.includes("TIME"))return"string";if(n.includes("INT"))return"number";if(n.includes("CHAR")||n.includes("CLOB")||n.includes("TEXT"))return"string";if(n.includes("REAL")||n.includes("FLOA")||n.includes("DOUB")||n.includes("NUMERIC")||n.includes("DEC"))return"number";if(n.includes("BLOB"))return"Uint8Array";return"unknown"}function bi(e,t){try{return e.exec(t),{ok:!0}}catch(n){if(/CREATE\s+TRIGGER/i.test(t))return{ok:!1,error:n.message};let r=0;for(let o of t.split(/;\s*$/m)){if(!o.trim())continue;try{e.exec(o),r++}catch{}}return r>0?{ok:!0}:{ok:!1,error:n.message}}}function Bn(e,t="sqlite"){let n=[];if(!pi(e))return{tables:[],errors:n};let r;try{r=mi(e).filter((i)=>i.endsWith(".sql")).sort()}catch(i){return{tables:[],errors:[{file:e,error:i.message}]}}let o=new fi(":memory:");try{for(let s of r){let u=`${e}/${s}`,c;try{c=gi(u,"utf-8")}catch(f){n.push({file:u,error:f.message});continue}let l=bi(o,c);if(!l.ok)n.push({file:u,error:l.error??"could not be applied"})}let i=o.query("SELECT name FROM sqlite_master WHERE type = 'table' ORDER BY name").all().map((s)=>s.name).filter((s)=>!yi(s)),a=[];for(let s of i){let u=o.query(`PRAGMA table_info("${s.replace(/"/g,'""')}")`).all();if(u.length===0)continue;let c={};for(let l of u){let f=wi(l.type??"",t),d=l.notnull===0&&l.pk===0;c[l.name]=d&&f!=="unknown"?`${f} | null`:f}a.push({table:s,columns:c})}return{tables:a,errors:n}}finally{o.close()}}function Ti(e){if(e)return e;let t=String(hi.env.DB_CONNECTION??"").toLowerCase();return t==="postgres"||t==="mysql"?t:"sqlite"}function Re(e){return e==="postgres"?"boolean":"number"}function O(e){return e.replace(/([A-Z]+)([A-Z][a-z])/g,"$1_$2").replace(/([a-z\d])([A-Z])/g,"$1_$2").toLowerCase()}function Ri(e,t){let n=e.default;if(typeof n==="boolean")return Re(t);if(typeof n==="number")return"number";if(typeof n==="string")return"string";return"unknown"}function _i(e){let t=e.validation;if(!t||typeof t!=="object")return null;let n=t.rule;return n&&typeof n==="object"?n:null}function Si(e){if(!e||String(e.name??"")!=="enum")return null;let n=(Array.isArray(e.allowedValues)?e.allowedValues:[]).filter((r)=>typeof r==="string"||typeof r==="number").map((r)=>typeof r==="number"?String(r):JSON.stringify(r));return n.length>0?n.join(" | "):null}function Ai(e,t){let n=_i(e),r=Si(n);if(r!==null)return e.nullable===!0?`${r} | null`:r;let o=typeof e.type==="string"?e.type.toLowerCase():String(n?.name??"").toLowerCase(),i=(()=>{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 Re(t);case"json":case"jsonb":return"unknown";case"binary":case"blob":case"bytea":return"Uint8Array";case"unix":return"number";case"array":return"unknown[]";case"object":return"Record<string, unknown>";default:return Ri(e,t)}})();return e.nullable===!0?`${i} | null`:i}function Pi(e){let t={},n=e.belongsTo;if(!n)return t;let r=Array.isArray(n)?n:Object.values(n);for(let o of r){if(typeof o==="string"){t[`${O(o)}_id`]="number";continue}if(o&&typeof o==="object"){let i=o;if(typeof i.foreignKey==="string"){t[i.foreignKey]="number";continue}if(typeof i.model==="string")t[`${O(i.model)}_id`]="number"}}return t}function xi(e,t){let[n,r]=[O(e),O(t)].sort();return`${n}_${r}`}function Ci(e,t){let n=e.default,r=typeof n==="string"?"string":typeof n==="number"?"number":typeof n==="boolean"?Re(t):n instanceof Date?"string":"unknown";return e.nullable?`${r} | null`:r}function vi(e,t,n){let r=t.belongsToMany;if(!r)return[];let o=[],i=Array.isArray(r)?r:Object.values(r);for(let a of i){let s,u,c,l,f={},d=!0;if(typeof a==="string")s=a;else if(a&&typeof a==="object"&&"model"in a){let h=a;if(s=h.model,"pivotTable"in h||"firstForeignKey"in h||"secondForeignKey"in h)u=h.pivotTable,c=h.firstForeignKey,l=h.secondForeignKey;else{let b=a;u=b.table,c=b.foreignKey,l=b.relatedKey,f=b.pivot?.columns??{},d=Boolean(b.pivot?.timestamps)}}else continue;let p=u??xi(e,s),m=c??`${O(e)}_id`,g=l??`${O(s)}_id`,w={id:"number",[m]:"number",[g]:"number"};for(let[h,b]of Object.entries(f))w[h]=Ci(b,n);if(d)w.created_at="string",w.updated_at="string | null";o.push({table:p,columns:w})}return o}function Mi(e){return{email_verified_at:"string | null",password_changed_at:"string | null",two_factor_secret:"string | null",two_factor_enabled:`${Re(e)} | null`,two_factor_last_used_step:"number | null",stripe_id:"string | null"}}function Oi(e,t){let n={id:"number"},r=e.traits??{};if(r.useUuid)n.uuid="string";if((r.useTimestamps??r.timestampable)!==!1)n.created_at="string",n.updated_at="string | null";if(r.useSoftDeletes??r.softDeletable)n.deleted_at="string | null";if((e.table??"")==="users"||e.name==="User")Object.assign(n,Mi(t));return n}function Di(e,t){let n={},r=e.attributes??{};for(let[o,i]of Object.entries(r))n[O(o)]=Ai(i,t);return n}function Nn(e,t,n=2){let r=" ".repeat(n),o=" ".repeat(n+1),i=Object.entries(t).map(([s,u])=>`${o}${s}: ${u}`).join(`
8
+ `),a=/^[A-Z_a-z]\w*$/.test(e)?e:`'${e}'`;return`${r}${a}: {
4
9
  ${o}// columns
5
- ${a}
6
- ${r}}`}var go=`/* eslint-disable */
10
+ ${i}
11
+ ${r}}`}var Ei=`/* eslint-disable */
7
12
  // AUTO-GENERATED by \`buddy generate:db-types\` \u2014 do not edit.
8
13
  // Regenerate after adding/removing a model or changing its attributes.
9
14
  // See stacksjs/stacks#1923.
10
15
 
11
16
  declare module '@stacksjs/database' {
12
17
  interface DatabaseSchema {
13
- `,wo=` }
18
+ `,ji=` }
14
19
  }
15
20
 
16
21
  export {}
17
- `,bo="/* 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",ho=`}
18
- `;function Gt(e){return e==="framework"?bo:go}function Jt(e){return e==="framework"?ho:wo}async function Yt(e,n,t=[]){let r=[];if(!z.existsSync(e))return r;let o=z.readdirSync(e,{withFileTypes:!0});for(let a of o){let i=_.join(e,a.name);if(a.isDirectory()){if(n){let s=await Yt(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(_.isAbsolute(i)?import(i):import(_.resolve(i))),u=s.default||s;if(u?.name&&(u.attributes||u.table))r.push({filePath:i,model:u})}catch(s){t.push({file:i,error:s.message})}}return r}async function ko(e={}){let n=ro(e.dialect),t=e.modelsDir??_.userModelsPath(),r=e.defaultsDir??_.frameworkPath("defaults/app/Models"),o=e.outFile??_.projectPath("database/types.d.ts"),a=[],i=[];for(let[m,g]of[[t,!1],[r,!0]])try{let w=await Yt(m,g,a);i.push(...w)}catch(w){a.push({file:m,error:w.message})}let s=new Map;for(let m of i)s.set(m.model.name??_.basename(m.filePath).replace(/\.ts$/,""),m);for(let m of i)if(m.filePath.startsWith(t))s.set(m.model.name??_.basename(m.filePath).replace(/\.ts$/,""),m);let u=[];for(let[m,{model:g}]of s){let w=g.table??`${x(m)}s`,b={...mo(g,n),...yo(g,n),...uo(g)};u.push({table:w,model:m,columns:b})}let c=new Map;for(let[m,{model:g}]of s)for(let w of fo(m,g,n)){if(c.has(w.table))continue;c.set(w.table,{table:w.table,model:`(${w.table} pivot)`,columns:w.columns})}if(u.push(...c.values()),e.migrationsDir!==!1){let m=e.migrationsDir??_.resolve(_.dirname(o),"migrations"),g=new Set(u.map((b)=>b.table)),w=zt(m,n);for(let b of w.tables){if(g.has(b.table))continue;g.add(b.table),u.push({table:b.table,model:`(${b.table} migration)`,columns:b.columns})}a.push(...w.errors)}u.sort((m,g)=>m.table.localeCompare(g.table));let l=e.target??"app",f=l==="framework"?1:2,d=u.map((m)=>Ht(m.table,m.columns,f)).join(`
19
- `),p=`${Gt(l)}${d}
20
- ${Jt(l)}`;if(!e.dryRun){let m=_.dirname(o);if(!z.existsSync(m))z.mkdirSync(m,{recursive:!0});z.writeFileSync(o,p,"utf-8"),no.success(`[generate:db-types] wrote ${u.length} table(s) to ${o}`)}return{outFile:o,tables:u,errors:a,content:p}}function To(e,n="app"){let t=[...e].sort((r,o)=>r.table.localeCompare(o.table)).map((r)=>Ht(r.table,r.columns,n==="framework"?1:2)).join(`
21
- `);return`${Gt(n)}${t}
22
- ${Jt(n)}`}import{isCursorPaginator as Du,isPaginator as Eu,isSimplePaginator as Fu,toCursorPaginator as Iu,toPaginator as $u,toSimplePaginator as ju}from"@stacksjs/pagination";import{configureOrm as _o}from"@stacksjs/query-builder";function Ro(){try{let e=process.env.DB_DATABASE_PATH||"database/stacks.sqlite";if((process.env.DB_CONNECTION||"sqlite")==="sqlite")_o({database:e})}catch{}}Ro();async function Xt(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 ue(e,n=[""]){let{path:t}=await import("@stacksjs/path"),r=t.userModelsPath(`${e}.ts`);try{if(await Bun.file(r).exists())return await Xt(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 Xt(i)}catch(s){console.error(`[orm] Failed to import framework default model ${e} from ${i} - trying next subdir. Reason:`,s)}}return null}var C={},Zt=()=>{},ru=new Promise((e)=>{Zt=e});function y(e){return new Proxy(function(){},{get(n,t){if(t==="then")return;let r=C[e];if(r==null)return;let o=r[t];return typeof o==="function"?o.bind(r):o},set(n,t,r){let o=C[e];if(o==null)return!1;return o[t]=r,!0},has(n,t){let r=C[e];return r==null?!1:(t in r)},apply(n,t,r){let o=C[e];if(o==null||typeof o!=="function")return;return o.apply(t,r)}})}var So=y("User"),Ao=y("Job"),Po=y("FailedJob"),xo=[["Referral",[""],"auth"],["ReferralCode",[""],"auth"],["Team",[""],"auth"],["TeamInvitation",[""],"auth"],["TeamMember",[""],"auth"],["SocialAccount",[""],"auth"],["Subscriber",[""],"auth"],["SubscriberEmail",[""],"auth"],["Subscription",[""],"auth"],["Categorizable",["Content"],"cms"],["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"],["PersonalAccessToken",[""],"dashboard"],["MailPreference",[""],"dashboard"],["Log",[""],"dashboard"],["Request",[""],"dashboard"],["AnalyticsEvent",[""],"dashboard"],["QueryLog",[""],"dashboard"],["StorageItem",[""],"dashboard"],["StorageItemTask",[""],"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 ue("User");if(n)C.User=n;if(e("queue")){let t=await ue("Job");if(t)C.Job=t;let r=await ue("FailedJob");if(r)C.FailedJob=r}for(let[t,r,o]of xo){if(!e(o))continue;let a=await ue(t,r);if(a)C[t]=a}}catch(e){console.error("[orm] deferred model load failed:",e)}finally{Zt()}});var Co=y("Activity"),vo=y("AnalyticsEvent"),Oo=y("Automation"),Mo=y("AutomationRun"),Do=y("Auction"),Eo=y("CampaignVariant"),Fo=y("CommunicationSuppression"),Io=y("ConsentEvent"),$o=y("SenderDomain"),jo=y("UsageEvent"),Bo=y("AuctionItem"),No=y("Author"),qo=y("Bid"),Lo=y("Board"),Uo=y("BoardColumn"),Ko=y("Campaign"),Wo=y("Card"),Vo=y("CardComment"),Qo=y("Cart"),zo=y("CartItem"),Ho=y("Category"),Go=y("Comment"),Jo=y("Coupon"),Yo=y("Customer"),Xo=y("DeliveryRoute"),Zo=y("DeliveryStop"),ea=y("Deployment"),ta=y("DigitalDelivery"),na=y("Courier"),ra=y("CourierPing"),oa=y("CampaignSend"),aa=y("EmailList"),ia=y("EmailListSubscriber"),sa=y("Form"),ua=y("FormField"),ca=y("FormSubmission"),la=y("MagicLinkToken"),da=y("Menu"),fa=y("MenuItem"),pa=y("PageRevision"),ma=y("Pledge"),ya=y("Redirect"),ga=y("Site"),wa=y("SiteDomain"),ba=y("SmsOptOut"),ou=y("StorageItem"),au=y("StorageItemTask"),ha=y("EmailIdempotency"),ka=y("EmailSuppression"),Ta=y("EmailWebhookEvent"),_a=y("Error"),Ra=y("GiftCard"),Sa=y("Label"),Aa=y("LicenseKey"),Pa=y("Log"),xa=y("LoyaltyPoint"),Ca=y("LoyaltyReward"),va=y("MailPreference"),Oa=y("Manufacturer"),Ma=y("Notification"),Da=y("NotificationDelivery"),Ea=y("Order"),Fa=y("OrderIdempotency"),iu=y("PersonalAccessToken"),Ia=y("OrderItem"),$a=y("Page"),ja=y("Payment"),Ba=y("PaymentMethod"),Na=y("PaymentProduct"),qa=y("PaymentTransaction"),La=y("Post"),Ua=y("Categorizable"),Ka=y("PrintDevice"),Wa=y("Product"),Va=y("ProductUnit"),Qa=y("ProductVariant"),za=y("QueryLog"),Ha=y("Receipt"),su=y("Referral"),uu=y("ReferralCode"),Ga=y("Release"),Ja=y("Request"),Ya=y("Review"),Xa=y("ShippingMethod"),Za=y("ShippingRate"),ei=y("ShippingZone"),ti=y("SocialPost"),ni=y("SocialAccount"),ri=y("Subscriber"),oi=y("SubscriberEmail"),ai=y("Subscription"),ii=y("Tag"),si=y("TaxRate"),ui=y("Team"),ci=y("TeamInvitation"),li=y("TeamMember"),di=y("Transaction"),fi=y("WaitlistProduct"),pi=y("WaitlistRestaurant"),mi=y("Websocket"),en={User:So,Job:Ao,FailedJob:Po,Activity:Co,AnalyticsEvent:vo,Automation:Oo,AutomationRun:Mo,Auction:Do,AuctionItem:Bo,Author:No,Bid:qo,Board:Lo,BoardColumn:Uo,Campaign:Ko,CampaignSend:oa,CampaignVariant:Eo,Card:Wo,CardComment:Vo,Cart:Qo,CartItem:zo,Categorizable:Ua,Category:Ho,Comment:Go,Coupon:Jo,Customer:Yo,CommunicationSuppression:Fo,ConsentEvent:Io,DeliveryRoute:Xo,DeliveryStop:Zo,Deployment:ea,DigitalDelivery:ta,Courier:na,CourierPing:ra,EmailList:aa,EmailListSubscriber:ia,EmailIdempotency:ha,EmailSuppression:ka,EmailWebhookEvent:Ta,ErrorModel:_a,Form:sa,FormField:ua,FormSubmission:ca,GiftCard:Ra,Label:Sa,LicenseKey:Aa,Log:Pa,LoyaltyPoint:xa,LoyaltyReward:Ca,MailPreference:va,Manufacturer:Oa,Notification:Ma,MagicLinkToken:la,Menu:da,MenuItem:fa,NotificationDelivery:Da,Order:Ea,OrderIdempotency:Fa,OrderItem:Ia,Page:$a,PageRevision:pa,Payment:ja,PaymentMethod:Ba,PaymentProduct:Na,PaymentTransaction:qa,Pledge:ma,Post:La,PrintDevice:Ka,Product:Wa,ProductUnit:Va,ProductVariant:Qa,QueryLog:za,Receipt:Ha,Release:Ga,Request:Ja,Review:Ya,ShippingMethod:Xa,Redirect:ya,SenderDomain:$o,ShippingRate:Za,ShippingZone:ei,Site:ga,SiteDomain:wa,SmsOptOut:ba,SocialAccount:ni,SocialPost:ti,Subscriber:ri,SubscriberEmail:oi,Subscription:ai,Tag:ii,TaxRate:si,Team:ui,TeamInvitation:ci,TeamMember:li,Transaction:di,UsageEvent:jo,WaitlistProduct:fi,WaitlistRestaurant:pi,Websocket:mi},B=globalThis;for(let[e,n]of Object.entries(en))if(n&&B[e]===void 0)B[e]=n;var cu=Object.keys(en);async function yi(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 gi(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(B.safeAll===void 0)B.safeAll=yi;if(B.safeGet===void 0)B.safeGet=gi;export{Co as Activity,vo as AnalyticsEvent,Do as Auction,Bo as AuctionItem,No as Author,Oo as Automation,Mo as AutomationRun,Z as BILLABLE_INSTANCE_METHODS,qo as Bid,Lo as Board,Uo as BoardColumn,Ko as Campaign,oa as CampaignSend,Eo as CampaignVariant,Wo as Card,Vo as CardComment,Qo as Cart,zo as CartItem,Ua as Categorizable,Ho as Category,Go as Comment,Fo as CommunicationSuppression,Io as ConsentEvent,Jo as Coupon,na as Courier,ra as CourierPing,Yo as Customer,Xo as DeliveryRoute,Zo as DeliveryStop,ea as Deployment,ta as DigitalDelivery,ha as EmailIdempotency,aa as EmailList,ia as EmailListSubscriber,ka as EmailSuppression,Ta as EmailWebhookEvent,_a as ErrorModel,Po as FailedJob,sa as Form,ua as FormField,ca as FormSubmission,Ra as GiftCard,Ao as Job,Sa as Label,Aa as LicenseKey,Pa as Log,xa as LoyaltyPoint,Ca as LoyaltyReward,$e as MODEL_DEFINITION,la as MagicLinkToken,va as MailPreference,Oa as Manufacturer,Fe as MassAssignmentException,da as Menu,fa as MenuItem,Lt as ModelNotFoundError,jt as ModelValidationError,Ma as Notification,Da as NotificationDelivery,Ea as Order,Fa as OrderIdempotency,Ia as OrderItem,$a as Page,pa as PageRevision,ja as Payment,Ba as PaymentMethod,Na as PaymentProduct,qa as PaymentTransaction,iu as PersonalAccessToken,ma as Pledge,La as Post,Ka as PrintDevice,Wa as Product,Va as ProductUnit,Qa as ProductVariant,za as QueryLog,Ha as Receipt,ya as Redirect,su as Referral,uu as ReferralCode,Ga as Release,Ja as Request,Ya as Review,$o as SenderDomain,Xa as ShippingMethod,Za as ShippingRate,ei as ShippingZone,ga as Site,wa as SiteDomain,ba as SmsOptOut,ni as SocialAccount,ti as SocialPost,ou as StorageItem,au as StorageItemTask,Yn as SubqueryBuilder,ri as Subscriber,oi as SubscriberEmail,ai as Subscription,ke as SubscriptionNotOwnedError,ii as Tag,si as TaxRate,ui as Team,ci as TeamInvitation,li as TeamMember,di as Transaction,jo as UsageEvent,So as User,fi as WaitlistProduct,pi as WaitlistRestaurant,mi as Websocket,os as batchLoad,ko as buildDatabaseSchema,fe as collectEncryptedAttributes,Ve as createAuditMethods,be as createCategorizableMethods,ye as createCommentableMethods,he as createLikeableMethods,we as createTaggableMethods,Kn as customerOwnership,us as db,de as decryptValue,Wt as defineModel,le as encryptValue,Ce as enrichPaginatorUrls,Ws as extendModel,vn as filterFillable,Ti as getPrunableConfig,Cn as getWritableFields,An as isBillable,Du as isCursorPaginator,N as isEncrypted,Eu as isPaginator,Fu as isSimplePaginator,nt as isUniqueViolation,Pn as mapWriteError,ki as massPrunable,zr as mergeModelDefinition,cu as modelGlobalNames,ru as ormReady,zn as parentOwnership,ct as parseCursor,Ie as projectDocumentsFromTrait,nn as prunable,To as renderDatabaseTypeFile,xe as resolveCursorArgs,Pe as resolvePageArgs,fs as savepoint,Wn as selfOwnership,dn as setAuditUser,Vn as siteOwnership,Qn as teamMembershipOwnership,Lr as toAttrs,Iu as toCursorPaginator,$u as toPaginator,ju as toSimplePaginator,xn as toSnakeCaseKeys,ds as transaction,ps as transactional,O as withoutEvents,gr as withoutValidation};
22
+ `,Fi="/* 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",$i=`}
23
+ `;function Ln(e){return e==="framework"?Fi:Ei}function qn(e){return e==="framework"?$i:ji}async function Gn(e,t,n=[]){let r=[];if(!ee.existsSync(e))return r;let o=ee.readdirSync(e,{withFileTypes:!0});for(let i of o){let a=S.join(e,i.name);if(i.isDirectory()){if(t){let s=await Gn(a,!0,n);r.push(...s)}continue}if(!i.name.endsWith(".ts"))continue;if(i.name.startsWith("_")||i.name.startsWith("index"))continue;try{let s=await(S.isAbsolute(a)?import(a):import(S.resolve(a))),u=s.default||s;if(u?.name&&(u.attributes||u.table))r.push({filePath:a,model:u})}catch(s){n.push({file:a,error:s.message})}}return r}async function Ii(e={}){let t=Ti(e.dialect),n=e.modelsDir??S.userModelsPath(),r=e.defaultsDir??S.frameworkPath("defaults/app/Models"),o=e.outFile??S.projectPath("database/types.d.ts"),i=[],a=[];for(let[m,g]of[[n,!1],[r,!0]])try{let w=await Gn(m,g,i);a.push(...w)}catch(w){i.push({file:m,error:w.message})}let s=new Map;for(let m of a)s.set(m.model.name??S.basename(m.filePath).replace(/\.ts$/,""),m);for(let m of a)if(m.filePath.startsWith(n))s.set(m.model.name??S.basename(m.filePath).replace(/\.ts$/,""),m);let u=[];for(let[m,{model:g}]of s){let w=g.table??`${O(m)}s`,h={...Oi(g,t),...Di(g,t),...Pi(g)};u.push({table:w,model:m,columns:h})}let c=new Map;for(let[m,{model:g}]of s)for(let w of vi(m,g,t)){if(c.has(w.table))continue;c.set(w.table,{table:w.table,model:`(${w.table} pivot)`,columns:w.columns})}if(u.push(...c.values()),e.migrationsDir!==!1){let m=e.migrationsDir??S.resolve(S.dirname(o),"migrations"),g=new Set(u.map((h)=>h.table)),w=Bn(m,t);for(let h of w.tables){if(g.has(h.table))continue;g.add(h.table),u.push({table:h.table,model:`(${h.table} migration)`,columns:h.columns})}i.push(...w.errors)}u.sort((m,g)=>m.table.localeCompare(g.table));let l=e.target??"app",f=l==="framework"?1:2,d=u.map((m)=>Nn(m.table,m.columns,f)).join(`
24
+ `),p=`${Ln(l)}${d}
25
+ ${qn(l)}`;if(!e.dryRun){let m=S.dirname(o);if(!ee.existsSync(m))ee.mkdirSync(m,{recursive:!0});ee.writeFileSync(o,p,"utf-8"),ki.success(`[generate:db-types] wrote ${u.length} table(s) to ${o}`)}return{outFile:o,tables:u,errors:i,content:p}}function Bi(e,t="app"){let n=[...e].sort((r,o)=>r.table.localeCompare(o.table)).map((r)=>Nn(r.table,r.columns,t==="framework"?1:2)).join(`
26
+ `);return`${Ln(t)}${n}
27
+ ${qn(t)}`}import{isCursorPaginator as gl,isPaginator as yl,isSimplePaginator as wl,toCursorPaginator as bl,toPaginator as hl,toSimplePaginator as kl}from"@stacksjs/pagination";import{configureOrm as Ni}from"@stacksjs/query-builder";function Li(){try{let e=process.env.DB_DATABASE_PATH||"database/stacks.sqlite";if((process.env.DB_CONNECTION||"sqlite")==="sqlite")Ni({database:e})}catch{}}Li();async function Un(e){for(let t=0;;t++){let n=await import(e);try{return n.default}catch(r){if(t<5&&r instanceof ReferenceError&&/before initialization/.test(r.message)){await new Promise((o)=>setTimeout(o,0));continue}throw r}}}async function _e(e,t=[""]){let{path:n}=await import("@stacksjs/path"),r=n.userModelsPath(`${e}.ts`);try{if(await Bun.file(r).exists())return await Un(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 t){let i=o?`${o}/`:"",a=n.frameworkPath(`defaults/app/Models/${i}${e}.ts`);try{if(await Bun.file(a).exists())return await Un(a)}catch(s){console.error(`[orm] Failed to import framework default model ${e} from ${a} - trying next subdir. Reason:`,s)}}return null}var D={},Kn=()=>{},Nc=new Promise((e)=>{Kn=e});function y(e){return new Proxy(function(){},{get(t,n){if(n==="then")return;let r=D[e];if(r==null)return;let o=r[n];return typeof o==="function"?o.bind(r):o},set(t,n,r){let o=D[e];if(o==null)return!1;return o[n]=r,!0},has(t,n){let r=D[e];return r==null?!1:(n in r)},apply(t,n,r){let o=D[e];if(o==null||typeof o!=="function")return;return o.apply(n,r)}})}var qi=y("User"),Gi=y("Job"),Ui=y("FailedJob"),Ki=[["Referral",[""],"auth"],["ReferralCode",[""],"auth"],["Team",[""],"auth"],["TeamInvitation",[""],"auth"],["TeamMember",[""],"auth"],["SocialAccount",[""],"auth"],["Subscriber",[""],"auth"],["SubscriberEmail",[""],"auth"],["Subscription",[""],"auth"],["Categorizable",["Content"],"cms"],["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"],["GdprRequest",[""],"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"],["PersonalAccessToken",[""],"dashboard"],["MailPreference",[""],"dashboard"],["Log",[""],"dashboard"],["Request",[""],"dashboard"],["AnalyticsEvent",[""],"dashboard"],["QueryLog",[""],"dashboard"],["StorageItem",[""],"dashboard"],["StorageItemTask",[""],"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"),t=await _e("User");if(t)D.User=t;if(e("queue")){let n=await _e("Job");if(n)D.Job=n;let r=await _e("FailedJob");if(r)D.FailedJob=r}for(let[n,r,o]of Ki){if(!e(o))continue;let i=await _e(n,r);if(i)D[n]=i}}catch(e){console.error("[orm] deferred model load failed:",e)}finally{Kn()}});var Wi=y("Activity"),Vi=y("AnalyticsEvent"),Qi=y("Automation"),zi=y("AutomationRun"),Hi=y("Auction"),Ji=y("CampaignVariant"),Yi=y("CommunicationSuppression"),Xi=y("ConsentEvent"),Zi=y("SenderDomain"),ea=y("UsageEvent"),ta=y("AuctionItem"),na=y("Author"),ra=y("Bid"),oa=y("Board"),ia=y("BoardColumn"),aa=y("Campaign"),sa=y("Card"),ua=y("CardComment"),ca=y("Cart"),la=y("CartItem"),da=y("Category"),fa=y("Comment"),pa=y("Coupon"),ma=y("Customer"),ga=y("DeliveryRoute"),ya=y("DeliveryStop"),wa=y("Deployment"),ba=y("DigitalDelivery"),ha=y("Courier"),ka=y("CourierPing"),Ta=y("CampaignSend"),Ra=y("EmailList"),_a=y("EmailListSubscriber"),Sa=y("Form"),Aa=y("FormField"),Pa=y("FormSubmission"),xa=y("MagicLinkToken"),Ca=y("Menu"),va=y("MenuItem"),Ma=y("PageRevision"),Oa=y("Pledge"),Da=y("Redirect"),Ea=y("Site"),ja=y("SiteDomain"),Fa=y("SmsOptOut"),$a=y("GdprRequest"),Lc=y("StorageItem"),qc=y("StorageItemTask"),Ia=y("EmailIdempotency"),Ba=y("EmailSuppression"),Na=y("EmailWebhookEvent"),La=y("Error"),qa=y("GiftCard"),Ga=y("Label"),Ua=y("LicenseKey"),Ka=y("Log"),Wa=y("LoyaltyPoint"),Va=y("LoyaltyReward"),Qa=y("MailPreference"),za=y("Manufacturer"),Ha=y("Notification"),Ja=y("NotificationDelivery"),Ya=y("Order"),Xa=y("OrderIdempotency"),Gc=y("PersonalAccessToken"),Za=y("OrderItem"),es=y("Page"),ts=y("Payment"),ns=y("PaymentMethod"),rs=y("PaymentProduct"),os=y("PaymentTransaction"),is=y("Post"),as=y("Categorizable"),ss=y("PrintDevice"),us=y("Product"),cs=y("ProductUnit"),ls=y("ProductVariant"),ds=y("QueryLog"),fs=y("Receipt"),Uc=y("Referral"),Kc=y("ReferralCode"),ps=y("Release"),ms=y("Request"),gs=y("Review"),ys=y("ShippingMethod"),ws=y("ShippingRate"),bs=y("ShippingZone"),hs=y("SocialPost"),ks=y("SocialAccount"),Ts=y("Subscriber"),Rs=y("SubscriberEmail"),_s=y("Subscription"),Ss=y("Tag"),As=y("TaxRate"),Ps=y("Team"),xs=y("TeamInvitation"),Cs=y("TeamMember"),vs=y("Transaction"),Ms=y("WaitlistProduct"),Os=y("WaitlistRestaurant"),Ds=y("Websocket"),Wn={User:qi,Job:Gi,FailedJob:Ui,Activity:Wi,AnalyticsEvent:Vi,Automation:Qi,AutomationRun:zi,Auction:Hi,AuctionItem:ta,Author:na,Bid:ra,Board:oa,BoardColumn:ia,Campaign:aa,CampaignSend:Ta,CampaignVariant:Ji,Card:sa,CardComment:ua,Cart:ca,CartItem:la,Categorizable:as,Category:da,Comment:fa,Coupon:pa,Customer:ma,CommunicationSuppression:Yi,ConsentEvent:Xi,DeliveryRoute:ga,DeliveryStop:ya,Deployment:wa,DigitalDelivery:ba,Courier:ha,CourierPing:ka,EmailList:Ra,EmailListSubscriber:_a,EmailIdempotency:Ia,EmailSuppression:Ba,EmailWebhookEvent:Na,ErrorModel:La,Form:Sa,FormField:Aa,FormSubmission:Pa,GdprRequest:$a,GiftCard:qa,Label:Ga,LicenseKey:Ua,Log:Ka,LoyaltyPoint:Wa,LoyaltyReward:Va,MailPreference:Qa,Manufacturer:za,Notification:Ha,MagicLinkToken:xa,Menu:Ca,MenuItem:va,NotificationDelivery:Ja,Order:Ya,OrderIdempotency:Xa,OrderItem:Za,Page:es,PageRevision:Ma,Payment:ts,PaymentMethod:ns,PaymentProduct:rs,PaymentTransaction:os,Pledge:Oa,Post:is,PrintDevice:ss,Product:us,ProductUnit:cs,ProductVariant:ls,QueryLog:ds,Receipt:fs,Release:ps,Request:ms,Review:gs,ShippingMethod:ys,Redirect:Da,SenderDomain:Zi,ShippingRate:ws,ShippingZone:bs,Site:Ea,SiteDomain:ja,SmsOptOut:Fa,SocialAccount:ks,SocialPost:hs,Subscriber:Ts,SubscriberEmail:Rs,Subscription:_s,Tag:Ss,TaxRate:As,Team:Ps,TeamInvitation:xs,TeamMember:Cs,Transaction:vs,UsageEvent:ea,WaitlistProduct:Ms,WaitlistRestaurant:Os,Websocket:Ds},G=globalThis;for(let[e,t]of Object.entries(Wn))if(t&&G[e]===void 0)G[e]=t;var Wc=Object.keys(Wn);async function Es(e){if(!e)return[];try{if(typeof e.all==="function"){let t=await e.all();return Array.isArray(t)?t:[]}if(typeof e.get==="function"){let t=await e.get();return Array.isArray(t)?t:[]}}catch{}return[]}function js(e,t,n=""){if(!e)return n;try{if(typeof e.get==="function"){let o=e.get(t);if(o!==void 0&&o!==null)return o}}catch{}let r=e?.[t];return r!==void 0&&r!==null?r:n}if(G.safeAll===void 0)G.safeAll=Es;if(G.safeGet===void 0)G.safeGet=js;export{Wi as Activity,Vi as AnalyticsEvent,Hi as Auction,ta as AuctionItem,na as Author,Qi as Automation,zi as AutomationRun,ue as BILLABLE_INSTANCE_METHODS,ra as Bid,oa as Board,ia as BoardColumn,aa as Campaign,Ta as CampaignSend,Ji as CampaignVariant,sa as Card,ua as CardComment,ca as Cart,la as CartItem,as as Categorizable,da as Category,fa as Comment,Yi as CommunicationSuppression,Xi as ConsentEvent,pa as Coupon,ha as Courier,ka as CourierPing,ma as Customer,ga as DeliveryRoute,ya as DeliveryStop,wa as Deployment,ba as DigitalDelivery,Ia as EmailIdempotency,Ra as EmailList,_a as EmailListSubscriber,Ba as EmailSuppression,Na as EmailWebhookEvent,La as ErrorModel,Ui as FailedJob,Sa as Form,Aa as FormField,Pa as FormSubmission,fe as GDPR_AUDIT_TABLE,M as GDPR_SUBJECT_MODEL,Ge as GdprDeclarationError,$a as GdprRequest,pe as GdprSubjectNotFoundError,qa as GiftCard,Gi as Job,Ga as Label,Ua as LicenseKey,Ka as Log,Wa as LoyaltyPoint,Va as LoyaltyReward,lt as MODEL_DEFINITION,xa as MagicLinkToken,Qa as MailPreference,za as Manufacturer,ut as MassAssignmentException,Ca as Menu,va as MenuItem,Dn as ModelNotFoundError,Cn as ModelValidationError,Ha as Notification,Ja as NotificationDelivery,Ya as Order,Xa as OrderIdempotency,Za as OrderItem,es as Page,Ma as PageRevision,ts as Payment,ns as PaymentMethod,rs as PaymentProduct,os as PaymentTransaction,Gc as PersonalAccessToken,Oa as Pledge,is as Post,ss as PrintDevice,us as Product,cs as ProductUnit,ls as ProductVariant,ds as QueryLog,fs as Receipt,Da as Redirect,Uc as Referral,Kc as ReferralCode,ps as Release,ms as Request,gs as Review,Zi as SenderDomain,ys as ShippingMethod,ws as ShippingRate,bs as ShippingZone,Ea as Site,ja as SiteDomain,Fa as SmsOptOut,ks as SocialAccount,hs as SocialPost,Lc as StorageItem,qc as StorageItemTask,qr as SubqueryBuilder,Ts as Subscriber,Rs as SubscriberEmail,_s as Subscription,$e as SubscriptionNotOwnedError,Ss as Tag,As as TaxRate,Ps as Team,xs as TeamInvitation,Cs as TeamMember,vs as Transaction,ea as UsageEvent,qi as User,Ms as WaitlistProduct,Os as WaitlistRestaurant,Ds as Websocket,de as assertGdprPlan,Ru as batchLoad,Ii as buildDatabaseSchema,mo as buildProcessingRegister,Ce as collectEncryptedAttributes,ht as createAuditMethods,je as createCategorizableMethods,Oe as createCommentableMethods,Fe as createLikeableMethods,Ee as createTaggableMethods,Er as customerOwnership,Pu as db,xe as decryptValue,Fn as defineModel,Pe as encryptValue,nt as enrichPaginatorUrls,co as eraseSubject,so as exportSubjectData,Pc as extendModel,hr as filterFillable,ge as gdprTableExists,Lt as gdprTableName,Ns as getPrunableConfig,br as getWritableFields,gr as isBillable,gl as isCursorPaginator,K as isEncrypted,yl as isPaginator,wl as isSimplePaginator,Mt as isUniqueViolation,Ue as loadGdprModels,yr as mapWriteError,Bs as massPrunable,di as mergeModelDefinition,Wc as modelGlobalNames,Nc as ormReady,Ir as parentOwnership,Zt as parseCursor,ct as projectDocumentsFromTrait,Qn as prunable,fo as pruneRetainedData,Bi as renderDatabaseTypeFile,go as renderProcessingRegister,tt as resolveCursorArgs,le as resolveGdprPlan,ro as resolveGdprSubject,et as resolvePageArgs,vu as savepoint,jr as selfOwnership,tr as setAuditUser,Fr as siteOwnership,$r as teamMembershipOwnership,ii as toAttrs,bl as toCursorPaginator,hl as toPaginator,kl as toSimplePaginator,wr as toSnakeCaseKeys,qe as transaction,Mu as transactional,j as withoutEvents,jo as withoutValidation};