@stacksjs/orm 0.74.48 → 0.74.50
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/auto-crud.d.ts +9 -0
- package/dist/index.js +9 -9
- package/dist/routes.js +1 -1
- package/package.json +23 -23
package/dist/auto-crud.d.ts
CHANGED
|
@@ -187,7 +187,16 @@ declare function safeJSONOrEmpty(_s: string): unknown;
|
|
|
187
187
|
* read path) now gets its casts instead of leaking raw SQLite `"1"`s.
|
|
188
188
|
*/
|
|
189
189
|
export declare function applyCasts(record: Record<string, any> | null | undefined, casts: Record<string, string | { get: (v: unknown) => unknown, set: (v: unknown) => unknown }> | null | undefined, direction: 'get' | 'set'): any;
|
|
190
|
+
export declare function hasWriteValidators(model: any): boolean;
|
|
190
191
|
export declare function validateWriteBody(data: Record<string, any>, model: any, hook: 'creating' | 'updating'): WriteValidationResult;
|
|
192
|
+
/** A stable lookup key for the verb and parameter-independent route shape. */
|
|
193
|
+
export declare function routeShapeKey(method: string, path: string): string;
|
|
194
|
+
/**
|
|
195
|
+
* Index registered routes by verb and path shape while preserving the first
|
|
196
|
+
* route for collision diagnostics. The router also serves the first
|
|
197
|
+
* registration, so later duplicates must not replace it here.
|
|
198
|
+
*/
|
|
199
|
+
export declare function indexRouteShapes<T extends RegisteredRouteLike>(routes: readonly T[]): Map<string, T>;
|
|
191
200
|
/**
|
|
192
201
|
* The already-registered route that would shadow a generated `method` + `path`,
|
|
193
202
|
* or undefined when the generated route is free to register.
|
package/dist/index.js
CHANGED
|
@@ -1,22 +1,22 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
var It=import.meta.require;import"@stacksjs/validation";import{log as ne}from"@stacksjs/cli";import{db as ve,mutationCount as Me}from"@stacksjs/database/runtime";async function jt(e,t={}){let{olderThanDays:n=30,column:r="created_at",query:o}=t;try{if(o){let c=ve.deleteFrom(e);c=o(c);let u=Me(await c.execute());return ne.info(`Pruned ${u} records from ${e}`),u}let a=new Date;a.setDate(a.getDate()-n);let i=await ve.deleteFrom(e).where(r,"<",a.toISOString()).execute(),s=Me(i);return ne.info(`Pruned ${s} records from ${e} older than ${n} days`),s}catch(a){throw ne.error(`Failed to prune ${e}:`,a),a}}async function Va(e,t={}){return jt(e,t)}function za(e){if(!e?.prunable)return null;if(typeof e.prunable==="boolean")return{olderThanDays:30,column:"created_at"};return e.prunable}import{createCipheriv as Bt,createDecipheriv as Nt,createHash as qt,randomBytes as Lt}from"crypto";import{log as z}from"@stacksjs/logging";var De="enc:",Ee="aes-256-gcm",Ut=12,V=null;async function Fe(){if(V)return V;let e=process.env.APP_KEY;if(!e)try{e=(await import("@stacksjs/config").catch(()=>null))?.config?.app?.key}catch{}if(!e)return null;return V=qt("sha256").update(e).digest(),V}function j(e){return typeof e==="string"&&e.startsWith(De)}async function re(e){if(e==null)return e;if(j(e))return e;if(typeof e!=="string")return e;let t=await Fe();if(!t)return z.warn("[orm] encrypted attribute: APP_KEY not set - storing value in plaintext"),e;let n=Lt(Ut),r=Bt(Ee,t,n),o=Buffer.concat([r.update(e,"utf8"),r.final()]),a=r.getAuthTag();return`${De}${n.toString("base64")}:${a.toString("base64")}:${o.toString("base64")}`}async function oe(e){if(e==null)return e;if(typeof e!=="string")return e;if(!j(e))return e;try{let t=await Fe();if(!t)return z.warn("[orm] encrypted attribute: APP_KEY not set - cannot decrypt"),null;let[,n,r,o]=e.split(":");if(!n||!r||!o)return z.warn("[orm] encrypted attribute: malformed envelope, returning null"),null;let a=Buffer.from(n,"base64"),i=Buffer.from(r,"base64"),s=Buffer.from(o,"base64"),c=Nt(Ee,t,a);return c.setAuthTag(i),Buffer.concat([c.update(s),c.final()]).toString("utf8")}catch(t){return z.warn("[orm] encrypted attribute: decrypt failed (key rotation? corrupted ciphertext?)",{error:t}),null}}function ae(e){let t=e.attributes;if(!t||typeof t!=="object")return[];let n=[];for(let[r,o]of Object.entries(t))if(o&&typeof o==="object"&&o.encrypted===!0)n.push(r);return n}import{sqlDateTime as Kt}from"@stacksjs/database/runtime";import{log as N}from"@stacksjs/logging";var Wt=[/^password$/i,/^password_hash$/i,/^api_key$/i,/_token$/i,/_secret$/i,/^remember_token$/i],Ie="model_audits",ue=null;function Qt(e){ue=e}async function ie(){if(ue!=null)return ue;try{let e=await import("@stacksjs/router").catch(()=>null);if(!e)return null;let t=e.getCurrentRequest;if(typeof t!=="function")return null;let n=t();if(!n)return null;return(n.user??n._user)?.id??null}catch{return null}}function H(e){if(!e||typeof e!=="object")return null;let t={};for(let[n,r]of Object.entries(e)){if(Wt.some((o)=>o.test(n)))continue;t[n]=r}return t}function B(e){if(!e||typeof e!=="object")return null;let t=e;if(t._attributes&&typeof t._attributes==="object")return{...t._attributes};return{...e}}function Vt(e,t){if(!e||!t)return{old:e,next:t};let n={},r={},o=new Set([...Object.keys(e),...Object.keys(t)]);for(let a of o)if(e[a]!==t[a])n[a]=e[a],r[a]=t[a];return{old:n,next:r}}async function se(e,t=!1){try{let{db:n}=await import("@stacksjs/database/runtime");await n.insertInto(Ie).values({auditable_type:e.auditable_type,auditable_id:e.auditable_id,event:e.event,old_values:e.old_values?JSON.stringify(e.old_values):null,new_values:e.new_values?JSON.stringify(e.new_values):null,user_id:e.user_id,created_at:Kt()}).executeTakeFirst()}catch(n){if(N.warn(`[orm] audit row write failed for ${e.auditable_type}#${String(e.auditable_id)} (${e.event})`,{error:n}),t)throw n}}function je(e){return{async audits(t){try{let{db:n}=await import("@stacksjs/database/runtime");return(await n.selectFrom(Ie).selectAll().where("auditable_type","=",e).where("auditable_id","=",t).orderBy("created_at","desc").execute()??[]).map((o)=>({...o,old_values:typeof o.old_values==="string"?$e(o.old_values):o.old_values,new_values:typeof o.new_values==="string"?$e(o.new_values):o.new_values}))}catch(n){return N.warn(`[orm] audits() lookup failed for ${e}#${String(t)}`,{error:n}),[]}}}}function $e(e){try{return JSON.parse(e)}catch{return e}}function Be(e){if(e&&typeof e==="object"&&"transactional"in e)return{transactional:e.transactional===!0};return{transactional:!1}}function Ne(e,t,n="id",r={}){let o=r.transactional===!0,a=e;if(typeof e.audits!=="function")e.audits=je(t).audits;let i=async(l)=>{if(!o)return await l();let{db:d}=await import("@stacksjs/database/runtime");return await d.transaction(async()=>l())},s=e.create;if(typeof s==="function")e.create=async function(...l){return await i(async()=>{let d=await s.apply(this,l);try{let f=B(d),m=f?.[n];if(m!=null){let p=await ie();await se({auditable_type:t,auditable_id:m,event:"created",old_values:null,new_values:H(f),user_id:p},o)}}catch(f){if(N.warn(`[orm] audit(create) failed for ${t}`,{error:f}),o)throw f}return d})};let c=e.update;if(typeof c==="function")e.update=async function(l,d){return await i(async()=>{let f=a.find,m=typeof f==="function"?B(await f.call(a,l)):null,p=await c.call(this,l,d);try{let g=B(p)??(typeof f==="function"?B(await f.call(a,l)):null),{old:w,next:b}=Vt(m,g);if(b&&Object.keys(b).length>0){let h=await ie();await se({auditable_type:t,auditable_id:l,event:"updated",old_values:H(w),new_values:H(b),user_id:h},o)}}catch(g){if(N.warn(`[orm] audit(update) failed for ${t}#${String(l)}`,{error:g}),o)throw g}return p})};let u=(l)=>{let d=e[l];if(typeof d!=="function")return;e[l]=async function(f){return await i(async()=>{let m=a.find,p=typeof m==="function"?B(await m.call(a,f)):null,g=await d.call(this,f);try{if(g!==!1&&p){let w=await ie();await se({auditable_type:t,auditable_id:f,event:"deleted",old_values:H(p),new_values:null,user_id:w},o)}}catch(w){if(N.warn(`[orm] audit(${l}) failed for ${t}#${String(f)}`,{error:w}),o)throw w}return g})}};u("delete"),u("softDelete")}import{db as zt,sql as Ht,sqlDateTime as ce}from"@stacksjs/database/runtime";function A(e,t){if(typeof e!=="number"||!Number.isFinite(e)||e<=0)throw Error(`[orm/commentable] ${t} requires a positive numeric id (received ${String(e)})`)}var q="commentable_upvotes",L="commentables";function Gt(e){let t=e;return t.code==="SQLITE_CONSTRAINT_UNIQUE"||t.code==="SQLITE_CONSTRAINT"||t.code==="23505"||t.errno===1062||/unique|duplicate/i.test(t.message??"")}function le(e){let t=zt;return{async comments(n){return A(n,"comments"),await t.selectFrom("commentables").where("commentables_id","=",n).where("commentables_type","=",e).selectAll().execute()},async commentCount(n){let r=await t.selectFrom("commentables").select(Ht`count(*) as count`).where("commentables_id","=",n).where("commentables_type","=",e).executeTakeFirst();return Number(r?.count)||0},async addComment(n,r){if(A(n,"addComment"),!r||typeof r.title!=="string"||r.title.trim().length===0)throw Error("[orm/commentable] addComment requires a non-empty comment.title");if(typeof r.body!=="string"||r.body.trim().length===0)throw Error("[orm/commentable] addComment requires a non-empty comment.body");let o=await t.insertInto("commentables").values({...r,commentables_id:n,commentables_type:e,status:"pending",created_at:ce(),updated_at:ce()}).returningAll().executeTakeFirst();if(o&&typeof o==="object"&&"id"in o)return o;let a=o?.lastInsertRowid;if(a==null)return o;return await t.selectFrom("commentables").where("id","=",Number(a)).selectAll().executeTakeFirst()},async approvedComments(n){return await t.selectFrom("commentables").where("commentables_id","=",n).where("commentables_type","=",e).where("status","=","approved").selectAll().execute()},async pendingComments(n){return await t.selectFrom("commentables").where("commentables_id","=",n).where("commentables_type","=",e).where("status","=","pending").selectAll().execute()},async rejectedComments(n){return await t.selectFrom("commentables").where("commentables_id","=",n).where("commentables_type","=",e).where("status","=","rejected").selectAll().execute()},async upvoteComment(n,r){A(n,"upvoteComment"),A(r,"upvoteComment");let o=()=>t.selectFrom(q).where("upvoteable_id","=",n).where("upvoteable_type","=",L).where("user_id","=",r).selectAll().executeTakeFirst(),a=await o();if(a)return a;try{await t.insertInto(q).values({upvoteable_id:n,upvoteable_type:L,user_id:r,created_at:ce()}).execute()}catch(i){if(!Gt(i))throw i}return await o()},async removeCommentUpvote(n,r){A(n,"removeCommentUpvote"),A(r,"removeCommentUpvote"),await t.deleteFrom(q).where("upvoteable_id","=",n).where("upvoteable_type","=",L).where("user_id","=",r).execute()},async commentUpvoteCount(n){A(n,"commentUpvoteCount");let r=await t.selectFrom(q).select("count(*) as count").where("upvoteable_id","=",n).where("upvoteable_type","=",L).executeTakeFirst();return Number(r?.count)||0},async hasUpvotedComment(n,r){return A(n,"hasUpvotedComment"),A(r,"hasUpvotedComment"),!!await t.selectFrom(q).where("upvoteable_id","=",n).where("upvoteable_type","=",L).where("user_id","=",r).selectAll().executeTakeFirst()}}}import{db as Jt,sql as Yt,sqlDateTime as qe}from"@stacksjs/database/runtime";function de(e,t){if(typeof e!=="number"||!Number.isFinite(e)||e<=0)throw Error(`[orm/taggable] ${t} requires a positive numeric id (received ${String(e)})`)}function fe(e){let t=Jt;return{async tags(n){return de(n,"tags"),await t.selectFrom("taggables").where("taggable_id","=",n).where("taggable_type","=",e).selectAll().execute()},async tagCount(n){de(n,"tagCount");let r=await t.selectFrom("taggables").select(Yt`count(*) as count`).where("taggable_id","=",n).where("taggable_type","=",e).executeTakeFirst();return Number(r?.count)||0},async addTag(n,r){if(de(n,"addTag"),!r||typeof r.name!=="string"||r.name.trim().length===0)throw Error("[orm/taggable] addTag requires a non-empty tag.name");return await t.insertInto("taggables").values({...r,taggable_id:n,taggable_type:e,slug:r.name.toLowerCase().replace(/[^a-z0-9]+/g,"-"),is_active:!0,created_at:qe(),updated_at:qe()}).execute(),await t.selectFrom("taggables").where("taggable_id","=",n).where("taggable_type","=",e).where("name","=",r.name).selectAll().executeTakeFirst()},async activeTags(n){return await t.selectFrom("taggables").where("taggable_id","=",n).where("taggable_type","=",e).where("is_active","=",!0).selectAll().execute()},async inactiveTags(n){return await t.selectFrom("taggables").where("taggable_id","=",n).where("taggable_type","=",e).where("is_active","=",!1).selectAll().execute()},async removeTag(n,r){await t.deleteFrom("taggables").where("taggable_id","=",n).where("taggable_type","=",e).where("id","=",r).execute()}}}import{db as Xt,sqlDateTime as G}from"@stacksjs/database/runtime";function pe(e){let t=Xt;async function n(r){return(await t.selectFrom("categorizable_models").where("categorizable_id","=",r).where("categorizable_type","=",e).selectAll().execute()).map((a)=>a.category_id)}return{async categories(r){let o=await n(r);if(o.length===0)return[];return await t.selectFrom("categorizables").where("id","in",o).selectAll().execute()},async categoryCount(r){return(await n(r)).length},async addCategory(r,o){let a=()=>t.selectFrom("categorizables").where("name","=",o.name).where("categorizable_type","=",e).selectAll().executeTakeFirst(),i=await a();if(!i)await t.insertInto("categorizables").values({name:o.name,description:o.description,slug:o.name.toLowerCase().replace(/[^a-z0-9]+/g,"-"),categorizable_type:e,is_active:!0,created_at:G(),updated_at:G()}).execute(),i=await a();return await t.insertInto("categorizable_models").values({categorizable_id:r,categorizable_type:e,category_id:i?.id,created_at:G(),updated_at:G()}).execute(),i},async activeCategories(r){let o=await n(r);if(o.length===0)return[];return await t.selectFrom("categorizables").where("id","in",o).where("is_active","=",!0).selectAll().execute()},async inactiveCategories(r){let o=await n(r);if(o.length===0)return[];return await t.selectFrom("categorizables").where("id","in",o).where("is_active","=",!1).selectAll().execute()},async removeCategory(r,o){await t.deleteFrom("categorizable_models").where("categorizable_id","=",r).where("categorizable_type","=",e).where("category_id","=",o).execute()}}}import{db as Zt,sqlDateTime as en}from"@stacksjs/database/runtime";function me(e,t){let n=Zt,r=t?.table||`${e}_likes`,o=t?.foreignKey||`${e.replace(/s$/,"")}_id`;return{async likes(a){return await n.selectFrom(r).where(o,"=",a).selectAll().execute()},async likeCount(a){let i=await n.selectFrom(r).select("count(*) as count").where(o,"=",a).executeTakeFirst();return Number(i?.count)||0},async like(a,i){if(typeof a!=="number"||!Number.isFinite(a)||a<=0)throw Error(`[orm/likeable] like requires a positive numeric id (received ${String(a)})`);if(typeof i!=="number"||!Number.isFinite(i)||i<=0)throw Error(`[orm/likeable] like requires a positive numeric userId (received ${String(i)})`);let s=en();try{return await n.insertInto(r).values({[o]:a,user_id:i,created_at:s,updated_at:s}).returningAll().executeTakeFirst()}catch(c){let u=c;if(!(u.code==="SQLITE_CONSTRAINT_UNIQUE"||u.code==="SQLITE_CONSTRAINT"||u.code==="23505"||u.errno===1062||/unique|duplicate/i.test(u.message??"")))throw c;let d=await n.selectFrom(r).where(o,"=",a).where("user_id","=",i).selectAll().executeTakeFirst();if(d)return d;throw c}},async unlike(a,i){await n.deleteFrom(r).where(o,"=",a).where("user_id","=",i).execute()},async isLiked(a,i){return!!await n.selectFrom(r).where(o,"=",a).where("user_id","=",i).selectAll().executeTakeFirst()},async likedBy(a){return(await n.selectFrom(r).select([o]).where("user_id","=",a).execute()).map((s)=>Number(s[o])).filter(Boolean)}}}function Ke(e){let t=e;return t?.code==="SQLITE_CONSTRAINT_UNIQUE"||t?.code==="SQLITE_CONSTRAINT"||t?.code==="23505"||t?.errno===1062||/unique|duplicate/i.test(t?.message??"")}function tn(e,t,n){let r=e;if(e instanceof Error&&typeof r.status==="number"&&Number.isInteger(r.status)&&r.status>=400&&r.status<600){let o={error:e.message};if(r.details!==void 0)o.details=r.details;return{status:r.status,body:o}}if(Ke(e))return{status:409,body:{error:`${t} already exists`}};return{status:500,body:{error:`Failed to ${n} ${t}`,detail:String(e)}}}function _(e){return e.replace(/([a-z\d])([A-Z])/g,"$1_$2").replace(/([A-Z])([A-Z][a-z])/g,"$1_$2").toLowerCase()}function nn(e){let t={};for(let[n,r]of Object.entries(e))t[_(n)]=r;return t}function ci(e,t){let n=String(t||"").replace(/^\/+|\/+$/g,""),r=String(e).replace(/^\/+/,"");return`/api/${n?`${n}/`:""}${r}`}function We(e){if(!e)return null;let t=e.attributes??{};if(Object.prototype.hasOwnProperty.call(t,"teamId")||Object.prototype.hasOwnProperty.call(t,"team_id"))return"team_id";return e.belongsTo?.some((n)=>n==="Team")?"team_id":null}function Qe(e){if(!e)return null;let t=e.attributes??{};if(Object.prototype.hasOwnProperty.call(t,"userId")||Object.prototype.hasOwnProperty.call(t,"user_id"))return"user_id";return e.belongsTo?.some((n)=>n==="User")?"user_id":null}function li(e){return e?.ownership===!1}function di(e,t,n){let r=Object.keys(e).find((a)=>_(a)===_(t));if(Array.isArray(n)){if(r===void 0)return{data:e,error:"Ownership value is required"};if(!n.some((a)=>String(a)===String(e[r])))return{data:e,error:"Ownership value is not available to this caller"};return{data:{...e,[t]:e[r]}}}if(n===null||n===void 0)return{data:e,error:"Caller has no ownership identity"};let o={...e};for(let a of Object.keys(o))if(_(a)===_(t))delete o[a];return o[t]=n,{data:o}}function rn(e){if(!e)return[];let t=Object.entries(e.attributes??{}).filter(([,n])=>n?.fillable===!0).map(([n])=>n);for(let n of e.belongsTo??[]){if(typeof n!=="string"||!n.trim())continue;let r=_(n.trim()).split("_").filter(Boolean);if(r.length===0)continue;let o=`${r[0]}${r.slice(1).map((a)=>`${a[0]?.toUpperCase()}${a.slice(1)}`).join("")}Id`;t.push(o)}return[...new Set(t)]}function on(e,t){if(!e||t.length===0)return{};let n={};for(let r of t){if(r in e){n[r]=e[r];continue}let o=_(r);if(o!==r&&o in e)n[r]=e[o]}return n}function an(e,t){if(e?.name!=="date"||t instanceof Date||typeof t!=="string")return t;let n=/^(\d{4})-(\d{2})-(\d{2})$/.exec(t);if(!n)return t;let r=Number(n[1]),o=Number(n[2]),a=Number(n[3]),i=new Date(Date.UTC(r,o-1,a));if(i.getUTCFullYear()!==r||i.getUTCMonth()!==o-1||i.getUTCDate()!==a)return t;return i}function fi(e,t){if(!t.length)return e;let n={...e};for(let r of t)delete n[r],delete n[_(r)];return n}function pi(e,t){if(!e||t.length===0)return e;let n={...e};for(let r of t)delete n[r],delete n[_(r)];return n}var sn=["id","uuid","created_at","updated_at","deleted_at"];function mi(e,t){let n=new Map;for(let r of[...Object.keys(e??{}),...sn]){let o=_(r);if(!/^\w+$/.test(o))continue;n.set(r,o),n.set(o,o)}for(let r of t)n.delete(r),n.delete(_(r));return n}function yi(e,t,n){if(!t)return e;let r=String(t).split(",").map((a)=>a.trim()).filter(Boolean),o=e;for(let a of r){let i=a.startsWith("-"),s=i?a.slice(1):a;if(!/^\w+$/.test(s))continue;let c=n.get(s);if(!c)continue;o=o.orderBy(c,i?"desc":"asc")}return o}var un={string:{get:(e)=>e!=null?String(e):null,set:(e)=>e!=null?String(e):null},number:{get:(e)=>e!=null?Number(e):null,set:(e)=>e!=null?Number(e):null},integer:{get:(e)=>e!=null?Math.trunc(Number(e)):null,set:(e)=>e!=null?Math.trunc(Number(e)):null},float:{get:(e)=>e!=null?Number.parseFloat(String(e)):null,set:(e)=>e!=null?Number.parseFloat(String(e)):null},boolean:{get:(e)=>e===1||e==="1"||e===!0||e==="true",set:(e)=>e===!0||e===1||e==="1"||e==="true"?1:0},json:{get:(e)=>e==null?null:typeof e==="string"?cn(e):e,set:(e)=>e==null?null:typeof e==="string"?e:JSON.stringify(e)},datetime:{get:(e)=>e?new Date(e):null,set:(e)=>e instanceof Date?e.toISOString():e},date:{get:(e)=>e?new Date(e):null,set:(e)=>e instanceof Date?e.toISOString().split("T")[0]:e},array:{get:(e)=>e==null?[]:Array.isArray(e)?e:typeof e==="string"?ln(e):[],set:(e)=>e==null?null:Array.isArray(e)?JSON.stringify(e):e}};function cn(e){try{return JSON.parse(e)}catch{return e}}function ln(e){try{return JSON.parse(e)}catch{return[]}}function gi(e,t,n){if(!e||typeof e!=="object"||!t||Object.keys(t).length===0)return e;let r={...e};for(let[o,a]of Object.entries(t)){let i=typeof a==="string"?un[a]:a;if(!i||typeof i[n]!=="function")continue;if(Object.prototype.hasOwnProperty.call(r,o))r[o]=i[n](r[o]);let s=_(o);if(s!==o&&Object.prototype.hasOwnProperty.call(r,s))r[s]=i[n](r[s])}return r}function Ve(e,t,n){let r=t?.attributes??{},o={};for(let[a,i]of Object.entries(r)){let s=i?.validation?.rule;if(!s||typeof s.validate!=="function")continue;let c=Object.prototype.hasOwnProperty.call(e,a);if(!c&&n==="updating")continue;let u=i!==null&&typeof i==="object"&&Object.prototype.hasOwnProperty.call(i,"default"),l=c?e[a]:u?i.default:void 0,d=an(s,l),f=s.validate(d);if(!f?.valid&&Array.isArray(f?.errors)&&f.errors.length>0)o[a]=f.errors.map((m)=>i?.validation?.message?.[m?.code]??m?.message??"invalid")}return Object.keys(o).length===0?{valid:!0}:{valid:!1,errors:o}}function bi(e,t,n){let r=Le(n);return e.find((o)=>o.method===t&&Le(String(o.path??""))===r)}function Le(e){return e.replace(/\{[^}]*\}/g,"{}").replace(/:[^/]+/g,"{}")}function ye(e){if(Array.isArray(e))return e.filter((t)=>typeof t==="string"&&t.length>0);return typeof e==="string"&&e?[e]:[]}function wi(e){let t=typeof e==="object"&&e!==null&&"middleware"in e,n=e?.middleware;if(!t)return{read:["auth"],write:["auth"],declared:!1};if(n&&typeof n==="object"&&!Array.isArray(n)){let o=n;return{read:"read"in o?ye(o.read):["auth"],write:"write"in o?ye(o.write):["auth"],declared:!0}}let r=ye(n);return{read:r,write:r,declared:!0}}var Ue=15,dn=100;function hi(e){let t=Number.parseInt(e.get("page")||String(1),10),n=Number.isFinite(t)?Math.max(1,t):1,r=Number.parseInt(e.get("per_page")||String(Ue),10),o=Math.min(Number.isFinite(r)?Math.max(1,r):Ue,dn);return{page:n,perPage:o,offset:(n-1)*o}}function J(e,t){let n=new URL(e.toString());return n.searchParams.set("page",String(t)),`${n.pathname}${n.search}`}function fn(e,t,n,r,o,a){let i=(t-1)*n,s=r===0,c={page:t,per_page:n,from:s?null:i+1,to:s?null:i+r,has_more_pages:o,prev_page_url:t>1?J(e,t-1):null,next_page_url:o?J(e,t+1):null};if(a!==void 0&&!Number.isNaN(a)){let u=Math.max(1,Math.ceil(a/n));c.total=a,c.last_page=u,c.first_page_url=J(e,1),c.last_page_url=J(e,u)}return c}function ki(e,t,n,r,o,a){let{page:i,...s}=fn(e,t,n,r,o,a);return{current_page:i,...s}}function _i(e,t){return(t??e??"").toString().trim().toLowerCase()==="warn"?"warn":"deny"}function Ti(e,t){if(e.length===0)return null;let n=[...e].sort().join(", ");if(t==="deny")return`[orm] security.api.rowScoping is 'deny': NOT registering store/update/destroy for ${e.length} model(s) `+`with no row-level scoping \u2014 ${n}. Give a model an \`ownership\` config or a \`team_id\` column to restore its writes.`;return`[orm] ${e.length} model(s) publish mutating routes with no row-level scoping, so an authenticated caller can write any row \u2014 `+`${n}. Scope one with an \`ownership\` config or a \`team_id\` column; intended for public catalog tables. Set \`security.api.rowScoping: 'deny'\` (config/security.ts) to stop generating these routes instead.`}function pn(e){if(e?.ownership===!1)return null;if(e?.ownership)return e.ownership;let t=We(e);if(t)return{field:t,resolve:async(r,o)=>{let{resolveAuthenticatedTeamId:a}=await import("@stacksjs/auth");return a(ge(o))}};let n=Qe(e);if(n)return{field:n,resolve:async(r)=>r?.id??null};return null}function ge(e){let t=e?.headers?.get?.("authorization"),n=t&&/^Bearer\s+/i.test(t)?t.replace(/^Bearer\s+/i,"").trim():null,r=e?.headers?.get?.("cookie")||"";return{bearerToken:()=>n,cookies:{get:(o)=>{for(let a of r.split(";")){let i=a.indexOf("=");if(i===-1)continue;if(a.slice(0,i).trim()===o)return decodeURIComponent(a.slice(i+1).trim())}return null}}}}function mn(e="customer_id"){return{field:e,resolve:async(t)=>{let n=t?.id;if(n==null)return null;try{let{Customer:r}=await import("@stacksjs/orm");return(await r.where("user_id",n).first())?.id??null}catch{return null}}}}function yn(e="id"){return{field:e,resolve:async(t)=>t?.id??null}}function gn(e="site_id"){return{field:e,resolve:async(t,n)=>{try{let[{resolveAuthenticatedTeamId:r},{Site:o}]=await Promise.all([import("@stacksjs/auth"),import("@stacksjs/orm")]),a=await r(ge(n));if(a==null)return[];return(await o.where("team_id",a).get()??[]).map((s)=>s.id).filter((s)=>s!=null)}catch{return[]}}}}function bn(e="id"){return{field:e,resolve:async(t,n)=>{try{let{resolveAuthenticatedTeamId:r}=await import("@stacksjs/auth");return await r(ge(n))}catch{return null}}}}function wn(e,t){return{field:t,resolve:async(n,r)=>{try{let o=await import("@stacksjs/orm"),a=o.models?.[e]??o[e]?.definition??null,i=pn(a);if(!i?.field||typeof i.resolve!=="function")return[];let s=await i.resolve(n,r);if(s==null||Array.isArray(s)&&s.length===0)return[];let c=o[e];if(!c)return[];return((Array.isArray(s)?await c.whereIn(i.field,s).get():await c.where(i.field,s).get())??[]).map((l)=>l.id).filter((l)=>l!=null)}catch{return[]}}}}import{getCurrentRequest as hn}from"@stacksjs/router";var ze=new WeakMap;function He(e){let t=new Map;for(let n of e){let r=n?.id;if(r!==void 0)t.set(r,n)}return t}async function kn(e,t){if(typeof e.find==="function")return e.find(t);let n=await e.findMany?.([t]);return He(n??[]).get(t)}async function _n(e,t,n){t.pending=void 0;try{let r=typeof e.findMany==="function"?await e.findMany(n.keys):await Promise.all(n.keys.map((a)=>e.find?.(a))),o=He(r??[]);for(let a of n.resolvers)a.resolve(o.get(a.key))}catch(r){for(let o of n.resolvers)o.reject(r)}}function xi(e,t){let n=hn();if(!n)return kn(e,t);let r=ze.get(n);if(!r)r=new WeakMap,ze.set(n,r);let o=r.get(e);if(!o)o={cache:new Map},r.set(e,o);let a=o.cache.get(t);if(a)return a.then();let i=o.pending;if(!i){i={keys:[],resolvers:[]},o.pending=i;let u=i,l=o;queueMicrotask(()=>{_n(e,l,u)})}let s=new Promise((u,l)=>{i.keys.push(t),i.resolvers.push({key:t,resolve:u,reject:l})});o.cache.set(t,s);let c=o.cache;return s.catch(()=>c.delete(t)),s.then()}import{db as Mi}from"@stacksjs/database/runtime";class Tn{conditions=[];where(e,...t){let[n,r]=t,o=r===void 0?"=":n,a=r===void 0?n:r;this.addCondition("and","where",e,o,a)}orWhere(e,...t){let[n,r]=t,o=r===void 0?"=":n,a=r===void 0?n:r;this.addCondition("or","where",e,o,a)}whereIn(e,t){this.conditions.push({type:"and",method:"whereIn",column:e,values:t})}whereNotIn(e,t){this.conditions.push({type:"and",method:"whereIn",column:e,values:t,operator:"not in"})}whereNull(e){this.conditions.push({type:"and",method:"whereNull",column:e})}whereNotNull(e){this.conditions.push({type:"and",method:"whereNotNull",column:e})}whereBetween(e,t){this.conditions.push({type:"and",method:"whereBetween",column:e,range:t})}whereExists(e){this.conditions.push({type:"and",method:"whereExists",column:"",callback:e})}addCondition(e,t,n,r,o){this.conditions.push({type:e,method:t,column:n,operator:r,value:o})}getConditions(){return this.conditions}}import{db as be}from"@stacksjs/database/runtime";async function Fi(e,t){return await be.transaction(e,t)}async function $i(e){return await be.savepoint(e)}function Ii(e,t){return be.transactional(e,t)}export*from"@stacksjs/model-meta";import{createModel as Bn,registerModel as Nn}from"@stacksjs/query-builder";import{log as k}from"@stacksjs/logging";import{snakeCase as x}from"@stacksjs/strings";import{AsyncLocalStorage as gt}from"async_hooks";import{toCursorPaginator as qn,toPaginator as Ln,toSimplePaginator as Un}from"@stacksjs/pagination";function he(e,t){let n=Te(),r=n?we(n,"per_page"):void 0,o=n?we(n,"page"):void 0,a=e!==void 0?Math.max(1,Math.floor(e)):Math.min(100,Math.max(1,r??15)),i=Math.max(1,Math.floor(t??o??1));return{perPage:a,page:i}}function ke(e,t){let n=Te(),r=n?Je(n,"cursor"):void 0,o=n?we(n,"per_page"):void 0,a=e!==void 0?Math.max(1,Math.floor(e)):Math.min(100,Math.max(1,o??15)),s=Ge(t!==void 0?t:r??null);return{perPage:a,cursor:s}}function Ge(e){if(e===null||e===void 0)return null;if(Array.isArray(e))return e;if(typeof e==="string"&&e.startsWith("["))try{let t=JSON.parse(e);if(Array.isArray(t))return t}catch{}return e}function _e(e){let t=Te();if(!t)return e;let n=(()=>{try{return new URL(t.url)}catch{return null}})();if(!n)return e;let r=n.pathname;if(e.path=r,"next_cursor"in e)return e.next_page_url=e.next_cursor!==null?v(n,{cursor:e.next_cursor}):null,e.prev_page_url=e.prev_cursor!==null?v(n,{cursor:e.prev_cursor}):null,e;let o=e.current_page;if(e.prev_page_url=o>1?v(n,{page:o-1}):null,"total"in e){let a=e.last_page;e.next_page_url=o<a?v(n,{page:o+1}):null,e.first_page_url=v(n,{page:1}),e.last_page_url=v(n,{page:a})}else e.next_page_url=e.has_more_pages?v(n,{page:o+1}):null;return e}function v(e,t){let n=new URL(e.toString());for(let[r,o]of Object.entries(t))n.searchParams.set(r,String(o));return`${n.pathname}${n.search}`}var E;function Te(){if(E===null)return;if(E===void 0)try{let t=It("@stacksjs/router");if(typeof t.getCurrentRequest==="function")E=t.getCurrentRequest;else{E=null;return}}catch{E=null;return}return E()}function we(e,t){let n=Je(e,t);if(n===void 0)return;let r=Number(n);return Number.isFinite(r)?r:void 0}function Je(e,t){let n=e.query?.[t];if(n===void 0)return;return Array.isArray(n)?n[0]:n}import{createRequire as Rn}from"module";import{db as Sn}from"@stacksjs/database/runtime";var Pn=Rn(import.meta.url);function Ye(e){let t=Sn;return{async createStripeUser(n,r){let{manageCustomer:o}=await import("@stacksjs/payments");return await o.createStripeCustomer(n,r)},async updateStripeUser(n,r){let{manageCustomer:o}=await import("@stacksjs/payments");return await o.updateStripeCustomer(n,r)},async deleteStripeUser(n){let{manageCustomer:r}=await import("@stacksjs/payments");return await r.deleteStripeUser(n)},async createOrGetStripeUser(n,r){let{manageCustomer:o}=await import("@stacksjs/payments");return await o.createOrGetStripeUser(n,r)},async retrieveStripeUser(n){let{manageCustomer:r}=await import("@stacksjs/payments");return await r.retrieveStripeUser(n)},async defaultPaymentMethod(n){let{managePaymentMethod:r}=await import("@stacksjs/payments");return await r.retrieveDefaultPaymentMethod(n)},async setDefaultPaymentMethod(n,r){let{managePaymentMethod:o}=await import("@stacksjs/payments");return await o.setDefaultPaymentMethod(n,r)},async addPaymentMethod(n,r){let{managePaymentMethod:o}=await import("@stacksjs/payments");return await o.addPaymentMethod(n,r)},async paymentMethods(n,r){let{managePaymentMethod:o}=await import("@stacksjs/payments");return await o.listPaymentMethods(n,r)},async newSubscription(n,r,o,a={}){let{manageSubscription:i}=await import("@stacksjs/payments"),s=await i.create(n,r,o,a),u=s.latest_invoice?.payment_intent;return{subscription:s,paymentIntent:u}},async updateSubscription(n,r,o,a={}){let{manageSubscription:i}=await import("@stacksjs/payments"),s=await i.update(n,r,o,a),u=s.latest_invoice?.payment_intent;return{subscription:s,paymentIntent:u}},async cancelSubscription(n,r,o={}){let{manageSubscription:a}=await import("@stacksjs/payments");return{subscription:await a.cancel(r,o)}},async activeSubscription(n){let{manageSubscription:r}=await import("@stacksjs/payments"),o=await t.selectFrom("subscriptions").where("user_id","=",n.id).where("provider_status","=","active").selectAll().executeTakeFirst();if(o){let a=await r.retrieve(n,o.provider_id||"");return{subscription:o,providerSubscription:a}}return},async checkout(n,r,o={}){let{manageCheckout:a,manageCustomer:i}=await import("@stacksjs/payments"),s={};if(o.enableTax)s.automatic_tax={enabled:!0},delete o.enableTax;if(o.allowPromotions)s.allow_promotion_codes=!0,delete o.allowPromotions;let l={...{mode:"payment",customer:(await i.createOrGetStripeUser(n,{})).id,line_items:r.map((d)=>({price:d.priceId,quantity:d.quantity||1}))},...s,...o};return await a.create(n,l)},async createSetupIntent(n,r={}){let{manageSetupIntent:o}=await import("@stacksjs/payments");return await o.create(n,r)},async subscriptionHistory(n){let{manageInvoice:r}=await import("@stacksjs/payments");return await r.list(n)},async transactionHistory(n){let{manageTransaction:r}=await import("@stacksjs/payments");return await r.list(n)},async connectAccount(n,r={}){let o=r.accountColumn||"stripe_account_id",a=(n._attributes??n)[o];if(!a)return null;let i=await U();try{return await i.accounts.retrieve(a)}catch{return null}},async createConnectAccount(n,r={}){let o=r.accountColumn||"stripe_account_id",a=n._attributes??n,i=a[o],s=await U();if(!i){let{stacksIdempotencyKey:c}=await import("@stacksjs/payments"),u=r.modelTable||e,l=await s.accounts.create({type:r.type??"express",email:r.email??a.email,country:r.country??"US",capabilities:r.capabilities??{card_payments:{requested:!0},transfers:{requested:!0}}},{idempotencyKey:c("connect.account.create",u,a.id)});return i=l.id,await t.updateTable(u).set({[o]:i}).where("id","=",Number(a.id)).execute(),l}return await s.accounts.retrieve(i)},async connectOnboardLink(n,r){let o=r.accountColumn||"stripe_account_id",i=(n._attributes??n)[o];if(!i)throw Error("connectOnboardLink: model has no Stripe Connect account; call createConnectAccount first");return{url:(await(await U()).accountLinks.create({account:i,refresh_url:r.refreshUrl,return_url:r.returnUrl,type:r.type??"account_onboarding"})).url,accountId:i}},async syncConnectStatus(n,r={}){let o=r.accountColumn||"stripe_account_id",a=r.chargesColumn||"charges_enabled",i=r.payoutsColumn||"payouts_enabled",s=n._attributes??n,c=s[o];if(!c)return{chargesEnabled:!1,payoutsEnabled:!1};let l=await(await U()).accounts.retrieve(c),d=!!l.charges_enabled,f=!!l.payouts_enabled,m=r.modelTable||e;return await t.updateTable(m).set({[a]:d,[i]:f}).where("id","=",Number(s.id)).execute(),{chargesEnabled:d,payoutsEnabled:f}},async chargeWithSplit(n,r){let o=await U(),a=r.accountColumn||"stripe_account_id",i=n._attributes??n,s=r.connectAccountId||i[a],c={amount:r.amountCents,currency:r.currency||"usd",automatic_payment_methods:{enabled:!0},metadata:r.metadata};if(s){if(c.transfer_data={destination:s},r.platformFeeCents)c.application_fee_amount=r.platformFeeCents}let{freshIdempotencyKey:u}=await import("@stacksjs/payments");return await o.paymentIntents.create(c,{idempotencyKey:u("payment_intent.create",i.id,r.amountCents)})}}}function U(){let e=globalThis.process?.env?.STRIPE_SECRET_KEY;if(!e)throw Error("Stripe Connect: STRIPE_SECRET_KEY not configured");let t;try{t=Pn("stripe")}catch{throw Error("Stripe Connect is being used but the `stripe` package is not installed. It is an opt-in dependency - run `bun add stripe` to enable Stripe Connect.")}return new t(e,{apiVersion:"2026-06-24.dahlia"})}function Xe(){return{async generateTwoFactorForModel(e){let{generateTwoFactorSecret:t}=await import("@stacksjs/auth"),n=t();await e.update({two_factor_secret:n})},async verifyTwoFactorCode(e,t){let n=e.get("two_factor_secret");if(typeof n!=="string")return!1;let{verifyTwoFactorCode:r,RateLimiter:o}=await import("@stacksjs/auth"),a=String(e.id??e.get?.("id")??e.get?.("email")??n),i=`2fa:${a}`;if(await o.isRateLimited(i)){let{HttpError:c}=await import("@stacksjs/error-handling");throw new c(429,"Too many verification attempts. Please try again later.")}if(!await r(t,n))return await o.recordFailedAttempt(i),!1;try{let{cache:c}=await import("@stacksjs/cache"),u=`2fa:used:${a}:${t}`;if(await c.has(u))return await o.recordFailedAttempt(i),!1;await c.set(u,"1",90)}catch{}return await o.resetAttempts(i),!0}}}import{mutationCount as An,sqlDateTime as xn}from"@stacksjs/database/runtime";import{log as F}from"@stacksjs/logging";var Y="deleted_at";function Ze(e,t="id"){return{async softDelete(n){let r=xn(),o=e.where(t,n);if(typeof o?.update==="function")return await o.update({[Y]:r}),!0;return!1},async restore(n){let r=e.where(t,n).withTrashed();if(typeof r?.update==="function")return await r.update({[Y]:null}),!0;return!1},async forceDelete(n){let r=e.where(t,n),o=typeof r?.withTrashed==="function"?r.withTrashed():r;if(typeof o?.delete==="function")return An(await o.delete())>0;return!1},withTrashed(){return typeof e.query==="function"?e.query():e},onlyTrashed(){let n=typeof e.query==="function"?e.query():e;if(typeof n?.whereNotNull==="function")return n.whereNotNull(Y);return n?.where?.(Y,"!=",null)??n}}}function et(e){if(e===!0||e==null)return{};if(typeof e==="object"&&!Array.isArray(e)){let t=e;if(Array.isArray(t.cascade)){let n=t.cascade.filter((r)=>typeof r==="string");return n.length?{cascade:n}:{}}return{}}return{}}function On(e,t){let n=e.hasMany??[],r=e.hasOne??[],o=n.some((l)=>Re(l,t,!0)),a=r.some((l)=>Re(l,t,!1));if(!o&&!a)return F.warn(`[orm] soft-delete cascade: '${t}' is not a declared hasMany/hasOne relation - skipping`),null;let s=(o?n:r).find((l)=>Re(l,t,o))??null;if(!s)return null;let u=globalThis[s];if(!u)return F.warn(`[orm] soft-delete cascade: model '${s}' is not yet on globalThis - skipping cascade for '${t}'`),null;return{className:s,model:u}}function Re(e,t,n){let r=e.toLowerCase();if(t===r)return!0;if(n&&t===`${r}s`)return!0;if(n&&r.endsWith("y")&&t===`${r.slice(0,-1)}ies`)return!0;return!1}async function Cn(e,t,n,r,o){try{let a=n.where;if(typeof a!=="function"){F.warn(`[orm] cascade ${o}: child model has no .where()`);return}if(o==="softDelete"){let i=n.softDelete;if(typeof i==="function"){let c=a.call(n,r,t),u=typeof c?.get==="function"?await c.get():Array.isArray(c)?c:[],l=n.primaryKey||"id";for(let d of u){let f=d?.[l];if(f!=null)await i.call(n,f)}return}let s=a.call(n,r,t);if(typeof s?.delete==="function"){F.debug(`[orm] cascade soft-delete: child has no softDeletes trait, hard-deleting from ${String(n.table??"?")}`),await s.delete();return}}else{let i=n.restore;if(typeof i!=="function"){F.debug("[orm] cascade restore: child has no restore() - nothing to do");return}let s=n.withTrashed,u=(typeof s==="function"?s.call(n):n).where?.(r,t),l=typeof u?.get==="function"?await u.get():[],d=n.primaryKey||"id";for(let f of l){let m=f?.[d];if(m!=null)await i.call(n,m)}}}catch(a){if(F.warn(`[orm] soft-delete cascade ${o} on ${e}#${String(t)} failed`,{error:a}),process.env.STACKS_ORM_CASCADE_SWALLOW!=="true")throw a}}async function K(e,t,n,r){let o=t.cascade;if(!o||o.length===0)return;let a=`${e.name.toLowerCase()}_id`;for(let i of o){let s=On(e,i);if(!s)continue;await Cn(s.className,n,s.model,a,r)}}import{sqlDateTime as Dn}from"@stacksjs/database/runtime";import{log as vn}from"@stacksjs/logging";var Mn=[/^password$/i,/^password_hash$/i,/^api_key$/i,/_token$/i,/_secret$/i,/^remember_token$/i],tt=null;async function nt(){if(tt!=null)return tt;try{let e=await import("@stacksjs/router").catch(()=>null);if(!e)return null;let t=e.getCurrentRequest;if(typeof t!=="function")return null;let n=t();return n?.user?.id??n?._user?.id??null}catch{return null}}async function rt(){try{let t=(await import("@stacksjs/router").catch(()=>null))?.getCurrentRequest;if(typeof t!=="function")return null;let n=t();return typeof n?.ip==="function"?n.ip()??null:null}catch{return null}}function ot(e){if(!e||typeof e!=="object")return null;let t={};for(let[n,r]of Object.entries(e)){if(Mn.some((o)=>o.test(n)))continue;t[n]=r}return t}function at(e,t,n){vn.warn(`[orm] ${e} row write failed for ${t}: ${n?.message??String(n)}`)}var En="activities";function it(e){if(!e)return null;if(e===!0)return{};if(typeof e!=="object")return null;let t=e;return{logOnly:Array.isArray(t.logOnly)?t.logOnly:void 0,include:Array.isArray(t.include)?t.include:void 0,exclude:Array.isArray(t.exclude)?t.exclude:void 0}}function Fn(e,t,n=[]){let r=ot(e);if(!r)return null;let o=new Set(n),a=t.logOnly??t.include,i=new Set(t.exclude??[]),s={};for(let[c,u]of Object.entries(r)){if(o.has(c)||i.has(c))continue;if(a&&!a.includes(c))continue;s[c]=u}return s}function $n(e,t,n){return n==null?`${e} was ${t}`:`${e} ${String(n)} was ${t}`}async function In(e){try{let{db:t}=await import("@stacksjs/database/runtime");await t.insertInto(En).values({type:e.type,description:e.description,subject_type:e.subject_type,subject_id:e.subject_id,causer:e.causer,properties:e.properties?JSON.stringify(e.properties):null,ip_address:e.ip_address,user_id:e.user_id,created_at:Dn()}).executeTakeFirst()}catch(t){at("activity",`${e.subject_type}#${String(e.subject_id)}`,t)}}async function jn(e){let{attributes:t,event:n,modelName:r,options:o,primaryKey:a}=e,i=t?.[a]??null,s=await nt();await In({type:`${r.toLowerCase()}.${n}`,description:$n(r,n,i),subject_type:r,subject_id:i,properties:Fn(t,o,e.hidden),causer:s==null?null:`User:${String(s)}`,user_id:s,ip_address:await rt()})}function Se(e){if(!e||typeof e!=="object")return null;let t=e;if(t.attributes&&typeof t.attributes==="object")return{...t.attributes};if(t._attributes&&typeof t._attributes==="object")return{...t._attributes};return{...e}}function st(e,t,n,r,o=[]){if(t==="Activity")return;let a=e,i=async(d)=>typeof a.find==="function"?Se(await a.find(d)):null,s=async(d,f)=>{await jn({modelName:t,event:d,attributes:f,primaryKey:n,options:r,hidden:o})},c=e.create;if(typeof c==="function")e.create=async function(...d){let f=await c.apply(this,d);return await s("created",Se(f)),f};let u=e.update;if(typeof u==="function")e.update=async function(d,f){let m=await u.call(this,d,f);return await s("updated",Se(m)??await i(d)),m};let l=e.delete;if(typeof l==="function")e.delete=async function(d){let f=await i(d),m=await l.call(this,d);return await s("deleted",f??{[n]:d}),m}}var Z,bt=new gt;function D(){return bt.getStore()?.suppressed===!0}function M(e){return Promise.resolve(bt.run({suppressed:!0},e))}var wt=new gt;function Kn(){return wt.getStore()?.suppressed===!0}function Wn(e){return Promise.resolve(wt.run({suppressed:!0},e))}var Ce=Symbol.for("stacks.orm.modelDefinition");class ht extends Error{status=422;errors;constructor(e,t){let n=Object.keys(t).join(", ");super(`${e} validation failed: ${n}`);this.name="ModelValidationError",this.errors=t}}var ut=new Set;function Qn(e,t){let n=typeof e==="string"?e.slice(0,80):String(e),r=`${typeof e}:${n}`;if(ut.has(r))return;ut.add(r);let o=t instanceof Error?t.message:String(t);console.error(`[orm] JSON cast failed to parse value (returning null): ${o} - value preview: ${JSON.stringify(n)}`)}var Vn={string:{get:(e)=>e!=null?String(e):null,set:(e)=>e!=null?String(e):null},number:{get:(e)=>e!=null?Number(e):null,set:(e)=>e!=null?Number(e):null},integer:{get:(e)=>e!=null?Math.trunc(Number(e)):null,set:(e)=>e!=null?Math.trunc(Number(e)):null},float:{get:(e)=>e!=null?Number.parseFloat(String(e)):null,set:(e)=>e!=null?Number.parseFloat(String(e)):null},boolean:{get:(e)=>e===1||e==="1"||e===!0||e==="true",set:(e)=>e===!0||e===1||e==="1"||e==="true"?1:0},json:{get:(e)=>{if(e==null)return null;if(typeof e==="string")try{return JSON.parse(e)}catch(t){return Qn(e,t),null}return e},set:(e)=>{if(e==null)return null;return typeof e==="string"?e:JSON.stringify(e)}},datetime:{get:(e)=>e?new Date(e):null,set:(e)=>e instanceof Date?e.toISOString():e},date:{get:(e)=>e?new Date(e):null,set:(e)=>e instanceof Date?e.toISOString().split("T")[0]:e},array:{get:(e)=>{if(e==null)return[];if(Array.isArray(e))return e;if(typeof e==="string")try{return JSON.parse(e)}catch{return[]}return[]},set:(e)=>{if(e==null)return null;return Array.isArray(e)?JSON.stringify(e):e}}};function kt(e){return typeof e==="string"?Vn[e]:e}function ct(e,t,n){if(!e||typeof e!=="object")return e;let r={...e};for(let[o,a]of Object.entries(t))if(o in r){let i=kt(a);r[o]=i[n](r[o])}return r}var X=new Set(["_attributes","_original","_definition","_hasSaved","_relations"]),lt=Symbol.for("stacks.modelInstanceProxy"),zn={tags:{bag:"_taggable",mode:"id"},tagCount:{bag:"_taggable",mode:"id"},addTag:{bag:"_taggable",mode:"id"},activeTags:{bag:"_taggable",mode:"id"},inactiveTags:{bag:"_taggable",mode:"id"},removeTag:{bag:"_taggable",mode:"id"},categories:{bag:"_categorizable",mode:"id"},categoryCount:{bag:"_categorizable",mode:"id"},addCategory:{bag:"_categorizable",mode:"id"},activeCategories:{bag:"_categorizable",mode:"id"},inactiveCategories:{bag:"_categorizable",mode:"id"},removeCategory:{bag:"_categorizable",mode:"id"},comments:{bag:"_commentable",mode:"id"},commentCount:{bag:"_commentable",mode:"id"},addComment:{bag:"_commentable",mode:"id"},approvedComments:{bag:"_commentable",mode:"id"},pendingComments:{bag:"_commentable",mode:"id"},rejectedComments:{bag:"_commentable",mode:"id"},likes:{bag:"_likeable",mode:"id"},likeCount:{bag:"_likeable",mode:"id"},like:{bag:"_likeable",mode:"id"},unlike:{bag:"_likeable",mode:"id"},isLiked:{bag:"_likeable",mode:"id"},createStripeUser:{bag:"_billable",mode:"model"},updateStripeUser:{bag:"_billable",mode:"model"},deleteStripeUser:{bag:"_billable",mode:"model"},createOrGetStripeUser:{bag:"_billable",mode:"model"},retrieveStripeUser:{bag:"_billable",mode:"model"},defaultPaymentMethod:{bag:"_billable",mode:"model"},setDefaultPaymentMethod:{bag:"_billable",mode:"model"},addPaymentMethod:{bag:"_billable",mode:"model"},paymentMethods:{bag:"_billable",mode:"model"},newSubscription:{bag:"_billable",mode:"model"},updateSubscription:{bag:"_billable",mode:"model"},cancelSubscription:{bag:"_billable",mode:"model"},activeSubscription:{bag:"_billable",mode:"model"},checkout:{bag:"_billable",mode:"model"},createSetupIntent:{bag:"_billable",mode:"model"},subscriptionHistory:{bag:"_billable",mode:"model"},transactionHistory:{bag:"_billable",mode:"model"},connectAccount:{bag:"_billable",mode:"model"},createConnectAccount:{bag:"_billable",mode:"model"},connectOnboardLink:{bag:"_billable",mode:"model"},syncConnectStatus:{bag:"_billable",mode:"model"},chargeWithSplit:{bag:"_billable",mode:"model"},generateTwoFactorForModel:{bag:"_twoFactor",mode:"model"},verifyTwoFactorCode:{bag:"_twoFactor",mode:"model"}};function Hn(e,t){if(!e||!t)return null;let n=t.split("."),r=e;for(let o of n){if(r==null||typeof r!=="object")return null;let a=r;if("_attributes"in a&&a._attributes&&typeof a._attributes==="object"){let i=a._attributes;if(o in i){r=i[o];continue}}if(o in a){r=a[o];continue}return null}return r??null}function R(e,t){if(!e||typeof e!=="object")return e;let n=e;if(n[lt])return e;let r=n._attributes;if(!r||typeof r!=="object")return e;if(t&&Object.keys(t).length>0){for(let[o,a]of Object.entries(t))if(Object.prototype.hasOwnProperty.call(r,o))r[o]=kt(a).get(r[o])}return new Proxy(e,{get(o,a,i){let s=o;if(a===lt)return!0;if(a==="saveAsync")return async function(){let u=s._definition,l=u?.set;if(l&&typeof s.isDirty==="function"){for(let[f,m]of Object.entries(l)){if(typeof m!=="function")continue;if(!s.isDirty(f))continue;let p=m(s._attributes),g=p&&typeof p.then==="function"?await p:p;s._attributes[f]=g}let d=u.set;u.set={};try{return s.save()}finally{u.set=d}}return s.save()};if(a==="save")return function(){let u=s._definition,l=u?.set;if(l&&Object.keys(l).length>0&&typeof s.isDirty==="function"){for(let[f,m]of Object.entries(l)){if(typeof m!=="function")continue;if(!s.isDirty(f))continue;let p=m(s._attributes);if(p&&typeof p.then==="function")throw Error(`Setter for "${f}" returned a Promise - use \`saveAsync()\` instead of \`save()\` when a model has async setters.`);s._attributes[f]=p}let d=u.set;u.set={};try{return s.save()}finally{u.set=d}}return s.save()};if(a==="updateAsync")return async function(u){if(u&&typeof u==="object"&&!Array.isArray(u))for(let[l,d]of Object.entries(u))i[l]=d;return i.saveAsync()};if(a==="saveQuietly")return function(){return M(()=>s.save())};if(a==="saveAsyncQuietly")return function(){return M(()=>i.saveAsync())};if(a==="updateQuietly")return function(u){return M(()=>s.update(u))};if(a==="updateAsyncQuietly")return function(u){return M(()=>i.updateAsync(u))};if(a==="deleteQuietly")return function(){return M(()=>s.delete())};if(a==="toSearchableObject")return function(){let d=s._definition?.traits?.useSearch;if(!d)return null;let f=s._attributes;if(!f)return null;if(d===!0){let b={...f};if(f.id!=null)b.id=String(f.id);return b}let m={},p=d.displayable?.length?d.displayable:[...d.searchable??[],...d.filterable??[],...d.sortable??[],"id"],g=d.denormalize??{},w=s._relations;for(let b of p){let h=x(b),T=f[h]??f[b];if(T!==void 0){m[h]=T;continue}let P=g[b]??g[h];if(P){m[h]=Hn(w,P);continue}m[h]=void 0}if(f.id!=null)m.id=String(f.id);return m};if(typeof a==="string"&&!X.has(a)){let u=s._attributes;if(u&&Object.prototype.hasOwnProperty.call(u,a))return u[a];let l=s._relations;if(l&&Object.prototype.hasOwnProperty.call(l,a)){let f=l[a];if(Array.isArray(f))return f.map((m)=>R(m,t));return f&&typeof f==="object"?R(f,t):f}let d=zn[a];if(d){let p=s._definition?.__traitMethods?.[d.bag]?.[a];if(typeof p==="function")return d.mode==="model"?(...g)=>p(i,...g):(...g)=>p(s.id,...g)}if(u){let f=x(a);if(f!==a&&Object.prototype.hasOwnProperty.call(u,f))return u[f]}}let c=Reflect.get(s,a,s);return typeof c==="function"?c.bind(s):c},set(o,a,i,s){let c=o;if(typeof a==="string"&&!X.has(a)){let{_attributes:u,set:l}=c;if(u&&Object.prototype.hasOwnProperty.call(u,a)){if(typeof l==="function")l.call(c,a,i);else u[a]=i;return!0}if(u){let d=x(a);if(d!==a&&Object.prototype.hasOwnProperty.call(u,d)){if(typeof l==="function")l.call(c,d,i);else u[d]=i;return!0}}if(u&&!(a in c)){if(typeof l==="function")l.call(c,a,i);else u[a]=i;return!0}}return Reflect.set(c,a,i,s)},has(o,a){let i=o;if(typeof a==="string"&&!X.has(a)){let s=i._attributes;if(s&&Object.prototype.hasOwnProperty.call(s,a))return!0;let c=i._relations;if(c&&Object.prototype.hasOwnProperty.call(c,a))return!0;if(s){let u=x(a);if(u!==a&&Object.prototype.hasOwnProperty.call(s,u))return!0}}return Reflect.has(i,a)},deleteProperty(o,a){let i=o;if(typeof a==="string"&&!X.has(a)){let s=i._attributes;if(s&&Object.prototype.hasOwnProperty.call(s,a))return delete s[a],!0}return Reflect.deleteProperty(i,a)},ownKeys(o){let i=o._attributes;return i?Object.keys(i):[]},getOwnPropertyDescriptor(o,a){let i=o;if(typeof a==="string"){let s=i._attributes;if(s&&Object.prototype.hasOwnProperty.call(s,a))return{configurable:!0,enumerable:!0,value:s[a],writable:!0}}return Object.getOwnPropertyDescriptor(i,a)}})}var Gn=new Set(["get","first","last","firstOrFail","find","findOrFail","all","paginate","simplePaginate","cursorPaginate"]),Jn={paginate:Ln,simplePaginate:Un,cursorPaginate:qn},dt=Symbol.for("stacks.queryBuilderProxy");function _t(e,t){if(!e||typeof e!=="object")return e;if(e[dt])return e;return new Proxy(e,{get(n,r,o){if(r===dt)return!0;let a=Reflect.get(n,r,o);if(typeof a!=="function")return a;return function(...i){let s=i,c=String(r);if(c==="paginate"||c==="simplePaginate"){let{perPage:d,page:f}=he(i[0],i[1]);s=[d,f]}else if(c==="cursorPaginate"){let{perPage:d,cursor:f}=ke(i[0],i[1]);s=[d,f,i[2],i[3]]}let u=a.apply(n,s),l=(d)=>{if(Gn.has(c)){if(Array.isArray(d))return d.map((m)=>R(m,t));let f=Jn[c];if(f&&d&&Array.isArray(d.data)){let m=d.data.map((g)=>R(g,t)),p=f({...d,data:m});return _e(p)}if(d&&Array.isArray(d.data))return{...d,data:d.data.map((m)=>R(m,t))};return R(d,t)}if(d&&typeof d==="object"&&typeof d.get==="function")return _t(d,t);return d};if(u&&typeof u.then==="function")return u.then(l);return l(u)}}})}function Yn(e,t){let n=["find","first","last","all","firstOrFail","findOrFail","findMany"];for(let a of n){let i=e[a];if(typeof i!=="function")continue;e[a]=function(...s){let c=i.apply(this,s),u=(l)=>Array.isArray(l)?l.map((d)=>R(d,t)):R(l,t);if(c&&typeof c.then==="function")return c.then(u);return u(c)}}let r=["create","firstOrCreate","updateOrCreate","make"];for(let a of r){let i=e[a];if(typeof i!=="function")continue;e[a]=function(...s){let c=i.apply(this,s),u=(l)=>Array.isArray(l)?l.map((d)=>R(d,t)):R(l,t);if(c&&typeof c.then==="function")return c.then(u);return u(c)}}let o=["query","where","orWhere","whereIn","whereNotIn","whereNull","whereNotNull","whereLike","whereBetween","whereNotBetween","orderBy","orderByDesc","select","with","limit","take","skip","latest","oldest"];for(let a of o){let i=e[a];if(typeof i!=="function")continue;e[a]=function(...s){let c=i.apply(this,s);return _t(c,t)}}}class Tt extends Error{model;id;constructor(e,t){super(t!=null?`[ORM] ${e} not found for id=${String(t)}`:`[ORM] No matching ${e} row`);this.name="ModelNotFoundError",this.model=e,this.id=t}}class Ae extends Error{model;attribute;reason;constructor(e,t,n){let r=n==="guarded"?`'${t}' is marked guarded`:`'${t}' is not in the fillable allowlist`;super(`[ORM] Mass assignment to ${e} forbidden: ${r}. Use ${e}.forceCreate(...) / .forceUpdate(...) to bypass.`);this.name="MassAssignmentException",this.model=e,this.attribute=t,this.reason=n}}var Xn=new Set(["id","created_at","updated_at","deleted_at","uuid"]);function W(e,t,n={}){if(n.force)return t;if(!t||typeof t!=="object"||Array.isArray(t))return t;let r=e.attributes;if(!r)return t;let o=new Set,a=new Set,i=new Set;for(let[c,u]of Object.entries(r)){let l=x(c);if(o.add(l),u?.fillable===!0)a.add(l);if(u?.guarded===!0)i.add(l)}let s=a.size>0?a:o;for(let c of Object.keys(t)){let u=x(c);if(Xn.has(u))continue;if(i.has(u))throw new Ae(e.name,c,"guarded");if(u.endsWith("_id"))continue;if(!s.has(u))throw new Ae(e.name,c,"not-fillable")}return t}async function xe(e,t){let n=e.set;if(!n||typeof n!=="object")return t;let r={...t};for(let[o,a]of Object.entries(n)){if(typeof a!=="function"||!(o in r))continue;try{r[o]=await a(r)}catch(i){k.error(`[orm] ${e.name}.set.${o} threw - skipping setter`,i)}}return r}function Zn(e,t){let n=t.primaryKey||"id",r=e.create;function o(u){let l=e.where;if(typeof l!=="function")throw Error(`[ORM] ${t.name}.${u} needs a working where(): the underlying query builder did not expose one`);return l}function a(u){let l=e.find;if(typeof l!=="function")throw Error(`[ORM] ${t.name}.${u} needs a working find(): the underlying query builder did not expose one`);return l}function i(u){let l=e.create;if(typeof l!=="function")throw Error(`[ORM] ${t.name}.${u} cannot create: the underlying query builder did not expose create()`);return l}if(e.update=async function(u,l){if(u==null)throw Error(`[ORM] ${t.name}.update requires an id as the first argument`);if(!l||typeof l!=="object"||Array.isArray(l))throw Error(`[ORM] ${t.name}.update requires a data object as the second argument`);if(Object.keys(l).length===0){k.debug(`[orm] ${t.name}.update called with empty data - short-circuiting and returning current row`);let m=e.find;return typeof m==="function"?await m.call(e,u):null}W(t,l);let d=await xe(t,l);await o("update").call(e,n,u).update(d);let f=e.find;return typeof f==="function"?await f.call(e,u):null},typeof e.forceUpdate!=="function")e.forceUpdate=async function(u,l){if(u==null)throw Error(`[ORM] ${t.name}.forceUpdate requires an id as the first argument`);if(!l||typeof l!=="object"||Array.isArray(l))throw Error(`[ORM] ${t.name}.forceUpdate requires a data object as the second argument`);let d=await xe(t,l);await o("forceUpdate").call(e,n,u).update(d);let f=e.find;return typeof f==="function"?await f.call(e,u):null};if(typeof e.forceCreate!=="function")e.forceCreate=async function(u){if(!u||typeof u!=="object"||Array.isArray(u))throw Error(`[ORM] ${t.name}.forceCreate requires a data object`);let l=e.make;if(typeof l==="function"){let d=await l.call(e);if(d&&typeof d.forceFill==="function"&&typeof d.save==="function")return d.forceFill(u),await d.save()??d}if(typeof r!=="function")throw Error(`[ORM] ${t.name}.forceCreate cannot create: the underlying query builder did not expose create()`);return await r.call(e,u)};if(e.delete=async function(u){if(u==null)throw Error(`[ORM] ${t.name}.delete requires an id as the first argument`);if(!await a("delete").call(e,u))return!1;return await o("delete").call(e,n,u).delete(),!0},typeof e.findOrFail!=="function")e.findOrFail=async function(u){let l=await a("findOrFail").call(e,u);if(l==null)throw new Tt(t.name,u);return l};if(typeof e.exists!=="function")e.exists=async function(u){if(u==null)return!1;let l=o("exists").call(e,n,u);if(typeof l.count==="function"){let f=await l.count();return Number(f)>0}let d=e.find;return typeof d==="function"?await d.call(e,u)!=null:!1};if(typeof e.firstOrCreate!=="function")e.firstOrCreate=async function(u,l={}){if(!u||typeof u!=="object"||Array.isArray(u))throw Error(`[ORM] ${t.name}.firstOrCreate requires a where-attrs object`);let d=o("firstOrCreate").call(e,u),f=typeof d.first==="function"?await d.first():await d;if(f)return f;let m={...u,...l};return W(t,m),await i("firstOrCreate").call(e,m)};if(typeof e.updateOrCreate!=="function")e.updateOrCreate=async function(u,l){if(!u||typeof u!=="object"||Array.isArray(u))throw Error(`[ORM] ${t.name}.updateOrCreate requires a where-attrs object`);if(!l||typeof l!=="object"||Array.isArray(l))throw Error(`[ORM] ${t.name}.updateOrCreate requires a values object`);let d=o("updateOrCreate").call(e,u),f=typeof d.first==="function"?await d.first():await d;if(f){W(t,l);let p=f[n];await o("updateOrCreate").call(e,n,p).update(l);let g=e.find;return typeof g==="function"?await g.call(e,p):{...f,...l}}let m={...u,...l};return W(t,m),await i("updateOrCreate").call(e,m)};if(typeof e.count!=="function")e.count=async function(){let u=e;if(typeof u.query==="function"){let f=u.query();if(typeof f?.count==="function"){let m=await f.count();return Number(m)||0}}let{all:l,get:d}=e;if(typeof l==="function")return(await l.call(e)||[]).length;if(typeof d==="function")return(await d.call(e)||[]).length;return 0};if(typeof e.pluck!=="function")e.pluck=async function(u){if(!u||typeof u!=="string")throw Error(`[ORM] ${t.name}.pluck requires a column name`);let l=e.all;return((typeof l==="function"?await l.call(e):[])||[]).map((f)=>f?.[u])};if(typeof e.whereIn!=="function")e.whereIn=async function(u,l){if(!u||typeof u!=="string")throw Error(`[ORM] ${t.name}.whereIn requires a column name`);if(!Array.isArray(l))throw Error(`[ORM] ${t.name}.whereIn requires an array of values`);if(l.length===0)return[];let d=e.where;if(typeof d!=="function")return[];let f=d.call(e,u,"in",l);if(f&&typeof f.get==="function")return await f.get();return await f};let s=[["latest","desc"],["oldest","asc"]];for(let[u,l]of s)if(typeof e[u]!=="function")e[u]=async function(d="created_at"){let f=e,m=typeof f.query==="function"?f.query():f;if(typeof m?.orderBy==="function"){let b=m.orderBy(d,l);if(typeof b.first==="function")return await b.first();if(typeof b.get==="function")return(await b.get())?.[0]??null}let p=e.all;if(typeof p!=="function")return null;return[...await p.call(e)||[]].sort((b,h)=>{let T=b?.[d],P=h?.[d];if(T===P)return 0;return(T>P?1:-1)*(l==="desc"?-1:1)})[0]??null};let c=At(t.traits?.useSearch,t);if(c){let u=c.index??t.table??x(`${t.name}s`);if(typeof e.search!=="function")e.search=function(l,d){return nr(e,u,l,d,c.searchable)};if(typeof e.makeAllSearchable!=="function")e.makeAllSearchable=async function(l=500){let d=e.all;if(typeof d!=="function")throw Error(`[ORM] ${t.name}.makeAllSearchable cannot run: the underlying query builder did not expose all()`);let{useSearchEngine:f}=await import("@stacksjs/search-engine"),m=f(),p=0,g=e.query;if(typeof g==="function")try{let h=g.call(e);if(h&&typeof h.chunk==="function")return await h.chunk(l,async(T)=>{let P=await Oe(T,c);if(P.length>0)await m.addDocuments(u,P);p+=P.length}),p}catch{}let w=await d.call(e)||[],b=await Oe(w,c);if(b.length>0)await m.addDocuments(u,b);return b.length};if(typeof e.removeAllFromSearch!=="function")e.removeAllFromSearch=async function(){let{useSearchEngine:l}=await import("@stacksjs/search-engine"),d=l();if(typeof d.deleteAllDocuments==="function"){await d.deleteAllDocuments(u);return}let f=e.all,m=typeof f==="function"?await f.call(e)||[]:[],p=l();for(let g of m){let w=g?.id??g?._attributes?.id;if(w!=null)await p.deleteDocument(u,Number(w))}}}}async function Oe(e,t){if(e.length===0)return[];if(typeof t.shapeMany==="function"){let r=await t.shapeMany(e);if(!Array.isArray(r)||r.length!==e.length)throw TypeError(`[orm/search] shapeMany returned ${Array.isArray(r)?r.length:typeof r} documents for ${e.length} rows. It must return one document per row, in order, or documents are indexed under the wrong ids.`);return r.filter(Boolean)}return(await Promise.all(e.map((r)=>tr(r,t)))).filter(Boolean)}function Rt(e){let t=new Set,n=e.attributes??{};for(let[r,o]of Object.entries(n))if(o?.hidden)t.add(r);return t}function er(e,t){if(!e||t.size===0)return e;let n={};for(let[r,o]of Object.entries(e))if(!t.has(r))n[r]=o;return n}async function tr(e,t){if(typeof t.shape==="function")try{return await t.shape(e)}catch{return}let n=e?.toSearchableObject?.();if(n!==void 0)return n;return er(e?._attributes??(typeof e?.toJSON==="function"?e.toJSON():null),t.hidden??new Set)}function nr(e,t,n,r,o){let a=o&&o.length>0?{query_by:[...o].join(",")}:{},i={q:n,...a,...r??{}},s={with(c){return i={...i,...c},s},where(c){return i={...i,filter:c},s},async get(){let{useSearchEngine:c}=await import("@stacksjs/search-engine");return(await c().search(t,i))?.hits??[]},async paginate(c,u=1){let{useSearchEngine:l}=await import("@stacksjs/search-engine"),f=await l().search(t,{...i,limit:c,offset:(u-1)*c});return{hits:f.hits??[],total:Number(f.estimatedTotalHits??f.nbHits??f.total??0),page:u,perPage:c}},async raw(){let{useSearchEngine:c}=await import("@stacksjs/search-engine");return await c().search(t,i)}};return s}function St(e){let t=x(e);return t===e?[e]:[e,t]}async function Pe(e,t){if(!e||typeof e!=="object")return;let n=e._attributes??e;for(let r of t)for(let o of St(r)){if(!(o in n))continue;let a=n[o];if(!j(a))continue;n[o]=await oe(a)}}function rr(e,t){if(t.length===0)return;let n=async(s)=>{if(Array.isArray(s)){for(let c of s)await Pe(c,t);return s}if(s&&typeof s==="object"&&Array.isArray(s.data)){for(let c of s.data)await Pe(c,t);return s}if(s)await Pe(s,t);return s},r=["find","first","last","all","firstOrFail","findOrFail","findMany"];for(let s of r){let c=e[s];if(typeof c!=="function")continue;e[s]=async function(...u){let l=await c.apply(this,u);return await n(l)}}let o=["create","firstOrCreate","updateOrCreate","make"];for(let s of o){let c=e[s];if(typeof c!=="function")continue;e[s]=async function(...u){let l=await c.apply(this,u);return await n(l)}}for(let s of["update","forceUpdate"]){let c=e[s];if(typeof c!=="function")continue;e[s]=async function(u,l){let d=await c.call(this,u,l);return await n(d)}}let a=["first","firstOrFail","get","all","find","findOrFail","last","paginate","simplePaginate"],i=(s)=>{if(!s||typeof s!=="object")return s;let c=s;if(c.__stacksEncryptedReads)return s;for(let u of a){let l=c[u];if(typeof l!=="function")continue;c[u]=async function(...d){return await n(await l.apply(this,d))}}for(let u of["where","whereIn","whereNull","whereNotNull","orWhere","orderBy","orderByDesc","limit","offset","with"]){let l=c[u];if(typeof l!=="function")continue;c[u]=function(...d){return i(l.apply(this,d))}}return Object.defineProperty(c,"__stacksEncryptedReads",{value:!0,enumerable:!1}),s};for(let s of["where","whereIn","whereNull","whereNotNull","orderBy","orderByDesc","limit","query"]){let c=e[s];if(typeof c!=="function")continue;e[s]=function(...u){return i(c.apply(this,u))}}}function or(e,t){if(t.length===0)return;let n=async(o)=>{if(!o||typeof o!=="object"||Array.isArray(o))return o;let a={...o};for(let i of t)for(let s of St(i))if(s in a)a[s]=await re(a[s]);return a},r=["create","firstOrCreate","updateOrCreate","forceCreate"];for(let o of r){let a=e[o];if(typeof a!=="function")continue;e[o]=async function(...i){if(i[0]=await n(i[0]),i[1])i[1]=await n(i[1]);return await a.apply(this,i)}}for(let o of["update","forceUpdate"]){let a=e[o];if(typeof a!=="function")continue;e[o]=async function(i,s){let c=await n(s);return await a.call(this,i,c)}}}function ar(e,t){let n=e.create;if(typeof n==="function")e.create=async function(r,...o){W(t,r);let a=await xe(t,r);return await n.call(this,a,...o)};for(let r of["firstOrCreate","updateOrCreate"]){let o=e[r];if(typeof o!=="function")continue}}function ir(e,t){let n=String(t?.name??e.name??"Model"),r=(i,s)=>{if(Kn())return;if(!i||typeof i!=="object"||Array.isArray(i))return;let c=Ve(i,t,s);if(!c.valid)throw new ht(n,c.errors)},o=e.create;if(typeof o==="function")e.create=async function(i,...s){return r(i,"creating"),await o.call(this,i,...s)};let a=e.update;if(typeof a==="function")e.update=async function(i,s,...c){return r(s,"updating"),await a.call(this,i,s,...c)}}function sr(e,t){let n=["create","firstOrCreate","updateOrCreate"];for(let o of n){let a=e[o];if(typeof a==="function")e[o]=async function(...i){if(k.debug(`[orm] ${o.charAt(0).toUpperCase()+o.slice(1)} ${String(e.name||"unknown")}`,i[0]),i[0]&&typeof i[0]==="object"&&!Array.isArray(i[0]))i[0]=ct(i[0],t,"set");return await a.apply(this,i)}}let r=e.update;if(typeof r==="function")e.update=async function(o,a){let i=a&&typeof a==="object"&&!Array.isArray(a)?ct(a,t,"set"):a;return await r.call(this,o,i)}}var ft=new Set(["useUuid","useTimestamps","timestampable","useSoftDeletes","softDeletable","useApi","useAuth","authenticatable","useSearch","searchable","useSeeder","seedable","useSocials","billable","observe","useAudit","useActivityLog","prunable","sharding","likeable","taggable","categorizable","commentable","commentables","broadcastOn","broadcastWith"]);function Pt(e){k.debug(`[orm] Defining model: ${e.name} (table: ${e.table})`);for(let g of Object.keys(e.traits??{}))if(!ft.has(g))k.warn(`[orm] Model '${e.name}' declares an unknown trait '${g}'. It does nothing. Known traits: ${[...ft].sort().join(", ")}.`);let t=ur(e),n=lr(e),r=cr(t,n),o=dr(e);e.__traitMethods=o;let a=e.traits;if((a?.useAuth||a?.authenticatable)&&e.name!=="PersonalAccessToken"){let g=e.morphMany;if(!g||!("tokenable"in g))e.morphMany={...g??{},tokenable:"PersonalAccessToken"}}let i=r?{...e,hooks:{...e.hooks,...r}}:e,c=Bn(i);if(Yn(c,e.casts),Zn(c,i),ar(c,i),e.casts&&Object.keys(e.casts).length>0)sr(c,e.casts);let u=ae(e);if(u.length>0)or(c,u),rr(c,u);let l=e.traits?.useSoftDeletes;if(l)fr(c,i,l);let d=e.traits?.useAudit;if(d){let g=Be(d);Ne(c,e.name,e.primaryKey||"id",g)}let f=it(e.traits?.useActivityLog);if(f)st(c,e.name,e.primaryKey||"id",f,[...Rt(e)]);ir(c,i);let m=c;m.withoutValidation=function(g){return Wn(g)},m.withoutEvents=function(g){return M(g)};for(let g of["create","update","firstOrCreate","updateOrCreate","forceCreate","forceUpdate","delete","forceDelete","softDelete","restore"]){let w=c[g];if(typeof w!=="function")continue;let b=`${g}Quietly`;if(typeof c[b]==="function")continue;c[b]=function(...h){return M(()=>w.apply(c,h))}}let p=Object.assign(c,o,{...e,getDefinition:()=>e,_isStacksModel:!0});return Nn(e.name,p),Object.defineProperty(p,Ce,{value:e,enumerable:!1,configurable:!0}),p}function ur(e){let t=e.traits?.observe;if(!t)return;let n=e.name.toLowerCase(),r=(f)=>{let m=f?.attributes;if(!m||typeof m!=="object")return f;let p=e.primaryKey||"id",g={...m};if(g[p]===void 0&&f[p]!==void 0)g[p]=f[p];return g},o=async(f,m)=>{if(D())return;try{let{dispatch:p}=Z??=await import("@stacksjs/events");await p(f,m)}catch(p){if(p&&typeof p==="object"&&"code"in p&&p.code==="MODULE_NOT_FOUND")return;if(console.error(`[ORM] Event '${f}' handler error:`,p),process.env.STACKS_ORM_EVENT_ERRORS!=="swallow")throw p}},a=e.traits?.broadcastOn,i=e.traits?.broadcastWith,s=typeof a==="function"&&typeof i==="function",c=async(f,m)=>{if(!s)return;if(D())return;try{let p=a(m),g=Array.isArray(p)?p:[p],w=i(m),h=(await import("@stacksjs/realtime").catch(()=>null))?.broadcast;if(typeof h!=="function")return;for(let T of g){if(typeof T!=="string"||T.length===0)continue;await h(T,f,w)}}catch(p){if(p&&typeof p==="object"&&"code"in p&&p.code==="MODULE_NOT_FOUND")return;if(console.error(`[ORM] Broadcast '${f}' handler error:`,p),process.env.STACKS_ORM_BROADCAST_ERRORS==="throw")throw p}},u=async(f,m)=>{if(D())return!0;let p;try{p=Z??=await import("@stacksjs/events");let{dispatchAndCollect:g}=p,w=await g(f,m);if(w.some((h)=>h.ok&&h.value===!1))return!1;let b=w.find((h)=>!h.ok);if(b&&!b.ok)throw b.error}catch(g){if(!p&&g&&typeof g==="object"&&"code"in g&&g.code==="MODULE_NOT_FOUND")return!0;if(console.error(`[ORM] Before-event '${f}' handler error:`,g),process.env.STACKS_ORM_EVENT_ERRORS!=="swallow")throw g}return!0},l=t===!0?["create","update","delete"]:Array.isArray(t)?t:[],d={};if(l.includes("create"))d.beforeCreate=async(f)=>{if(k.debug(`[orm] Create ${n}`,f),!await u(`${n}:saving`,f))throw Error(`[ORM] ${n}:saving event cancelled the operation`);if(!await u(`${n}:creating`,f))throw Error(`[ORM] ${n}:creating event cancelled the operation`)},d.afterCreate=async(f)=>{let m=r(f);await o(`${n}:created`,m),await o(`${n}:saved`,m),await c(`${n}:created`,f)};if(l.includes("update"))d.beforeUpdate=async(f)=>{if(k.debug(`[orm] Update ${n}#${f?.id??"unknown"}`,f),!await u(`${n}:saving`,f))throw Error(`[ORM] ${n}:saving event cancelled the operation`);if(!await u(`${n}:updating`,f))throw Error(`[ORM] ${n}:updating event cancelled the operation`)},d.afterUpdate=async(f)=>{let m=r(f);await o(`${n}:updated`,m),await o(`${n}:saved`,m),await c(`${n}:updated`,f)};if(l.includes("delete"))d.beforeDelete=async(f)=>{if(k.debug(`[orm] Delete ${n}#${f?.id??"unknown"}`),!await u(`${n}:deleting`,f))throw Error(`[ORM] ${n}:deleting event cancelled the operation`)},d.afterDelete=async(f)=>{await o(`${n}:deleted`,r(f)),await c(`${n}:deleted`,f)};return d}function cr(...e){let t={},n=new Set;for(let r of e){if(!r)continue;for(let o of Object.keys(r))n.add(o)}for(let r of n){let o=e.map((a)=>a?.[r]).filter((a)=>typeof a==="function");if(!o.length)continue;t[r]=async(...a)=>{for(let i of o)await i(...a)}}return Object.keys(t).length?t:void 0}function At(e,t){if(!e)return null;let n=e===!0?{}:typeof e==="object"?{...e}:null;if(!n)return null;if(t)n.hidden=Rt(t);return n}function lr(e){let t=At(e.traits?.useSearch,e);if(!t)return;let n=t,r=n.index??e.table??x(`${e.name}s`);async function o(s){if(typeof n.shapeMany==="function")try{let[l]=await Oe([s],n);return l}catch(l){k.warn(`[orm/search] shapeMany() threw for ${e.name}: ${l.message}`);return}if(typeof n.shape==="function")try{return await n.shape(s)}catch(l){k.warn(`[orm/search] shape() threw for ${e.name}: ${l.message}`);return}let u=R(s).toSearchableObject?.();if(u!==void 0)return u;return s?._attributes??(typeof s?.toJSON==="function"?s.toJSON():null)}let a=async(s)=>{if(D())return;let c=await o(s);if(!c)return;if(t.queueable){try{let{Jobs:u}=await import("@stacksjs/queue");await u.dispatch("SyncSearchIndexJob",{index:r,op:"upsert",doc:c})}catch(u){k.warn(`[orm/search] queue dispatch failed for ${e.name}; falling back to inline: ${u.message}`),await mt(r,c,e.name)}return}await mt(r,c,e.name)};return{afterCreate:a,afterUpdate:a,afterDelete:async(s)=>{if(D())return;let c=s?.id??s?._attributes?.id;if(c==null)return;if(t.queueable){try{let{Jobs:u}=await import("@stacksjs/queue");await u.dispatch("SyncSearchIndexJob",{index:r,op:"delete",id:Number(c)})}catch(u){k.warn(`[orm/search] queue dispatch failed for ${e.name}#${c}; falling back to inline: ${u.message}`),await yt(r,Number(c),e.name)}return}await yt(r,Number(c),e.name)}}}var pt=new Map;function xt(e,t){let n=pt.get(e)??0;if(pt.set(e,n+1),n===0)k.warn(`[orm/search] ${t}`);else if(n===9)k.warn(`[orm/search] ${e} is still failing; further identical warnings suppressed for this process.`)}async function mt(e,t,n){try{let{useSearchEngine:r}=await import("@stacksjs/search-engine");await r().addDocument(e,t)}catch(r){xt(`index:${n}`,`Failed to index ${n}: ${r.message}`)}}async function yt(e,t,n){try{let{useSearchEngine:r}=await import("@stacksjs/search-engine");await r().deleteDocument(e,t)}catch(r){xt(`remove:${n}`,`Failed to remove ${n}#${t}: ${r.message}`)}}function dr(e){let t={},{table:n,traits:r}=e;if(!r)return t;if(r.taggable)t._taggable=fe(n);if(r.categorizable)t._categorizable=pe(n);if(r.commentable)t._commentable=le(n);if(r.billable)t._billable=Ye(n);if(r.likeable){let a=typeof r.likeable==="object"?r.likeable:void 0;t._likeable=me(n,a)}let o=r.useAuth||r.authenticatable;if(typeof o==="object"&&o&&"useTwoFactor"in o&&o.useTwoFactor)t._twoFactor=Xe();return t}function fr(e,t,n){let r=Ze(e,t.primaryKey||"id"),o=et(n),a=t,i=t.name.toLowerCase(),s=t.traits?.observe!=null&&t.traits?.observe!==!1,c=async(m)=>{if(!s||D())return!0;try{let{dispatchAsync:p}=Z??=await import("@stacksjs/events"),g=await p(`${i}:restoring`,{id:m});if(Array.isArray(g)&&g.some((w)=>w===!1))return!1}catch(p){if(p?.code!=="MODULE_NOT_FOUND")console.error(`[ORM] Before-event '${i}:restoring' handler error:`,p)}return!0},u=async(m)=>{if(!s||D())return;try{let{dispatch:p}=Z??=await import("@stacksjs/events");await p(`${i}:restored`,{id:m})}catch(p){if(p?.code!=="MODULE_NOT_FOUND")console.error(`[ORM] Event '${i}:restored' handler error:`,p)}},l=process.env.STACKS_ORM_CASCADE_SWALLOW!=="true",d=async(m)=>{if(!o.cascade?.length||!l){let g=await r.softDelete(m);if(g&&o.cascade?.length)await K(a,o,m,"softDelete");return g}let{db:p}=await import("@stacksjs/database/runtime");return await p.transaction(async()=>{let g=await r.softDelete(m);if(g)await K(a,o,m,"softDelete");return g})},f=async(m)=>{if(!await c(m))return!1;if(!o.cascade?.length||!l){let b=await r.restore(m);if(b){if(o.cascade?.length)await K(a,o,m,"restore");await u(m)}return b}let{db:g}=await import("@stacksjs/database/runtime"),w=await g.transaction(async()=>{let b=await r.restore(m);if(b)await K(a,o,m,"restore");return b});if(w)await u(m);return w};e.softDelete=d,e.restore=f,e.forceDelete=r.forceDelete,e.withTrashed=r.withTrashed,e.onlyTrashed=r.onlyTrashed,e.delete=d}function pr(e){if(e==null)return e;if(Array.isArray(e))return e.map((n)=>pr(n));if(typeof e!=="object")return e;let t=e;if(typeof t.toJSON==="function")return t.toJSON();if(t._attributes&&typeof t._attributes==="object")return t._attributes;return e}var mr=["belongsTo","hasOne","hasMany","belongsToMany","morphMany","morphOne"],yr=["traits","dashboard"];function gr(e){let t=e?.[Ce];if(t&&typeof t==="object")return t;if(e&&typeof e==="object"&&"name"in e&&"attributes"in e)return e;throw TypeError("extendModel() expects a model created by defineModel(), or a model definition. Import the framework model itself rather than its table name.")}function br(e,t){let n=Array.isArray(e)?e:[],r=Array.isArray(t)?t:[];if(!n.length&&!r.length)return;return[...new Set([...n,...r])]}function wr(e){if(!e)return 0;return Object.values(e).reduce((t,n)=>{let r=Number(n?.order);return Number.isFinite(r)&&r>t?r:t},0)}function hr(e,t){let n={...e,...t},r=e.attributes??{},o=t.attributes??{};if(t.attributes){let a=wr(r),i=Object.fromEntries(Object.entries(o).map(([s,c])=>{let u=!(s in r),l=Number.isFinite(Number(c?.order));if(u&&!l)return[s,{...c,order:++a}];return[s,c]}));n.attributes={...r,...i}}for(let a of mr){let i=br(e[a],t[a]);if(i)n[a]=i}for(let a of yr){let i=e[a],s=t[a];if(i&&s&&typeof i==="object"&&typeof s==="object")n[a]={...i,...s}}return n}function gs(e,t){return Pt(hr(gr(e),t))}import xr from"process";import{log as Or}from"@stacksjs/logging";import{path as S}from"@stacksjs/path";import{fs as Q}from"@stacksjs/storage";import{Database as kr}from"bun:sqlite";import{existsSync as _r,readdirSync as Tr,readFileSync as Rr}from"fs";function Sr(e){return e.startsWith("sqlite_")||e.startsWith("_qb_tmp_")}function Pr(e,t){let n=e.toUpperCase();if(n.includes("BOOL"))return t==="postgres"?"boolean":"number";if(n.includes("DATE")||n.includes("TIME"))return"string";if(n.includes("INT"))return"number";if(n.includes("CHAR")||n.includes("CLOB")||n.includes("TEXT"))return"string";if(n.includes("REAL")||n.includes("FLOA")||n.includes("DOUB")||n.includes("NUMERIC")||n.includes("DEC"))return"number";if(n.includes("BLOB"))return"Uint8Array";return"unknown"}function Ar(e,t){try{return e.exec(t),{ok:!0}}catch(n){if(/CREATE\s+TRIGGER/i.test(t))return{ok:!1,error:n.message};let r=0;for(let o of t.split(/;\s*$/m)){if(!o.trim())continue;try{e.exec(o),r++}catch{}}return r>0?{ok:!0}:{ok:!1,error:n.message}}}function Ot(e,t="sqlite"){let n=[];if(!_r(e))return{tables:[],errors:n};let r;try{r=Tr(e).filter((a)=>a.endsWith(".sql")).sort()}catch(a){return{tables:[],errors:[{file:e,error:a.message}]}}let o=new kr(":memory:");try{for(let s of r){let c=`${e}/${s}`,u;try{u=Rr(c,"utf-8")}catch(d){n.push({file:c,error:d.message});continue}let l=Ar(o,u);if(!l.ok)n.push({file:c,error:l.error??"could not be applied"})}let a=o.query("SELECT name FROM sqlite_master WHERE type = 'table' ORDER BY name").all().map((s)=>s.name).filter((s)=>!Sr(s)),i=[];for(let s of a){let c=o.query(`PRAGMA table_info("${s.replace(/"/g,'""')}")`).all();if(c.length===0)continue;let u={};for(let l of c){let d=Pr(l.type??"",t),f=l.notnull===0&&l.pk===0;u[l.name]=f&&d!=="unknown"?`${d} | null`:d}i.push({table:s,columns:u})}return{tables:i,errors:n}}finally{o.close()}}function Cr(e){if(e)return e;let t=String(xr.env.DB_CONNECTION??"").toLowerCase();return t==="postgres"||t==="mysql"?t:"sqlite"}function ee(e){return e==="postgres"?"boolean":"number"}function O(e){return e.replace(/([A-Z]+)([A-Z][a-z])/g,"$1_$2").replace(/([a-z\d])([A-Z])/g,"$1_$2").toLowerCase()}function vr(e,t){let n=e.default;if(typeof n==="boolean")return ee(t);if(typeof n==="number")return"number";if(typeof n==="string")return"string";return"unknown"}function Mr(e){let t=e.validation;if(!t||typeof t!=="object")return null;let n=t.rule;return n&&typeof n==="object"?n:null}function Dr(e){if(!e||String(e.name??"")!=="enum")return null;let n=(Array.isArray(e.allowedValues)?e.allowedValues:[]).filter((r)=>typeof r==="string"||typeof r==="number").map((r)=>typeof r==="number"?String(r):JSON.stringify(r));return n.length>0?n.join(" | "):null}function Er(e,t){let n=Mr(e),r=Dr(n);if(r!==null)return e.nullable===!0?`${r} | null`:r;let o=typeof e.type==="string"?e.type.toLowerCase():String(n?.name??"").toLowerCase(),a=(()=>{switch(o){case"string":case"text":case"longtext":case"mediumtext":case"tinytext":case"char":case"varchar":case"enum":case"uuid":case"date":case"datetime":case"timestamp":case"timestamptz":case"password":case"time":case"year":return"string";case"number":case"integer":case"int":case"tinyint":case"smallint":case"mediumint":case"float":case"double":case"decimal":case"numeric":return"number";case"bigint":return"number | bigint";case"boolean":case"bool":return ee(t);case"json":case"jsonb":return"unknown";case"binary":case"blob":case"bytea":return"Uint8Array";case"unix":return"number";case"array":return"unknown[]";case"object":return"Record<string, unknown>";default:return vr(e,t)}})();return e.nullable===!0?`${a} | null`:a}function Fr(e){let t={},n=e.belongsTo;if(!n)return t;let r=Array.isArray(n)?n:Object.values(n);for(let o of r){if(typeof o==="string"){t[`${O(o)}_id`]="number";continue}if(o&&typeof o==="object"){let a=o;if(typeof a.foreignKey==="string"){t[a.foreignKey]="number";continue}if(typeof a.model==="string")t[`${O(a.model)}_id`]="number"}}return t}function $r(e,t){let[n,r]=[O(e),O(t)].sort();return`${n}_${r}`}function Ir(e,t){let n=e.default,r=typeof n==="string"?"string":typeof n==="number"?"number":typeof n==="boolean"?ee(t):n instanceof Date?"string":"unknown";return e.nullable?`${r} | null`:r}function jr(e,t,n){let r=t.belongsToMany;if(!r)return[];let o=[],a=Array.isArray(r)?r:Object.values(r);for(let i of a){let s,c,u,l,d={},f=!0;if(typeof i==="string")s=i;else if(i&&typeof i==="object"&&"model"in i){let b=i;if(s=b.model,"pivotTable"in b||"firstForeignKey"in b||"secondForeignKey"in b)c=b.pivotTable,u=b.firstForeignKey,l=b.secondForeignKey;else{let h=i;c=h.table,u=h.foreignKey,l=h.relatedKey,d=h.pivot?.columns??{},f=Boolean(h.pivot?.timestamps)}}else continue;let m=c??$r(e,s),p=u??`${O(e)}_id`,g=l??`${O(s)}_id`,w={id:"number",[p]:"number",[g]:"number"};for(let[b,h]of Object.entries(d))w[b]=Ir(h,n);if(f)w.created_at="string",w.updated_at="string | null";o.push({table:m,columns:w})}return o}function Br(e){return{email_verified_at:"string | null",password_changed_at:"string | null",two_factor_secret:"string | null",two_factor_enabled:`${ee(e)} | null`,two_factor_last_used_step:"number | null",stripe_id:"string | null"}}function Nr(e,t){let n={id:"number"},r=e.traits??{};if(r.useUuid)n.uuid="string";if((r.useTimestamps??r.timestampable)!==!1)n.created_at="string",n.updated_at="string | null";if(r.useSoftDeletes??r.softDeletable)n.deleted_at="string | null";if((e.table??"")==="users"||e.name==="User")Object.assign(n,Br(t));return n}function qr(e,t){let n={},r=e.attributes??{};for(let[o,a]of Object.entries(r))n[O(o)]=Er(a,t);return n}function Ct(e,t,n=2){let r=" ".repeat(n),o=" ".repeat(n+1),a=Object.entries(t).map(([s,c])=>`${o}${s}: ${c}`).join(`
|
|
2
|
+
var Yt=import.meta.require;import"@stacksjs/validation";import{log as re}from"@stacksjs/cli";import{db as Ee,mutationCount as Fe}from"@stacksjs/database/runtime";async function Xt(e,n={}){let{olderThanDays:t=30,column:r="created_at",query:o}=n;try{if(o){let u=Ee.deleteFrom(e);u=o(u);let c=Fe(await u.execute());return re.info(`Pruned ${c} records from ${e}`),c}let a=new Date;a.setDate(a.getDate()-t);let i=await Ee.deleteFrom(e).where(r,"<",a.toISOString()).execute(),s=Fe(i);return re.info(`Pruned ${s} records from ${e} older than ${t} days`),s}catch(a){throw re.error(`Failed to prune ${e}:`,a),a}}async function mi(e,n={}){return Xt(e,n)}function gi(e){if(!e?.prunable)return null;if(typeof e.prunable==="boolean")return{olderThanDays:30,column:"created_at"};return e.prunable}import{createCipheriv as Zt,createDecipheriv as en,createHash as tn,randomBytes as nn}from"crypto";import{log as H}from"@stacksjs/logging";var Ie="enc:",$e="aes-256-gcm",rn=12,z=null;async function je(){if(z)return z;let e=process.env.APP_KEY;if(!e)try{e=(await import("@stacksjs/config").catch(()=>null))?.config?.app?.key}catch{}if(!e)return null;return z=tn("sha256").update(e).digest(),z}function I(e){return typeof e==="string"&&e.startsWith(Ie)}async function oe(e){if(e==null)return e;if(I(e))return e;if(typeof e!=="string")return e;let n=await je();if(!n)return H.warn("[orm] encrypted attribute: APP_KEY not set - storing value in plaintext"),e;let t=nn(rn),r=Zt($e,n,t),o=Buffer.concat([r.update(e,"utf8"),r.final()]),a=r.getAuthTag();return`${Ie}${t.toString("base64")}:${a.toString("base64")}:${o.toString("base64")}`}async function ae(e){if(e==null)return e;if(typeof e!=="string")return e;if(!I(e))return e;try{let n=await je();if(!n)return H.warn("[orm] encrypted attribute: APP_KEY not set - cannot decrypt"),null;let[,t,r,o]=e.split(":");if(!t||!r||!o)return H.warn("[orm] encrypted attribute: malformed envelope, returning null"),null;let a=Buffer.from(t,"base64"),i=Buffer.from(r,"base64"),s=Buffer.from(o,"base64"),u=en($e,n,a);return u.setAuthTag(i),Buffer.concat([u.update(s),u.final()]).toString("utf8")}catch(n){return H.warn("[orm] encrypted attribute: decrypt failed (key rotation? corrupted ciphertext?)",{error:n}),null}}function ie(e){let n=e.attributes;if(!n||typeof n!=="object")return[];let t=[];for(let[r,o]of Object.entries(n))if(o&&typeof o==="object"&&o.encrypted===!0)t.push(r);return t}import{sqlDateTime as on}from"@stacksjs/database/runtime";import{log as B}from"@stacksjs/logging";var an=[/^password$/i,/^password_hash$/i,/^api_key$/i,/_token$/i,/_secret$/i,/^remember_token$/i],Ne="model_audits",ce=null;function sn(e){ce=e}async function se(){if(ce!=null)return ce;try{let e=await import("@stacksjs/router").catch(()=>null);if(!e)return null;let n=e.getCurrentRequest;if(typeof n!=="function")return null;let t=n();if(!t)return null;return(t.user??t._user)?.id??null}catch{return null}}function G(e){if(!e||typeof e!=="object")return null;let n={};for(let[t,r]of Object.entries(e)){if(an.some((o)=>o.test(t)))continue;n[t]=r}return n}function j(e){if(!e||typeof e!=="object")return null;let n=e;if(n._attributes&&typeof n._attributes==="object")return{...n._attributes};return{...e}}function un(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 ue(e,n=!1){try{let{db:t}=await import("@stacksjs/database/runtime");await t.insertInto(Ne).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:on()}).executeTakeFirst()}catch(t){if(B.warn(`[orm] audit row write failed for ${e.auditable_type}#${String(e.auditable_id)} (${e.event})`,{error:t}),n)throw t}}function qe(e){return{async audits(n){try{let{db:t}=await import("@stacksjs/database/runtime");return(await t.selectFrom(Ne).selectAll().where("auditable_type","=",e).where("auditable_id","=",n).orderBy("created_at","desc").execute()??[]).map((o)=>({...o,old_values:typeof o.old_values==="string"?Be(o.old_values):o.old_values,new_values:typeof o.new_values==="string"?Be(o.new_values):o.new_values}))}catch(t){return B.warn(`[orm] audits() lookup failed for ${e}#${String(n)}`,{error:t}),[]}}}}function Be(e){try{return JSON.parse(e)}catch{return e}}function Le(e){if(e&&typeof e==="object"&&"transactional"in e)return{transactional:e.transactional===!0};return{transactional:!1}}function Ue(e,n,t="id",r={}){let o=r.transactional===!0,a=e;if(typeof e.audits!=="function")e.audits=qe(n).audits;let i=async(l)=>{if(!o)return await l();let{db:f}=await import("@stacksjs/database/runtime");return await f.transaction(async()=>l())},s=e.create;if(typeof s==="function")e.create=async function(...l){return await i(async()=>{let f=await s.apply(this,l);try{let d=j(f),m=d?.[t];if(m!=null){let p=await se();await ue({auditable_type:n,auditable_id:m,event:"created",old_values:null,new_values:G(d),user_id:p},o)}}catch(d){if(B.warn(`[orm] audit(create) failed for ${n}`,{error:d}),o)throw d}return f})};let u=e.update;if(typeof u==="function")e.update=async function(l,f){return await i(async()=>{let d=a.find,m=typeof d==="function"?j(await d.call(a,l)):null,p=await u.call(this,l,f);try{let y=j(p)??(typeof d==="function"?j(await d.call(a,l)):null),{old:b,next:w}=un(m,y);if(w&&Object.keys(w).length>0){let h=await se();await ue({auditable_type:n,auditable_id:l,event:"updated",old_values:G(b),new_values:G(w),user_id:h},o)}}catch(y){if(B.warn(`[orm] audit(update) failed for ${n}#${String(l)}`,{error:y}),o)throw y}return p})};let c=(l)=>{let f=e[l];if(typeof f!=="function")return;e[l]=async function(d){return await i(async()=>{let m=a.find,p=typeof m==="function"?j(await m.call(a,d)):null,y=await f.call(this,d);try{if(y!==!1&&p){let b=await se();await ue({auditable_type:n,auditable_id:d,event:"deleted",old_values:G(p),new_values:null,user_id:b},o)}}catch(b){if(B.warn(`[orm] audit(${l}) failed for ${n}#${String(d)}`,{error:b}),o)throw b}return y})}};c("delete"),c("softDelete")}import{db as cn,sql as ln,sqlDateTime as le}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 N="commentable_upvotes",q="commentables";function dn(e){let n=e;return n.code==="SQLITE_CONSTRAINT_UNIQUE"||n.code==="SQLITE_CONSTRAINT"||n.code==="23505"||n.errno===1062||/unique|duplicate/i.test(n.message??"")}function de(e){let n=cn;return{async comments(t){return A(t,"comments"),await n.selectFrom("commentables").where("commentables_id","=",t).where("commentables_type","=",e).selectAll().execute()},async commentCount(t){let r=await n.selectFrom("commentables").select(ln`count(*) as count`).where("commentables_id","=",t).where("commentables_type","=",e).executeTakeFirst();return Number(r?.count)||0},async addComment(t,r){if(A(t,"addComment"),!r||typeof r.title!=="string"||r.title.trim().length===0)throw Error("[orm/commentable] addComment requires a non-empty comment.title");if(typeof r.body!=="string"||r.body.trim().length===0)throw Error("[orm/commentable] addComment requires a non-empty comment.body");let o=await n.insertInto("commentables").values({...r,commentables_id:t,commentables_type:e,status:"pending",created_at:le(),updated_at:le()}).returningAll().executeTakeFirst();if(o&&typeof o==="object"&&"id"in o)return o;let a=o?.lastInsertRowid;if(a==null)return o;return await n.selectFrom("commentables").where("id","=",Number(a)).selectAll().executeTakeFirst()},async approvedComments(t){return await n.selectFrom("commentables").where("commentables_id","=",t).where("commentables_type","=",e).where("status","=","approved").selectAll().execute()},async pendingComments(t){return await n.selectFrom("commentables").where("commentables_id","=",t).where("commentables_type","=",e).where("status","=","pending").selectAll().execute()},async rejectedComments(t){return await n.selectFrom("commentables").where("commentables_id","=",t).where("commentables_type","=",e).where("status","=","rejected").selectAll().execute()},async upvoteComment(t,r){A(t,"upvoteComment"),A(r,"upvoteComment");let o=()=>n.selectFrom(N).where("upvoteable_id","=",t).where("upvoteable_type","=",q).where("user_id","=",r).selectAll().executeTakeFirst(),a=await o();if(a)return a;try{await n.insertInto(N).values({upvoteable_id:t,upvoteable_type:q,user_id:r,created_at:le()}).execute()}catch(i){if(!dn(i))throw i}return await o()},async removeCommentUpvote(t,r){A(t,"removeCommentUpvote"),A(r,"removeCommentUpvote"),await n.deleteFrom(N).where("upvoteable_id","=",t).where("upvoteable_type","=",q).where("user_id","=",r).execute()},async commentUpvoteCount(t){A(t,"commentUpvoteCount");let r=await n.selectFrom(N).select("count(*) as count").where("upvoteable_id","=",t).where("upvoteable_type","=",q).executeTakeFirst();return Number(r?.count)||0},async hasUpvotedComment(t,r){return A(t,"hasUpvotedComment"),A(r,"hasUpvotedComment"),!!await n.selectFrom(N).where("upvoteable_id","=",t).where("upvoteable_type","=",q).where("user_id","=",r).selectAll().executeTakeFirst()}}}import{db as fn,sql as pn,sqlDateTime as Ke}from"@stacksjs/database/runtime";function fe(e,n){if(typeof e!=="number"||!Number.isFinite(e)||e<=0)throw Error(`[orm/taggable] ${n} requires a positive numeric id (received ${String(e)})`)}function pe(e){let n=fn;return{async tags(t){return fe(t,"tags"),await n.selectFrom("taggables").where("taggable_id","=",t).where("taggable_type","=",e).selectAll().execute()},async tagCount(t){fe(t,"tagCount");let r=await n.selectFrom("taggables").select(pn`count(*) as count`).where("taggable_id","=",t).where("taggable_type","=",e).executeTakeFirst();return Number(r?.count)||0},async addTag(t,r){if(fe(t,"addTag"),!r||typeof r.name!=="string"||r.name.trim().length===0)throw Error("[orm/taggable] addTag requires a non-empty tag.name");return await n.insertInto("taggables").values({...r,taggable_id:t,taggable_type:e,slug:r.name.toLowerCase().replace(/[^a-z0-9]+/g,"-"),is_active:!0,created_at:Ke(),updated_at:Ke()}).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 mn,sqlDateTime as J}from"@stacksjs/database/runtime";function me(e){let n=mn;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:J(),updated_at:J()}).execute(),i=await a();return await n.insertInto("categorizable_models").values({categorizable_id:r,categorizable_type:e,category_id:i?.id,created_at:J(),updated_at:J()}).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 gn,sqlDateTime as yn}from"@stacksjs/database/runtime";function ge(e,n){let t=gn,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=yn();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)}}}function Ge(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 bn(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(Ge(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 wn(e){let n={};for(let[t,r]of Object.entries(e))n[R(t)]=r;return n}function Mi(e,n){let t=String(n||"").replace(/^\/+|\/+$/g,""),r=String(e).replace(/^\/+/,"");return`/api/${t?`${t}/`:""}${r}`}function Je(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 Ye(e){if(!e)return null;let n=e.attributes??{};if(Object.prototype.hasOwnProperty.call(n,"userId")||Object.prototype.hasOwnProperty.call(n,"user_id"))return"user_id";return e.belongsTo?.some((t)=>t==="User")?"user_id":null}function Di(e){return e?.ownership===!1}function Ei(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 hn(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 kn(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??=_n(n);let a=r.get(o);if(a!==o&&a in e)t[o]=e[a]}return t}function Tn(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 We=new WeakMap,Ve=new WeakMap;function be(e){let n=We.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 We.set(e,t),t}function _n(e){let n=be(e),t=Ve.get(n);if(t)return t;let r=new Map(n.map(({field:o,snake:a})=>[o,a]));return Ve.set(n,r),r}function Fi(e,n){if(!n.length)return e;let t={...e};for(let{field:r,snake:o}of be(n))if(delete t[r],o!==r)delete t[o];return t}function Ii(e,n){if(!e||n.length===0)return e;let t={...e};for(let{field:r,snake:o}of be(n))if(delete t[r],o!==r)delete t[o];return t}var Rn=["id","uuid","created_at","updated_at","deleted_at"];function $i(e,n){let t=new Map;for(let r of[...Object.keys(e??{}),...Rn]){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 ji(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 Sn={string:{get:(e)=>e!=null?String(e):null,set:(e)=>e!=null?String(e):null},number:{get:(e)=>e!=null?Number(e):null,set:(e)=>e!=null?Number(e):null},integer:{get:(e)=>e!=null?Math.trunc(Number(e)):null,set:(e)=>e!=null?Math.trunc(Number(e)):null},float:{get:(e)=>e!=null?Number.parseFloat(String(e)):null,set:(e)=>e!=null?Number.parseFloat(String(e)):null},boolean:{get:(e)=>e===1||e==="1"||e===!0||e==="true",set:(e)=>e===!0||e===1||e==="1"||e==="true"?1:0},json:{get:(e)=>e==null?null:typeof e==="string"?xn(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"?Pn(e):[],set:(e)=>e==null?null:Array.isArray(e)?JSON.stringify(e):e}},Qe=new WeakMap;function An(e,n){let t=Qe.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"?Sn[a]:a;r.push({attr:o,snake:R(o),definition:a,caster:i})}return Qe.set(e,r),r}function xn(e){try{return JSON.parse(e)}catch{return e}}function Pn(e){try{return JSON.parse(e)}catch{return[]}}function Bi(e,n,t){if(!e||typeof e!=="object"||!n)return e;let r=Object.keys(n);if(r.length===0)return e;let o=An(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 ze=new WeakMap;function Cn(e){let n=ze.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 ze.set(e,t),t}function Xe(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 Ze(e,n,t){let r=n?.attributes;if(!r||typeof r!=="object")return{valid:!0};let o=Cn(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 m=d?e[c]:l?u.default:void 0,p=Tn(f,m),y=f.validate(p);if(!y?.valid&&Array.isArray(y?.errors)&&y.errors.length>0)i=!0,a[c]=y.errors.map((b)=>u.validation?.message?.[b?.code]??b?.message??"invalid")}return i?{valid:!1,errors:a}:{valid:!0}}function vn(e,n){return`${e}\x00${On(n)}`}function Ni(e){let n=new Map;for(let t of e){let r=vn(String(t.method??""),String(t.path??""));if(!n.has(r))n.set(r,t)}return n}function On(e){return e.replace(/\{[^}]*\}/g,"{}").replace(/:[^/]+/g,"{}")}function ye(e){if(Array.isArray(e))return e.filter((n)=>typeof n==="string"&&n.length>0);return typeof e==="string"&&e?[e]:[]}function qi(e){let n=typeof e==="object"&&e!==null&&"middleware"in e,t=e?.middleware;if(!n)return{read:["auth"],write:["auth"],declared:!1};if(t&&typeof t==="object"&&!Array.isArray(t)){let o=t;return{read:"read"in o?ye(o.read):["auth"],write:"write"in o?ye(o.write):["auth"],declared:!0}}let r=ye(t);return{read:r,write:r,declared:!0}}var He=15,Mn=100;function Li(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(He),10),o=Math.min(Number.isFinite(r)?Math.max(1,r):He,Mn);return{page:t,perPage:o,offset:(t-1)*o}}function Y(e,n){let t=new URL(e.toString());return t.searchParams.set("page",String(n)),`${t.pathname}${t.search}`}function Dn(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?Y(e,n-1):null,next_page_url:o?Y(e,n+1):null};if(a!==void 0&&!Number.isNaN(a)){let c=Math.max(1,Math.ceil(a/t));u.total=a,u.last_page=c,u.first_page_url=Y(e,1),u.last_page_url=Y(e,c)}return u}function Ui(e,n,t,r,o,a){let{page:i,...s}=Dn(e,n,t,r,o,a);return{current_page:i,...s}}function Ki(e,n){return(n??e??"").toString().trim().toLowerCase()==="warn"?"warn":"deny"}function Wi(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 En(e){if(e?.ownership===!1)return null;if(e?.ownership)return e.ownership;let n=Je(e);if(n)return{field:n,resolve:async(r,o)=>{let{resolveAuthenticatedTeamId:a}=await import("@stacksjs/auth");return a(we(o))}};let t=Ye(e);if(t)return{field:t,resolve:async(r)=>r?.id??null};return null}function we(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 Fn(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 In(e="id"){return{field:e,resolve:async(n)=>n?.id??null}}function $n(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(we(t));if(a==null)return[];return(await o.where("team_id",a).get()??[]).map((s)=>s.id).filter((s)=>s!=null)}catch{return[]}}}}function jn(e="id"){return{field:e,resolve:async(n,t)=>{try{let{resolveAuthenticatedTeamId:r}=await import("@stacksjs/auth");return await r(we(t))}catch{return null}}}}function Bn(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=En(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 Nn}from"@stacksjs/router";var et=new WeakMap;function tt(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 qn(e,n){if(typeof e.find==="function")return e.find(n);let t=await e.findMany?.([n]);return tt(t??[]).get(n)}async function Ln(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=tt(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 Gi(e,n){let t=Nn();if(!t)return qn(e,n);let r=et.get(t);if(!r)r=new WeakMap,et.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(()=>{Ln(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 Zi}from"@stacksjs/database/runtime";class Un{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 he}from"@stacksjs/database/runtime";async function ns(e,n){return await he.transaction(e,n)}async function rs(e){return await he.savepoint(e)}function os(e,n){return he.transactional(e,n)}export*from"@stacksjs/model-meta";import{createModel as or,registerModel as ar}from"@stacksjs/query-builder";import{log as T}from"@stacksjs/logging/runtime";import{snakeCase as V}from"@stacksjs/strings";import{AsyncLocalStorage as Ot}from"async_hooks";import{toCursorPaginator as ir,toPaginator as sr,toSimplePaginator as ur}from"@stacksjs/pagination";function Te(e,n){let t=Se(),r=t?ke(t,"per_page"):void 0,o=t?ke(t,"page"):void 0,a=e!==void 0?Math.max(1,Math.floor(e)):Math.min(100,Math.max(1,r??15)),i=Math.max(1,Math.floor(n??o??1));return{perPage:a,page:i}}function _e(e,n){let t=Se(),r=t?rt(t,"cursor"):void 0,o=t?ke(t,"per_page"):void 0,a=e!==void 0?Math.max(1,Math.floor(e)):Math.min(100,Math.max(1,o??15)),s=nt(n!==void 0?n:r??null);return{perPage:a,cursor:s}}function nt(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 Re(e){let n=Se();if(!n)return e;let t=(()=>{try{return new URL(n.url)}catch{return null}})();if(!t)return e;let r=t.pathname;if(e.path=r,"next_cursor"in e)return e.next_page_url=e.next_cursor!==null?v(t,{cursor:e.next_cursor}):null,e.prev_page_url=e.prev_cursor!==null?v(t,{cursor:e.prev_cursor}):null,e;let o=e.current_page;if(e.prev_page_url=o>1?v(t,{page:o-1}):null,"total"in e){let a=e.last_page;e.next_page_url=o<a?v(t,{page:o+1}):null,e.first_page_url=v(t,{page:1}),e.last_page_url=v(t,{page:a})}else e.next_page_url=e.has_more_pages?v(t,{page:o+1}):null;return e}function v(e,n){let t=new URL(e.toString());for(let[r,o]of Object.entries(n))t.searchParams.set(r,String(o));return`${t.pathname}${t.search}`}var D;function Se(){if(D===null)return;if(D===void 0)try{let n=Yt("@stacksjs/router");if(typeof n.getCurrentRequest==="function")D=n.getCurrentRequest;else{D=null;return}}catch{D=null;return}return D()}function ke(e,n){let t=rt(e,n);if(t===void 0)return;let r=Number(t);return Number.isFinite(r)?r:void 0}function rt(e,n){let t=e.query?.[n];if(t===void 0)return;return Array.isArray(t)?t[0]:t}import{createRequire as Kn}from"module";import{db as Wn}from"@stacksjs/database/runtime";var Vn=Kn(import.meta.url);function ot(e){let n=Wn;return{async createStripeUser(t,r){let{manageCustomer:o}=await import("@stacksjs/payments");return await o.createStripeCustomer(t,r)},async updateStripeUser(t,r){let{manageCustomer:o}=await import("@stacksjs/payments");return await o.updateStripeCustomer(t,r)},async deleteStripeUser(t){let{manageCustomer:r}=await import("@stacksjs/payments");return await r.deleteStripeUser(t)},async createOrGetStripeUser(t,r){let{manageCustomer:o}=await import("@stacksjs/payments");return await o.createOrGetStripeUser(t,r)},async retrieveStripeUser(t){let{manageCustomer:r}=await import("@stacksjs/payments");return await r.retrieveStripeUser(t)},async defaultPaymentMethod(t){let{managePaymentMethod:r}=await import("@stacksjs/payments");return await r.retrieveDefaultPaymentMethod(t)},async setDefaultPaymentMethod(t,r){let{managePaymentMethod:o}=await import("@stacksjs/payments");return await o.setDefaultPaymentMethod(t,r)},async addPaymentMethod(t,r){let{managePaymentMethod:o}=await import("@stacksjs/payments");return await o.addPaymentMethod(t,r)},async paymentMethods(t,r){let{managePaymentMethod:o}=await import("@stacksjs/payments");return await o.listPaymentMethods(t,r)},async newSubscription(t,r,o,a={}){let{manageSubscription:i}=await import("@stacksjs/payments"),s=await i.create(t,r,o,a),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={}){let{manageSubscription:a}=await import("@stacksjs/payments");return{subscription:await a.cancel(r,o)}},async activeSubscription(t){let{manageSubscription:r}=await import("@stacksjs/payments"),o=await n.selectFrom("subscriptions").where("user_id","=",t.id).where("provider_status","=","active").selectAll().executeTakeFirst();if(o){let a=await r.retrieve(t,o.provider_id||"");return{subscription:o,providerSubscription:a}}return},async checkout(t,r,o={}){let{manageCheckout:a,manageCustomer:i}=await import("@stacksjs/payments"),s={};if(o.enableTax)s.automatic_tax={enabled:!0},delete o.enableTax;if(o.allowPromotions)s.allow_promotion_codes=!0,delete o.allowPromotions;let l={...{mode:"payment",customer:(await i.createOrGetStripeUser(t,{})).id,line_items:r.map((f)=>({price:f.priceId,quantity:f.quantity||1}))},...s,...o};return await a.create(t,l)},async createSetupIntent(t,r={}){let{manageSetupIntent:o}=await import("@stacksjs/payments");return await o.create(t,r)},async subscriptionHistory(t){let{manageInvoice:r}=await import("@stacksjs/payments");return await r.list(t)},async transactionHistory(t){let{manageTransaction:r}=await import("@stacksjs/payments");return await r.list(t)},async connectAccount(t,r={}){let o=r.accountColumn||"stripe_account_id",a=(t._attributes??t)[o];if(!a)return null;let i=await L();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 L();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 L()).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 L()).accounts.retrieve(u),f=!!l.charges_enabled,d=!!l.payouts_enabled,m=r.modelTable||e;return await n.updateTable(m).set({[a]:f,[i]:d}).where("id","=",Number(s.id)).execute(),{chargesEnabled:f,payoutsEnabled:d}},async chargeWithSplit(t,r){let o=await L(),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)})}}}function L(){let e=globalThis.process?.env?.STRIPE_SECRET_KEY;if(!e)throw Error("Stripe Connect: STRIPE_SECRET_KEY not configured");let n;try{n=Vn("stripe")}catch{throw Error("Stripe Connect is being used but the `stripe` package is not installed. It is an opt-in dependency - run `bun add stripe` to enable Stripe Connect.")}return new n(e,{apiVersion:"2026-06-24.dahlia"})}function at(){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 Qn,sqlDateTime as zn}from"@stacksjs/database/runtime";import{log as E}from"@stacksjs/logging";var X="deleted_at";function it(e,n="id"){return{async softDelete(t){let r=zn(),o=e.where(n,t);if(typeof o?.update==="function")return await o.update({[X]:r}),!0;return!1},async restore(t){let r=e.where(n,t).withTrashed();if(typeof r?.update==="function")return await r.update({[X]:null}),!0;return!1},async forceDelete(t){let r=e.where(n,t),o=typeof r?.withTrashed==="function"?r.withTrashed():r;if(typeof o?.delete==="function")return Qn(await o.delete())>0;return!1},withTrashed(){return typeof e.query==="function"?e.query():e},onlyTrashed(){let t=typeof e.query==="function"?e.query():e;if(typeof t?.whereNotNull==="function")return t.whereNotNull(X);return t?.where?.(X,"!=",null)??t}}}function st(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 Hn(e,n){let t=e.hasMany??[],r=e.hasOne??[],o=t.some((l)=>Ae(l,n,!0)),a=r.some((l)=>Ae(l,n,!1));if(!o&&!a)return E.warn(`[orm] soft-delete cascade: '${n}' is not a declared hasMany/hasOne relation - skipping`),null;let s=(o?t:r).find((l)=>Ae(l,n,o))??null;if(!s)return null;let c=globalThis[s];if(!c)return E.warn(`[orm] soft-delete cascade: model '${s}' is not yet on globalThis - skipping cascade for '${n}'`),null;return{className:s,model:c}}function Ae(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 Gn(e,n,t,r,o){try{let a=t.where;if(typeof a!=="function"){E.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"){E.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"){E.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 m=d?.[f];if(m!=null)await i.call(t,m)}}}catch(a){if(E.warn(`[orm] soft-delete cascade ${o} on ${e}#${String(n)} failed`,{error:a}),process.env.STACKS_ORM_CASCADE_SWALLOW!=="true")throw a}}async function U(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=Hn(e,i);if(!s)continue;await Gn(s.className,t,s.model,a,r)}}import{sqlDateTime as Xn}from"@stacksjs/database/runtime";import{log as Jn}from"@stacksjs/logging";var Yn=[/^password$/i,/^password_hash$/i,/^api_key$/i,/_token$/i,/_secret$/i,/^remember_token$/i],ut=null;async function ct(){if(ut!=null)return ut;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 lt(){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 dt(e){if(!e||typeof e!=="object")return null;let n={};for(let[t,r]of Object.entries(e)){if(Yn.some((o)=>o.test(t)))continue;n[t]=r}return n}function ft(e,n,t){Jn.warn(`[orm] ${e} row write failed for ${n}: ${t?.message??String(t)}`)}var Zn="activities";function pt(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 er(e,n,t=[]){let r=dt(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 tr(e,n,t){return t==null?`${e} was ${n}`:`${e} ${String(t)} was ${n}`}async function nr(e){try{let{db:n}=await import("@stacksjs/database/runtime");await n.insertInto(Zn).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:Xn()}).executeTakeFirst()}catch(n){ft("activity",`${e.subject_type}#${String(e.subject_id)}`,n)}}async function rr(e){let{attributes:n,event:t,modelName:r,options:o,primaryKey:a}=e,i=n?.[a]??null,s=await ct();await nr({type:`${r.toLowerCase()}.${t}`,description:tr(r,t,i),subject_type:r,subject_id:i,properties:er(n,o,e.hidden),causer:s==null?null:`User:${String(s)}`,user_id:s,ip_address:await lt()})}function xe(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 mt(e,n,t,r,o=[]){if(n==="Activity")return;let a=e,i=async(f)=>typeof a.find==="function"?xe(await a.find(f)):null,s=async(f,d)=>{await rr({modelName:n,event:f,attributes:d,primaryKey:t,options:r,hidden:o})},u=e.create;if(typeof u==="function")e.create=async function(...f){let d=await u.apply(this,f);return await s("created",xe(d)),d};let c=e.update;if(typeof c==="function")e.update=async function(f,d){let m=await c.call(this,f,d);return await s("updated",xe(m)??await i(f)),m};let l=e.delete;if(typeof l==="function")e.delete=async function(f){let d=await i(f),m=await l.call(this,f);return await s("deleted",d??{[t]:f}),m}}var ee,Mt=new Ot;function M(){return Mt.getStore()?.suppressed===!0}function O(e){return Promise.resolve(Mt.run({suppressed:!0},e))}var Dt=new Ot;function cr(){return Dt.getStore()?.suppressed===!0}function lr(e){return Promise.resolve(Dt.run({suppressed:!0},e))}var Me=Symbol.for("stacks.orm.modelDefinition");class Et 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 gt=new Set,dr=4096,yt=Object.create(null),bt=0;function W(e){let n=yt[e];if(n!==void 0)return n;let t=V(e);if(bt<dr)yt[e]=t,bt++;return t}function fr(e,n){let t=typeof e==="string"?e.slice(0,80):String(e),r=`${typeof e}:${t}`;if(gt.has(r))return;gt.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 pr={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 fr(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 mr(e){return typeof e==="string"?pr[e]:e}var wt=new WeakMap;function Ft(e){let n=Object.keys(e),t=wt.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:mr(a)}});return wt.set(e,r),r}function ht(e,n,t){if(!e||typeof e!=="object")return e;let r={...e};for(let{attr:o,caster:a}of Ft(n))if(o in r)r[o]=a[t].call(a,r[o]);return r}function Z(e){return e==="_attributes"||e==="_original"||e==="_definition"||e==="_hasSaved"||e==="_relations"}var kt=Symbol.for("stacks.modelInstanceProxy"),Tt,_t=new WeakMap,gr={tags:{bag:"_taggable",mode:"id"},tagCount:{bag:"_taggable",mode:"id"},addTag:{bag:"_taggable",mode:"id"},activeTags:{bag:"_taggable",mode:"id"},inactiveTags:{bag:"_taggable",mode:"id"},removeTag:{bag:"_taggable",mode:"id"},categories:{bag:"_categorizable",mode:"id"},categoryCount:{bag:"_categorizable",mode:"id"},addCategory:{bag:"_categorizable",mode:"id"},activeCategories:{bag:"_categorizable",mode:"id"},inactiveCategories:{bag:"_categorizable",mode:"id"},removeCategory:{bag:"_categorizable",mode:"id"},comments:{bag:"_commentable",mode:"id"},commentCount:{bag:"_commentable",mode:"id"},addComment:{bag:"_commentable",mode:"id"},approvedComments:{bag:"_commentable",mode:"id"},pendingComments:{bag:"_commentable",mode:"id"},rejectedComments:{bag:"_commentable",mode:"id"},likes:{bag:"_likeable",mode:"id"},likeCount:{bag:"_likeable",mode:"id"},like:{bag:"_likeable",mode:"id"},unlike:{bag:"_likeable",mode:"id"},isLiked:{bag:"_likeable",mode:"id"},createStripeUser:{bag:"_billable",mode:"model"},updateStripeUser:{bag:"_billable",mode:"model"},deleteStripeUser:{bag:"_billable",mode:"model"},createOrGetStripeUser:{bag:"_billable",mode:"model"},retrieveStripeUser:{bag:"_billable",mode:"model"},defaultPaymentMethod:{bag:"_billable",mode:"model"},setDefaultPaymentMethod:{bag:"_billable",mode:"model"},addPaymentMethod:{bag:"_billable",mode:"model"},paymentMethods:{bag:"_billable",mode:"model"},newSubscription:{bag:"_billable",mode:"model"},updateSubscription:{bag:"_billable",mode:"model"},cancelSubscription:{bag:"_billable",mode:"model"},activeSubscription:{bag:"_billable",mode:"model"},checkout:{bag:"_billable",mode:"model"},createSetupIntent:{bag:"_billable",mode:"model"},subscriptionHistory:{bag:"_billable",mode:"model"},transactionHistory:{bag:"_billable",mode:"model"},connectAccount:{bag:"_billable",mode:"model"},createConnectAccount:{bag:"_billable",mode:"model"},connectOnboardLink:{bag:"_billable",mode:"model"},syncConnectStatus:{bag:"_billable",mode:"model"},chargeWithSplit:{bag:"_billable",mode:"model"},generateTwoFactorForModel:{bag:"_twoFactor",mode:"model"},verifyTwoFactorCode:{bag:"_twoFactor",mode:"model"}};function yr(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 x(e,n){if(!e||typeof e!=="object")return e;let t=e;if(t[kt])return e;let r=t._attributes;if(!r||typeof r!=="object")return e;if(n){for(let{attr:a,caster:i}of Ft(n))if(Object.hasOwn(r,a))r[a]=i.get.call(i,r[a])}let o=n?_t.get(n):Tt;if(!o)if(o={get(a,i,s){let u=a;if(i===kt)return!0;if(i==="saveAsync")return async function(){let l=u._definition,f=l?.set;if(f&&typeof u.isDirty==="function"){for(let[m,p]of Object.entries(f)){if(typeof p!=="function")continue;if(!u.isDirty(m))continue;let y=p(u._attributes),b=y&&typeof y.then==="function"?await y:y;u._attributes[m]=b}let d=l.set;l.set={};try{return u.save()}finally{l.set=d}}return u.save()};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[m,p]of Object.entries(f)){if(typeof p!=="function")continue;if(!u.isDirty(m))continue;let y=p(u._attributes);if(y&&typeof y.then==="function")throw Error(`Setter for "${m}" returned a Promise - use \`saveAsync()\` instead of \`save()\` when a model has async setters.`);u._attributes[m]=y}let d=l.set;l.set={};try{return u.save()}finally{l.set=d}}return u.save()};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 m=u._attributes;if(!m)return null;if(d===!0){let h={...m};if(m.id!=null)h.id=String(m.id);return h}let p={},y=d.displayable?.length?d.displayable:[...d.searchable??[],...d.filterable??[],...d.sortable??[],"id"],b=d.denormalize??{},w=u._relations;for(let h of y){let k=V(h),S=m[k]??m[h];if(S!==void 0){p[k]=S;continue}let De=b[h]??b[k];if(De){p[k]=yr(w,De);continue}p[k]=void 0}if(m.id!=null)p.id=String(m.id);return p};if(typeof i==="string"&&!Z(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 m=f[i];if(Array.isArray(m))return m.map((p)=>x(p,n));return m&&typeof m==="object"?x(m,n):m}let d=gr[i];if(d){let y=u._definition?.__traitMethods?.[d.bag]?.[i];if(typeof y==="function")return d.mode==="model"?(...b)=>y(s,...b):(...b)=>y(u.id,...b)}if(l){let m=W(i);if(m!==i&&Object.hasOwn(l,m))return l[m]}}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"&&!Z(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=W(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"&&!Z(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=W(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"&&!Z(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)_t.set(n,o);else Tt=o;return new Proxy(e,o)}var It=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}),br={paginate:sr,simplePaginate:ur,cursorPaginate:ir},Rt=Symbol.for("stacks.queryBuilderProxy");function St(e,n,t){if(It[n]){if(Array.isArray(e))return e.map((o)=>x(o,t));let r=br[n];if(r&&e&&Array.isArray(e.data)){let o=e.data.map((i)=>x(i,t)),a=r({...e,data:o});return Re(a)}if(e&&Array.isArray(e.data))return{...e,data:e.data.map((o)=>x(o,t))};return x(e,t)}if(e&&typeof e==="object"&&typeof e.get==="function")return $t(e,t);return e}function $t(e,n){if(!e||typeof e!=="object")return e;if(e[Rt])return e;return new Proxy(e,{get(t,r,o){if(r===Rt)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}=Te(s[0],s[1]);u=[l,f]}else if(i==="cursorPaginate"){let{perPage:l,cursor:f}=_e(s[0],s[1]);u=[l,f,s[2],s[3]]}let c=a.apply(t,u);if(!It[i]&&c===t)return o;if(c&&typeof c.then==="function")return c.then((l)=>St(l,i,n));return St(c,i,n)}}})}function wr(e,n){let t=(i)=>Array.isArray(i)?i.map((s)=>x(s,n)):x(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","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 $t(c,n)}}}class jt 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 Ce 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 hr=new Set(["id","created_at","updated_at","deleted_at","uuid"]),At=new WeakMap;function kr(e){let n=At.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=W(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 At.set(e,a),a}function K(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}=kr(r);for(let i in n){if(!Object.hasOwn(n,i))continue;let s=W(i);if(hr.has(s))continue;if(a.has(s))throw new Ce(e.name,i,"guarded");if(s.endsWith("_id"))continue;if(!o.has(s))throw new Ce(e.name,i,"not-fillable")}return n}async function ve(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 Tr(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 m=e.find;return typeof m==="function"?await m.call(e,c):null}K(n,l);let f=await ve(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 ve(n,l);await o("forceUpdate").call(e,t,c).update(f);let d=e.find;return typeof d==="function"?await d.call(e,c):null};if(typeof e.forceCreate!=="function")e.forceCreate=async function(c){if(!c||typeof c!=="object"||Array.isArray(c))throw Error(`[ORM] ${n.name}.forceCreate requires a data object`);let l=e.make;if(typeof l==="function"){let f=await l.call(e);if(f&&typeof f.forceFill==="function"&&typeof f.save==="function")return f.forceFill(c),await f.save()??f}if(typeof r!=="function")throw Error(`[ORM] ${n.name}.forceCreate cannot create: the underlying query builder did not expose create()`);return await r.call(e,c)};if(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 jt(n.name,c);return l};if(typeof e.exists!=="function")e.exists=async function(c){if(c==null)return!1;let l=o("exists").call(e,t,c);if(typeof l.count==="function"){let d=await l.count();return Number(d)>0}let f=e.find;return typeof f==="function"?await f.call(e,c)!=null:!1};if(typeof e.firstOrCreate!=="function")e.firstOrCreate=async function(c,l={}){if(!c||typeof c!=="object"||Array.isArray(c))throw Error(`[ORM] ${n.name}.firstOrCreate requires a where-attrs object`);let f=o("firstOrCreate").call(e,c),d=typeof f.first==="function"?await f.first():await f;if(d)return d;let m={...c,...l};return K(n,m),await i("firstOrCreate").call(e,m)};if(typeof e.updateOrCreate!=="function")e.updateOrCreate=async function(c,l){if(!c||typeof c!=="object"||Array.isArray(c))throw Error(`[ORM] ${n.name}.updateOrCreate requires a where-attrs object`);if(!l||typeof l!=="object"||Array.isArray(l))throw Error(`[ORM] ${n.name}.updateOrCreate requires a values object`);let f=o("updateOrCreate").call(e,c),d=typeof f.first==="function"?await f.first():await f;if(d){K(n,l);let p=d[t];await o("updateOrCreate").call(e,t,p).update(l);let y=e.find;return typeof y==="function"?await y.call(e,p):{...d,...l}}let m={...c,...l};return K(n,m),await i("updateOrCreate").call(e,m)};if(typeof e.count!=="function")e.count=async function(){let c=e;if(typeof c.query==="function"){let d=c.query();if(typeof d?.count==="function"){let m=await d.count();return Number(m)||0}}let{all:l,get:f}=e;if(typeof l==="function")return(await l.call(e)||[]).length;if(typeof f==="function")return(await f.call(e)||[]).length;return 0};if(typeof e.pluck!=="function")e.pluck=async function(c){if(!c||typeof c!=="string")throw Error(`[ORM] ${n.name}.pluck requires a column name`);let l=e.all;return((typeof l==="function"?await l.call(e):[])||[]).map((d)=>d?.[c])};if(typeof e.whereIn!=="function")e.whereIn=async function(c,l){if(!c||typeof c!=="string")throw Error(`[ORM] ${n.name}.whereIn requires a column name`);if(!Array.isArray(l))throw Error(`[ORM] ${n.name}.whereIn requires an array of values`);if(l.length===0)return[];let f=e.where;if(typeof f!=="function")return[];let d=f.call(e,c,"in",l);if(d&&typeof d.get==="function")return await d.get();return await d};let 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,m=typeof d.query==="function"?d.query():d;if(typeof m?.orderBy==="function"){let w=m.orderBy(f,l);if(typeof w.first==="function")return await w.first();if(typeof w.get==="function")return(await w.get())?.[0]??null}let p=e.all;if(typeof p!=="function")return null;return[...await p.call(e)||[]].sort((w,h)=>{let k=w?.[f],S=h?.[f];if(k===S)return 0;return(k>S?1:-1)*(l==="desc"?-1:1)})[0]??null};let u=Lt(n.traits?.useSearch,n);if(u){let c=u.index??n.table??V(`${n.name}s`);if(typeof e.search!=="function")e.search=function(l,f){return Sr(e,c,l,f,u.searchable)};if(typeof e.makeAllSearchable!=="function")e.makeAllSearchable=async function(l=500){let f=e.all;if(typeof f!=="function")throw Error(`[ORM] ${n.name}.makeAllSearchable cannot run: the underlying query builder did not expose all()`);let{useSearchEngine:d}=await import("@stacksjs/search-engine"),m=d(),p=0,y=e.query;if(typeof y==="function")try{let h=y.call(e);if(h&&typeof h.chunk==="function")return await h.chunk(l,async(k)=>{let S=await Oe(k,u);if(S.length>0)await m.addDocuments(c,S);p+=S.length}),p}catch{}let b=await f.call(e)||[],w=await Oe(b,u);if(w.length>0)await m.addDocuments(c,w);return w.length};if(typeof e.removeAllFromSearch!=="function")e.removeAllFromSearch=async function(){let{useSearchEngine:l}=await import("@stacksjs/search-engine"),f=l();if(typeof f.deleteAllDocuments==="function"){await f.deleteAllDocuments(c);return}let d=e.all,m=typeof d==="function"?await d.call(e)||[]:[],p=l();for(let y of m){let b=y?.id??y?._attributes?.id;if(b!=null)await p.deleteDocument(c,Number(b))}}}}async function Oe(e,n){if(e.length===0)return[];if(typeof n.shapeMany==="function"){let r=await n.shapeMany(e);if(!Array.isArray(r)||r.length!==e.length)throw TypeError(`[orm/search] shapeMany returned ${Array.isArray(r)?r.length:typeof r} documents for ${e.length} rows. It must return one document per row, in order, or documents are indexed under the wrong ids.`);return r.filter(Boolean)}return(await Promise.all(e.map((r)=>Rr(r,n)))).filter(Boolean)}function Bt(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 _r(e,n){if(!e||n.size===0)return e;let t={};for(let[r,o]of Object.entries(e))if(!n.has(r))t[r]=o;return t}async function Rr(e,n){if(typeof n.shape==="function")try{return await n.shape(e)}catch{return}let t=e?.toSearchableObject?.();if(t!==void 0)return t;return _r(e?._attributes??(typeof e?.toJSON==="function"?e.toJSON():null),n.hidden??new Set)}function Sr(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 Nt(e){let n=V(e);return n===e?[e]:[e,n]}async function Pe(e,n){if(!e||typeof e!=="object")return;let t=e._attributes??e;for(let r of n)for(let o of Nt(r)){if(!(o in t))continue;let a=t[o];if(!I(a))continue;t[o]=await ae(a)}}function Ar(e,n){if(n.length===0)return;let t=async(s)=>{if(Array.isArray(s)){for(let u of s)await Pe(u,n);return s}if(s&&typeof s==="object"&&Array.isArray(s.data)){for(let u of s.data)await Pe(u,n);return s}if(s)await Pe(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","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 xr(e,n){if(n.length===0)return;let t=async(o)=>{if(!o||typeof o!=="object"||Array.isArray(o))return o;let a={...o};for(let i of n)for(let s of Nt(i))if(s in a)a[s]=await oe(a[s]);return a},r=["create","firstOrCreate","updateOrCreate","forceCreate"];for(let o of r){let a=e[o];if(typeof a!=="function")continue;e[o]=async function(...i){if(i[0]=await t(i[0]),i[1])i[1]=await t(i[1]);return await a.apply(this,i)}}for(let o of["update","forceUpdate"]){let a=e[o];if(typeof a!=="function")continue;e[o]=async function(i,s){let u=await t(s);return await a.call(this,i,u)}}}function Pr(e,n){let t=e.create;if(typeof t==="function")e.create=async function(r,...o){K(n,r);let a=await ve(n,r);return await t.call(this,a,...o)};for(let r of["firstOrCreate","updateOrCreate"]){let o=e[r];if(typeof o!=="function")continue}}function Cr(e,n){if(!Xe(n))return;let t=String(n?.name??e.name??"Model"),r=(i,s)=>{if(cr())return;if(!i||typeof i!=="object"||Array.isArray(i))return;let u=Ze(i,n,s);if(!u.valid)throw new Et(t,u.errors)},o=e.create;if(typeof o==="function")e.create=async function(i,...s){return r(i,"creating"),await o.call(this,i,...s)};let a=e.update;if(typeof a==="function")e.update=async function(i,s,...u){return r(s,"updating"),await a.call(this,i,s,...u)}}function vr(e,n){let t=["create","firstOrCreate","updateOrCreate"];for(let o of t){let a=e[o];if(typeof a==="function")e[o]=async function(...i){if(T.debug(`[orm] ${o.charAt(0).toUpperCase()+o.slice(1)} ${String(e.name||"unknown")}`,i[0]),i[0]&&typeof i[0]==="object"&&!Array.isArray(i[0]))i[0]=ht(i[0],n,"set");return await a.apply(this,i)}}let r=e.update;if(typeof r==="function")e.update=async function(o,a){let i=a&&typeof a==="object"&&!Array.isArray(a)?ht(a,n,"set"):a;return await r.call(this,o,i)}}var xt=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 qt(e){T.debug(`[orm] Defining model: ${e.name} (table: ${e.table})`);for(let y of Object.keys(e.traits??{}))if(!xt.has(y))T.warn(`[orm] Model '${e.name}' declares an unknown trait '${y}'. It does nothing. Known traits: ${[...xt].sort().join(", ")}.`);let n=Or(e),t=Dr(e),r=Mr(n,t),o=Er(e);e.__traitMethods=o;let a=e.traits;if((a?.useAuth||a?.authenticatable)&&e.name!=="PersonalAccessToken"){let y=e.morphMany;if(!y||!("tokenable"in y))e.morphMany={...y??{},tokenable:"PersonalAccessToken"}}let i=r?{...e,hooks:{...e.hooks,...r}}:e,u=or(i);if(wr(u,e.casts),Tr(u,i),Pr(u,i),e.casts&&Object.keys(e.casts).length>0)vr(u,e.casts);let c=ie(e);if(c.length>0)xr(u,c),Ar(u,c);let l=e.traits?.useSoftDeletes;if(l)Fr(u,i,l);let f=e.traits?.useAudit;if(f){let y=Le(f);Ue(u,e.name,e.primaryKey||"id",y)}let d=pt(e.traits?.useActivityLog);if(d)mt(u,e.name,e.primaryKey||"id",d,[...Bt(e)]);Cr(u,i);let m=u;m.withoutValidation=function(y){return lr(y)},m.withoutEvents=function(y){return O(y)};for(let y of["create","update","firstOrCreate","updateOrCreate","forceCreate","forceUpdate","delete","forceDelete","softDelete","restore"]){let b=u[y];if(typeof b!=="function")continue;let w=`${y}Quietly`;if(typeof u[w]==="function")continue;u[w]=function(...h){return O(()=>b.apply(u,h))}}let p=Object.assign(u,o,{...e,getDefinition:()=>e,_isStacksModel:!0});return ar(e.name,p),Object.defineProperty(p,Me,{value:e,enumerable:!1,configurable:!0}),p}function Or(e){let n=e.traits?.observe;if(!n)return;let t=e.name.toLowerCase(),r=(d)=>{let m=d?.attributes;if(!m||typeof m!=="object")return d;let p=e.primaryKey||"id",y={...m};if(y[p]===void 0&&d[p]!==void 0)y[p]=d[p];return y},o=async(d,m)=>{if(M())return;try{let{dispatch:p}=ee??=await import("@stacksjs/events");await p(d,m)}catch(p){if(p&&typeof p==="object"&&"code"in p&&p.code==="MODULE_NOT_FOUND")return;if(console.error(`[ORM] Event '${d}' handler error:`,p),process.env.STACKS_ORM_EVENT_ERRORS!=="swallow")throw p}},a=e.traits?.broadcastOn,i=e.traits?.broadcastWith,s=typeof a==="function"&&typeof i==="function",u=async(d,m)=>{if(!s)return;if(M())return;try{let p=a(m),y=Array.isArray(p)?p:[p],b=i(m),h=(await import("@stacksjs/realtime").catch(()=>null))?.broadcast;if(typeof h!=="function")return;for(let k of y){if(typeof k!=="string"||k.length===0)continue;await h(k,d,b)}}catch(p){if(p&&typeof p==="object"&&"code"in p&&p.code==="MODULE_NOT_FOUND")return;if(console.error(`[ORM] Broadcast '${d}' handler error:`,p),process.env.STACKS_ORM_BROADCAST_ERRORS==="throw")throw p}},c=async(d,m)=>{if(M())return!0;let p;try{p=ee??=await import("@stacksjs/events");let{dispatchAndCollect:y}=p,b=await y(d,m);if(b.some((h)=>h.ok&&h.value===!1))return!1;let w=b.find((h)=>!h.ok);if(w&&!w.ok)throw w.error}catch(y){if(!p&&y&&typeof y==="object"&&"code"in y&&y.code==="MODULE_NOT_FOUND")return!0;if(console.error(`[ORM] Before-event '${d}' handler error:`,y),process.env.STACKS_ORM_EVENT_ERRORS!=="swallow")throw y}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 m=r(d);await o(`${t}:created`,m),await o(`${t}:saved`,m),await u(`${t}:created`,d)};if(l.includes("update"))f.beforeUpdate=async(d)=>{if(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 m=r(d);await o(`${t}:updated`,m),await o(`${t}:saved`,m),await u(`${t}:updated`,d)};if(l.includes("delete"))f.beforeDelete=async(d)=>{if(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 Mr(...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 Lt(e,n){if(!e)return null;let t=e===!0?{}:typeof e==="object"?{...e}:null;if(!t)return null;if(n)t.hidden=Bt(n);return t}function Dr(e){let n=Lt(e.traits?.useSearch,e);if(!n)return;let t=n,r=t.index??e.table??V(`${e.name}s`);async function o(s){if(typeof t.shapeMany==="function")try{let[l]=await Oe([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=x(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 Ct(r,u,e.name)}return}await Ct(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 vt(r,Number(u),e.name)}return}await vt(r,Number(u),e.name)}}}var Pt=new Map;function Ut(e,n){let t=Pt.get(e)??0;if(Pt.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 Ct(e,n,t){try{let{useSearchEngine:r}=await import("@stacksjs/search-engine");await r().addDocument(e,n)}catch(r){Ut(`index:${t}`,`Failed to index ${t}: ${r.message}`)}}async function vt(e,n,t){try{let{useSearchEngine:r}=await import("@stacksjs/search-engine");await r().deleteDocument(e,n)}catch(r){Ut(`remove:${t}`,`Failed to remove ${t}#${n}: ${r.message}`)}}function Er(e){let n={},{table:t,traits:r}=e;if(!r)return n;if(r.taggable)n._taggable=pe(t);if(r.categorizable)n._categorizable=me(t);if(r.commentable)n._commentable=de(t);if(r.billable)n._billable=ot(t);if(r.likeable){let a=typeof r.likeable==="object"?r.likeable:void 0;n._likeable=ge(t,a)}let o=r.useAuth||r.authenticatable;if(typeof o==="object"&&o&&"useTwoFactor"in o&&o.useTwoFactor)n._twoFactor=at();return n}function Fr(e,n,t){let r=it(e,n.primaryKey||"id"),o=st(t),a=n,i=n.name.toLowerCase(),s=n.traits?.observe!=null&&n.traits?.observe!==!1,u=async(m)=>{if(!s||M())return!0;try{let{dispatchAsync:p}=ee??=await import("@stacksjs/events"),y=await p(`${i}:restoring`,{id:m});if(Array.isArray(y)&&y.some((b)=>b===!1))return!1}catch(p){if(p?.code!=="MODULE_NOT_FOUND")console.error(`[ORM] Before-event '${i}:restoring' handler error:`,p)}return!0},c=async(m)=>{if(!s||M())return;try{let{dispatch:p}=ee??=await import("@stacksjs/events");await p(`${i}:restored`,{id:m})}catch(p){if(p?.code!=="MODULE_NOT_FOUND")console.error(`[ORM] Event '${i}:restored' handler error:`,p)}},l=process.env.STACKS_ORM_CASCADE_SWALLOW!=="true",f=async(m)=>{if(!o.cascade?.length||!l){let y=await r.softDelete(m);if(y&&o.cascade?.length)await U(a,o,m,"softDelete");return y}let{db:p}=await import("@stacksjs/database/runtime");return await p.transaction(async()=>{let y=await r.softDelete(m);if(y)await U(a,o,m,"softDelete");return y})},d=async(m)=>{if(!await u(m))return!1;if(!o.cascade?.length||!l){let w=await r.restore(m);if(w){if(o.cascade?.length)await U(a,o,m,"restore");await c(m)}return w}let{db:y}=await import("@stacksjs/database/runtime"),b=await y.transaction(async()=>{let w=await r.restore(m);if(w)await U(a,o,m,"restore");return w});if(b)await c(m);return b};e.softDelete=f,e.restore=d,e.forceDelete=r.forceDelete,e.withTrashed=r.withTrashed,e.onlyTrashed=r.onlyTrashed,e.delete=f}function Ir(e){if(e==null)return e;if(Array.isArray(e))return e.map((t)=>Ir(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 $r=["belongsTo","hasOne","hasMany","belongsToMany","morphMany","morphOne"],jr=["traits","dashboard"];function Br(e){let n=e?.[Me];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 Nr(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 Lr(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 $r){let i=Nr(e[a],n[a]);if(i)t[a]=i}for(let a of jr){let i=e[a],s=n[a];if(i&&s&&typeof i==="object"&&typeof s==="object")t[a]={...i,...s}}return t}function Bs(e,n){return qt(Lr(Br(e),n))}import Gr from"process";import{log as Jr}from"@stacksjs/logging";import{path as _}from"@stacksjs/path";import{fs as Q}from"@stacksjs/storage";import{Database as Ur}from"bun:sqlite";import{existsSync as Kr,readdirSync as Wr,readFileSync as Vr}from"fs";function Qr(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 Hr(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 Kt(e,n="sqlite"){let t=[];if(!Kr(e))return{tables:[],errors:t};let r;try{r=Wr(e).filter((a)=>a.endsWith(".sql")).sort()}catch(a){return{tables:[],errors:[{file:e,error:a.message}]}}let o=new Ur(":memory:");try{for(let s of r){let u=`${e}/${s}`,c;try{c=Vr(u,"utf-8")}catch(f){t.push({file:u,error:f.message});continue}let l=Hr(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)=>!Qr(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 Yr(e){if(e)return e;let n=String(Gr.env.DB_CONNECTION??"").toLowerCase();return n==="postgres"||n==="mysql"?n:"sqlite"}function te(e){return e==="postgres"?"boolean":"number"}function P(e){return e.replace(/([A-Z]+)([A-Z][a-z])/g,"$1_$2").replace(/([a-z\d])([A-Z])/g,"$1_$2").toLowerCase()}function Xr(e,n){let t=e.default;if(typeof t==="boolean")return te(n);if(typeof t==="number")return"number";if(typeof t==="string")return"string";return"unknown"}function Zr(e){let n=e.validation;if(!n||typeof n!=="object")return null;let t=n.rule;return t&&typeof t==="object"?t:null}function eo(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 to(e,n){let t=Zr(e),r=eo(t);if(r!==null)return e.nullable===!0?`${r} | null`:r;let o=typeof e.type==="string"?e.type.toLowerCase():String(t?.name??"").toLowerCase(),a=(()=>{switch(o){case"string":case"text":case"longtext":case"mediumtext":case"tinytext":case"char":case"varchar":case"enum":case"uuid":case"date":case"datetime":case"timestamp":case"timestamptz":case"password":case"time":case"year":return"string";case"number":case"integer":case"int":case"tinyint":case"smallint":case"mediumint":case"float":case"double":case"decimal":case"numeric":return"number";case"bigint":return"number | bigint";case"boolean":case"bool":return te(n);case"json":case"jsonb":return"unknown";case"binary":case"blob":case"bytea":return"Uint8Array";case"unix":return"number";case"array":return"unknown[]";case"object":return"Record<string, unknown>";default:return Xr(e,n)}})();return e.nullable===!0?`${a} | null`:a}function no(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[`${P(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[`${P(a.model)}_id`]="number"}}return n}function ro(e,n){let[t,r]=[P(e),P(n)].sort();return`${t}_${r}`}function oo(e,n){let t=e.default,r=typeof t==="string"?"string":typeof t==="number"?"number":typeof t==="boolean"?te(n):t instanceof Date?"string":"unknown";return e.nullable?`${r} | null`:r}function ao(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 w=i;if(s=w.model,"pivotTable"in w||"firstForeignKey"in w||"secondForeignKey"in w)u=w.pivotTable,c=w.firstForeignKey,l=w.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 m=u??ro(e,s),p=c??`${P(e)}_id`,y=l??`${P(s)}_id`,b={id:"number",[p]:"number",[y]:"number"};for(let[w,h]of Object.entries(f))b[w]=oo(h,t);if(d)b.created_at="string",b.updated_at="string | null";o.push({table:m,columns:b})}return o}function io(e){return{email_verified_at:"string | null",password_changed_at:"string | null",two_factor_secret:"string | null",two_factor_enabled:`${te(e)} | null`,two_factor_last_used_step:"number | null",stripe_id:"string | null"}}function so(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,io(n));return t}function uo(e,n){let t={},r=e.attributes??{};for(let[o,a]of Object.entries(r))t[P(o)]=to(a,n);return t}function Wt(e,n,t=2){let r=" ".repeat(t),o=" ".repeat(t+1),a=Object.entries(n).map(([s,u])=>`${o}${s}: ${u}`).join(`
|
|
3
3
|
`),i=/^[A-Z_a-z]\w*$/.test(e)?e:`'${e}'`;return`${r}${i}: {
|
|
4
4
|
${o}// columns
|
|
5
5
|
${a}
|
|
6
|
-
${r}}`}var
|
|
6
|
+
${r}}`}var co=`/* eslint-disable */
|
|
7
7
|
// AUTO-GENERATED by \`buddy generate:db-types\` \u2014 do not edit.
|
|
8
8
|
// Regenerate after adding/removing a model or changing its attributes.
|
|
9
9
|
// See stacksjs/stacks#1923.
|
|
10
10
|
|
|
11
11
|
declare module '@stacksjs/database' {
|
|
12
12
|
interface DatabaseSchema {
|
|
13
|
-
`,
|
|
13
|
+
`,lo=` }
|
|
14
14
|
}
|
|
15
15
|
|
|
16
16
|
export {}
|
|
17
|
-
`,
|
|
18
|
-
`;function
|
|
19
|
-
`),m=`${
|
|
20
|
-
${
|
|
21
|
-
`);return`${
|
|
22
|
-
${Mt(t)}`}import{isCursorPaginator as ru,isPaginator as ou,isSimplePaginator as au,toCursorPaginator as iu,toPaginator as su,toSimplePaginator as uu}from"@stacksjs/pagination";import{configureOrm as zr}from"@stacksjs/query-builder";function Hr(){try{let e=process.env.DB_DATABASE_PATH||"database/stacks.sqlite";if((process.env.DB_CONNECTION||"sqlite")==="sqlite")zr({database:e})}catch{}}Hr();async function Et(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 te(e,t=[""]){let{path:n}=await import("@stacksjs/path"),r=n.userModelsPath(`${e}.ts`);try{if(await Bun.file(r).exists())return await Et(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 a=o?`${o}/`:"",i=n.frameworkPath(`defaults/app/Models/${a}${e}.ts`);try{if(await Bun.file(i).exists())return await Et(i)}catch(s){console.error(`[orm] Failed to import framework default model ${e} from ${i} - trying next subdir. Reason:`,s)}}return null}var C={},Ft=()=>{},Cs=new Promise((e)=>{Ft=e});function y(e){return new Proxy(function(){},{get(t,n){if(n==="then")return;let r=C[e];if(r==null)return;let o=r[n];return typeof o==="function"?o.bind(r):o},set(t,n,r){let o=C[e];if(o==null)return!1;return o[n]=r,!0},has(t,n){let r=C[e];return r==null?!1:(n in r)},apply(t,n,r){let o=C[e];if(o==null||typeof o!=="function")return;return o.apply(n,r)}})}var Gr=y("User"),Jr=y("Job"),Yr=y("FailedJob"),Xr=[["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"),t=await te("User");if(t)C.User=t;if(e("queue")){let n=await te("Job");if(n)C.Job=n;let r=await te("FailedJob");if(r)C.FailedJob=r}for(let[n,r,o]of Xr){if(!e(o))continue;let a=await te(n,r);if(a)C[n]=a}}catch(e){console.error("[orm] deferred model load failed:",e)}finally{Ft()}});var Zr=y("Activity"),eo=y("AnalyticsEvent"),to=y("Automation"),no=y("AutomationRun"),ro=y("Auction"),oo=y("CampaignVariant"),ao=y("CommunicationSuppression"),io=y("ConsentEvent"),so=y("SenderDomain"),uo=y("UsageEvent"),co=y("AuctionItem"),lo=y("Author"),fo=y("Bid"),po=y("Board"),mo=y("BoardColumn"),yo=y("Campaign"),go=y("Card"),bo=y("CardComment"),wo=y("Cart"),ho=y("CartItem"),ko=y("Category"),_o=y("Comment"),To=y("Coupon"),Ro=y("Customer"),So=y("DeliveryRoute"),Po=y("DeliveryStop"),Ao=y("Deployment"),xo=y("DigitalDelivery"),Oo=y("Courier"),Co=y("CourierPing"),vo=y("CampaignSend"),Mo=y("EmailList"),Do=y("EmailListSubscriber"),Eo=y("Form"),Fo=y("FormField"),$o=y("FormSubmission"),Io=y("MagicLinkToken"),jo=y("Menu"),Bo=y("MenuItem"),No=y("PageRevision"),qo=y("Pledge"),Lo=y("Redirect"),Uo=y("Site"),Ko=y("SiteDomain"),Wo=y("SmsOptOut"),vs=y("StorageItem"),Ms=y("StorageItemTask"),Qo=y("EmailIdempotency"),Vo=y("EmailSuppression"),zo=y("EmailWebhookEvent"),Ho=y("Error"),Go=y("GiftCard"),Jo=y("Label"),Yo=y("LicenseKey"),Xo=y("Log"),Zo=y("LoyaltyPoint"),ea=y("LoyaltyReward"),ta=y("MailPreference"),na=y("Manufacturer"),ra=y("Notification"),oa=y("NotificationDelivery"),aa=y("Order"),ia=y("OrderIdempotency"),Ds=y("PersonalAccessToken"),sa=y("OrderItem"),ua=y("Page"),ca=y("Payment"),la=y("PaymentMethod"),da=y("PaymentProduct"),fa=y("PaymentTransaction"),pa=y("Post"),ma=y("Categorizable"),ya=y("PrintDevice"),ga=y("Product"),ba=y("ProductUnit"),wa=y("ProductVariant"),ha=y("QueryLog"),ka=y("Receipt"),Es=y("Referral"),Fs=y("ReferralCode"),_a=y("Release"),Ta=y("Request"),Ra=y("Review"),Sa=y("ShippingMethod"),Pa=y("ShippingRate"),Aa=y("ShippingZone"),xa=y("SocialPost"),Oa=y("SocialAccount"),Ca=y("Subscriber"),va=y("SubscriberEmail"),Ma=y("Subscription"),Da=y("Tag"),Ea=y("TaxRate"),Fa=y("Team"),$a=y("TeamInvitation"),Ia=y("TeamMember"),ja=y("Transaction"),Ba=y("WaitlistProduct"),Na=y("WaitlistRestaurant"),qa=y("Websocket"),$t={User:Gr,Job:Jr,FailedJob:Yr,Activity:Zr,AnalyticsEvent:eo,Automation:to,AutomationRun:no,Auction:ro,AuctionItem:co,Author:lo,Bid:fo,Board:po,BoardColumn:mo,Campaign:yo,CampaignSend:vo,CampaignVariant:oo,Card:go,CardComment:bo,Cart:wo,CartItem:ho,Categorizable:ma,Category:ko,Comment:_o,Coupon:To,Customer:Ro,CommunicationSuppression:ao,ConsentEvent:io,DeliveryRoute:So,DeliveryStop:Po,Deployment:Ao,DigitalDelivery:xo,Courier:Oo,CourierPing:Co,EmailList:Mo,EmailListSubscriber:Do,EmailIdempotency:Qo,EmailSuppression:Vo,EmailWebhookEvent:zo,ErrorModel:Ho,Form:Eo,FormField:Fo,FormSubmission:$o,GiftCard:Go,Label:Jo,LicenseKey:Yo,Log:Xo,LoyaltyPoint:Zo,LoyaltyReward:ea,MailPreference:ta,Manufacturer:na,Notification:ra,MagicLinkToken:Io,Menu:jo,MenuItem:Bo,NotificationDelivery:oa,Order:aa,OrderIdempotency:ia,OrderItem:sa,Page:ua,PageRevision:No,Payment:ca,PaymentMethod:la,PaymentProduct:da,PaymentTransaction:fa,Pledge:qo,Post:pa,PrintDevice:ya,Product:ga,ProductUnit:ba,ProductVariant:wa,QueryLog:ha,Receipt:ka,Release:_a,Request:Ta,Review:Ra,ShippingMethod:Sa,Redirect:Lo,SenderDomain:so,ShippingRate:Pa,ShippingZone:Aa,Site:Uo,SiteDomain:Ko,SmsOptOut:Wo,SocialAccount:Oa,SocialPost:xa,Subscriber:Ca,SubscriberEmail:va,Subscription:Ma,Tag:Da,TaxRate:Ea,Team:Fa,TeamInvitation:$a,TeamMember:Ia,Transaction:ja,UsageEvent:uo,WaitlistProduct:Ba,WaitlistRestaurant:Na,Websocket:qa},I=globalThis;for(let[e,t]of Object.entries($t))if(t&&I[e]===void 0)I[e]=t;var $s=Object.keys($t);async function La(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 Ua(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(I.safeAll===void 0)I.safeAll=La;if(I.safeGet===void 0)I.safeGet=Ua;export{Zr as Activity,eo as AnalyticsEvent,ro as Auction,co as AuctionItem,lo as Author,to as Automation,no as AutomationRun,fo as Bid,po as Board,mo as BoardColumn,yo as Campaign,vo as CampaignSend,oo as CampaignVariant,go as Card,bo as CardComment,wo as Cart,ho as CartItem,ma as Categorizable,ko as Category,_o as Comment,ao as CommunicationSuppression,io as ConsentEvent,To as Coupon,Oo as Courier,Co as CourierPing,Ro as Customer,So as DeliveryRoute,Po as DeliveryStop,Ao as Deployment,xo as DigitalDelivery,Qo as EmailIdempotency,Mo as EmailList,Do as EmailListSubscriber,Vo as EmailSuppression,zo as EmailWebhookEvent,Ho as ErrorModel,Yr as FailedJob,Eo as Form,Fo as FormField,$o as FormSubmission,Go as GiftCard,Jr as Job,Jo as Label,Yo as LicenseKey,Xo as Log,Zo as LoyaltyPoint,ea as LoyaltyReward,Ce as MODEL_DEFINITION,Io as MagicLinkToken,ta as MailPreference,na as Manufacturer,Ae as MassAssignmentException,jo as Menu,Bo as MenuItem,Tt as ModelNotFoundError,ht as ModelValidationError,ra as Notification,oa as NotificationDelivery,aa as Order,ia as OrderIdempotency,sa as OrderItem,ua as Page,No as PageRevision,ca as Payment,la as PaymentMethod,da as PaymentProduct,fa as PaymentTransaction,Ds as PersonalAccessToken,qo as Pledge,pa as Post,ya as PrintDevice,ga as Product,ba as ProductUnit,wa as ProductVariant,ha as QueryLog,ka as Receipt,Lo as Redirect,Es as Referral,Fs as ReferralCode,_a as Release,Ta as Request,Ra as Review,so as SenderDomain,Sa as ShippingMethod,Pa as ShippingRate,Aa as ShippingZone,Uo as Site,Ko as SiteDomain,Wo as SmsOptOut,Oa as SocialAccount,xa as SocialPost,vs as StorageItem,Ms as StorageItemTask,Tn as SubqueryBuilder,Ca as Subscriber,va as SubscriberEmail,Ma as Subscription,Da as Tag,Ea as TaxRate,Fa as Team,$a as TeamInvitation,Ia as TeamMember,ja as Transaction,uo as UsageEvent,Gr as User,Ba as WaitlistProduct,Na as WaitlistRestaurant,qa as Websocket,xi as batchLoad,Qr as buildDatabaseSchema,ae as collectEncryptedAttributes,je as createAuditMethods,pe as createCategorizableMethods,le as createCommentableMethods,me as createLikeableMethods,fe as createTaggableMethods,mn as customerOwnership,Mi as db,oe as decryptValue,Pt as defineModel,re as encryptValue,_e as enrichPaginatorUrls,gs as extendModel,on as filterFillable,za as getPrunableConfig,rn as getWritableFields,ru as isCursorPaginator,j as isEncrypted,ou as isPaginator,au as isSimplePaginator,Ke as isUniqueViolation,tn as mapWriteError,Va as massPrunable,hr as mergeModelDefinition,$s as modelGlobalNames,Cs as ormReady,wn as parentOwnership,Ge as parseCursor,Oe as projectDocumentsFromTrait,jt as prunable,Vr as renderDatabaseTypeFile,ke as resolveCursorArgs,he as resolvePageArgs,$i as savepoint,yn as selfOwnership,Qt as setAuditUser,gn as siteOwnership,bn as teamMembershipOwnership,pr as toAttrs,iu as toCursorPaginator,su as toPaginator,uu as toSimplePaginator,nn as toSnakeCaseKeys,Fi as transaction,Ii as transactional,M as withoutEvents,Wn as withoutValidation};
|
|
17
|
+
`,fo="/* 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",po=`}
|
|
18
|
+
`;function Vt(e){return e==="framework"?fo:co}function Qt(e){return e==="framework"?po:lo}async function zt(e,n,t=[]){let r=[];if(!Q.existsSync(e))return r;let o=Q.readdirSync(e,{withFileTypes:!0});for(let a of o){let i=_.join(e,a.name);if(a.isDirectory()){if(n){let s=await zt(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 mo(e={}){let n=Yr(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[p,y]of[[t,!1],[r,!0]])try{let b=await zt(p,y,a);i.push(...b)}catch(b){a.push({file:p,error:b.message})}let s=new Map;for(let p of i)s.set(p.model.name??_.basename(p.filePath).replace(/\.ts$/,""),p);for(let p of i)if(p.filePath.startsWith(t))s.set(p.model.name??_.basename(p.filePath).replace(/\.ts$/,""),p);let u=[];for(let[p,{model:y}]of s){let b=y.table??`${P(p)}s`,w={...so(y,n),...uo(y,n),...no(y)};u.push({table:b,model:p,columns:w})}let c=new Map;for(let[p,{model:y}]of s)for(let b of ao(p,y,n)){if(c.has(b.table))continue;c.set(b.table,{table:b.table,model:`(${b.table} pivot)`,columns:b.columns})}if(u.push(...c.values()),e.migrationsDir!==!1){let p=e.migrationsDir??_.resolve(_.dirname(o),"migrations"),y=new Set(u.map((w)=>w.table)),b=Kt(p,n);for(let w of b.tables){if(y.has(w.table))continue;y.add(w.table),u.push({table:w.table,model:`(${w.table} migration)`,columns:w.columns})}a.push(...b.errors)}u.sort((p,y)=>p.table.localeCompare(y.table));let l=e.target??"app",f=l==="framework"?1:2,d=u.map((p)=>Wt(p.table,p.columns,f)).join(`
|
|
19
|
+
`),m=`${Vt(l)}${d}
|
|
20
|
+
${Qt(l)}`;if(!e.dryRun){let p=_.dirname(o);if(!Q.existsSync(p))Q.mkdirSync(p,{recursive:!0});Q.writeFileSync(o,m,"utf-8"),Jr.success(`[generate:db-types] wrote ${u.length} table(s) to ${o}`)}return{outFile:o,tables:u,errors:a,content:m}}function go(e,n="app"){let t=[...e].sort((r,o)=>r.table.localeCompare(o.table)).map((r)=>Wt(r.table,r.columns,n==="framework"?1:2)).join(`
|
|
21
|
+
`);return`${Vt(n)}${t}
|
|
22
|
+
${Qt(n)}`}import{isCursorPaginator as Au,isPaginator as xu,isSimplePaginator as Pu,toCursorPaginator as Cu,toPaginator as vu,toSimplePaginator as Ou}from"@stacksjs/pagination";import{configureOrm as yo}from"@stacksjs/query-builder";function bo(){try{let e=process.env.DB_DATABASE_PATH||"database/stacks.sqlite";if((process.env.DB_CONNECTION||"sqlite")==="sqlite")yo({database:e})}catch{}}bo();async function Ht(e){for(let n=0;;n++){let t=await import(e);try{return t.default}catch(r){if(n<5&&r instanceof ReferenceError&&/before initialization/.test(r.message)){await new Promise((o)=>setTimeout(o,0));continue}throw r}}}async function ne(e,n=[""]){let{path:t}=await import("@stacksjs/path"),r=t.userModelsPath(`${e}.ts`);try{if(await Bun.file(r).exists())return await Ht(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 Ht(i)}catch(s){console.error(`[orm] Failed to import framework default model ${e} from ${i} - trying next subdir. Reason:`,s)}}return null}var C={},Gt=()=>{},Ys=new Promise((e)=>{Gt=e});function g(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 wo=g("User"),ho=g("Job"),ko=g("FailedJob"),To=[["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 ne("User");if(n)C.User=n;if(e("queue")){let t=await ne("Job");if(t)C.Job=t;let r=await ne("FailedJob");if(r)C.FailedJob=r}for(let[t,r,o]of To){if(!e(o))continue;let a=await ne(t,r);if(a)C[t]=a}}catch(e){console.error("[orm] deferred model load failed:",e)}finally{Gt()}});var _o=g("Activity"),Ro=g("AnalyticsEvent"),So=g("Automation"),Ao=g("AutomationRun"),xo=g("Auction"),Po=g("CampaignVariant"),Co=g("CommunicationSuppression"),vo=g("ConsentEvent"),Oo=g("SenderDomain"),Mo=g("UsageEvent"),Do=g("AuctionItem"),Eo=g("Author"),Fo=g("Bid"),Io=g("Board"),$o=g("BoardColumn"),jo=g("Campaign"),Bo=g("Card"),No=g("CardComment"),qo=g("Cart"),Lo=g("CartItem"),Uo=g("Category"),Ko=g("Comment"),Wo=g("Coupon"),Vo=g("Customer"),Qo=g("DeliveryRoute"),zo=g("DeliveryStop"),Ho=g("Deployment"),Go=g("DigitalDelivery"),Jo=g("Courier"),Yo=g("CourierPing"),Xo=g("CampaignSend"),Zo=g("EmailList"),ea=g("EmailListSubscriber"),ta=g("Form"),na=g("FormField"),ra=g("FormSubmission"),oa=g("MagicLinkToken"),aa=g("Menu"),ia=g("MenuItem"),sa=g("PageRevision"),ua=g("Pledge"),ca=g("Redirect"),la=g("Site"),da=g("SiteDomain"),fa=g("SmsOptOut"),Xs=g("StorageItem"),Zs=g("StorageItemTask"),pa=g("EmailIdempotency"),ma=g("EmailSuppression"),ga=g("EmailWebhookEvent"),ya=g("Error"),ba=g("GiftCard"),wa=g("Label"),ha=g("LicenseKey"),ka=g("Log"),Ta=g("LoyaltyPoint"),_a=g("LoyaltyReward"),Ra=g("MailPreference"),Sa=g("Manufacturer"),Aa=g("Notification"),xa=g("NotificationDelivery"),Pa=g("Order"),Ca=g("OrderIdempotency"),eu=g("PersonalAccessToken"),va=g("OrderItem"),Oa=g("Page"),Ma=g("Payment"),Da=g("PaymentMethod"),Ea=g("PaymentProduct"),Fa=g("PaymentTransaction"),Ia=g("Post"),$a=g("Categorizable"),ja=g("PrintDevice"),Ba=g("Product"),Na=g("ProductUnit"),qa=g("ProductVariant"),La=g("QueryLog"),Ua=g("Receipt"),tu=g("Referral"),nu=g("ReferralCode"),Ka=g("Release"),Wa=g("Request"),Va=g("Review"),Qa=g("ShippingMethod"),za=g("ShippingRate"),Ha=g("ShippingZone"),Ga=g("SocialPost"),Ja=g("SocialAccount"),Ya=g("Subscriber"),Xa=g("SubscriberEmail"),Za=g("Subscription"),ei=g("Tag"),ti=g("TaxRate"),ni=g("Team"),ri=g("TeamInvitation"),oi=g("TeamMember"),ai=g("Transaction"),ii=g("WaitlistProduct"),si=g("WaitlistRestaurant"),ui=g("Websocket"),Jt={User:wo,Job:ho,FailedJob:ko,Activity:_o,AnalyticsEvent:Ro,Automation:So,AutomationRun:Ao,Auction:xo,AuctionItem:Do,Author:Eo,Bid:Fo,Board:Io,BoardColumn:$o,Campaign:jo,CampaignSend:Xo,CampaignVariant:Po,Card:Bo,CardComment:No,Cart:qo,CartItem:Lo,Categorizable:$a,Category:Uo,Comment:Ko,Coupon:Wo,Customer:Vo,CommunicationSuppression:Co,ConsentEvent:vo,DeliveryRoute:Qo,DeliveryStop:zo,Deployment:Ho,DigitalDelivery:Go,Courier:Jo,CourierPing:Yo,EmailList:Zo,EmailListSubscriber:ea,EmailIdempotency:pa,EmailSuppression:ma,EmailWebhookEvent:ga,ErrorModel:ya,Form:ta,FormField:na,FormSubmission:ra,GiftCard:ba,Label:wa,LicenseKey:ha,Log:ka,LoyaltyPoint:Ta,LoyaltyReward:_a,MailPreference:Ra,Manufacturer:Sa,Notification:Aa,MagicLinkToken:oa,Menu:aa,MenuItem:ia,NotificationDelivery:xa,Order:Pa,OrderIdempotency:Ca,OrderItem:va,Page:Oa,PageRevision:sa,Payment:Ma,PaymentMethod:Da,PaymentProduct:Ea,PaymentTransaction:Fa,Pledge:ua,Post:Ia,PrintDevice:ja,Product:Ba,ProductUnit:Na,ProductVariant:qa,QueryLog:La,Receipt:Ua,Release:Ka,Request:Wa,Review:Va,ShippingMethod:Qa,Redirect:ca,SenderDomain:Oo,ShippingRate:za,ShippingZone:Ha,Site:la,SiteDomain:da,SmsOptOut:fa,SocialAccount:Ja,SocialPost:Ga,Subscriber:Ya,SubscriberEmail:Xa,Subscription:Za,Tag:ei,TaxRate:ti,Team:ni,TeamInvitation:ri,TeamMember:oi,Transaction:ai,UsageEvent:Mo,WaitlistProduct:ii,WaitlistRestaurant:si,Websocket:ui},F=globalThis;for(let[e,n]of Object.entries(Jt))if(n&&F[e]===void 0)F[e]=n;var ru=Object.keys(Jt);async function ci(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 li(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(F.safeAll===void 0)F.safeAll=ci;if(F.safeGet===void 0)F.safeGet=li;export{_o as Activity,Ro as AnalyticsEvent,xo as Auction,Do as AuctionItem,Eo as Author,So as Automation,Ao as AutomationRun,Fo as Bid,Io as Board,$o as BoardColumn,jo as Campaign,Xo as CampaignSend,Po as CampaignVariant,Bo as Card,No as CardComment,qo as Cart,Lo as CartItem,$a as Categorizable,Uo as Category,Ko as Comment,Co as CommunicationSuppression,vo as ConsentEvent,Wo as Coupon,Jo as Courier,Yo as CourierPing,Vo as Customer,Qo as DeliveryRoute,zo as DeliveryStop,Ho as Deployment,Go as DigitalDelivery,pa as EmailIdempotency,Zo as EmailList,ea as EmailListSubscriber,ma as EmailSuppression,ga as EmailWebhookEvent,ya as ErrorModel,ko as FailedJob,ta as Form,na as FormField,ra as FormSubmission,ba as GiftCard,ho as Job,wa as Label,ha as LicenseKey,ka as Log,Ta as LoyaltyPoint,_a as LoyaltyReward,Me as MODEL_DEFINITION,oa as MagicLinkToken,Ra as MailPreference,Sa as Manufacturer,Ce as MassAssignmentException,aa as Menu,ia as MenuItem,jt as ModelNotFoundError,Et as ModelValidationError,Aa as Notification,xa as NotificationDelivery,Pa as Order,Ca as OrderIdempotency,va as OrderItem,Oa as Page,sa as PageRevision,Ma as Payment,Da as PaymentMethod,Ea as PaymentProduct,Fa as PaymentTransaction,eu as PersonalAccessToken,ua as Pledge,Ia as Post,ja as PrintDevice,Ba as Product,Na as ProductUnit,qa as ProductVariant,La as QueryLog,Ua as Receipt,ca as Redirect,tu as Referral,nu as ReferralCode,Ka as Release,Wa as Request,Va as Review,Oo as SenderDomain,Qa as ShippingMethod,za as ShippingRate,Ha as ShippingZone,la as Site,da as SiteDomain,fa as SmsOptOut,Ja as SocialAccount,Ga as SocialPost,Xs as StorageItem,Zs as StorageItemTask,Un as SubqueryBuilder,Ya as Subscriber,Xa as SubscriberEmail,Za as Subscription,ei as Tag,ti as TaxRate,ni as Team,ri as TeamInvitation,oi as TeamMember,ai as Transaction,Mo as UsageEvent,wo as User,ii as WaitlistProduct,si as WaitlistRestaurant,ui as Websocket,Gi as batchLoad,mo as buildDatabaseSchema,ie as collectEncryptedAttributes,qe as createAuditMethods,me as createCategorizableMethods,de as createCommentableMethods,ge as createLikeableMethods,pe as createTaggableMethods,Fn as customerOwnership,Zi as db,ae as decryptValue,qt as defineModel,oe as encryptValue,Re as enrichPaginatorUrls,Bs as extendModel,kn as filterFillable,gi as getPrunableConfig,hn as getWritableFields,Au as isCursorPaginator,I as isEncrypted,xu as isPaginator,Pu as isSimplePaginator,Ge as isUniqueViolation,bn as mapWriteError,mi as massPrunable,Lr as mergeModelDefinition,ru as modelGlobalNames,Ys as ormReady,Bn as parentOwnership,nt as parseCursor,Oe as projectDocumentsFromTrait,Xt as prunable,go as renderDatabaseTypeFile,_e as resolveCursorArgs,Te as resolvePageArgs,rs as savepoint,In as selfOwnership,sn as setAuditUser,$n as siteOwnership,jn as teamMembershipOwnership,Ir as toAttrs,Cu as toCursorPaginator,vu as toPaginator,Ou as toSimplePaginator,wn as toSnakeCaseKeys,ns as transaction,os as transactional,O as withoutEvents,lr as withoutValidation};
|
package/dist/routes.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
import ct from"process";import{route as F}from"@stacksjs/router";import{env as H}from"@stacksjs/env";import{projectPath as _e,storagePath as dt}from"@stacksjs/path";import{createQueryBuilder as ft,defaultConfig as Be,setConfig as Qe}from"@stacksjs/query-builder";import{HttpError as B}from"@stacksjs/error-handling";import{log as q}from"@stacksjs/logging";function Ye(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 ce(e,t,n){let r=e;if(e instanceof Error&&typeof r.status==="number"&&Number.isInteger(r.status)&&r.status>=400&&r.status<600){let s={error:e.message};if(r.details!==void 0)s.details=r.details;return{status:r.status,body:s}}if(Ye(e))return{status:409,body:{error:`${t} already exists`}};return{status:500,body:{error:`Failed to ${n} ${t}`,detail:String(e)}}}function _(e){return e.replace(/([a-z\d])([A-Z])/g,"$1_$2").replace(/([A-Z])([A-Z][a-z])/g,"$1_$2").toLowerCase()}function de(e){let t={};for(let[n,r]of Object.entries(e))t[_(n)]=r;return t}function Oe(e,t){let n=String(t||"").replace(/^\/+|\/+$/g,""),r=String(e).replace(/^\/+/,"");return`/api/${n?`${n}/`:""}${r}`}function Te(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 Ae(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 Pe(e){return e?.ownership===!1}function De(e,t,n){let r=Object.keys(e).find((o)=>_(o)===_(t));if(Array.isArray(n)){if(r===void 0)return{data:e,error:"Ownership value is required"};if(!n.some((o)=>String(o)===String(e[r])))return{data:e,error:"Ownership value is not available to this caller"};return{data:{...e,[t]:e[r]}}}if(n===null||n===void 0)return{data:e,error:"Caller has no ownership identity"};let s={...e};for(let o of Object.keys(s))if(_(o)===_(t))delete s[o];return s[t]=n,{data:s}}function $e(e){if(!e)return[];let t=Object.entries(e.attributes??{}).filter(([,n])=>n?.fillable===!0).map(([n])=>n);for(let n of e.belongsTo??[]){if(typeof n!=="string"||!n.trim())continue;let r=_(n.trim()).split("_").filter(Boolean);if(r.length===0)continue;let s=`${r[0]}${r.slice(1).map((o)=>`${o[0]?.toUpperCase()}${o.slice(1)}`).join("")}Id`;t.push(s)}return[...new Set(t)]}function fe(e,t){if(!e||t.length===0)return{};let n={};for(let r of t){if(r in e){n[r]=e[r];continue}let s=_(r);if(s!==r&&s in e)n[r]=e[s]}return n}function Ze(e,t){if(e?.name!=="date"||t instanceof Date||typeof t!=="string")return t;let n=/^(\d{4})-(\d{2})-(\d{2})$/.exec(t);if(!n)return t;let r=Number(n[1]),s=Number(n[2]),o=Number(n[3]),i=new Date(Date.UTC(r,s-1,o));if(i.getUTCFullYear()!==r||i.getUTCMonth()!==s-1||i.getUTCDate()!==o)return t;return i}function ge(e,t){if(!t.length)return e;let n={...e};for(let r of t)delete n[r],delete n[_(r)];return n}function K(e,t){if(!e||t.length===0)return e;let n={...e};for(let r of t)delete n[r],delete n[_(r)];return n}var et=["id","uuid","created_at","updated_at","deleted_at"];function Ie(e,t){let n=new Map;for(let r of[...Object.keys(e??{}),...et]){let s=_(r);if(!/^\w+$/.test(s))continue;n.set(r,s),n.set(s,s)}for(let r of t)n.delete(r),n.delete(_(r));return n}function Ne(e,t,n){if(!t)return e;let r=String(t).split(",").map((o)=>o.trim()).filter(Boolean),s=e;for(let o of r){let i=o.startsWith("-"),l=i?o.slice(1):o;if(!/^\w+$/.test(l))continue;let w=n.get(l);if(!w)continue;s=s.orderBy(w,i?"desc":"asc")}return s}var tt={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"?nt(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"?rt(e):[],set:(e)=>e==null?null:Array.isArray(e)?JSON.stringify(e):e}};function nt(e){try{return JSON.parse(e)}catch{return e}}function rt(e){try{return JSON.parse(e)}catch{return[]}}function pe(e,t,n){if(!e||typeof e!=="object"||!t||Object.keys(t).length===0)return e;let r={...e};for(let[s,o]of Object.entries(t)){let i=typeof o==="string"?tt[o]:o;if(!i||typeof i[n]!=="function")continue;if(Object.prototype.hasOwnProperty.call(r,s))r[s]=i[n](r[s]);let l=_(s);if(l!==s&&Object.prototype.hasOwnProperty.call(r,l))r[l]=i[n](r[l])}return r}function ye(e,t,n){let r=t?.attributes??{},s={};for(let[o,i]of Object.entries(r)){let l=i?.validation?.rule;if(!l||typeof l.validate!=="function")continue;let w=Object.prototype.hasOwnProperty.call(e,o);if(!w&&n==="updating")continue;let c=i!==null&&typeof i==="object"&&Object.prototype.hasOwnProperty.call(i,"default"),P=w?e[o]:c?i.default:void 0,v=Ze(l,P),D=l.validate(v);if(!D?.valid&&Array.isArray(D?.errors)&&D.errors.length>0)s[o]=D.errors.map((Q)=>i?.validation?.message?.[Q?.code]??Q?.message??"invalid")}return Object.keys(s).length===0?{valid:!0}:{valid:!1,errors:s}}function ve(e,t,n){let r=Se(n);return e.find((s)=>s.method===t&&Se(String(s.path??""))===r)}function Se(e){return e.replace(/\{[^}]*\}/g,"{}").replace(/:[^/]+/g,"{}")}function le(e){if(Array.isArray(e))return e.filter((t)=>typeof t==="string"&&t.length>0);return typeof e==="string"&&e?[e]:[]}function Ce(e){let t=typeof e==="object"&&e!==null&&"middleware"in e,n=e?.middleware;if(!t)return{read:["auth"],write:["auth"],declared:!1};if(n&&typeof n==="object"&&!Array.isArray(n)){let s=n;return{read:"read"in s?le(s.read):["auth"],write:"write"in s?le(s.write):["auth"],declared:!0}}let r=le(n);return{read:r,write:r,declared:!0}}var xe=15,st=100;function Ee(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(xe),10),s=Math.min(Number.isFinite(r)?Math.max(1,r):xe,st);return{page:n,perPage:s,offset:(n-1)*s}}function oe(e,t){let n=new URL(e.toString());return n.searchParams.set("page",String(t)),`${n.pathname}${n.search}`}function ot(e,t,n,r,s,o){let i=(t-1)*n,l=r===0,w={page:t,per_page:n,from:l?null:i+1,to:l?null:i+r,has_more_pages:s,prev_page_url:t>1?oe(e,t-1):null,next_page_url:s?oe(e,t+1):null};if(o!==void 0&&!Number.isNaN(o)){let c=Math.max(1,Math.ceil(o/n));w.total=o,w.last_page=c,w.first_page_url=oe(e,1),w.last_page_url=oe(e,c)}return w}function me(e,t,n,r,s,o){let{page:i,...l}=ot(e,t,n,r,s,o);return{current_page:i,...l}}function we(e,t){return(t??e??"").toString().trim().toLowerCase()==="warn"?"warn":"deny"}function je(e,t){if(e.length===0)return null;let n=[...e].sort().join(", ");if(t==="deny")return`[orm] security.api.rowScoping is 'deny': NOT registering store/update/destroy for ${e.length} model(s) `+`with no row-level scoping \u2014 ${n}. Give a model an \`ownership\` config or a \`team_id\` column to restore its writes.`;return`[orm] ${e.length} model(s) publish mutating routes with no row-level scoping, so an authenticated caller can write any row \u2014 `+`${n}. Scope one with an \`ownership\` config or a \`team_id\` column; intended for public catalog tables. Set \`security.api.rowScoping: 'deny'\` (config/security.ts) to stop generating these routes instead.`}import{readdirSync as it}from"fs";import{basename as at,extname as Fe,join as ut}from"path";function lt(e){let t=[],n=(r)=>{let s;try{s=it(r,{withFileTypes:!0})}catch{return}for(let o of s){let i=ut(r,o.name);if(o.isDirectory()){n(i);continue}if(![".ts",".js"].includes(Fe(o.name)))continue;if(o.name.startsWith(".")||o.name.startsWith("index"))continue;t.push(i)}};return n(e),t.sort()}async function Me(e,t,n){for(let r of lt(e))try{let s=Fe(r),o=await import(`${r}?t=${Date.now()}`),i=o.default??o,l=i.name??at(r,s);t[l]={...i,name:l}}catch(s){n?.(r,s)}}async function Ue(e){let t={};return await Me(e.defaultsRoot,t,e.onImportError),await Me(e.userRoot,t,e.onImportError),t}function ie(e){if(e?.ownership===!1)return null;if(e?.ownership)return e.ownership;let t=Te(e);if(t)return{field:t,resolve:async(r,s)=>{let{resolveAuthenticatedTeamId:o}=await import("@stacksjs/auth");return o(he(s))}};let n=Ae(e);if(n)return{field:n,resolve:async(r)=>r?.id??null};return null}function he(e){let t=e?.headers?.get?.("authorization"),n=t&&/^Bearer\s+/i.test(t)?t.replace(/^Bearer\s+/i,"").trim():null,r=e?.headers?.get?.("cookie")||"";return{bearerToken:()=>n,cookies:{get:(s)=>{for(let o of r.split(";")){let i=o.indexOf("=");if(i===-1)continue;if(o.slice(0,i).trim()===s)return decodeURIComponent(o.slice(i+1).trim())}return null}}}}function kt(e="customer_id"){return{field:e,resolve:async(t)=>{let n=t?.id;if(n==null)return null;try{let{Customer:r}=await import("@stacksjs/orm");return(await r.where("user_id",n).first())?.id??null}catch{return null}}}}function St(e="id"){return{field:e,resolve:async(t)=>t?.id??null}}function xt(e="site_id"){return{field:e,resolve:async(t,n)=>{try{let[{resolveAuthenticatedTeamId:r},{Site:s}]=await Promise.all([import("@stacksjs/auth"),import("@stacksjs/orm")]),o=await r(he(n));if(o==null)return[];return(await s.where("team_id",o).get()??[]).map((l)=>l.id).filter((l)=>l!=null)}catch{return[]}}}}function Ot(e="id"){return{field:e,resolve:async(t,n)=>{try{let{resolveAuthenticatedTeamId:r}=await import("@stacksjs/auth");return await r(he(n))}catch{return null}}}}function Tt(e,t){return{field:t,resolve:async(n,r)=>{try{let s=await import("@stacksjs/orm"),o=s.models?.[e]??s[e]?.definition??null,i=ie(o);if(!i?.field||typeof i.resolve!=="function")return[];let l=await i.resolve(n,r);if(l==null||Array.isArray(l)&&l.length===0)return[];let w=s[e];if(!w)return[];return((Array.isArray(l)?await w.whereIn(i.field,l).get():await w.where(i.field,l).get())??[]).map((P)=>P.id).filter((P)=>P!=null)}catch{return[]}}}}var gt=_e("config/qb.ts");try{let e=(await import(gt)).default;Qe(e??Be)}catch{q.debug("[orm] No config/qb.ts override found - deriving config from DB_CONNECTION");let e=H.DB_CONNECTION||"sqlite";Qe({...Be,dialect:e,database:e==="sqlite"?{database:H.DB_DATABASE_PATH||"database/stacks.sqlite"}:{database:H.DB_DATABASE||"stacks",host:H.DB_HOST||"127.0.0.1",port:H.DB_PORT||(e==="postgres"?5432:3306),username:H.DB_USERNAME||(e==="postgres"?"postgres":"root"),password:H.DB_PASSWORD||""}})}var be=await Ue({defaultsRoot:dt("framework/defaults/app/Models"),userRoot:_e("app/Models"),onImportError:(e,t)=>q.warn(`[orm] Could not load model ${e}: ${t.message}`)}),pt=ft(),A=pt;function J(e,t){let n=ve(F.routes,e,t);if(!n)return!1;let r=String(n.path??"");return q.info(`[orm] Skipping generated ${e} ${t} - already defined${r&&r!==t?` as ${r}`:""}.`),!0}function qe(e){if(!e.attributes)return[];return Object.entries(e.attributes).filter(([t,n])=>n.hidden===!0).map(([t])=>t)}function We(e){if(e.endsWith("y")&&!/[aeiou]y$/i.test(e))return`${e.slice(0,-1)}ies`;if(/(?:s|x|z|ch|sh)$/i.test(e))return`${e}es`;return`${e}s`}async function Le(e,t,n,r){if(!e.length)return e;let s=n.split(",").map((c)=>c.trim()).filter(Boolean);if(!s.length)return e;let o=Array.isArray(t.belongsTo)?t.belongsTo:[],i=Array.isArray(t.hasMany)?t.hasMany:[],l=Array.isArray(t.hasOne)?t.hasOne:[],w=new Map;for(let c of o)w.set(_(c),{kind:"belongsTo",modelName:c});for(let c of l)w.set(_(c),{kind:"hasOne",modelName:c});for(let c of i)w.set(We(_(c)),{kind:"hasMany",modelName:c});for(let c of s){let P=w.get(c);if(!P)continue;let v=r[P.modelName];if(!v)continue;let D=v.table||We(_(P.modelName)),Q=qe(v),V=(W)=>K(ne(W,v),Q);if(P.kind==="belongsTo"||P.kind==="hasOne"){let W=`${_(P.modelName)}_id`,C=[...new Set(e.map((S)=>S[W]).filter((S)=>S!=null))];if(!C.length){for(let S of e)S[c]=null;continue}let G=await A.selectFrom(D).whereIn("id",C).get(),L=new Map;for(let S of G??[])L.set(String(S.id),V(S));for(let S of e)S[c]=L.get(String(S[W]))??null}else{let W=String(t.name??""),C=`${_(W)}_id`,G=[...new Set(e.map((T)=>T.id).filter((T)=>T!=null))];if(!G.length){for(let T of e)T[c]=[];continue}let L=await A.selectFrom(D).whereIn(C,G).get(),S=new Map;for(let T of L??[]){let E=String(T[C]),Z=S.get(E)??[];Z.push(V(T)),S.set(E,Z)}for(let T of e)T[c]=S.get(String(T.id))??[]}}return e}async function ze(e,t){let n=t?.set;if(!n||typeof n!=="object")return e;let r={...e};for(let[s,o]of Object.entries(n)){if(typeof o!=="function"||!(s in r))continue;try{r[s]=await o(r)}catch{}}return r}function He(e,t){return pe(e,t?.casts,"set")}function ne(e,t){return pe(e,t?.casts,"get")}function d(e,t=200){return new Response(JSON.stringify(e),{status:t,headers:{"Content-Type":"application/json"}})}var ae=1048576;async function Re(e){if(Number(e.headers?.get?.("content-length")??0)>ae)throw new B(413,`Request body exceeds ${ae}-byte limit`);if(e.jsonBody&&typeof e.jsonBody==="object")return e.jsonBody;if(e.formBody&&typeof e.formBody==="object")return e.formBody;try{let n=await e.clone().text();if(n.length>ae)throw new B(413,`Request body exceeds ${ae}-byte limit`);if(!n)return{};let r=JSON.parse(n);return r&&typeof r==="object"&&!Array.isArray(r)?r:{}}catch(n){if(n instanceof B)throw n;throw new B(400,`Invalid JSON body: ${n.message}`)}}function ue(e){if(e==null)return null;if(typeof e==="number")return Number.isFinite(e)&&e>0?e:null;if(typeof e==="string"){let t=e.trim();if(!t)return null;if(/^\d+$/.test(t)){let n=Number(t);return Number.isFinite(n)&&n>0?n:null}return t}return null}function yt(e){let t=e.bearerToken;if(typeof t==="function"){let r=t.call(e);if(r)return r}let n=e.headers?.get?.("authorization")||e.headers?.get?.("Authorization")||"";if(typeof n==="string"&&n.startsWith("Bearer "))return n.substring(7);return null}async function X(e){let t=e._authenticatedUser;if(t)return t;let n=yt(e);if(!n)return null;try{let{Auth:r}=await import("@stacksjs/auth"),s=await r.getUserFromToken(n);if(s)e._authenticatedUser=s;return s||null}catch{return null}}function te(e,t){if(e==null||t==null)return!1;if(Array.isArray(t))return t.some((n)=>String(n)===String(e));return String(e)===String(t)}async function Y(e,t,n){let r=ie(e);if(!r||!r.field||typeof r.resolve!=="function")return{enforced:!1,value:null,field:"",bypass:!1};let s=typeof r.bypass==="function"?!!r.bypass(t,n):!1,o=null;try{o=await r.resolve(t,n)}catch{o=null}return{enforced:!0,value:o,field:String(r.field),bypass:s}}async function Je(e,t,n,r){let s=e?.authedFill?.[t];if(!s)return{};if(typeof s==="function")try{let o=await s(n,r);return o&&typeof o==="object"?o:{}}catch{return{}}if(typeof s==="object"){let o={};for(let[i,l]of Object.entries(s))try{o[i]=typeof l==="function"?await l(n,r):l}catch{}return o}return{}}var Ve=await(async()=>{let e=ct.env.STACKS_API_ROW_SCOPING;try{let t=(await import(_e("config/security.ts"))).default;return we(t?.api?.rowScoping,e)}catch{return we(void 0,e)}})(),Ge=[];for(let[e,t]of Object.entries(be)){let n=t.traits?.useApi;if(!n)continue;let r=typeof n==="object"?n:{},s=r.uri||t.table||e.toLowerCase()+"s",o=r.routes||["index","show","store","update","destroy"],i=t.table||s,l=$e(t),w=qe(t),c=Oe(s,r.prefix),P=Ie(t.attributes,w),{read:v,write:D,declared:Q}=Ce(n),V=["store","update","destroy"].some((p)=>o.includes(p));if(V&&Q&&D.length===0)q.warn(`[orm] ${e}: registering UNAUTHENTICATED mutating routes at ${c} (explicit \`middleware: []\` opt-out)`);if(["index","show"].some((p)=>o.includes(p))&&Q&&v.length===0)q.debug(`[orm] ${e}: registering public read routes at ${c} (declared \`middleware.read: []\`)`);let C=!!ie(t),G=C&&!v.includes("auth")?["auth",...v]:v,L=Pe(t),S=V&&!C&&!L;if(S)Ge.push(e);if(V&&L)q.debug(`[orm] ${e}: registering unscoped mutating routes at ${c} (declared \`ownership: false\`)`);let T=S&&Ve==="deny",E=(p,a=G)=>{let u=p;for(let f of a)if(u&&typeof u.middleware==="function")u=u.middleware(f);return u};if(o.includes("index")&&!J("GET",c))E(F.get(c,async(p)=>{try{let a=new URL(p.url),{page:u,perPage:f,offset:h}=Ee(a.searchParams),m=a.searchParams.get("sort"),g=A.selectFrom(i);g=Ne(g,m,P);let N=new Set(["page","per_page","sort","fields","search","include","limit","offset","with_count","withTrashed","onlyTrashed"]);for(let[x,O]of a.searchParams.entries()){if(N.has(x)||!O)continue;if(!/^[a-z_][a-z0-9_]*$/i.test(x))continue;let z=P.get(x);if(z)g=g.where(z,"=",O)}let R=a.searchParams.get("search");if(R&&l.length>0){let x=l.slice(0,5);g=g.where((O)=>{for(let z of x)O=O.orWhere(_(z),"like",`%${R}%`);return O})}let k=a.searchParams.get("fields");if(k){let x=k.split(",").map((O)=>O.trim()).filter((O)=>/^[a-z_][a-z0-9_]*$/i.test(O)).map((O)=>_(O));if(x.length>0)g=g.select(x)}let I=!!t.traits?.useSoftDeletes,b=a.searchParams.get("withTrashed")==="true",j=a.searchParams.get("onlyTrashed")==="true";if(I&&!b)g=j?g.whereNotNull("deleted_at"):g.whereNull("deleted_at");let y=C?await Y(t,await X(p),p):{enforced:!1,value:null,field:"",bypass:!1};if(y.enforced&&!y.bypass){if(y.value==null||Array.isArray(y.value)&&y.value.length===0){let x=me(a,u,f,0,!1,void 0);return new Response(JSON.stringify({data:[],...x}),{status:200,headers:{"Content-Type":"application/json","Cache-Control":"private, no-store",Vary:"Authorization"}})}g=Array.isArray(y.value)?g.where(y.field,"in",y.value):g.where(y.field,"=",y.value)}let M=await g.limit(f+1).offset(h).get()||[],U=M.length>f,re=(U?M.slice(0,f):M).map((x)=>K(ne(x,t),w)),ke=a.searchParams.get("include");if(ke)re=await Le(re,t,ke,be);let Ke=a.searchParams.get("with_count")==="true",ee;if(Ke)try{let x=A.selectFrom(i);if(y.enforced&&!y.bypass&&y.value!=null)x=Array.isArray(y.value)?x.where(y.field,"in",y.value):x.where(y.field,"=",y.value);let O=await x.count(),z=typeof O==="number"?O:Number(O?.count??O);if(Number.isFinite(z))ee=z}catch{}let se={"Content-Type":"application/json"};if(ee!==void 0&&!Number.isNaN(ee))se["X-Total-Count"]=String(ee);se["Cache-Control"]=y.enforced&&!y.bypass?"private, no-store":"public, max-age=15, must-revalidate",se.Vary="Authorization";let Xe=me(a,u,f,re.length,U,ee);return new Response(JSON.stringify({data:re,...Xe}),{status:200,headers:se})}catch(a){if(a instanceof B){let u={error:a.message};if(a.details!==void 0)u.details=a.details;return d(u,a.status||400)}return d({error:`Failed to fetch ${s}`,detail:String(a)},500)}}));if(o.includes("show")&&!J("GET",`${c}/{id}`))E(F.get(`${c}/{id}`,async(p)=>{try{let a=ue(p.params?.id);if(a==null)return d({error:"Invalid ID parameter"},400);let u=await A.selectFrom(i).where({id:a}).executeTakeFirst();if(!u)return d({error:`${e} not found`},404);let f=new URL(p.url);if(t.traits?.useSoftDeletes&&u.deleted_at&&f.searchParams.get("withTrashed")!=="true")return d({error:`${e} not found`},404);let h=C?await Y(t,await X(p),p):{enforced:!1,value:null,field:"",bypass:!1};if(h.enforced&&!h.bypass){if(h.value==null||!te(u[h.field],h.value))return d({error:`${e} not found`},404)}let m=K(ne(u,t),w),g=f.searchParams.get("include");if(g){let[b]=await Le([m],t,g,be);m=b}let N=m?.updated_at||m?.created_at,R=N?`W/"${m.id}-${String(N)}"`:void 0,k=p.headers?.get?.("if-none-match");if(R&&k&&k===R)return new Response(null,{status:304,headers:{ETag:R}});let I={"Content-Type":"application/json"};if(R)I.ETag=R;return I["Cache-Control"]=h.enforced&&!h.bypass?"private, no-store":"public, max-age=30, must-revalidate",I.Vary="Authorization",new Response(JSON.stringify({data:m}),{status:200,headers:I})}catch(a){if(a instanceof B){let u={error:a.message};if(a.details!==void 0)u.details=a.details;return d(u,a.status||400)}return d({error:`Failed to fetch ${e}`,detail:String(a)},500)}}));if(!T&&o.includes("store")&&!J("POST",c))E(F.post(c,async(p)=>{try{let a=await Re(p),u=ge(a,w),f=fe(u,l),h=await X(p);if(h){let b=await Je(t,"creating",h,p);for(let[j,y]of Object.entries(b))if(y!==void 0&&y!==null&&f[j]===void 0)f[j]=y}let m=await Y(t,h,p);if(m.enforced&&!m.bypass){if(!h)return d({error:"Auth required"},401);let b=De(f,m.field,m.value);if(b.error)return d({error:b.error},403);f=b.data}if(Object.keys(f).length===0)return d({error:"No fillable fields provided"},422);let g=ye(f,t,"creating");if(!g.valid)return d({success:!1,message:"Validation failed",errors:g.errors},422);if(t.traits?.useTimestamps!==!1){let b=new Date().toISOString();f.created_at=b,f.updated_at=b}let N=await ze(f,t),R=de(He(N,t)),k=await A.insertInto(i).values(R).execute(),I=R;try{let b=k?.lastInsertRowid??k?.insertId??k;if(b){let j=await A.selectFrom(i).where({id:b}).executeTakeFirst();if(j)I=j}}catch{}return d({data:K(ne(I,t),w)},201)}catch(a){let{status:u,body:f}=ce(a,e,"create");return d(f,u)}}),D);if(!T&&o.includes("update")){let p=async(a)=>{try{let u=ue(a.params?.id);if(u==null)return d({error:"Invalid ID parameter"},400);let f=await Re(a),h=ge(f,w),m=fe(h,l),g=await X(a);if(g){let y=await Je(t,"updating",g,a);for(let[M,U]of Object.entries(y))if(U!==void 0&&U!==null&&m[M]===void 0)m[M]=U}if(Object.keys(m).length===0)return d({error:"No fillable fields provided"},422);let N=ye(m,t,"updating");if(!N.valid)return d({success:!1,message:"Validation failed",errors:N.errors},422);let R=await A.selectFrom(i).where({id:u}).executeTakeFirst();if(!R)return d({error:`${e} not found`},404);let k=await Y(t,g,a);if(k.enforced&&!k.bypass){if(!g)return d({error:"Auth required"},401);let y=R[k.field];if(!te(y,k.value))return d({error:`Not your ${e}`},403);let M=Object.keys(m).find((U)=>_(U)===_(k.field));if(M!==void 0&&!te(m[M],k.value))return d({error:`Cannot reassign ${e} ownership`},403)}if(t.traits?.useTimestamps!==!1)m.updated_at=new Date().toISOString();let I=await ze(m,t),b=de(He(I,t));await A.updateTable(i).set(b).where({id:u}).execute();let j={...R,...b};try{let y=await A.selectFrom(i).where({id:u}).executeTakeFirst();if(y)j=y}catch{}return d({data:K(ne(j,t),w)})}catch(u){let{status:f,body:h}=ce(u,e,"update");return d(h,f)}};if(!J("PUT",`${c}/{id}`))E(F.put(`${c}/{id}`,p),D);if(!J("PATCH",`${c}/{id}`))E(F.patch(`${c}/{id}`,p),D)}let Z=!!t.traits?.useSoftDeletes;if(!T&&o.includes("destroy")&&!J("DELETE",`${c}/{id}`))E(F.delete(`${c}/{id}`,async(p)=>{try{let a=ue(p.params?.id);if(a==null)return d({error:"Invalid ID parameter"},400);let u=await A.selectFrom(i).where({id:a}).executeTakeFirst();if(!u)return d({error:`${e} not found`},404);let f=await X(p),h=await Y(t,f,p);if(h.enforced&&!h.bypass){if(!f)return d({error:"Auth required"},401);let m=u[h.field];if(!te(m,h.value))return d({error:`Not your ${e}`},403)}if(Z){let m=new Date().toISOString();await A.updateTable(i).set({deleted_at:m,updated_at:m}).where({id:a}).execute()}else await A.deleteFrom(i).where({id:a}).execute();return new Response(null,{status:204})}catch(a){if(a instanceof B){let u={error:a.message};if(a.details!==void 0)u.details=a.details;return d(u,a.status||400)}return d({error:`Failed to delete ${e}`,detail:String(a)},500)}}),D);if(!T&&o.includes("destroy")&&!J("POST",`${c}/bulk-delete`))E(F.post(`${c}/bulk-delete`,async(p)=>{try{let u=(await Re(p))?.ids;if(!Array.isArray(u)||u.length===0)return d({error:"An array of IDs is required"},422);if(u.length>100)return d({error:"Cannot delete more than 100 records at once"},422);let f=[],h=[];for(let R of u){let k=ue(R);if(k!=null)f.push(k);else h.push(R)}if(h.length>0)return d({error:"Invalid IDs in batch",invalid:h},422);let m=await X(p),g=await Y(t,m,p);if(g.enforced&&!g.bypass){if(!m)return d({error:"Auth required"},401);if(g.value==null)return d({error:"Caller has no ownership identity"},403);let R=await A.selectFrom(i).select(["id",g.field]).execute(),k=new Set(R.filter((b)=>te(b[g.field],g.value)).map((b)=>String(b.id))),I=f.filter((b)=>!k.has(String(b)));if(I.length>0)return d({error:`Cannot delete ${e} you don't own`,ids:I},403)}let N=new Date().toISOString();for(let R of f)if(Z)await A.updateTable(i).set({deleted_at:N,updated_at:N}).where({id:R}).execute();else await A.deleteFrom(i).where({id:R}).execute();return d({message:`Successfully deleted ${f.length} ${s}`})}catch(a){if(a instanceof B){let u={error:a.message};if(a.details!==void 0)u.details=a.details;return d(u,a.status||400)}return d({error:`Failed to bulk delete ${s}`,detail:String(a)},500)}}),D)}{let e=je(Ge,Ve);if(e)q.warn(e)}var Ut=F;export{Ut as default};
|
|
2
|
+
import Rt from"process";import{route as U}from"@stacksjs/router";import{env as z}from"@stacksjs/env";import{projectPath as Se,storagePath as kt}from"@stacksjs/path";import{createQueryBuilder as _t,defaultConfig as ze,setConfig as He}from"@stacksjs/query-builder";import{HttpError as W}from"@stacksjs/error-handling";import{log as J}from"@stacksjs/logging/runtime";function ot(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 ce(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(ot(e))return{status:409,body:{error:`${t} already exists`}};return{status:500,body:{error:`Failed to ${n} ${t}`,detail:String(e)}}}function _(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 s=r>0?e.charCodeAt(r-1):0,i=r+1<e.length?e.charCodeAt(r+1):0,c=s>=97&&s<=122||s>=48&&s<=57,f=s>=65&&s<=90&&i>=97&&i<=122;if(r>0&&(c||f))n+="_";n+=String.fromCharCode(o+32)}return n}function de(e){let t={};for(let[n,r]of Object.entries(e))t[_(n)]=r;return t}function Ce(e,t){let n=String(t||"").replace(/^\/+|\/+$/g,""),r=String(e).replace(/^\/+/,"");return`/api/${n?`${n}/`:""}${r}`}function Pe(e){if(!e)return null;let t=e.attributes??{};if(Object.prototype.hasOwnProperty.call(t,"teamId")||Object.prototype.hasOwnProperty.call(t,"team_id"))return"team_id";return e.belongsTo?.some((n)=>n==="Team")?"team_id":null}function $e(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 Ie(e){return e?.ownership===!1}function Ne(e,t,n){let r=Object.keys(e).find((s)=>_(s)===_(t));if(Array.isArray(n)){if(r===void 0)return{data:e,error:"Ownership value is required"};if(!n.some((s)=>String(s)===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 s of Object.keys(o))if(_(s)===_(t))delete o[s];return o[t]=n,{data:o}}function Me(e){if(!e)return[];let t=Object.entries(e.attributes??{}).filter(([,n])=>n?.fillable===!0).map(([n])=>n);for(let n of e.belongsTo??[]){if(typeof n!=="string"||!n.trim())continue;let r=_(n.trim()).split("_").filter(Boolean);if(r.length===0)continue;let o=`${r[0]}${r.slice(1).map((s)=>`${s[0]?.toUpperCase()}${s.slice(1)}`).join("")}Id`;t.push(o)}return[...new Set(t)]}function fe(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??=it(t);let s=r.get(o);if(s!==o&&s in e)n[o]=e[s]}return n}function st(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]),s=Number(n[3]),i=new Date(Date.UTC(r,o-1,s));if(i.getUTCFullYear()!==r||i.getUTCMonth()!==o-1||i.getUTCDate()!==s)return t;return i}var ve=new WeakMap,Oe=new WeakMap;function ge(e){let t=ve.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:_(r)}));return ve.set(e,n),n}function it(e){let t=ge(e),n=Oe.get(t);if(n)return n;let r=new Map(t.map(({field:o,snake:s})=>[o,s]));return Oe.set(t,r),r}function pe(e,t){if(!t.length)return e;let n={...e};for(let{field:r,snake:o}of ge(t))if(delete n[r],o!==r)delete n[o];return n}function G(e,t){if(!e||t.length===0)return e;let n={...e};for(let{field:r,snake:o}of ge(t))if(delete n[r],o!==r)delete n[o];return n}var at=["id","uuid","created_at","updated_at","deleted_at"];function je(e,t){let n=new Map;for(let r of[...Object.keys(e??{}),...at]){let o=_(r);if(!/^\w+$/.test(o))continue;n.set(r,o),n.set(o,o)}for(let r of t)n.delete(r),n.delete(_(r));return n}function Ee(e,t,n){if(!t)return e;let r=e;for(let o of String(t).split(",")){let s=o.trim();if(!s)continue;let i=s.startsWith("-"),c=i?s.slice(1):s;if(!/^\w+$/.test(c))continue;let f=n.get(c);if(!f)continue;r=r.orderBy(f,i?"desc":"asc")}return r}var ut={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"?ct(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"?dt(e):[],set:(e)=>e==null?null:Array.isArray(e)?JSON.stringify(e):e}},Ae=new WeakMap;function lt(e,t){let n=Ae.get(e);if(n&&n.length===t.length){let o=!0;for(let s=0;s<t.length;s++){let i=t[s];if(n[s]?.attr!==i||n[s]?.definition!==e[i]){o=!1;break}}if(o)return n}let r=[];for(let o of t){let s=e[o],i=typeof s==="string"?ut[s]:s;r.push({attr:o,snake:_(o),definition:s,caster:i})}return Ae.set(e,r),r}function ct(e){try{return JSON.parse(e)}catch{return e}}function dt(e){try{return JSON.parse(e)}catch{return[]}}function ye(e,t,n){if(!e||typeof e!=="object"||!t)return e;let r=Object.keys(t);if(r.length===0)return e;let o=lt(t,r);if(o.length===0)return e;let s={...e};for(let{attr:i,caster:c,snake:f}of o){if(!c)continue;let u=c[n];if(typeof u!=="function")continue;if(Object.prototype.hasOwnProperty.call(s,i))s[i]=u.call(c,s[i]);if(f!==i&&Object.prototype.hasOwnProperty.call(s,f))s[f]=u.call(c,s[f])}return s}var Te=new WeakMap;function ft(e){let t=Te.get(e);if(t)return t;let n=[];for(let[r,o]of Object.entries(e)){let s=o?.validation?.rule;if(!s||typeof s.validate!=="function")continue;n.push({definition:o,field:r,hasDefault:o!==null&&typeof o==="object"&&Object.prototype.hasOwnProperty.call(o,"default"),rule:s})}return Te.set(e,n),n}function At(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 me(e,t,n){let r=t?.attributes;if(!r||typeof r!=="object")return{valid:!0};let o=ft(r);if(o.length===0)return{valid:!0};let s={},i=!1;for(let c of o){let{definition:f,field:u,hasDefault:T,rule:P}=c,I=Object.prototype.hasOwnProperty.call(e,u);if(!I&&n==="updating")continue;let q=I?e[u]:T?f.default:void 0,B=st(P,q),N=P.validate(B);if(!N?.valid&&Array.isArray(N?.errors)&&N.errors.length>0)i=!0,s[u]=N.errors.map((C)=>f.validation?.message?.[C?.code]??C?.message??"invalid")}return i?{valid:!1,errors:s}:{valid:!0}}function he(e,t){return`${e}\x00${gt(t)}`}function Fe(e){let t=new Map;for(let n of e){let r=he(String(n.method??""),String(n.path??""));if(!t.has(r))t.set(r,n)}return t}function gt(e){return e.replace(/\{[^}]*\}/g,"{}").replace(/:[^/]+/g,"{}")}function le(e){if(Array.isArray(e))return e.filter((t)=>typeof t==="string"&&t.length>0);return typeof e==="string"&&e?[e]:[]}function Ue(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?le(o.read):["auth"],write:"write"in o?le(o.write):["auth"],declared:!0}}let r=le(n);return{read:r,write:r,declared:!0}}var De=15,pt=100;function Be(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(De),10),o=Math.min(Number.isFinite(r)?Math.max(1,r):De,pt);return{page:n,perPage:o,offset:(n-1)*o}}function se(e,t){let n=new URL(e.toString());return n.searchParams.set("page",String(t)),`${n.pathname}${n.search}`}function yt(e,t,n,r,o,s){let i=(t-1)*n,c=r===0,f={page:t,per_page:n,from:c?null:i+1,to:c?null:i+r,has_more_pages:o,prev_page_url:t>1?se(e,t-1):null,next_page_url:o?se(e,t+1):null};if(s!==void 0&&!Number.isNaN(s)){let u=Math.max(1,Math.ceil(s/n));f.total=s,f.last_page=u,f.first_page_url=se(e,1),f.last_page_url=se(e,u)}return f}function we(e,t,n,r,o,s){let{page:i,...c}=yt(e,t,n,r,o,s);return{current_page:i,...c}}function be(e,t){return(t??e??"").toString().trim().toLowerCase()==="warn"?"warn":"deny"}function Qe(e,t){if(e.length===0)return null;let n=[...e].sort().join(", ");if(t==="deny")return`[orm] security.api.rowScoping is 'deny': NOT registering store/update/destroy for ${e.length} model(s) `+`with no row-level scoping \u2014 ${n}. Give a model an \`ownership\` config or a \`team_id\` column to restore its writes.`;return`[orm] ${e.length} model(s) publish mutating routes with no row-level scoping, so an authenticated caller can write any row \u2014 `+`${n}. Scope one with an \`ownership\` config or a \`team_id\` column; intended for public catalog tables. Set \`security.api.rowScoping: 'deny'\` (config/security.ts) to stop generating these routes instead.`}import{readdirSync as mt}from"fs";import{basename as ht,extname as Le,join as wt}from"path";function bt(e){let t=[],n=(r)=>{let o;try{o=mt(r,{withFileTypes:!0})}catch{return}for(let s of o){let i=wt(r,s.name);if(s.isDirectory()){n(i);continue}if(![".ts",".js"].includes(Le(s.name)))continue;if(s.name.startsWith(".")||s.name.startsWith("index"))continue;t.push(i)}};return n(e),t.sort()}async function We(e,t,n){for(let r of bt(e))try{let o=Le(r),s=await import(`${r}?t=${Date.now()}`),i=s.default??s,c=i.name??ht(r,o);t[c]={...i,name:c}}catch(o){n?.(r,o)}}async function Ve(e){let t={};return await We(e.defaultsRoot,t,e.onImportError),await We(e.userRoot,t,e.onImportError),t}function ie(e){if(e?.ownership===!1)return null;if(e?.ownership)return e.ownership;let t=Pe(e);if(t)return{field:t,resolve:async(r,o)=>{let{resolveAuthenticatedTeamId:s}=await import("@stacksjs/auth");return s(Re(o))}};let n=$e(e);if(n)return{field:n,resolve:async(r)=>r?.id??null};return null}function Re(e){let t=e?.headers?.get?.("authorization"),n=t&&/^Bearer\s+/i.test(t)?t.replace(/^Bearer\s+/i,"").trim():null,r=e?.headers?.get?.("cookie")||"";return{bearerToken:()=>n,cookies:{get:(o)=>{for(let s of r.split(";")){let i=s.indexOf("=");if(i===-1)continue;if(s.slice(0,i).trim()===o)return decodeURIComponent(s.slice(i+1).trim())}return null}}}}function It(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 Nt(e="id"){return{field:e,resolve:async(t)=>t?.id??null}}function Mt(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")]),s=await r(Re(n));if(s==null)return[];return(await o.where("team_id",s).get()??[]).map((c)=>c.id).filter((c)=>c!=null)}catch{return[]}}}}function jt(e="id"){return{field:e,resolve:async(t,n)=>{try{let{resolveAuthenticatedTeamId:r}=await import("@stacksjs/auth");return await r(Re(n))}catch{return null}}}}function Et(e,t){return{field:t,resolve:async(n,r)=>{try{let o=await import("@stacksjs/orm"),s=o.models?.[e]??o[e]?.definition??null,i=ie(s);if(!i?.field||typeof i.resolve!=="function")return[];let c=await i.resolve(n,r);if(c==null||Array.isArray(c)&&c.length===0)return[];let f=o[e];if(!f)return[];return((Array.isArray(c)?await f.whereIn(i.field,c).get():await f.where(i.field,c).get())??[]).map((T)=>T.id).filter((T)=>T!=null)}catch{return[]}}}}var St=Se("config/qb.ts");try{let e=(await import(St)).default;He(e??ze)}catch{J.debug("[orm] No config/qb.ts override found - deriving config from DB_CONNECTION");let e=z.DB_CONNECTION||"sqlite";He({...ze,dialect:e,database:e==="sqlite"?{database:z.DB_DATABASE_PATH||"database/stacks.sqlite"}:{database:z.DB_DATABASE||"stacks",host:z.DB_HOST||"127.0.0.1",port:z.DB_PORT||(e==="postgres"?5432:3306),username:z.DB_USERNAME||(e==="postgres"?"postgres":"root"),password:z.DB_PASSWORD||""}})}var ke=await Ve({defaultsRoot:kt("framework/defaults/app/Models"),userRoot:Se("app/Models"),onImportError:(e,t)=>J.warn(`[orm] Could not load model ${e}: ${t.message}`)}),xt=_t(),A=xt,Je=Fe(U.routes);function H(e,t){let n=he(e,t),r=Je.get(n);if(!r)return Je.set(n,{method:e,path:t}),!1;let o=String(r.path??"");return J.debug(`[orm] Skipping generated ${e} ${t} - already defined${o&&o!==t?` as ${o}`:""}.`),!0}function Ze(e){if(!e.attributes)return[];return Object.entries(e.attributes).filter(([t,n])=>n.hidden===!0).map(([t])=>t)}function qe(e){if(e.endsWith("y")&&!/[aeiou]y$/i.test(e))return`${e.slice(0,-1)}ies`;if(/(?:s|x|z|ch|sh)$/i.test(e))return`${e}es`;return`${e}s`}async function Ke(e,t,n,r){if(!e.length)return e;let o=n.split(",").map((u)=>u.trim()).filter(Boolean);if(!o.length)return e;let s=Array.isArray(t.belongsTo)?t.belongsTo:[],i=Array.isArray(t.hasMany)?t.hasMany:[],c=Array.isArray(t.hasOne)?t.hasOne:[],f=new Map;for(let u of s)f.set(_(u),{kind:"belongsTo",modelName:u});for(let u of c)f.set(_(u),{kind:"hasOne",modelName:u});for(let u of i)f.set(qe(_(u)),{kind:"hasMany",modelName:u});for(let u of o){let T=f.get(u);if(!T)continue;let P=r[T.modelName];if(!P)continue;let I=P.table||qe(_(T.modelName)),q=Ze(P),B=(N)=>G(ne(N,P),q);if(T.kind==="belongsTo"||T.kind==="hasOne"){let N=`${_(T.modelName)}_id`,C=[...new Set(e.map((S)=>S[N]).filter((S)=>S!=null))];if(!C.length){for(let S of e)S[u]=null;continue}let K=await A.selectFrom(I).whereIn("id",C).get(),L=new Map;for(let S of K??[])L.set(String(S.id),B(S));for(let S of e)S[u]=L.get(String(S[N]))??null}else{let N=String(t.name??""),C=`${_(N)}_id`,K=[...new Set(e.map((O)=>O.id).filter((O)=>O!=null))];if(!K.length){for(let O of e)O[u]=[];continue}let L=await A.selectFrom(I).whereIn(C,K).get(),S=new Map;for(let O of L??[]){let j=String(O[C]),Z=S.get(j)??[];Z.push(B(O)),S.set(j,Z)}for(let O of e)O[u]=S.get(String(O.id))??[]}}return e}async function Ge(e,t){let n=t?.set;if(!n||typeof n!=="object")return e;let r={...e};for(let[o,s]of Object.entries(n)){if(typeof s!=="function"||!(o in r))continue;try{r[o]=await s(r)}catch{}}return r}function Xe(e,t){return ye(e,t?.casts,"set")}function ne(e,t){return ye(e,t?.casts,"get")}function d(e,t=200){return new Response(JSON.stringify(e),{status:t,headers:{"Content-Type":"application/json"}})}var ae=1048576;async function _e(e){if(Number(e.headers?.get?.("content-length")??0)>ae)throw new W(413,`Request body exceeds ${ae}-byte limit`);if(e.jsonBody&&typeof e.jsonBody==="object")return e.jsonBody;if(e.formBody&&typeof e.formBody==="object")return e.formBody;try{let n=await e.clone().text();if(n.length>ae)throw new W(413,`Request body exceeds ${ae}-byte limit`);if(!n)return{};let r=JSON.parse(n);return r&&typeof r==="object"&&!Array.isArray(r)?r:{}}catch(n){if(n instanceof W)throw n;throw new W(400,`Invalid JSON body: ${n.message}`)}}function ue(e){if(e==null)return null;if(typeof e==="number")return Number.isFinite(e)&&e>0?e:null;if(typeof e==="string"){let t=e.trim();if(!t)return null;if(/^\d+$/.test(t)){let n=Number(t);return Number.isFinite(n)&&n>0?n:null}return t}return null}function vt(e){let t=e.bearerToken;if(typeof t==="function"){let r=t.call(e);if(r)return r}let n=e.headers?.get?.("authorization")||e.headers?.get?.("Authorization")||"";if(typeof n==="string"&&n.startsWith("Bearer "))return n.substring(7);return null}async function X(e){let t=e._authenticatedUser;if(t)return t;let n=vt(e);if(!n)return null;try{let{Auth:r}=await import("@stacksjs/auth"),o=await r.getUserFromToken(n);if(o)e._authenticatedUser=o;return o||null}catch{return null}}function te(e,t){if(e==null||t==null)return!1;if(Array.isArray(t))return t.some((n)=>String(n)===String(e));return String(e)===String(t)}async function Y(e,t,n){let r=ie(e);if(!r||!r.field||typeof r.resolve!=="function")return{enforced:!1,value:null,field:"",bypass:!1};let o=typeof r.bypass==="function"?!!r.bypass(t,n):!1,s=null;try{s=await r.resolve(t,n)}catch{s=null}return{enforced:!0,value:s,field:String(r.field),bypass:o}}async function Ye(e,t,n,r){let o=e?.authedFill?.[t];if(!o)return{};if(typeof o==="function")try{let s=await o(n,r);return s&&typeof s==="object"?s:{}}catch{return{}}if(typeof o==="object"){let s={};for(let[i,c]of Object.entries(o))try{s[i]=typeof c==="function"?await c(n,r):c}catch{}return s}return{}}var et=await(async()=>{let e=Rt.env.STACKS_API_ROW_SCOPING;try{let t=(await import(Se("config/security.ts"))).default;return be(t?.api?.rowScoping,e)}catch{return be(void 0,e)}})(),tt=[];for(let[e,t]of Object.entries(ke)){let n=t.traits?.useApi;if(!n)continue;let r=typeof n==="object"?n:{},o=r.uri||t.table||e.toLowerCase()+"s",s=r.routes||["index","show","store","update","destroy"],i=t.table||o,c=Me(t),f=Ze(t),u=Ce(o,r.prefix),T=je(t.attributes,f),{read:P,write:I,declared:q}=Ue(n),B=["store","update","destroy"].some((y)=>s.includes(y));if(B&&q&&I.length===0)J.warn(`[orm] ${e}: registering UNAUTHENTICATED mutating routes at ${u} (explicit \`middleware: []\` opt-out)`);if(["index","show"].some((y)=>s.includes(y))&&q&&P.length===0)J.debug(`[orm] ${e}: registering public read routes at ${u} (declared \`middleware.read: []\`)`);let C=!!ie(t),K=C&&!P.includes("auth")?["auth",...P]:P,L=Ie(t),S=B&&!C&&!L;if(S)tt.push(e);if(B&&L)J.debug(`[orm] ${e}: registering unscoped mutating routes at ${u} (declared \`ownership: false\`)`);let O=S&&et==="deny",j=(y,a=K)=>{let l=y;for(let g of a)if(l&&typeof l.middleware==="function")l=l.middleware(g);return l};if(s.includes("index")&&!H("GET",u))j(U.get(u,async(y)=>{try{let a=new URL(y.url),{page:l,perPage:g,offset:w}=Be(a.searchParams),h=a.searchParams.get("sort"),p=A.selectFrom(i);p=Ee(p,h,T);let M=new Set(["page","per_page","sort","fields","search","include","limit","offset","with_count","withTrashed","onlyTrashed"]);for(let[x,v]of a.searchParams.entries()){if(M.has(x)||!v)continue;if(!/^[a-z_][a-z0-9_]*$/i.test(x))continue;let V=T.get(x);if(V)p=p.where(V,"=",v)}let R=a.searchParams.get("search");if(R&&c.length>0){let x=c.slice(0,5);p=p.where((v)=>{for(let V of x)v=v.orWhere(_(V),"like",`%${R}%`);return v})}let k=a.searchParams.get("fields");if(k){let x=k.split(",").map((v)=>v.trim()).filter((v)=>/^[a-z_][a-z0-9_]*$/i.test(v)).map((v)=>_(v));if(x.length>0)p=p.select(x)}let D=!!t.traits?.useSoftDeletes,b=a.searchParams.get("withTrashed")==="true",E=a.searchParams.get("onlyTrashed")==="true";if(D&&!b)p=E?p.whereNotNull("deleted_at"):p.whereNull("deleted_at");let m=C?await Y(t,await X(y),y):{enforced:!1,value:null,field:"",bypass:!1};if(m.enforced&&!m.bypass){if(m.value==null||Array.isArray(m.value)&&m.value.length===0){let x=we(a,l,g,0,!1,void 0);return new Response(JSON.stringify({data:[],...x}),{status:200,headers:{"Content-Type":"application/json","Cache-Control":"private, no-store",Vary:"Authorization"}})}p=Array.isArray(m.value)?p.where(m.field,"in",m.value):p.where(m.field,"=",m.value)}let F=await p.limit(g+1).offset(w).get()||[],Q=F.length>g,re=(Q?F.slice(0,g):F).map((x)=>G(ne(x,t),f)),xe=a.searchParams.get("include");if(xe)re=await Ke(re,t,xe,ke);let nt=a.searchParams.get("with_count")==="true",ee;if(nt)try{let x=A.selectFrom(i);if(m.enforced&&!m.bypass&&m.value!=null)x=Array.isArray(m.value)?x.where(m.field,"in",m.value):x.where(m.field,"=",m.value);let v=await x.count(),V=typeof v==="number"?v:Number(v?.count??v);if(Number.isFinite(V))ee=V}catch{}let oe={"Content-Type":"application/json"};if(ee!==void 0&&!Number.isNaN(ee))oe["X-Total-Count"]=String(ee);oe["Cache-Control"]=m.enforced&&!m.bypass?"private, no-store":"public, max-age=15, must-revalidate",oe.Vary="Authorization";let rt=we(a,l,g,re.length,Q,ee);return new Response(JSON.stringify({data:re,...rt}),{status:200,headers:oe})}catch(a){if(a instanceof W){let l={error:a.message};if(a.details!==void 0)l.details=a.details;return d(l,a.status||400)}return d({error:`Failed to fetch ${o}`,detail:String(a)},500)}}));if(s.includes("show")&&!H("GET",`${u}/{id}`))j(U.get(`${u}/{id}`,async(y)=>{try{let a=ue(y.params?.id);if(a==null)return d({error:"Invalid ID parameter"},400);let l=await A.selectFrom(i).where({id:a}).executeTakeFirst();if(!l)return d({error:`${e} not found`},404);let g=new URL(y.url);if(t.traits?.useSoftDeletes&&l.deleted_at&&g.searchParams.get("withTrashed")!=="true")return d({error:`${e} not found`},404);let w=C?await Y(t,await X(y),y):{enforced:!1,value:null,field:"",bypass:!1};if(w.enforced&&!w.bypass){if(w.value==null||!te(l[w.field],w.value))return d({error:`${e} not found`},404)}let h=G(ne(l,t),f),p=g.searchParams.get("include");if(p){let[b]=await Ke([h],t,p,ke);h=b}let M=h?.updated_at||h?.created_at,R=M?`W/"${h.id}-${String(M)}"`:void 0,k=y.headers?.get?.("if-none-match");if(R&&k&&k===R)return new Response(null,{status:304,headers:{ETag:R}});let D={"Content-Type":"application/json"};if(R)D.ETag=R;return D["Cache-Control"]=w.enforced&&!w.bypass?"private, no-store":"public, max-age=30, must-revalidate",D.Vary="Authorization",new Response(JSON.stringify({data:h}),{status:200,headers:D})}catch(a){if(a instanceof W){let l={error:a.message};if(a.details!==void 0)l.details=a.details;return d(l,a.status||400)}return d({error:`Failed to fetch ${e}`,detail:String(a)},500)}}));if(!O&&s.includes("store")&&!H("POST",u))j(U.post(u,async(y)=>{try{let a=await _e(y),l=pe(a,f),g=fe(l,c),w=await X(y);if(w){let b=await Ye(t,"creating",w,y);for(let[E,m]of Object.entries(b))if(m!==void 0&&m!==null&&g[E]===void 0)g[E]=m}let h=await Y(t,w,y);if(h.enforced&&!h.bypass){if(!w)return d({error:"Auth required"},401);let b=Ne(g,h.field,h.value);if(b.error)return d({error:b.error},403);g=b.data}if(Object.keys(g).length===0)return d({error:"No fillable fields provided"},422);let p=me(g,t,"creating");if(!p.valid)return d({success:!1,message:"Validation failed",errors:p.errors},422);if(t.traits?.useTimestamps!==!1){let b=new Date().toISOString();g.created_at=b,g.updated_at=b}let M=await Ge(g,t),R=de(Xe(M,t)),k=await A.insertInto(i).values(R).execute(),D=R;try{let b=k?.lastInsertRowid??k?.insertId??k;if(b){let E=await A.selectFrom(i).where({id:b}).executeTakeFirst();if(E)D=E}}catch{}return d({data:G(ne(D,t),f)},201)}catch(a){let{status:l,body:g}=ce(a,e,"create");return d(g,l)}}),I);if(!O&&s.includes("update")){let y=async(a)=>{try{let l=ue(a.params?.id);if(l==null)return d({error:"Invalid ID parameter"},400);let g=await _e(a),w=pe(g,f),h=fe(w,c),p=await X(a);if(p){let m=await Ye(t,"updating",p,a);for(let[F,Q]of Object.entries(m))if(Q!==void 0&&Q!==null&&h[F]===void 0)h[F]=Q}if(Object.keys(h).length===0)return d({error:"No fillable fields provided"},422);let M=me(h,t,"updating");if(!M.valid)return d({success:!1,message:"Validation failed",errors:M.errors},422);let R=await A.selectFrom(i).where({id:l}).executeTakeFirst();if(!R)return d({error:`${e} not found`},404);let k=await Y(t,p,a);if(k.enforced&&!k.bypass){if(!p)return d({error:"Auth required"},401);let m=R[k.field];if(!te(m,k.value))return d({error:`Not your ${e}`},403);let F=Object.keys(h).find((Q)=>_(Q)===_(k.field));if(F!==void 0&&!te(h[F],k.value))return d({error:`Cannot reassign ${e} ownership`},403)}if(t.traits?.useTimestamps!==!1)h.updated_at=new Date().toISOString();let D=await Ge(h,t),b=de(Xe(D,t));await A.updateTable(i).set(b).where({id:l}).execute();let E={...R,...b};try{let m=await A.selectFrom(i).where({id:l}).executeTakeFirst();if(m)E=m}catch{}return d({data:G(ne(E,t),f)})}catch(l){let{status:g,body:w}=ce(l,e,"update");return d(w,g)}};if(!H("PUT",`${u}/{id}`))j(U.put(`${u}/{id}`,y),I);if(!H("PATCH",`${u}/{id}`))j(U.patch(`${u}/{id}`,y),I)}let Z=!!t.traits?.useSoftDeletes;if(!O&&s.includes("destroy")&&!H("DELETE",`${u}/{id}`))j(U.delete(`${u}/{id}`,async(y)=>{try{let a=ue(y.params?.id);if(a==null)return d({error:"Invalid ID parameter"},400);let l=await A.selectFrom(i).where({id:a}).executeTakeFirst();if(!l)return d({error:`${e} not found`},404);let g=await X(y),w=await Y(t,g,y);if(w.enforced&&!w.bypass){if(!g)return d({error:"Auth required"},401);let h=l[w.field];if(!te(h,w.value))return d({error:`Not your ${e}`},403)}if(Z){let h=new Date().toISOString();await A.updateTable(i).set({deleted_at:h,updated_at:h}).where({id:a}).execute()}else await A.deleteFrom(i).where({id:a}).execute();return new Response(null,{status:204})}catch(a){if(a instanceof W){let l={error:a.message};if(a.details!==void 0)l.details=a.details;return d(l,a.status||400)}return d({error:`Failed to delete ${e}`,detail:String(a)},500)}}),I);if(!O&&s.includes("destroy")&&!H("POST",`${u}/bulk-delete`))j(U.post(`${u}/bulk-delete`,async(y)=>{try{let l=(await _e(y))?.ids;if(!Array.isArray(l)||l.length===0)return d({error:"An array of IDs is required"},422);if(l.length>100)return d({error:"Cannot delete more than 100 records at once"},422);let g=[],w=[];for(let R of l){let k=ue(R);if(k!=null)g.push(k);else w.push(R)}if(w.length>0)return d({error:"Invalid IDs in batch",invalid:w},422);let h=await X(y),p=await Y(t,h,y);if(p.enforced&&!p.bypass){if(!h)return d({error:"Auth required"},401);if(p.value==null)return d({error:"Caller has no ownership identity"},403);let R=await A.selectFrom(i).select(["id",p.field]).execute(),k=new Set(R.filter((b)=>te(b[p.field],p.value)).map((b)=>String(b.id))),D=g.filter((b)=>!k.has(String(b)));if(D.length>0)return d({error:`Cannot delete ${e} you don't own`,ids:D},403)}let M=new Date().toISOString();for(let R of g)if(Z)await A.updateTable(i).set({deleted_at:M,updated_at:M}).where({id:R}).execute();else await A.deleteFrom(i).where({id:R}).execute();return d({message:`Successfully deleted ${g.length} ${o}`})}catch(a){if(a instanceof W){let l={error:a.message};if(a.details!==void 0)l.details=a.details;return d(l,a.status||400)}return d({error:`Failed to bulk delete ${o}`,detail:String(a)},500)}}),I)}{let e=Qe(tt,et);if(e)J.warn(e)}var Gt=U;export{Gt as default};
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "@stacksjs/orm",
|
|
3
3
|
"type": "module",
|
|
4
4
|
"sideEffects": false,
|
|
5
|
-
"version": "0.74.
|
|
5
|
+
"version": "0.74.50",
|
|
6
6
|
"description": "The Stacks ORM integration",
|
|
7
7
|
"author": "Chris Breuer",
|
|
8
8
|
"contributors": [
|
|
@@ -63,31 +63,31 @@
|
|
|
63
63
|
"prepublishOnly": "bun run build"
|
|
64
64
|
},
|
|
65
65
|
"dependencies": {
|
|
66
|
-
"@stacksjs/cache": "0.74.
|
|
67
|
-
"@stacksjs/cli": "0.74.
|
|
68
|
-
"@stacksjs/config": "0.74.
|
|
69
|
-
"@stacksjs/database": "0.74.
|
|
70
|
-
"@stacksjs/env": "0.74.
|
|
71
|
-
"@stacksjs/error-handling": "0.74.
|
|
72
|
-
"@stacksjs/events": "0.74.
|
|
73
|
-
"@stacksjs/logging": "0.74.
|
|
74
|
-
"@stacksjs/model-meta": "0.74.
|
|
75
|
-
"@stacksjs/pagination": "0.74.
|
|
76
|
-
"@stacksjs/path": "0.74.
|
|
77
|
-
"@stacksjs/query-builder": "0.74.
|
|
78
|
-
"@stacksjs/realtime": "0.74.
|
|
79
|
-
"@stacksjs/router": "0.74.
|
|
80
|
-
"@stacksjs/storage": "0.74.
|
|
81
|
-
"@stacksjs/strings": "0.74.
|
|
66
|
+
"@stacksjs/cache": "0.74.50",
|
|
67
|
+
"@stacksjs/cli": "0.74.50",
|
|
68
|
+
"@stacksjs/config": "0.74.50",
|
|
69
|
+
"@stacksjs/database": "0.74.50",
|
|
70
|
+
"@stacksjs/env": "0.74.50",
|
|
71
|
+
"@stacksjs/error-handling": "0.74.50",
|
|
72
|
+
"@stacksjs/events": "0.74.50",
|
|
73
|
+
"@stacksjs/logging": "0.74.50",
|
|
74
|
+
"@stacksjs/model-meta": "0.74.50",
|
|
75
|
+
"@stacksjs/pagination": "0.74.50",
|
|
76
|
+
"@stacksjs/path": "0.74.50",
|
|
77
|
+
"@stacksjs/query-builder": "0.74.50",
|
|
78
|
+
"@stacksjs/realtime": "0.74.50",
|
|
79
|
+
"@stacksjs/router": "0.74.50",
|
|
80
|
+
"@stacksjs/storage": "0.74.50",
|
|
81
|
+
"@stacksjs/strings": "0.74.50",
|
|
82
82
|
"@stacksjs/ts-validation": "^0.5.6",
|
|
83
|
-
"@stacksjs/validation": "0.74.
|
|
83
|
+
"@stacksjs/validation": "0.74.50",
|
|
84
84
|
"bun-query-builder": "^0.2.70"
|
|
85
85
|
},
|
|
86
86
|
"peerDependencies": {
|
|
87
|
-
"@stacksjs/auth": "0.74.
|
|
88
|
-
"@stacksjs/payments": "0.74.
|
|
89
|
-
"@stacksjs/queue": "0.74.
|
|
90
|
-
"@stacksjs/search-engine": "0.74.
|
|
87
|
+
"@stacksjs/auth": "0.74.50",
|
|
88
|
+
"@stacksjs/payments": "0.74.50",
|
|
89
|
+
"@stacksjs/queue": "0.74.50",
|
|
90
|
+
"@stacksjs/search-engine": "0.74.50",
|
|
91
91
|
"stripe": "22.3.2"
|
|
92
92
|
},
|
|
93
93
|
"peerDependenciesMeta": {
|
|
@@ -108,7 +108,7 @@
|
|
|
108
108
|
}
|
|
109
109
|
},
|
|
110
110
|
"devDependencies": {
|
|
111
|
-
"@stacksjs/types": "0.74.
|
|
111
|
+
"@stacksjs/types": "0.74.50",
|
|
112
112
|
"better-dx": "^0.2.24",
|
|
113
113
|
"stripe": "22.3.2"
|
|
114
114
|
}
|