@stacksjs/orm 0.75.72 → 0.75.74
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 +12 -21
- package/dist/index.js +16 -16
- package/dist/routes.js +1 -1
- package/package.json +23 -23
package/dist/auto-crud.d.ts
CHANGED
|
@@ -1,24 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
* True when the error is a unique-constraint violation, across SQLite,
|
|
3
|
-
* MySQL, and Postgres:
|
|
4
|
-
*
|
|
5
|
-
* - SQLite: `SQLITE_CONSTRAINT_UNIQUE` / `SQLITE_CONSTRAINT`
|
|
6
|
-
* - MySQL: `errno: 1062` (ER_DUP_ENTRY)
|
|
7
|
-
* - Postgres: `code: '23505'` (unique_violation)
|
|
8
|
-
* - Generic fallback: message text match — covers wrapped errors from drivers
|
|
9
|
-
* that lose the structured code.
|
|
10
|
-
*
|
|
11
|
-
* Lives here (cycle-free `@stacksjs/orm`) rather than in `@stacksjs/auth`
|
|
12
|
-
* because every framework write path needs it: auto-CRUD routes, commerce/cms
|
|
13
|
-
* write functions, and `@stacksjs/auth`'s `register()` (which re-exports this
|
|
14
|
-
* via './rbac-store-bqb' for back-compat). `@stacksjs/database` is NOT a valid
|
|
15
|
-
* home — its drivers statically import `@stacksjs/orm`, so orm routes importing
|
|
16
|
-
* from database would create a package cycle.
|
|
17
|
-
*
|
|
18
|
-
* Exported for direct unit testing and for callers that map duplicates to
|
|
19
|
-
* their own error (e.g. `register()`'s 409) instead of swallowing them.
|
|
20
|
-
*/
|
|
21
|
-
export declare function isUniqueViolation(err: unknown): boolean;
|
|
1
|
+
import { isUniqueViolation } from '@stacksjs/error-handling';
|
|
22
2
|
/**
|
|
23
3
|
* Classify a write-path error into an HTTP status + JSON body for the
|
|
24
4
|
* auto-CRUD store/update handlers. Three branches, in priority order:
|
|
@@ -435,3 +415,14 @@ export type WriteValidationResult = | { valid: true }
|
|
|
435
415
|
* scoping. See `ApiSecurityOptions` in @stacksjs/types for the full reasoning.
|
|
436
416
|
*/
|
|
437
417
|
export type ApiRowScopingPolicy = 'warn' | 'deny';
|
|
418
|
+
/**
|
|
419
|
+
* Pure helpers for the auto-CRUD route generator (../routes.ts).
|
|
420
|
+
*
|
|
421
|
+
* Extracted so the write-path key mapping and middleware resolution can be
|
|
422
|
+
* unit-tested without booting the router or a database. The canonical
|
|
423
|
+
* storage/framework/orm/routes.ts entrypoint delegates to ../core/orm/routes,
|
|
424
|
+
* so every runtime consumes these same helpers.
|
|
425
|
+
*/
|
|
426
|
+
// Lives in @stacksjs/error-handling, where the queue and other packages that
|
|
427
|
+
// cannot depend on the ORM can use it too. Re-exported for existing callers.
|
|
428
|
+
export { isUniqueViolation } from '@stacksjs/error-handling';
|
package/dist/index.js
CHANGED
|
@@ -1,27 +1,27 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
var dt=(e,t,n)=>()=>{if(e)try{t=e(e=0)}catch(r){n=[r]}if(n)throw n[0];return t};var Vn=import.meta.require;import{readdirSync as Qr}from"fs";import{basename as zr,extname as Gt,join as Hr}from"path";function Jr(e){let t=[],n=(r)=>{let o;try{o=Qr(r,{withFileTypes:!0})}catch{return}for(let i of o){let a=Hr(r,i.name);if(i.isDirectory()){n(a);continue}if(![".ts",".js"].includes(Gt(i.name)))continue;if(i.name.startsWith(".")||i.name.startsWith("index"))continue;t.push(a)}};return n(e),t.sort()}async function qt(e,t,n){for(let r of Jr(e))try{let o=Gt(r),i=await import(`${r}?t=${Date.now()}`),a=i.default??i,s=a.name??zr(r,o);t[s]={...a,name:s}}catch(o){n?.(r,o)}}async function Ut(e){let t={};return await qt(e.defaultsRoot,t,e.onImportError),await qt(e.userRoot,t,e.onImportError),t}var Kt=()=>{};import{path as Wt}from"@stacksjs/path";async function Ue(){return Ut({defaultsRoot:Wt.frameworkPath("defaults/app/Models"),userRoot:Wt.userModelsPath()})}var Ke=dt(()=>{Kt()});import"@stacksjs/validation/runtime";import{log as Ae}from"@stacksjs/cli";import{db as ft,mutationCount as pt}from"@stacksjs/database/runtime";async function Qn(e,t={}){let{olderThanDays:n=30,column:r="created_at",query:o}=t;try{if(o){let u=ft.deleteFrom(e);u=o(u);let c=pt(await u.execute());return Ae.info(`Pruned ${c} records from ${e}`),c}let i=new Date;i.setDate(i.getDate()-n);let a=await ft.deleteFrom(e).where(r,"<",i.toISOString()).execute(),s=pt(a);return Ae.info(`Pruned ${s} records from ${e} older than ${n} days`),s}catch(i){throw Ae.error(`Failed to prune ${e}:`,i),i}}async function Bs(e,t={}){return Qn(e,t)}function Ns(e){if(!e?.prunable)return null;if(typeof e.prunable==="boolean")return{olderThanDays:30,column:"created_at"};return e.prunable}import{createCipheriv as zn,createDecipheriv as Hn,createHash as Jn,randomBytes as Yn}from"crypto";import{log as oe}from"@stacksjs/logging";var mt="enc:",gt="aes-256-gcm",Xn=12,re=null;async function yt(){if(re)return re;let e=process.env.APP_KEY;if(!e)try{e=(await import("@stacksjs/config").catch(()=>null))?.config?.app?.key}catch{}if(!e)return null;return re=Jn("sha256").update(e).digest(),re}function K(e){return typeof e==="string"&&e.startsWith(mt)}async function Pe(e){if(e==null)return e;if(K(e))return e;if(typeof e!=="string")return e;let t=await yt();if(!t)return oe.warn("[orm] encrypted attribute: APP_KEY not set - storing value in plaintext"),e;let n=Yn(Xn),r=zn(gt,t,n),o=Buffer.concat([r.update(e,"utf8"),r.final()]),i=r.getAuthTag();return`${mt}${n.toString("base64")}:${i.toString("base64")}:${o.toString("base64")}`}async function xe(e){if(e==null)return e;if(typeof e!=="string")return e;if(!K(e))return e;try{let t=await yt();if(!t)return oe.warn("[orm] encrypted attribute: APP_KEY not set - cannot decrypt"),null;let[,n,r,o]=e.split(":");if(!n||!r||!o)return oe.warn("[orm] encrypted attribute: malformed envelope, returning null"),null;let i=Buffer.from(n,"base64"),a=Buffer.from(r,"base64"),s=Buffer.from(o,"base64"),u=Hn(gt,t,i);return u.setAuthTag(a),Buffer.concat([u.update(s),u.final()]).toString("utf8")}catch(t){return oe.warn("[orm] encrypted attribute: decrypt failed (key rotation? corrupted ciphertext?)",{error:t}),null}}function Ce(e){let t=e.attributes;if(!t||typeof t!=="object")return[];let n=[];for(let[r,o]of Object.entries(t))if(o&&typeof o==="object"&&o.encrypted===!0)n.push(r);return n}import{sqlDateTime as Zn}from"@stacksjs/database/runtime";import{log as B}from"@stacksjs/logging";var er=[/^password$/i,/^password_hash$/i,/^api_key$/i,/_token$/i,/_secret$/i,/^remember_token$/i],bt="model_audits",ve=null;function tr(e){ve=e}async function ie(){if(ve!=null)return ve;try{let e=await import("@stacksjs/router").catch(()=>null);if(!e)return null;let t=e.getCurrentRequest;if(typeof t!=="function")return null;let n=t();if(!n)return null;return(n.user??n._user)?.id??null}catch{return null}}function W(e){if(!e||typeof e!=="object")return null;let t={};for(let[n,r]of Object.entries(e)){if(er.some((o)=>o.test(n)))continue;t[n]=r}return t}function I(e){if(!e||typeof e!=="object")return null;let t=e;if(t._attributes&&typeof t._attributes==="object")return{...t._attributes};return{...e}}function nr(e,t){if(!e||!t)return{old:e,next:t};let n={},r={},o=new Set([...Object.keys(e),...Object.keys(t)]);for(let i of o)if(e[i]!==t[i])n[i]=e[i],r[i]=t[i];return{old:n,next:r}}async function ae(e,t=!1){try{let{db:n}=await import("@stacksjs/database/runtime");await n.insertInto(bt).values({auditable_type:e.auditable_type,auditable_id:e.auditable_id,event:e.event,old_values:e.old_values?JSON.stringify(e.old_values):null,new_values:e.new_values?JSON.stringify(e.new_values):null,user_id:e.user_id,created_at:Zn()}).executeTakeFirst()}catch(n){if(B.warn(`[orm] audit row write failed for ${e.auditable_type}#${String(e.auditable_id)} (${e.event})`,{error:n}),t)throw n}}function ht(e){return{async audits(t){try{let{db:n}=await import("@stacksjs/database/runtime");return(await n.selectFrom(bt).selectAll().where("auditable_type","=",e).where("auditable_id","=",t).orderBy("created_at","desc").execute()??[]).map((o)=>({...o,old_values:typeof o.old_values==="string"?wt(o.old_values):o.old_values,new_values:typeof o.new_values==="string"?wt(o.new_values):o.new_values}))}catch(n){return B.warn(`[orm] audits() lookup failed for ${e}#${String(t)}`,{error:n}),[]}}}}function wt(e){try{return JSON.parse(e)}catch{return e}}function kt(e){if(e&&typeof e==="object"&&"transactional"in e)return{transactional:e.transactional===!0};return{transactional:!1}}function Tt(e,t,n="id",r={}){let o=r.transactional===!0,i=e;if(typeof e.audits!=="function")e.audits=ht(t).audits;let a=async(f)=>{if(!o)return await f();let{db:d}=await import("@stacksjs/database/runtime");return await d.transaction(async()=>f())},s=e.create;if(typeof s==="function")e.create=async function(...f){return await a(async()=>{let d=await s.apply(this,f);try{let p=I(d),m=p?.[n];if(m!=null){let g=await ie();await ae({auditable_type:t,auditable_id:m,event:"created",old_values:null,new_values:W(p),user_id:g},o)}}catch(p){if(B.warn(`[orm] audit(create) failed for ${t}`,{error:p}),o)throw p}return d})};let u=e.createMany;if(typeof u==="function")e.createMany=async function(...f){return await a(async()=>{let d=await u.apply(this,f);try{let p=Array.isArray(d)&&d.length?await ie():null;for(let m of Array.isArray(d)?d:[]){let g=I(m),w=g?.[n];if(w==null)continue;await ae({auditable_type:t,auditable_id:w,event:"created",old_values:null,new_values:W(g),user_id:p},o)}}catch(p){if(B.warn(`[orm] audit(createMany) failed for ${t}`,{error:p}),o)throw p}return d})};let c=e.update;if(typeof c==="function")e.update=async function(f,d){return await a(async()=>{let p=i.find,m=typeof p==="function"?I(await p.call(i,f)):null,g=await c.call(this,f,d);try{let w=I(g)??(typeof p==="function"?I(await p.call(i,f)):null),{old:h,next:b}=nr(m,w);if(b&&Object.keys(b).length>0){let k=await ie();await ae({auditable_type:t,auditable_id:f,event:"updated",old_values:W(h),new_values:W(b),user_id:k},o)}}catch(w){if(B.warn(`[orm] audit(update) failed for ${t}#${String(f)}`,{error:w}),o)throw w}return g})};let l=(f)=>{let d=e[f];if(typeof d!=="function")return;e[f]=async function(p){return await a(async()=>{let m=i.find,g=typeof m==="function"?I(await m.call(i,p)):null,w=await d.call(this,p);try{if(w!==!1&&g){let h=await ie();await ae({auditable_type:t,auditable_id:p,event:"deleted",old_values:W(g),new_values:null,user_id:h},o)}}catch(h){if(B.warn(`[orm] audit(${f}) failed for ${t}#${String(p)}`,{error:h}),o)throw h}return w})}};l("delete"),l("softDelete")}import{db as rr,sql as or,sqlDateTime as Me}from"@stacksjs/database/runtime";function C(e,t){if(typeof e!=="number"||!Number.isFinite(e)||e<=0)throw Error(`[orm/commentable] ${t} requires a positive numeric id (received ${String(e)})`)}var V="commentable_upvotes",Q="commentables";function ir(e){let t=e;return t.code==="SQLITE_CONSTRAINT_UNIQUE"||t.code==="SQLITE_CONSTRAINT"||t.code==="23505"||t.errno===1062||/unique|duplicate/i.test(t.message??"")}var Rt=["pending","approved"];function Oe(e){let t=rr;return{async comments(n){return C(n,"comments"),await t.selectFrom("commentables").where("commentables_id","=",n).where("commentables_type","=",e).selectAll().orderBy("id","asc").execute()},async commentCount(n){let r=await t.selectFrom("commentables").select(or`count(*) as count`).where("commentables_id","=",n).where("commentables_type","=",e).executeTakeFirst();return Number(r?.count)||0},async addComment(n,r,o={}){if(C(n,"addComment"),!r||typeof r.body!=="string"||r.body.trim().length===0)throw Error("[orm/commentable] addComment requires a non-empty comment.body");if(r.title!=null&&typeof r.title!=="string")throw Error("[orm/commentable] addComment requires comment.title to be a string when given");let i=o.status??"pending";if(!Rt.includes(i))throw Error(`[orm/commentable] addComment status must be one of ${Rt.join(", ")} (received ${String(i)})`);let a={title:r.title?.trim()??"",body:r.body,commentables_id:n,commentables_type:e,status:i,approved_at:i==="approved"?Date.now():null,created_at:Me(),updated_at:Me()};for(let c of["author_name","author_email","user_id"])if(r[c]!=null)a[c]=r[c];let s=await t.insertInto("commentables").values(a).returningAll().executeTakeFirst();if(s&&typeof s==="object"&&"id"in s)return s;let u=s?.lastInsertRowid;if(u==null)return s;return await t.selectFrom("commentables").where("id","=",Number(u)).selectAll().executeTakeFirst()},async approvedComments(n){return await t.selectFrom("commentables").where("commentables_id","=",n).where("commentables_type","=",e).where("status","=","approved").selectAll().orderBy("id","asc").execute()},async pendingComments(n){return await t.selectFrom("commentables").where("commentables_id","=",n).where("commentables_type","=",e).where("status","=","pending").selectAll().orderBy("id","asc").execute()},async rejectedComments(n){return await t.selectFrom("commentables").where("commentables_id","=",n).where("commentables_type","=",e).where("status","=","rejected").selectAll().orderBy("id","asc").execute()},async upvoteComment(n,r){C(n,"upvoteComment"),C(r,"upvoteComment");let o=()=>t.selectFrom(V).where("upvoteable_id","=",n).where("upvoteable_type","=",Q).where("user_id","=",r).selectAll().executeTakeFirst(),i=await o();if(i)return i;try{await t.insertInto(V).values({upvoteable_id:n,upvoteable_type:Q,user_id:r,created_at:Me()}).execute()}catch(a){if(!ir(a))throw a}return await o()},async removeCommentUpvote(n,r){C(n,"removeCommentUpvote"),C(r,"removeCommentUpvote"),await t.deleteFrom(V).where("upvoteable_id","=",n).where("upvoteable_type","=",Q).where("user_id","=",r).execute()},async commentUpvoteCount(n){C(n,"commentUpvoteCount");let r=await t.selectFrom(V).select("count(*) as count").where("upvoteable_id","=",n).where("upvoteable_type","=",Q).executeTakeFirst();return Number(r?.count)||0},async hasUpvotedComment(n,r){return C(n,"hasUpvotedComment"),C(r,"hasUpvotedComment"),!!await t.selectFrom(V).where("upvoteable_id","=",n).where("upvoteable_type","=",Q).where("user_id","=",r).selectAll().executeTakeFirst()}}}import{db as ar,sql as sr,sqlDateTime as _t}from"@stacksjs/database/runtime";function De(e,t){if(typeof e!=="number"||!Number.isFinite(e)||e<=0)throw Error(`[orm/taggable] ${t} requires a positive numeric id (received ${String(e)})`)}function Ee(e){let t=ar;return{async tags(n){return De(n,"tags"),await t.selectFrom("taggables").where("taggable_id","=",n).where("taggable_type","=",e).selectAll().execute()},async tagCount(n){De(n,"tagCount");let r=await t.selectFrom("taggables").select(sr`count(*) as count`).where("taggable_id","=",n).where("taggable_type","=",e).executeTakeFirst();return Number(r?.count)||0},async addTag(n,r){if(De(n,"addTag"),!r||typeof r.name!=="string"||r.name.trim().length===0)throw Error("[orm/taggable] addTag requires a non-empty tag.name");return await t.insertInto("taggables").values({...r,taggable_id:n,taggable_type:e,slug:r.name.toLowerCase().replace(/[^a-z0-9]+/g,"-"),is_active:!0,created_at:_t(),updated_at:_t()}).execute(),await t.selectFrom("taggables").where("taggable_id","=",n).where("taggable_type","=",e).where("name","=",r.name).selectAll().executeTakeFirst()},async activeTags(n){return await t.selectFrom("taggables").where("taggable_id","=",n).where("taggable_type","=",e).where("is_active","=",!0).selectAll().execute()},async inactiveTags(n){return await t.selectFrom("taggables").where("taggable_id","=",n).where("taggable_type","=",e).where("is_active","=",!1).selectAll().execute()},async removeTag(n,r){await t.deleteFrom("taggables").where("taggable_id","=",n).where("taggable_type","=",e).where("id","=",r).execute()}}}import{db as ur,sqlDateTime as se}from"@stacksjs/database/runtime";function je(e){let t=ur;async function n(r){return(await t.selectFrom("categorizable_models").where("categorizable_id","=",r).where("categorizable_type","=",e).selectAll().execute()).map((i)=>i.category_id)}return{async categories(r){let o=await n(r);if(o.length===0)return[];return await t.selectFrom("categorizables").where("id","in",o).selectAll().execute()},async categoryCount(r){return(await n(r)).length},async addCategory(r,o){let i=()=>t.selectFrom("categorizables").where("name","=",o.name).where("categorizable_type","=",e).selectAll().executeTakeFirst(),a=await i();if(!a)await t.insertInto("categorizables").values({name:o.name,description:o.description,slug:o.name.toLowerCase().replace(/[^a-z0-9]+/g,"-"),categorizable_type:e,is_active:!0,created_at:se(),updated_at:se()}).execute(),a=await i();return await t.insertInto("categorizable_models").values({categorizable_id:r,categorizable_type:e,category_id:a?.id,created_at:se(),updated_at:se()}).execute(),a},async activeCategories(r){let o=await n(r);if(o.length===0)return[];return await t.selectFrom("categorizables").where("id","in",o).where("is_active","=",!0).selectAll().execute()},async inactiveCategories(r){let o=await n(r);if(o.length===0)return[];return await t.selectFrom("categorizables").where("id","in",o).where("is_active","=",!1).selectAll().execute()},async removeCategory(r,o){await t.deleteFrom("categorizable_models").where("categorizable_id","=",r).where("categorizable_type","=",e).where("category_id","=",o).execute()}}}import{db as cr,sqlDateTime as lr}from"@stacksjs/database/runtime";function Fe(e,t){let n=cr,r=t?.table||`${e}_likes`,o=t?.foreignKey||`${e.replace(/s$/,"")}_id`;return{async likes(i){return await n.selectFrom(r).where(o,"=",i).selectAll().execute()},async likeCount(i){let a=await n.selectFrom(r).select("count(*) as count").where(o,"=",i).executeTakeFirst();return Number(a?.count)||0},async like(i,a){if(typeof i!=="number"||!Number.isFinite(i)||i<=0)throw Error(`[orm/likeable] like requires a positive numeric id (received ${String(i)})`);if(typeof a!=="number"||!Number.isFinite(a)||a<=0)throw Error(`[orm/likeable] like requires a positive numeric userId (received ${String(a)})`);let s=lr();try{return await n.insertInto(r).values({[o]:i,user_id:a,created_at:s,updated_at:s}).returningAll().executeTakeFirst()}catch(u){let c=u;if(!(c.code==="SQLITE_CONSTRAINT_UNIQUE"||c.code==="SQLITE_CONSTRAINT"||c.code==="23505"||c.errno===1062||/unique|duplicate/i.test(c.message??"")))throw u;let f=await n.selectFrom(r).where(o,"=",i).where("user_id","=",a).selectAll().executeTakeFirst();if(f)return f;throw u}},async unlike(i,a){await n.deleteFrom(r).where(o,"=",i).where("user_id","=",a).execute()},async isLiked(i,a){return!!await n.selectFrom(r).where(o,"=",i).where("user_id","=",a).selectAll().executeTakeFirst()},async likedBy(i){return(await n.selectFrom(r).select([o]).where("user_id","=",i).execute()).map((s)=>Number(s[o])).filter(Boolean)}}}import{createRequire as dr}from"module";import{db as fr}from"@stacksjs/database/runtime";var pr=dr(import.meta.url);class $e extends Error{constructor(e){super(`No subscription ${e} belongs to this user`);this.name="SubscriptionNotOwnedError"}}function St(e){let t=fr;return{async syncStripeCustomerDetails(n,r){let{manageCustomer:o}=await import("@stacksjs/payments");return await o.syncStripeCustomerDetails(n,r)},async createStripeUser(n,r){let{manageCustomer:o}=await import("@stacksjs/payments");return await o.createStripeCustomer(n,r)},async updateStripeUser(n,r){let{manageCustomer:o}=await import("@stacksjs/payments");return await o.updateStripeCustomer(n,r)},async deleteStripeUser(n){let{manageCustomer:r}=await import("@stacksjs/payments");return await r.deleteStripeUser(n)},async createOrGetStripeUser(n,r){let{manageCustomer:o}=await import("@stacksjs/payments");return await o.createOrGetStripeUser(n,r)},async retrieveStripeUser(n){let{manageCustomer:r}=await import("@stacksjs/payments");return await r.retrieveStripeUser(n)},async defaultPaymentMethod(n){let{managePaymentMethod:r}=await import("@stacksjs/payments");return await r.retrieveDefaultPaymentMethod(n)},async setDefaultPaymentMethod(n,r){let{managePaymentMethod:o}=await import("@stacksjs/payments");return typeof r==="string"?await o.setUserDefaultPayment(n,r):await o.setDefaultPaymentMethod(n,r)},async deletePaymentMethod(n,r){let{managePaymentMethod:o}=await import("@stacksjs/payments");return await o.deletePaymentMethod(n,r)},async addPaymentMethod(n,r){let{managePaymentMethod:o}=await import("@stacksjs/payments");return await o.addPaymentMethod(n,r)},async paymentMethods(n,r){let{managePaymentMethod:o}=await import("@stacksjs/payments");return await o.listPaymentMethods(n,r)},async newSubscription(n,r,o,i={}){let{manageSubscription:a}=await import("@stacksjs/payments"),s=await a.create(n,r,o,i),c=s.latest_invoice?.payment_intent;return{subscription:s,paymentIntent:c}},async updateSubscription(n,r,o,i={}){let{manageSubscription:a}=await import("@stacksjs/payments"),s=await a.update(n,r,o,i),c=s.latest_invoice?.payment_intent;return{subscription:s,paymentIntent:c}},async cancelSubscription(n,r,o={}){if(!await t.selectFrom("subscriptions").where("provider_id","=",r).where("user_id","=",n.id).select(["id"]).executeTakeFirst())throw new $e(r);let{manageSubscription:a}=await import("@stacksjs/payments");return{subscription:await a.cancel(r,o)}},async activeSubscription(n){let{manageSubscription:r}=await import("@stacksjs/payments"),o=await t.selectFrom("subscriptions").where("user_id","=",n.id).where("provider_status","=","active").selectAll().executeTakeFirst();if(o){let i=await r.retrieve(n,o.provider_id||"");return{subscription:o,providerSubscription:i}}return},async checkout(n,r,o={}){let{manageCheckout:i,manageCustomer:a}=await import("@stacksjs/payments"),s={};if(o.enableTax)s.automatic_tax={enabled:!0},delete o.enableTax;if(o.allowPromotions)s.allow_promotion_codes=!0,delete o.allowPromotions;let l={...{mode:"payment",customer:(await a.createOrGetStripeUser(n,{})).id,line_items:r.map((f)=>({price:f.priceId,quantity:f.quantity||1}))},...s,...o};return await i.create(n,l)},async createSetupIntent(n,r={}){let{manageSetupIntent:o}=await import("@stacksjs/payments");return await o.create(n,r)},async createPayment(n,r,o={}){let{manageCharge:i}=await import("@stacksjs/payments");return await i.createPayment(n,r,o)},async storeTransaction(n,r,o){let{manageTransaction:i}=await import("@stacksjs/payments");return await i.store(n,r,o)},async subscriptionHistory(n){let{manageInvoice:r}=await import("@stacksjs/payments");return await r.list(n)},async transactionHistory(n){let{manageTransaction:r}=await import("@stacksjs/payments");return await r.list(n)},async connectAccount(n,r={}){let o=r.accountColumn||"stripe_account_id",i=(n._attributes??n)[o];if(!i)return null;let a=await z();try{return await a.accounts.retrieve(i)}catch{return null}},async createConnectAccount(n,r={}){let o=r.accountColumn||"stripe_account_id",i=n._attributes??n,a=i[o],s=await z();if(!a){let{stacksIdempotencyKey:u}=await import("@stacksjs/payments"),c=r.modelTable||e,l=await s.accounts.create({type:r.type??"express",email:r.email??i.email,country:r.country??"US",capabilities:r.capabilities??{card_payments:{requested:!0},transfers:{requested:!0}}},{idempotencyKey:u("connect.account.create",c,i.id)});return a=l.id,await t.updateTable(c).set({[o]:a}).where("id","=",Number(i.id)).execute(),l}return await s.accounts.retrieve(a)},async connectOnboardLink(n,r){let o=r.accountColumn||"stripe_account_id",a=(n._attributes??n)[o];if(!a)throw Error("connectOnboardLink: model has no Stripe Connect account; call createConnectAccount first");return{url:(await(await z()).accountLinks.create({account:a,refresh_url:r.refreshUrl,return_url:r.returnUrl,type:r.type??"account_onboarding"})).url,accountId:a}},async syncConnectStatus(n,r={}){let o=r.accountColumn||"stripe_account_id",i=r.chargesColumn||"charges_enabled",a=r.payoutsColumn||"payouts_enabled",s=n._attributes??n,u=s[o];if(!u)return{chargesEnabled:!1,payoutsEnabled:!1};let l=await(await z()).accounts.retrieve(u),f=!!l.charges_enabled,d=!!l.payouts_enabled,p=r.modelTable||e;return await t.updateTable(p).set({[i]:f,[a]:d}).where("id","=",Number(s.id)).execute(),{chargesEnabled:f,payoutsEnabled:d}},async chargeWithSplit(n,r){let o=await z(),i=r.accountColumn||"stripe_account_id",a=n._attributes??n,s=r.connectAccountId||a[i],u={amount:r.amountCents,currency:r.currency||"usd",automatic_payment_methods:{enabled:!0},metadata:r.metadata};if(s){if(u.transfer_data={destination:s},r.platformFeeCents)u.application_fee_amount=r.platformFeeCents}let{freshIdempotencyKey:c}=await import("@stacksjs/payments");return await o.paymentIntents.create(u,{idempotencyKey:c("payment_intent.create",a.id,r.amountCents)})}}}var mr={syncStripeCustomerDetails:!0,createStripeUser:!0,updateStripeUser:!0,deleteStripeUser:!0,createOrGetStripeUser:!0,retrieveStripeUser:!0,defaultPaymentMethod:!0,setDefaultPaymentMethod:!0,deletePaymentMethod:!0,addPaymentMethod:!0,paymentMethods:!0,newSubscription:!0,updateSubscription:!0,cancelSubscription:!0,activeSubscription:!0,checkout:!0,createSetupIntent:!0,createPayment:!0,storeTransaction:!0,subscriptionHistory:!0,transactionHistory:!0,connectAccount:!0,createConnectAccount:!0,connectOnboardLink:!0,syncConnectStatus:!0,chargeWithSplit:!0},ue=Object.freeze(Object.keys(mr));function gr(e){return ue.every((t)=>typeof Reflect.get(e,t)==="function")}function z(){let e=globalThis.process?.env?.STRIPE_SECRET_KEY;if(!e)throw Error("Stripe Connect: STRIPE_SECRET_KEY not configured");let t;try{t=pr("stripe")}catch{throw Error("Stripe Connect is being used but the `stripe` package is not installed. It is an opt-in dependency - run `bun add stripe` to enable Stripe Connect.")}return new t(e,{apiVersion:t.API_VERSION})}function Mt(e){let t=e;return t?.code==="SQLITE_CONSTRAINT_UNIQUE"||t?.code==="SQLITE_CONSTRAINT"||t?.code==="23505"||t?.errno===1062||/unique|duplicate/i.test(t?.message??"")}function yr(e,t,n){let r=e;if(e instanceof Error&&typeof r.status==="number"&&Number.isInteger(r.status)&&r.status>=400&&r.status<600){let o={error:e.message};if(r.details!==void 0)o.details=r.details;return{status:r.status,body:o}}if(Mt(e))return{status:409,body:{error:`${t} already exists`}};return{status:500,body:{error:`Failed to ${n} ${t}`,detail:String(e)}}}function P(e){let t=!1;for(let r=0;r<e.length;r++){let o=e.charCodeAt(r);if(o>127)return e.replace(/([a-z\d])([A-Z])/g,"$1_$2").replace(/([A-Z])([A-Z][a-z])/g,"$1_$2").toLowerCase();if(o>=65&&o<=90)t=!0}if(!t)return e;let n="";for(let r=0;r<e.length;r++){let o=e.charCodeAt(r);if(o<65||o>90){n+=e[r];continue}let i=r>0?e.charCodeAt(r-1):0,a=r+1<e.length?e.charCodeAt(r+1):0,s=i>=97&&i<=122||i>=48&&i<=57,u=i>=65&&i<=90&&a>=97&&a<=122;if(r>0&&(s||u))n+="_";n+=String.fromCharCode(o+32)}return n}function wr(e){let t={};for(let[n,r]of Object.entries(e))t[P(n)]=r;return t}function ou(e,t){let n=String(t||"").replace(/^\/+|\/+$/g,""),r=String(e).replace(/^\/+/,"");return`/api/${n?`${n}/`:""}${r}`}function Ot(e){if(!e)return null;let t=e.attributes??{};if(Object.prototype.hasOwnProperty.call(t,"teamId")||Object.prototype.hasOwnProperty.call(t,"team_id"))return"team_id";return e.belongsTo?.some((n)=>n==="Team")?"team_id":null}function Dt(e){if(!e)return null;let t=e.attributes??{};if(Object.prototype.hasOwnProperty.call(t,"userId")||Object.prototype.hasOwnProperty.call(t,"user_id"))return"user_id";return e.belongsTo?.some((n)=>n==="User")?"user_id":null}function iu(e){return e?.ownership===!1}function au(e,t,n){let r=Object.keys(e).find((i)=>P(i)===P(t));if(Array.isArray(n)){if(r===void 0)return{data:e,error:"Ownership value is required"};if(!n.some((i)=>String(i)===String(e[r])))return{data:e,error:"Ownership value is not available to this caller"};return{data:{...e,[t]:e[r]}}}if(n===null||n===void 0)return{data:e,error:"Caller has no ownership identity"};let o={...e};for(let i of Object.keys(o))if(P(i)===P(t))delete o[i];return o[t]=n,{data:o}}function br(e){if(!e)return[];let t=Object.entries(e.attributes??{}).filter(([,n])=>n?.fillable===!0).map(([n])=>n);for(let n of e.belongsTo??[]){if(typeof n!=="string"||!n.trim())continue;let r=P(n.trim()).split("_").filter(Boolean);if(r.length===0)continue;let o=`${r[0]}${r.slice(1).map((i)=>`${i[0]?.toUpperCase()}${i.slice(1)}`).join("")}Id`;t.push(o)}return[...new Set(t)]}function hr(e,t){if(!e||t.length===0)return{};let n={},r;for(let o of t){if(o in e){n[o]=e[o];continue}r??=Tr(t);let i=r.get(o);if(i!==o&&i in e)n[o]=e[i]}return n}function kr(e,t){if(e?.name!=="date"||t instanceof Date||typeof t!=="string")return t;let n=/^(\d{4})-(\d{2})-(\d{2})$/.exec(t);if(!n)return t;let r=Number(n[1]),o=Number(n[2]),i=Number(n[3]),a=new Date(Date.UTC(r,o-1,i));if(a.getUTCFullYear()!==r||a.getUTCMonth()!==o-1||a.getUTCDate()!==i)return t;return a}var At=new WeakMap,Pt=new WeakMap;function Be(e){let t=At.get(e);if(t&&t.length===e.length){let r=!0;for(let o=0;o<e.length;o++)if(t[o]?.field!==e[o]){r=!1;break}if(r)return t}let n=e.map((r)=>({field:r,snake:P(r)}));return At.set(e,n),n}function Tr(e){let t=Be(e),n=Pt.get(t);if(n)return n;let r=new Map(t.map(({field:o,snake:i})=>[o,i]));return Pt.set(t,r),r}function su(e,t){if(!t.length)return e;let n={...e};for(let{field:r,snake:o}of Be(t))if(delete n[r],o!==r)delete n[o];return n}function uu(e,t){if(!e||t.length===0)return e;let n={...e};for(let{field:r,snake:o}of Be(t))if(delete n[r],o!==r)delete n[o];return n}var Rr=["id","uuid","created_at","updated_at","deleted_at"];function cu(e,t){let n=new Map;for(let r of[...Object.keys(e??{}),...Rr]){let o=P(r);if(!/^\w+$/.test(o))continue;n.set(r,o),n.set(o,o)}for(let r of t)n.delete(r),n.delete(P(r));return n}function lu(e,t,n){if(!t)return e;let r=e;for(let o of String(t).split(",")){let i=o.trim();if(!i)continue;let a=i.startsWith("-"),s=a?i.slice(1):i;if(!/^\w+$/.test(s))continue;let u=n.get(s);if(!u)continue;r=r.orderBy(u,a?"desc":"asc")}return r}var _r={string:{get:(e)=>e!=null?String(e):null,set:(e)=>e!=null?String(e):null},number:{get:(e)=>e!=null?Number(e):null,set:(e)=>e!=null?Number(e):null},integer:{get:(e)=>e!=null?Math.trunc(Number(e)):null,set:(e)=>e!=null?Math.trunc(Number(e)):null},float:{get:(e)=>e!=null?Number.parseFloat(String(e)):null,set:(e)=>e!=null?Number.parseFloat(String(e)):null},boolean:{get:(e)=>e===1||e==="1"||e===!0||e==="true",set:(e)=>e===!0||e===1||e==="1"||e==="true"?1:0},json:{get:(e)=>e==null?null:typeof e==="string"?Ar(e):e,set:(e)=>e==null?null:typeof e==="string"?e:JSON.stringify(e)},datetime:{get:(e)=>e?new Date(e):null,set:(e)=>e instanceof Date?e.toISOString():e},date:{get:(e)=>e?new Date(e):null,set:(e)=>e instanceof Date?e.toISOString().split("T")[0]:e},array:{get:(e)=>e==null?[]:Array.isArray(e)?e:typeof e==="string"?Pr(e):[],set:(e)=>e==null?null:Array.isArray(e)?JSON.stringify(e):e}},xt=new WeakMap;function Sr(e,t){let n=xt.get(e);if(n&&n.length===t.length){let o=!0;for(let i=0;i<t.length;i++){let a=t[i];if(n[i]?.attr!==a||n[i]?.definition!==e[a]){o=!1;break}}if(o)return n}let r=[];for(let o of t){let i=e[o],a=typeof i==="string"?_r[i]:i;r.push({attr:o,snake:P(o),definition:i,caster:a})}return xt.set(e,r),r}function Ar(e){try{return JSON.parse(e)}catch{return e}}function Pr(e){try{return JSON.parse(e)}catch{return[]}}function du(e,t,n){if(!e||typeof e!=="object"||!t)return e;let r=Object.keys(t);if(r.length===0)return e;let o=Sr(t,r);if(o.length===0)return e;let i={...e};for(let{attr:a,caster:s,snake:u}of o){if(!s)continue;let c=s[n];if(typeof c!=="function")continue;if(Object.prototype.hasOwnProperty.call(i,a))i[a]=c.call(s,i[a]);if(u!==a&&Object.prototype.hasOwnProperty.call(i,u))i[u]=c.call(s,i[u])}return i}var Ct=new WeakMap;function xr(e){let t=Ct.get(e);if(t)return t;let n=[];for(let[r,o]of Object.entries(e)){let i=o?.validation?.rule;if(!i||typeof i.validate!=="function")continue;n.push({definition:o,field:r,hasDefault:o!==null&&typeof o==="object"&&Object.prototype.hasOwnProperty.call(o,"default"),rule:i})}return Ct.set(e,n),n}function Et(e){let t=e?.attributes;if(!t||typeof t!=="object")return!1;for(let n of Object.values(t)){let r=n?.validation?.rule;if(r&&typeof r.validate==="function")return!0}return!1}function jt(e,t,n){let r=t?.attributes;if(!r||typeof r!=="object")return{valid:!0};let o=xr(r);if(o.length===0)return{valid:!0};let i={},a=!1;for(let s of o){let{definition:u,field:c,hasDefault:l,rule:f}=s,d=Object.prototype.hasOwnProperty.call(e,c);if(!d&&n==="updating")continue;let p=d?e[c]:l?u.default:void 0,m=kr(f,p),g=f.validate(m);if(!g?.valid&&Array.isArray(g?.errors)&&g.errors.length>0)a=!0,i[c]=g.errors.map((w)=>u.validation?.message?.[w?.code]??w?.message??"invalid")}return a?{valid:!1,errors:i}:{valid:!0}}function Cr(e,t){return`${e}\x00${vr(t)}`}function fu(e){let t=new Map;for(let n of e){let r=Cr(String(n.method??""),String(n.path??""));if(!t.has(r))t.set(r,n)}return t}function vr(e){return e.replace(/\{[^}]*\}/g,"{}").replace(/:[^/]+/g,"{}")}function Ie(e){if(Array.isArray(e))return e.filter((t)=>typeof t==="string"&&t.length>0);return typeof e==="string"&&e?[e]:[]}function pu(e){let t=typeof e==="object"&&e!==null&&"middleware"in e,n=e?.middleware;if(!t)return{read:["auth"],write:["auth"],declared:!1};if(n&&typeof n==="object"&&!Array.isArray(n)){let o=n;return{read:"read"in o?Ie(o.read):["auth"],write:"write"in o?Ie(o.write):["auth"],declared:!0}}let r=Ie(n);return{read:r,write:r,declared:!0}}var vt=15,Mr=100;function mu(e){let t=Number.parseInt(e.get("page")||String(1),10),n=Number.isFinite(t)?Math.max(1,t):1,r=Number.parseInt(e.get("per_page")||String(vt),10),o=Math.min(Number.isFinite(r)?Math.max(1,r):vt,Mr);return{page:n,perPage:o,offset:(n-1)*o}}function ce(e,t){let n=new URL(e.toString());return n.searchParams.set("page",String(t)),`${n.pathname}${n.search}`}function Or(e,t,n,r,o,i){let a=(t-1)*n,s=r===0,u={page:t,per_page:n,from:s?null:a+1,to:s?null:a+r,has_more_pages:o,prev_page_url:t>1?ce(e,t-1):null,next_page_url:o?ce(e,t+1):null};if(i!==void 0&&!Number.isNaN(i)){let c=Math.max(1,Math.ceil(i/n));u.total=i,u.last_page=c,u.first_page_url=ce(e,1),u.last_page_url=ce(e,c)}return u}function gu(e,t,n,r,o,i){let{page:a,...s}=Or(e,t,n,r,o,i);return{current_page:a,...s}}function yu(e,t){return(t??e??"").toString().trim().toLowerCase()==="warn"?"warn":"deny"}function wu(e,t){if(e.length===0)return null;let n=[...e].sort().join(", ");if(t==="deny")return`[orm] security.api.rowScoping is 'deny': NOT registering store/update/destroy for ${e.length} model(s) `+`with no row-level scoping \u2014 ${n}. Give a model an \`ownership\` config or a \`team_id\` column to restore its writes.`;return`[orm] ${e.length} model(s) publish mutating routes with no row-level scoping, so an authenticated caller can write any row \u2014 `+`${n}. Scope one with an \`ownership\` config or a \`team_id\` column; intended for public catalog tables. Set \`security.api.rowScoping: 'deny'\` (config/security.ts) to stop generating these routes instead.`}function Dr(e){if(e?.ownership===!1)return null;if(e?.ownership)return e.ownership;let t=Ot(e);if(t)return{field:t,resolve:async(r,o)=>{let{resolveAuthenticatedTeamId:i}=await import("@stacksjs/auth");return i(Ne(o))}};let n=Dt(e);if(n)return{field:n,resolve:async(r)=>r?.id??null};return null}function Ne(e){let t=e?.headers?.get?.("authorization"),n=t&&/^Bearer\s+/i.test(t)?t.replace(/^Bearer\s+/i,"").trim():null,r=e?.headers?.get?.("cookie")||"";return{bearerToken:()=>n,cookies:{get:(o)=>{for(let i of r.split(";")){let a=i.indexOf("=");if(a===-1)continue;if(i.slice(0,a).trim()===o)return decodeURIComponent(i.slice(a+1).trim())}return null}}}}function Er(e="customer_id"){return{field:e,resolve:async(t)=>{let n=t?.id;if(n==null)return null;try{let{Customer:r}=await import("@stacksjs/orm");return(await r.where("user_id",n).first())?.id??null}catch{return null}}}}function jr(e="id"){return{field:e,resolve:async(t)=>t?.id??null}}function Fr(e="site_id"){return{field:e,resolve:async(t,n)=>{try{let[{resolveAuthenticatedTeamId:r},{Site:o}]=await Promise.all([import("@stacksjs/auth"),import("@stacksjs/orm")]),i=await r(Ne(n));if(i==null)return[];return(await o.where("team_id",i).get()??[]).map((s)=>s.id).filter((s)=>s!=null)}catch{return[]}}}}function $r(e="id"){return{field:e,resolve:async(t,n)=>{try{let{resolveAuthenticatedTeamId:r}=await import("@stacksjs/auth");return await r(Ne(n))}catch{return null}}}}function Ir(e,t){return{field:t,resolve:async(n,r)=>{try{let o=await import("@stacksjs/orm"),i=o.models?.[e]??o[e]?.definition??null,a=Dr(i);if(!a?.field||typeof a.resolve!=="function")return[];let s=await a.resolve(n,r);if(s==null||Array.isArray(s)&&s.length===0)return[];let u=o[e];if(!u)return[];return((Array.isArray(s)?await u.whereIn(a.field,s).get():await u.where(a.field,s).get())??[]).map((l)=>l.id).filter((l)=>l!=null)}catch{return[]}}}}import{getCurrentRequest as Br}from"@stacksjs/router";var Ft=new WeakMap;function $t(e){let t=new Map;for(let n of e){let r=n?.id;if(r!==void 0)t.set(r,n)}return t}async function Nr(e,t){if(typeof e.find==="function")return e.find(t);let n=await e.findMany?.([t]);return $t(n??[]).get(t)}async function Lr(e,t,n){t.pending=void 0;try{let r=typeof e.findMany==="function"?await e.findMany(n.keys):await Promise.all(n.keys.map((i)=>e.find?.(i))),o=$t(r??[]);for(let i of n.resolvers)i.resolve(o.get(i.key))}catch(r){for(let o of n.resolvers)o.reject(r)}}function Ru(e,t){let n=Br();if(!n)return Nr(e,t);let r=Ft.get(n);if(!r)r=new WeakMap,Ft.set(n,r);let o=r.get(e);if(!o)o={cache:new Map},r.set(e,o);let i=o.cache.get(t);if(i)return i.then();let a=o.pending;if(!a){a={keys:[],resolvers:[]},o.pending=a;let c=a,l=o;queueMicrotask(()=>{Lr(e,l,c)})}let s=new Promise((c,l)=>{a.keys.push(t),a.resolvers.push({key:t,resolve:c,reject:l})});o.cache.set(t,s);let u=o.cache;return s.catch(()=>u.delete(t)),s.then()}import{db as Pu}from"@stacksjs/database/runtime";class qr{conditions=[];where(e,...t){let[n,r]=t,o=r===void 0?"=":n,i=r===void 0?n:r;this.addCondition("and","where",e,o,i)}orWhere(e,...t){let[n,r]=t,o=r===void 0?"=":n,i=r===void 0?n:r;this.addCondition("or","where",e,o,i)}whereIn(e,t){this.conditions.push({type:"and",method:"whereIn",column:e,values:t})}whereNotIn(e,t){this.conditions.push({type:"and",method:"whereIn",column:e,values:t,operator:"not in"})}whereNull(e){this.conditions.push({type:"and",method:"whereNull",column:e})}whereNotNull(e){this.conditions.push({type:"and",method:"whereNotNull",column:e})}whereBetween(e,t){this.conditions.push({type:"and",method:"whereBetween",column:e,range:t})}whereExists(e){this.conditions.push({type:"and",method:"whereExists",column:"",callback:e})}addCondition(e,t,n,r,o){this.conditions.push({type:e,method:t,column:n,operator:r,value:o})}getConditions(){return this.conditions}}import{db as Le}from"@stacksjs/database/runtime";async function qe(e,t){return await Le.transaction(e,t)}async function vu(e){return await Le.savepoint(e)}function Mu(e,t){return Le.transactional(e,t)}import{randomUUID as Yr}from"crypto";import{db as x,getDatabaseDialect as Xr,parseSqlDateTime as Zr,sqlDateTime as zt}from"@stacksjs/database/runtime";import{plural as Gr,snakeCase as H}from"@stacksjs/strings";var It=new Set(["anonymize","delete","keep"]),Bt=new Set(["anonymize","delete"]),Nt=new Set(["consent","contract","legal_obligation","vital_interests","public_task","legitimate_interests"]),M="User";class Ge extends Error{problems;constructor(e){super(`GDPR declarations cannot be honoured:
|
|
3
|
-
${e.map((
|
|
4
|
-
`)}`);this.name="GdprDeclarationError",this.problems=e}}function Ur(e){return(Array.isArray(e)?e.map((n)=>[n.name??"",n]):Object.entries(e)).map(([n,r])=>({name:String(r?.name??n),definition:r})).filter((n)=>n.name&&n.definition&&typeof n.definition==="object").sort((n,r)=>n.name.localeCompare(r.name))}function Lt(e,t){return t.table??H(Gr(e))}function Kr(e){let t=e.belongsTo,n=Array.isArray(t)?t:t&&typeof t==="object"?Object.values(t):[],r=[];for(let o of n){if(typeof o==="string"){r.push({model:o,foreignKey:`${H(o)}_id`});continue}if(o&&typeof o==="object"&&typeof o.model==="string"){let i=o;r.push({model:i.model,foreignKey:i.foreignKey??`${H(i.model)}_id`})}}return r}function Wr(e){if(e===!0)return{};if(e&&typeof e==="object")return e;return null}function Vr(e,t){if(t.anonymize!==void 0)return{perRow:!1,value:t.anonymize};if(!(e.required===!0&&e.nullable!==!0))return{perRow:!1,value:null};let r=e.validation?.rule?.name??e.type??"string";if(r==="string"||r==="text")return e.unique?{perRow:!0,value:null}:{perRow:!1,value:"[erased]"};if(e.unique)return{problem:`is a NOT NULL unique ${r} column; declare personal: { anonymize: <value> } or make it nullable`};if(r==="number"||r==="integer"||r==="float"||r==="decimal")return{perRow:!1,value:0};if(r==="boolean")return{perRow:!1,value:!1};if(r==="json")return{perRow:!1,value:"{}"};return{problem:`is a NOT NULL ${r} column with no safe placeholder; declare personal: { anonymize: <value> }`}}function le(e){let t=new Map,n=new Map,r=[],o=[],i=(s,u)=>{o.push({model:s,message:u})};for(let{name:s,definition:u}of Ur(e)){let c=u.attributes??{},l=u.traits?.gdpr,f=Kr(u),d=f.find((T)=>T.model===M),p=Object.entries(c).map(([T,A])=>({attribute:T,shape:A,options:Wr(A?.personal)})).filter((T)=>T.options!==null);if(!l&&p.length===0){if(d&&s!==M)r.push(s);continue}if(l!==void 0&&(l===null||typeof l!=="object")){i(s,"`traits.gdpr` must be an object");continue}let m=Lt(s,u),g=u.primaryKey??"id",w=null,h,b=l?.subject;if(b===void 0){if(s===M)w={kind:"column",columns:[g],where:{}};else if(d)w={kind:"column",columns:[d.foreignKey],where:{}}}else if(typeof b==="string")w={kind:"column",columns:[b],where:{}};else if(Array.isArray(b))w={kind:"column",columns:[...b].map(String),where:{}};else if(b&&typeof b==="object"&&"column"in b)w={kind:"column",columns:Array.isArray(b.column)?[...b.column].map(String):[String(b.column)],where:{...b.where??{}}};else if(b&&typeof b==="object"&&"via"in b){let T=f.find((A)=>A.model===b.via);if(!T)i(s,`subject { via: '${b.via}' } names a model this one does not declare in belongsTo`);else h=T.model,w={kind:"via",model:T.model,foreignKey:T.foreignKey}}else if(b&&typeof b==="object"&&"email"in b)w={kind:"email",column:String(b.email)};else i(s,"subject must be a column name, a list of columns, { column, where }, { via } or { email }");if(w?.kind==="column"&&w.columns.length===0)i(s,"subject names no column");let k=l?.erasure??"anonymize";if(!It.has(k))i(s,`erasure must be one of ${[...It].join(", ")}, got '${String(k)}'`);let R=null;if(l?.retention!==void 0){let T=l.retention,A=T?.action??"delete";if(!T||typeof T!=="object"||!Number.isInteger(T.days)||T.days<=0)i(s,"retention.days must be a positive whole number of days");else if(!Bt.has(A))i(s,`retention.action must be one of ${[...Bt].join(", ")}, got '${String(A)}'`);else R={days:T.days,column:T.column??"created_at",action:A}}if(l?.basis!==void 0&&!Nt.has(l.basis))i(s,`basis must be one of ${[...Nt].join(", ")}, got '${String(l.basis)}'`);let te=k==="anonymize"&&w!==null||R?.action==="anonymize",U=[];for(let{attribute:T,shape:A,options:Se}of p){let ne=Vr(A,Se);if("problem"in ne){if(te)i(s,`personal attribute '${T}' ${ne.problem}`);U.push({attribute:T,column:H(T),export:Se.export!==!1,perRow:!1,anonymizeTo:null});continue}U.push({attribute:T,column:H(T),export:Se.export!==!1,perRow:ne.perRow,anonymizeTo:ne.value})}if(w!==null&&k==="anonymize"&&U.length===0)i(s,"declares a subject but no personal attributes, so 'anonymize' would change nothing; mark the personal attributes, or declare erasure 'keep' or 'delete'");if(R?.action==="anonymize"&&U.length===0)i(s,"retention anonymizes, but no attribute is marked personal");if(t.set(s,{model:s,table:m,primaryKey:g,subject:w,personal:U,erasure:k,retention:R,purpose:l?.purpose??null,basis:l?.basis??null,depth:0,exportColumns:[...new Set([g,"uuid","created_at","updated_at"])]}),h)n.set(s,h)}let a=(s,u)=>{let c=n.get(s);if(!c)return 0;if(u.has(s))return null;if(!t.get(c)?.subject)return null;u.add(s);let f=a(c,u);return f===null?null:f+1};for(let s of t.values()){let u=n.get(s.model);if(!u)continue;if(!t.get(u)?.subject){i(s.model,`subject { via: '${u}' } points at a model that declares no subject of its own`);continue}let l=a(s.model,new Set);if(l===null)i(s.model,`subject { via: '${u}' } is part of a cycle`);else s.depth=l}return{models:[...t.values()],unclassified:r.sort(),problems:o}}function de(e){if(e.problems.length)throw new Ge(e.problems);return e}var fe="gdpr_requests",We=500;class pe extends Error{constructor(e){super(`No user matches '${String(e)}'.`);this.name="GdprSubjectNotFoundError"}}async function me(e){if(e)return de(le(e));await Promise.resolve().then(() => Ke());return de(le(await Ue()))}async function Ht(e=x){let t=String(Xr()),n=t==="sqlite"?"SELECT name FROM sqlite_master WHERE type = 'table'":t==="mysql"?"SELECT TABLE_NAME AS name FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE()":t==="postgres"?"SELECT table_name AS name FROM information_schema.tables WHERE table_schema = current_schema()":null;if(!n)return null;let r=await e.unsafe(n).execute();return new Set(r.map((o)=>String(o.name??o.NAME??"").toLowerCase()).filter(Boolean))}var eo=/no such table|does not exist|doesn't exist|unknown table|undefined table|ER_NO_SUCH_TABLE/i;async function ge(e,t=x){let n=await Ht(t);if(n)return n.has(e.toLowerCase());try{return await t.selectFrom(e).selectAll().limit(1).execute(),!0}catch(r){if(eo.test(r instanceof Error?r.message:String(r)))return!1;throw r}}function to(e){let t=e.models.find((n)=>n.model===M);return{table:t?.table??"users",primaryKey:t?.primaryKey??"id"}}function no(e){if(typeof e==="number")return{kind:"id",value:e};let t=String(e).trim();if(/^\d+$/.test(t))return{kind:"id",value:Number(t)};if(t.includes("@"))return{kind:"email",value:t};return{kind:"uuid",value:t}}async function ro(e,t={},n=x){let r=await me(t.models);return Qe(r,e,n)}async function Qe(e,t,n){let{table:r,primaryKey:o}=to(e),i=no(t),a;if(i.kind==="id")a=(await n.selectFrom(r).selectAll().where(o,"=",i.value).limit(1).execute())[0];else if(i.kind==="email"){for(let s of new Set([i.value,i.value.toLowerCase()]))if(a=(await n.selectFrom(r).selectAll().where("email","=",s).limit(1).execute())[0],a)break}else a=(await n.selectFrom(r).selectAll().where("uuid","=",i.value).limit(1).execute())[0];if(!a)return null;return{id:a[o],email:typeof a.email==="string"?a.email:null}}function ze(e,t=We){let n=[];for(let r=0;r<e.length;r+=t)n.push(e.slice(r,r+t));return n}function oo(e,t){let n=new Map;for(let r of e)n.set(String(r[t]),r);return[...n.values()].sort((r,o)=>String(r[t]).localeCompare(String(o[t]),void 0,{numeric:!0}))}async function He(e,t,n,r,o){let i=o.get(n.model);if(i)return i;let a=n.subject,s=[];if(a?.kind==="column")for(let u of a.columns){let c=e.selectFrom(n.table).selectAll().where(u,"=",r.id);for(let[l,f]of Object.entries(a.where))c=c.where(l,"=",f);s.push(...await c.execute())}else if(a?.kind==="email"){if(r.email)for(let u of new Set([r.email,r.email.toLowerCase()]))s.push(...await e.selectFrom(n.table).selectAll().where(a.column,"=",u).execute())}else if(a?.kind==="via"){let u=t.get(a.model),l=(await He(e,t,u,r,o)).map((f)=>f[u.primaryKey]).filter((f)=>f!==null&&f!==void 0);for(let f of ze(l))s.push(...await e.selectFrom(n.table).selectAll().where(a.foreignKey,"in",f).execute())}return s=oo(s,n.primaryKey),o.set(n.model,s),s}function Vt(e){if(typeof e==="bigint")return Number.isSafeInteger(Number(e))?Number(e):e.toString();if(e instanceof Date)return e.toISOString();return e}function io(e,t){let n={};for(let r of e.exportColumns)if(r in t)n[r]=Vt(t[r]);for(let r of e.personal)if(r.export&&r.column in t)n[r.column]=Vt(t[r.column]);return n}function Ve(e,t){let n={};for(let r of e.personal)n[r.column]=r.perRow?`erased-${String(t[e.primaryKey])}`:r.anonymizeTo;return n}function ao(e,t){if(e===t)return!0;if(e===null||e===void 0||t===null||t===void 0)return(e===null||e===void 0)&&(t===null||t===void 0);if(typeof t==="boolean")return Number(e)===Number(t);return String(e)===String(t)}function Jt(e,t){let n=Ve(e,t);return Object.entries(n).some(([r,o])=>!ao(t[r],o))}async function Yt(e,t,n){if(!n.length)return;if(t.personal.some((o)=>o.perRow)){for(let o of n)await e.updateTable(t.table).set(Ve(t,o)).where(t.primaryKey,"=",o[t.primaryKey]).execute();return}let r=Ve(t,n[0]);for(let o of ze(n.map((i)=>i[t.primaryKey])))await e.updateTable(t.table).set(r).where(t.primaryKey,"in",o).execute()}async function Xt(e,t,n){for(let r of ze(n.map((o)=>o[t.primaryKey])))await e.deleteFrom(t.table).where(t.primaryKey,"in",r).execute()}async function Je(e,t,n,r,o){let i=zt(new Date);await e.insertInto(fe).values({uuid:Yr(),type:t,subject_id:n!==null&&Number.isSafeInteger(Number(n))?Number(n):null,actor:r,status:"completed",summary:JSON.stringify(n!==null&&!Number.isSafeInteger(Number(n))?{subject:String(n),...o}:o),occurred_at:i,created_at:i}).execute()}async function Ye(){if(!await ge(fe))throw Error(`The '${fe}' table does not exist, so this request cannot be recorded. Run \`buddy migrate\` first.`)}async function Xe(e){let t=[],n=[],r=await Ht(),o=new Map;for(let i of e){if(!o.has(i.table))o.set(i.table,r?r.has(i.table.toLowerCase()):await ge(i.table));if(o.get(i.table))t.push(i);else n.push(i.table)}return{present:t,skipped:[...new Set(n)].sort()}}async function so(e,t={}){let n=await me(t.models),r=await Qe(n,e,x);if(!r)throw new pe(e);await Ye();let o=n.models.filter((l)=>l.subject),{present:i}=await Xe(o),a=new Map(i.map((l)=>[l.model,l]));for(let l of i)if(l.subject?.kind==="via"&&!a.has(l.subject.model))a.delete(l.model);let s=new Map,u={},c={};for(let l of[...a.values()].sort((f,d)=>f.model.localeCompare(d.model))){let f=await He(x,a,l,r,s);if(!f.length)continue;u[l.model]=f.map((d)=>io(l,d)),c[l.model]={purpose:l.purpose,basis:l.basis,retentionDays:l.retention?.days??null}}return await Je(x,"access",r.id,t.actor??"system",{models:Object.fromEntries(Object.entries(u).map(([l,f])=>[l,f.length]))}),{subject:{id:r.id},generatedAt:new Date().toISOString(),data:u,processing:c}}function uo(e){return[...e].sort((t,n)=>{let r=t.model===M?1:0,o=n.model===M?1:0;if(r!==o)return r-o;if(t.depth!==n.depth)return n.depth-t.depth;return t.model.localeCompare(n.model)})}async function co(e,t={}){let n=t.dryRun===!0,r=await me(t.models),o=await Qe(r,e,x);if(!o)throw new pe(e);if(!n)await Ye();let i=r.models.filter((d)=>d.subject),{present:a,skipped:s}=await Xe(i),u=new Map(a.map((d)=>[d.model,d]));for(let d of a)if(d.subject?.kind==="via"&&!u.has(d.subject.model))u.delete(d.model);let c=async(d)=>{let p=new Map;for(let g of u.values())await He(d,u,g,o,p);let m=[];for(let g of uo([...u.values()])){let w=p.get(g.model)??[];if(g.erasure==="delete"){if(!n)await Xt(d,g,w);m.push({model:g.model,table:g.table,action:"delete",matched:w.length,changed:w.length,fields:[]})}else if(g.erasure==="anonymize"){let h=w.filter((b)=>Jt(g,b));if(!n)await Yt(d,g,h);m.push({model:g.model,table:g.table,action:"anonymize",matched:w.length,changed:h.length,fields:g.personal.map((b)=>b.column)})}else m.push({model:g.model,table:g.table,action:"keep",matched:w.length,changed:0,fields:[]})}if(!n)await Je(d,"erasure",o.id,t.actor??"system",{changes:m.map(({model:g,action:w,matched:h,changed:b})=>({model:g,action:w,matched:h,changed:b})),skipped:s});return m},l=n?await c(x):await qe(c),f=!1;if(!n&&t.revokeCredentials!==!1)f=await lo(o.id);return{subject:{id:o.id},dryRun:n,changes:l.sort((d,p)=>d.model.localeCompare(p.model)),skipped:s,credentialsRevoked:f}}async function lo(e){let t;try{t=await import("@stacksjs/auth")}catch{return!1}let n=Number(e);if(!Number.isSafeInteger(n))return!1;if(t.revokeAllTokens&&await ge("oauth_access_tokens"))await t.revokeAllTokens(n);if(t.sessionDestroyAll)await t.sessionDestroyAll(n);return!0}var Qt=86400000;async function fo(e={}){let t=e.dryRun===!0,n=e.now??new Date,o=(await me(e.models)).models.filter((c)=>c.retention);if(!o.length)return{dryRun:t,cutoffs:{},changes:[],skipped:[]};if(!t)await Ye();let{present:i,skipped:a}=await Xe(o),s=[],u={};for(let c of i){let l=c.retention,f=new Date(n.getTime()-l.days*Qt),d=zt(new Date(f.getTime()+Qt));u[c.model]=f.toISOString();let p=[],m;for(;;){let h=x.selectFrom(c.table).selectAll().where(l.column,"<",d);if(m!==void 0)h=h.where(c.primaryKey,">",m);let b=await h.orderBy(c.primaryKey,"asc").limit(We).execute();if(!b.length)break;for(let k of b){let R=Zr(k[l.column]);if(R&&R.getTime()<f.getTime())p.push(k)}if(m=b[b.length-1][c.primaryKey],b.length<We)break}let g=l.action==="delete"?p:p.filter((w)=>Jt(c,w));if(!t&&g.length)await qe(async(w)=>{if(l.action==="delete")await Xt(w,c,g);else await Yt(w,c,g)});s.push({model:c.model,table:c.table,action:l.action,matched:p.length,changed:g.length,fields:l.action==="anonymize"?c.personal.map((w)=>w.column):[]})}if(!t&&s.some((c)=>c.changed>0))await Je(x,"retention",null,e.actor??"scheduler",{changes:s.map(({model:c,action:l,matched:f,changed:d})=>({model:c,action:l,matched:f,changed:d})),cutoffs:u});return{dryRun:t,cutoffs:u,changes:s.sort((c,l)=>c.model.localeCompare(l.model)),skipped:a}}Ke();function po(e){let t=e.subject;if(!t)return"none (not reachable by access or erasure)";if(t.kind==="via")return`via ${t.model} (\`${t.foreignKey}\`)`;if(t.kind==="email")return`email address in \`${t.column}\``;let n=t.columns.map((o)=>`\`${o}\``).join(" or "),r=Object.entries(t.where).map(([o,i])=>`${o} = ${String(i)}`).join(", ");return r?`${n} where ${r}`:n}function mo(e){return{entries:e.models.map((n)=>({model:n.model,table:n.table,subject:po(n),personal:n.personal.map((r)=>r.column),notExported:n.personal.filter((r)=>!r.export).map((r)=>r.column),erasure:n.subject?n.erasure:null,retention:n.retention?`${n.retention.action} after ${n.retention.days} days (\`${n.retention.column}\`)`:null,basis:n.basis,purpose:n.purpose})).sort((n,r)=>n.model.localeCompare(r.model)),unclassified:[...e.unclassified].sort()}}function J(e){return(e??"-").replaceAll("|","\\|").replaceAll(`
|
|
5
|
-
`," ")}function
|
|
6
|
-
`;let
|
|
7
|
-
`)}export*from"@stacksjs/model-meta";import{createModel as Co,registerModel as vo}from"@stacksjs/query-builder";import{log as _}from"@stacksjs/logging/runtime";import{snakeCase as Z}from"@stacksjs/strings";import{AsyncLocalStorage as An}from"async_hooks";import{toCursorPaginator as Mo,toPaginator as Oo,toSimplePaginator as Do}from"@stacksjs/pagination";function et(e,t){let n=rt(),r=n?Ze(n,"per_page"):void 0,o=n?Ze(n,"page"):void 0,i=e!==void 0?Math.max(1,Math.floor(e)):Math.min(100,Math.max(1,r??15)),a=Math.max(1,Math.floor(t??o??1));return{perPage:i,page:a}}function tt(e,t){let n=rt(),r=n?en(n,"cursor"):void 0,o=n?Ze(n,"per_page"):void 0,i=e!==void 0?Math.max(1,Math.floor(e)):Math.min(100,Math.max(1,o??15)),s=Zt(t!==void 0?t:r??null);return{perPage:i,cursor:s}}function Zt(e){if(e===null||e===void 0)return null;if(Array.isArray(e))return e;if(typeof e==="string"&&e.startsWith("["))try{let t=JSON.parse(e);if(Array.isArray(t))return t}catch{}return e}function nt(e){let t=rt();if(!t)return e;let n=(()=>{try{return new URL(t.url)}catch{return null}})();if(!n)return e;let r=n.pathname;if(e.path=r,"next_cursor"in e)return e.next_page_url=e.next_cursor!==null?E(n,{cursor:e.next_cursor}):null,e.prev_page_url=e.prev_cursor!==null?E(n,{cursor:e.prev_cursor}):null,e;let o=e.current_page;if(e.prev_page_url=o>1?E(n,{page:o-1}):null,"total"in e){let i=e.last_page;e.next_page_url=o<i?E(n,{page:o+1}):null,e.first_page_url=E(n,{page:1}),e.last_page_url=E(n,{page:i})}else e.next_page_url=e.has_more_pages?E(n,{page:o+1}):null;return e}function E(e,t){let n=new URL(e.toString());for(let[r,o]of Object.entries(t))n.searchParams.set(r,String(o));return`${n.pathname}${n.search}`}var N;function rt(){if(N===null)return;if(N===void 0)try{let t=Vn("@stacksjs/router");if(typeof t.getCurrentRequest==="function")N=t.getCurrentRequest;else{N=null;return}}catch{N=null;return}return N()}function Ze(e,t){let n=en(e,t);if(n===void 0)return;let r=Number(n);return Number.isFinite(r)?r:void 0}function en(e,t){let n=e.query?.[t];if(n===void 0)return;return Array.isArray(n)?n[0]:n}function tn(){return{async generateTwoFactorForModel(e){let{generateTwoFactorSecret:t}=await import("@stacksjs/auth"),n=t();await e.update({two_factor_secret:n})},async verifyTwoFactorCode(e,t){let n=e.get("two_factor_secret");if(typeof n!=="string")return!1;let{verifyTwoFactorCode:r,RateLimiter:o}=await import("@stacksjs/auth"),i=String(e.id??e.get?.("id")??e.get?.("email")??n),a=`2fa:${i}`;if(await o.isRateLimited(a)){let{HttpError:u}=await import("@stacksjs/error-handling");throw new u(429,"Too many verification attempts. Please try again later.")}if(!await r(t,n))return await o.recordFailedAttempt(a),!1;try{let{cache:u}=await import("@stacksjs/cache"),c=`2fa:used:${i}:${t}`;if(await u.has(c))return await o.recordFailedAttempt(a),!1;await u.set(c,"1",90)}catch{}return await o.resetAttempts(a),!0}}}import{mutationCount as yo,sqlDateTime as wo}from"@stacksjs/database/runtime";import{log as L}from"@stacksjs/logging";var ye="deleted_at";function nn(e,t="id"){return{async softDelete(n){let r=wo(),o=e.where(t,n);if(typeof o?.update==="function")return await o.update({[ye]:r}),!0;return!1},async restore(n){let r=e.where(t,n).withTrashed();if(typeof r?.update==="function")return await r.update({[ye]:null}),!0;return!1},async forceDelete(n){let r=e.where(t,n),o=typeof r?.withTrashed==="function"?r.withTrashed():r;if(typeof o?.forceDelete==="function")return yo(await o.forceDelete())>0;return!1},withTrashed(){return typeof e.query==="function"?e.query():e},onlyTrashed(){let n=typeof e.query==="function"?e.query():e;if(typeof n?.whereNotNull==="function")return n.whereNotNull(ye);return n?.where?.(ye,"!=",null)??n}}}function rn(e){if(e===!0||e==null)return{};if(typeof e==="object"&&!Array.isArray(e)){let t=e;if(Array.isArray(t.cascade)){let n=t.cascade.filter((r)=>typeof r==="string");return n.length?{cascade:n}:{}}return{}}return{}}function bo(e,t){let n=e.hasMany??[],r=e.hasOne??[],o=n.some((l)=>ot(l,t,!0)),i=r.some((l)=>ot(l,t,!1));if(!o&&!i)return L.warn(`[orm] soft-delete cascade: '${t}' is not a declared hasMany/hasOne relation - skipping`),null;let s=(o?n:r).find((l)=>ot(l,t,o))??null;if(!s)return null;let c=globalThis[s];if(!c)return L.warn(`[orm] soft-delete cascade: model '${s}' is not yet on globalThis - skipping cascade for '${t}'`),null;return{className:s,model:c}}function ot(e,t,n){let r=e.toLowerCase();if(t===r)return!0;if(n&&t===`${r}s`)return!0;if(n&&r.endsWith("y")&&t===`${r.slice(0,-1)}ies`)return!0;return!1}async function ho(e,t,n,r,o){try{let i=n.where;if(typeof i!=="function"){L.warn(`[orm] cascade ${o}: child model has no .where()`);return}if(o==="softDelete"){let a=n.softDelete;if(typeof a==="function"){let u=i.call(n,r,t),c=typeof u?.get==="function"?await u.get():Array.isArray(u)?u:[],l=n.primaryKey||"id";for(let f of c){let d=f?.[l];if(d!=null)await a.call(n,d)}return}let s=i.call(n,r,t);if(typeof s?.delete==="function"){L.debug(`[orm] cascade soft-delete: child has no softDeletes trait, hard-deleting from ${String(n.table??"?")}`),await s.delete();return}}else{let a=n.restore;if(typeof a!=="function"){L.debug("[orm] cascade restore: child has no restore() - nothing to do");return}let s=n.withTrashed,c=(typeof s==="function"?s.call(n):n).where?.(r,t),l=typeof c?.get==="function"?await c.get():[],f=n.primaryKey||"id";for(let d of l){let p=d?.[f];if(p!=null)await a.call(n,p)}}}catch(i){if(L.warn(`[orm] soft-delete cascade ${o} on ${e}#${String(t)} failed`,{error:i}),process.env.STACKS_ORM_CASCADE_SWALLOW!=="true")throw i}}async function Y(e,t,n,r){let o=t.cascade;if(!o||o.length===0)return;let i=`${e.name.toLowerCase()}_id`;for(let a of o){let s=bo(e,a);if(!s)continue;await ho(s.className,n,s.model,i,r)}}import{sqlDateTime as Ro}from"@stacksjs/database/runtime";import{log as ko}from"@stacksjs/logging";var To=[/^password$/i,/^password_hash$/i,/^api_key$/i,/_token$/i,/_secret$/i,/^remember_token$/i],on=null;async function an(){if(on!=null)return on;try{let e=await import("@stacksjs/router").catch(()=>null);if(!e)return null;let t=e.getCurrentRequest;if(typeof t!=="function")return null;let n=t();return n?.user?.id??n?._user?.id??null}catch{return null}}async function sn(){try{let t=(await import("@stacksjs/router").catch(()=>null))?.getCurrentRequest;if(typeof t!=="function")return null;let n=t();return typeof n?.ip==="function"?n.ip()??null:null}catch{return null}}function un(e){if(!e||typeof e!=="object")return null;let t={};for(let[n,r]of Object.entries(e)){if(To.some((o)=>o.test(n)))continue;t[n]=r}return t}function cn(e,t,n){ko.warn(`[orm] ${e} row write failed for ${t}: ${n?.message??String(n)}`)}var _o="activities";function ln(e){if(!e)return null;if(e===!0)return{};if(typeof e!=="object")return null;let t=e;return{logOnly:Array.isArray(t.logOnly)?t.logOnly:void 0,include:Array.isArray(t.include)?t.include:void 0,exclude:Array.isArray(t.exclude)?t.exclude:void 0}}function So(e,t,n=[]){let r=un(e);if(!r)return null;let o=new Set(n),i=t.logOnly??t.include,a=new Set(t.exclude??[]),s={};for(let[u,c]of Object.entries(r)){if(o.has(u)||a.has(u))continue;if(i&&!i.includes(u))continue;s[u]=c}return s}function Ao(e,t,n){return n==null?`${e} was ${t}`:`${e} ${String(n)} was ${t}`}async function Po(e){try{let{db:t}=await import("@stacksjs/database/runtime");await t.insertInto(_o).values({type:e.type,description:e.description,subject_type:e.subject_type,subject_id:e.subject_id,causer:e.causer,properties:e.properties?JSON.stringify(e.properties):null,ip_address:e.ip_address,user_id:e.user_id,created_at:Ro()}).executeTakeFirst()}catch(t){cn("activity",`${e.subject_type}#${String(e.subject_id)}`,t)}}async function xo(e){let{attributes:t,event:n,modelName:r,options:o,primaryKey:i}=e,a=t?.[i]??null,s=await an();await Po({type:`${r.toLowerCase()}.${n}`,description:Ao(r,n,a),subject_type:r,subject_id:a,properties:So(t,o,e.hidden),causer:s==null?null:`User:${String(s)}`,user_id:s,ip_address:await sn()})}function we(e){if(!e||typeof e!=="object")return null;let t=e;if(t.attributes&&typeof t.attributes==="object")return{...t.attributes};if(t._attributes&&typeof t._attributes==="object")return{...t._attributes};return{...e}}function dn(e,t,n,r,o=[]){if(t==="Activity")return;let i=e,a=async(d)=>typeof i.find==="function"?we(await i.find(d)):null,s=async(d,p)=>{await xo({modelName:t,event:d,attributes:p,primaryKey:n,options:r,hidden:o})},u=e.create;if(typeof u==="function")e.create=async function(...d){let p=await u.apply(this,d);return await s("created",we(p)),p};let c=e.createMany;if(typeof c==="function")e.createMany=async function(...d){let p=await c.apply(this,d);for(let m of Array.isArray(p)?p:[])await s("created",we(m));return p};let l=e.update;if(typeof l==="function")e.update=async function(d,p){let m=await l.call(this,d,p);return await s("updated",we(m)??await a(d)),m};let f=e.delete;if(typeof f==="function")e.delete=async function(d){let p=await a(d),m=await f.call(this,d);return await s("deleted",p??{[n]:d}),m}}var ke,Pn=new An;function F(){return Pn.getStore()?.suppressed===!0}function j(e){return Promise.resolve(Pn.run({suppressed:!0},e))}var xn=new An;function Eo(){return xn.getStore()?.suppressed===!0}function jo(e){return Promise.resolve(xn.run({suppressed:!0},e))}var lt=Symbol.for("stacks.orm.modelDefinition");class Cn extends Error{status=422;errors;constructor(e,t){let n=Object.keys(t).join(", ");super(`${e} validation failed: ${n}`);this.name="ModelValidationError",this.errors=t}}var fn=new Set,Fo=4096,pn=Object.create(null),mn=0;function X(e){let t=pn[e];if(t!==void 0)return t;let n=Z(e);if(mn<Fo)pn[e]=n,mn++;return n}function $o(e,t){let n=typeof e==="string"?e.slice(0,80):String(e),r=`${typeof e}:${n}`;if(fn.has(r))return;fn.add(r);let o=t instanceof Error?t.message:String(t);console.error(`[orm] JSON cast failed to parse value (returning null): ${o} - value preview: ${JSON.stringify(n)}`)}var Io={string:{get:(e)=>e!=null?String(e):null,set:(e)=>e!=null?String(e):null},number:{get:(e)=>e!=null?Number(e):null,set:(e)=>e!=null?Number(e):null},integer:{get:(e)=>e!=null?Math.trunc(Number(e)):null,set:(e)=>e!=null?Math.trunc(Number(e)):null},float:{get:(e)=>e!=null?Number.parseFloat(String(e)):null,set:(e)=>e!=null?Number.parseFloat(String(e)):null},boolean:{get:(e)=>e===1||e==="1"||e===!0||e==="true",set:(e)=>e===!0||e===1||e==="1"||e==="true"?1:0},json:{get:(e)=>{if(e==null)return null;if(typeof e==="string")try{return JSON.parse(e)}catch(t){return $o(e,t),null}return e},set:(e)=>{if(e==null)return null;return typeof e==="string"?e:JSON.stringify(e)}},datetime:{get:(e)=>e?new Date(e):null,set:(e)=>e instanceof Date?e.toISOString():e},date:{get:(e)=>e?new Date(e):null,set:(e)=>e instanceof Date?e.toISOString().split("T")[0]:e},array:{get:(e)=>{if(e==null)return[];if(Array.isArray(e))return e;if(typeof e==="string")try{return JSON.parse(e)}catch{return[]}return[]},set:(e)=>{if(e==null)return null;return Array.isArray(e)?JSON.stringify(e):e}}};function Bo(e){return typeof e==="string"?Io[e]:e}var gn=new WeakMap;function vn(e){let t=Object.keys(e),n=gn.get(e);if(n&&n.length===t.length){let o=!0;for(let i=0;i<t.length;i++){let a=t[i];if(n[i]?.attr!==a||n[i]?.definition!==e[a]){o=!1;break}}if(o)return n}let r=t.map((o)=>{let i=e[o];return{attr:o,definition:i,caster:Bo(i)}});return gn.set(e,r),r}function it(e,t,n){if(!e||typeof e!=="object")return e;let r={...e};for(let{attr:o,caster:i}of vn(t))if(o in r)r[o]=i[n].call(i,r[o]);return r}function be(e){return e==="_attributes"||e==="_original"||e==="_definition"||e==="_hasSaved"||e==="_relations"}var st=Symbol.for("stacks.modelInstanceProxy"),yn,wn=new WeakMap,No={tags:{bag:"_taggable",mode:"id"},tagCount:{bag:"_taggable",mode:"id"},addTag:{bag:"_taggable",mode:"id"},activeTags:{bag:"_taggable",mode:"id"},inactiveTags:{bag:"_taggable",mode:"id"},removeTag:{bag:"_taggable",mode:"id"},categories:{bag:"_categorizable",mode:"id"},categoryCount:{bag:"_categorizable",mode:"id"},addCategory:{bag:"_categorizable",mode:"id"},activeCategories:{bag:"_categorizable",mode:"id"},inactiveCategories:{bag:"_categorizable",mode:"id"},removeCategory:{bag:"_categorizable",mode:"id"},comments:{bag:"_commentable",mode:"id"},commentCount:{bag:"_commentable",mode:"id"},addComment:{bag:"_commentable",mode:"id"},approvedComments:{bag:"_commentable",mode:"id"},pendingComments:{bag:"_commentable",mode:"id"},rejectedComments:{bag:"_commentable",mode:"id"},likes:{bag:"_likeable",mode:"id"},likeCount:{bag:"_likeable",mode:"id"},like:{bag:"_likeable",mode:"id"},unlike:{bag:"_likeable",mode:"id"},isLiked:{bag:"_likeable",mode:"id"},...Object.fromEntries(ue.map((e)=>[e,{bag:"_billable",mode:"model"}])),generateTwoFactorForModel:{bag:"_twoFactor",mode:"model"},verifyTwoFactorCode:{bag:"_twoFactor",mode:"model"}};function Lo(e,t){if(!e||!t)return null;let n=t.split("."),r=e;for(let o of n){if(r==null||typeof r!=="object")return null;let i=r;if("_attributes"in i&&i._attributes&&typeof i._attributes==="object"){let a=i._attributes;if(o in a){r=a[o];continue}}if(o in i){r=i[o];continue}return null}return r??null}function he(e,t,n){if(e&&typeof e.then==="function")return e.then((r)=>r===t?n:r);return e===t?n:e}function v(e,t){if(!e||typeof e!=="object")return e;let n=e;if(n[st])return e;let r=n._attributes;if(!r||typeof r!=="object")return e;if(t){for(let{attr:i,caster:a}of vn(t))if(Object.hasOwn(r,i))r[i]=a.get.call(a,r[i])}let o=t?wn.get(t):yn;if(!o)if(o={get(i,a,s){let u=i;if(a===st)return!0;if(a==="saveAsync")return async function(){let l=u._definition,f=l?.set;if(f&&typeof u.isDirty==="function"){for(let[p,m]of Object.entries(f)){if(typeof m!=="function")continue;if(!u.isDirty(p))continue;let g=m(u._attributes),w=g&&typeof g.then==="function"?await g:g;u._attributes[p]=w}let d=l.set;l.set={};try{return he(u.save(),i,s)}finally{l.set=d}}return he(u.save(),i,s)};if(a==="save")return function(){let l=u._definition,f=l?.set;if(f&&Object.keys(f).length>0&&typeof u.isDirty==="function"){for(let[p,m]of Object.entries(f)){if(typeof m!=="function")continue;if(!u.isDirty(p))continue;let g=m(u._attributes);if(g&&typeof g.then==="function")throw Error(`Setter for "${p}" returned a Promise - use \`saveAsync()\` instead of \`save()\` when a model has async setters.`);u._attributes[p]=g}let d=l.set;l.set={};try{return he(u.save(),i,s)}finally{l.set=d}}return he(u.save(),i,s)};if(a==="updateAsync")return async function(l){if(l&&typeof l==="object"&&!Array.isArray(l))for(let[f,d]of Object.entries(l))s[f]=d;return s.saveAsync()};if(a==="saveQuietly")return function(){return j(()=>u.save())};if(a==="saveAsyncQuietly")return function(){return j(()=>s.saveAsync())};if(a==="updateQuietly")return function(l){return j(()=>u.update(l))};if(a==="updateAsyncQuietly")return function(l){return j(()=>s.updateAsync(l))};if(a==="deleteQuietly")return function(){return j(()=>u.delete())};if(a==="toSearchableObject")return function(){let d=u._definition?.traits?.useSearch;if(!d)return null;let p=u._attributes;if(!p)return null;if(d===!0){let b={...p};if(p.id!=null)b.id=String(p.id);return b}let m={},g=d.displayable?.length?d.displayable:[...d.searchable??[],...d.filterable??[],...d.sortable??[],"id"],w=d.denormalize??{},h=u._relations;for(let b of g){let k=Z(b),R=p[k]??p[b];if(R!==void 0){m[k]=R;continue}let te=w[b]??w[k];if(te){m[k]=Lo(h,te);continue}m[k]=void 0}if(p.id!=null)m.id=String(p.id);return m};if(typeof a==="string"&&!be(a)){let l=u._attributes;if(l&&Object.hasOwn(l,a))return l[a];let f=u._relations;if(f&&Object.hasOwn(f,a)){let p=f[a];if(Array.isArray(p))return p.map((m)=>v(m,t));return p&&typeof p==="object"?v(p,t):p}let d=No[a];if(d){let g=u._definition?.__traitMethods?.[d.bag]?.[a];if(typeof g==="function")return d.mode==="model"?(...w)=>g(s,...w):(...w)=>g(u.id,...w)}if(l){let p=X(a);if(p!==a&&Object.hasOwn(l,p))return l[p]}}let c=Reflect.get(u,a,u);return typeof c==="function"?c.bind(u):c},set(i,a,s,u){let c=i;if(typeof a==="string"&&!be(a)){let{_attributes:l,set:f}=c;if(l&&Object.hasOwn(l,a)){if(typeof f==="function")f.call(c,a,s);else l[a]=s;return!0}if(l){let d=X(a);if(d!==a&&Object.hasOwn(l,d)){if(typeof f==="function")f.call(c,d,s);else l[d]=s;return!0}}if(l&&!(a in c)){if(typeof f==="function")f.call(c,a,s);else l[a]=s;return!0}}return Reflect.set(c,a,s,u)},has(i,a){let s=i;if(typeof a==="string"&&!be(a)){let u=s._attributes;if(u&&Object.hasOwn(u,a))return!0;let c=s._relations;if(c&&Object.hasOwn(c,a))return!0;if(u){let l=X(a);if(l!==a&&Object.hasOwn(u,l))return!0}}return Reflect.has(s,a)},deleteProperty(i,a){let s=i;if(typeof a==="string"&&!be(a)){let u=s._attributes;if(u&&Object.hasOwn(u,a))return delete u[a],!0}return Reflect.deleteProperty(s,a)},ownKeys(i){let s=i._attributes;return s?Object.keys(s):[]},getOwnPropertyDescriptor(i,a){let s=i;if(typeof a==="string"){let u=s._attributes;if(u&&Object.hasOwn(u,a))return{configurable:!0,enumerable:!0,value:u[a],writable:!0}}return Object.getOwnPropertyDescriptor(s,a)}},t)wn.set(t,o);else yn=o;return new Proxy(e,o)}var Mn=Object.assign(Object.create(null),{get:!0,first:!0,last:!0,firstOrFail:!0,find:!0,findOrFail:!0,all:!0,paginate:!0,simplePaginate:!0,cursorPaginate:!0}),qo={paginate:Oo,simplePaginate:Do,cursorPaginate:Mo},bn=Symbol.for("stacks.queryBuilderProxy");function hn(e,t,n){if(Mn[t]){if(Array.isArray(e))return e.map((o)=>v(o,n));let r=qo[t];if(r&&e&&Array.isArray(e.data)){let o=e.data.map((a)=>v(a,n)),i=r({...e,data:o});return nt(i)}if(e&&Array.isArray(e.data))return{...e,data:e.data.map((o)=>v(o,n))};return v(e,n)}if(e&&typeof e==="object"&&typeof e.get==="function")return On(e,n);return e}function On(e,t){if(!e||typeof e!=="object")return e;if(e[bn])return e;return new Proxy(e,{get(n,r,o){if(r===bn)return!0;let i=Reflect.get(n,r,o);if(typeof i!=="function")return i;let a=String(r);return function(...s){let u=s;if(a==="paginate"||a==="simplePaginate"){let{perPage:l,page:f}=et(s[0],s[1]);u=[l,f]}else if(a==="cursorPaginate"){let{perPage:l,cursor:f}=tt(s[0],s[1]);u=[l,f,s[2],s[3]]}let c=i.apply(n,u);if(!Mn[a]&&c===n)return o;if(c&&typeof c.then==="function")return c.then((l)=>hn(l,a,t));return hn(c,a,t)}}})}function Go(e,t){let n=(a)=>Array.isArray(a)?a.map((s)=>v(s,t)):v(a,t),r=["find","first","last","all","firstOrFail","findOrFail","findMany"];for(let a of r){let s=e[a];if(typeof s!=="function")continue;e[a]=function(...u){let c=s.apply(this,u);if(c&&typeof c.then==="function")return c.then(n);return n(c)}}let o=["create","createMany","firstOrCreate","updateOrCreate","make"];for(let a of o){let s=e[a];if(typeof s!=="function")continue;e[a]=function(...u){let c=s.apply(this,u);if(c&&typeof c.then==="function")return c.then(n);return n(c)}}let i=["query","where","orWhere","whereIn","whereNotIn","whereNull","whereNotNull","whereLike","whereBetween","whereNotBetween","orderBy","orderByDesc","select","with","limit","take","skip","latest","oldest"];for(let a of i){let s=e[a];if(typeof s!=="function")continue;e[a]=function(...u){let c=s.apply(this,u);return On(c,t)}}}class Dn extends Error{model;id;constructor(e,t){super(t!=null?`[ORM] ${e} not found for id=${String(t)}`:`[ORM] No matching ${e} row`);this.name="ModelNotFoundError",this.model=e,this.id=t}}class ut extends Error{model;attribute;reason;constructor(e,t,n){let r=n==="guarded"?`'${t}' is marked guarded`:`'${t}' is not in the fillable allowlist`;super(`[ORM] Mass assignment to ${e} forbidden: ${r}. Use ${e}.forceCreate(...) / .forceUpdate(...) to bypass.`);this.name="MassAssignmentException",this.model=e,this.attribute=t,this.reason=n}}var Uo=new Set(["id","created_at","updated_at","deleted_at","uuid"]),kn=new WeakMap;function Ko(e){let t=kn.get(e);if(t)return t;let n=new Set,r=new Set,o=new Set;for(let[a,s]of Object.entries(e)){let u=X(a);if(n.add(u),s?.fillable===!0)r.add(u);if(s?.guarded===!0)o.add(u)}let i={allowed:r.size>0?r:n,guarded:o};return kn.set(e,i),i}function q(e,t,n={}){if(n.force)return t;if(!t||typeof t!=="object"||Array.isArray(t))return t;let r=e.attributes;if(!r)return t;let{allowed:o,guarded:i}=Ko(r);for(let a in t){if(!Object.hasOwn(t,a))continue;let s=X(a);if(Uo.has(s))continue;if(i.has(s))throw new ut(e.name,a,"guarded");if(s.endsWith("_id"))continue;if(!o.has(s))throw new ut(e.name,a,"not-fillable")}return t}async function Te(e,t){let n=e.set;if(!n||typeof n!=="object")return t;let r={...t};for(let[o,i]of Object.entries(n)){if(typeof i!=="function"||!(o in r))continue;try{r[o]=await i(r)}catch(a){_.error(`[orm] ${e.name}.set.${o} threw - skipping setter`,a)}}return r}function Wo(e,t){let n=t.primaryKey||"id",r=e.create;function o(c){let l=e.where;if(typeof l!=="function")throw Error(`[ORM] ${t.name}.${c} needs a working where(): the underlying query builder did not expose one`);return l}function i(c){let l=e.find;if(typeof l!=="function")throw Error(`[ORM] ${t.name}.${c} needs a working find(): the underlying query builder did not expose one`);return l}function a(c){let l=e.create;if(typeof l!=="function")throw Error(`[ORM] ${t.name}.${c} cannot create: the underlying query builder did not expose create()`);return l}if(e.update=async function(c,l){if(c==null)throw Error(`[ORM] ${t.name}.update requires an id as the first argument`);if(!l||typeof l!=="object"||Array.isArray(l))throw Error(`[ORM] ${t.name}.update requires a data object as the second argument`);if(Object.keys(l).length===0){_.debug(`[orm] ${t.name}.update called with empty data - short-circuiting and returning current row`);let p=e.find;return typeof p==="function"?await p.call(e,c):null}q(t,l);let f=await Te(t,l);await o("update").call(e,n,c).update(f);let d=e.find;return typeof d==="function"?await d.call(e,c):null},typeof e.forceUpdate!=="function")e.forceUpdate=async function(c,l){if(c==null)throw Error(`[ORM] ${t.name}.forceUpdate requires an id as the first argument`);if(!l||typeof l!=="object"||Array.isArray(l))throw Error(`[ORM] ${t.name}.forceUpdate requires a data object as the second argument`);let f=await Te(t,l);await o("forceUpdate").call(e,n,c).update(f);let d=e.find;return typeof d==="function"?await d.call(e,c):null};if(typeof e.forceCreate!=="function")e.forceCreate=async function(c){if(!c||typeof c!=="object"||Array.isArray(c))throw Error(`[ORM] ${t.name}.forceCreate requires a data object`);let l=e.make;if(typeof l==="function"){let f=await l.call(e);if(f&&typeof f.forceFill==="function"&&typeof f.save==="function"){f.forceFill(c);let d=await f.save();return d&&typeof d==="object"&&d!==f&&!d[st]?f:d??f}}if(typeof r!=="function")throw Error(`[ORM] ${t.name}.forceCreate cannot create: the underlying query builder did not expose create()`);return await r.call(e,c)};if(e.delete=async function(c){if(c==null)throw Error(`[ORM] ${t.name}.delete requires an id as the first argument`);if(!await i("delete").call(e,c))return!1;return await o("delete").call(e,n,c).delete(),!0},typeof e.findOrFail!=="function")e.findOrFail=async function(c){let l=await i("findOrFail").call(e,c);if(l==null)throw new Dn(t.name,c);return l};if(typeof e.exists!=="function")e.exists=async function(c){if(c==null)return!1;let l=o("exists").call(e,n,c);if(typeof l.count==="function"){let d=await l.count();return Number(d)>0}let f=e.find;return typeof f==="function"?await f.call(e,c)!=null:!1};if(typeof e.firstOrCreate!=="function")e.firstOrCreate=async function(c,l={}){if(!c||typeof c!=="object"||Array.isArray(c))throw Error(`[ORM] ${t.name}.firstOrCreate requires a where-attrs object`);let f=o("firstOrCreate").call(e,c),d=typeof f.first==="function"?await f.first():await f;if(d)return d;let p={...c,...l};return q(t,p),await a("firstOrCreate").call(e,p)};if(typeof e.updateOrCreate!=="function")e.updateOrCreate=async function(c,l){if(!c||typeof c!=="object"||Array.isArray(c))throw Error(`[ORM] ${t.name}.updateOrCreate requires a where-attrs object`);if(!l||typeof l!=="object"||Array.isArray(l))throw Error(`[ORM] ${t.name}.updateOrCreate requires a values object`);let f=o("updateOrCreate").call(e,c),d=typeof f.first==="function"?await f.first():await f;if(d){q(t,l);let m=d[n];await o("updateOrCreate").call(e,n,m).update(l);let g=e.find;return typeof g==="function"?await g.call(e,m):{...d,...l}}let p={...c,...l};return q(t,p),await a("updateOrCreate").call(e,p)};if(typeof e.count!=="function")e.count=async function(){let c=e;if(typeof c.query==="function"){let d=c.query();if(typeof d?.count==="function"){let p=await d.count();return Number(p)||0}}let{all:l,get:f}=e;if(typeof l==="function")return(await l.call(e)||[]).length;if(typeof f==="function")return(await f.call(e)||[]).length;return 0};if(typeof e.pluck!=="function")e.pluck=async function(c){if(!c||typeof c!=="string")throw Error(`[ORM] ${t.name}.pluck requires a column name`);let l=e.all;return((typeof l==="function"?await l.call(e):[])||[]).map((d)=>d?.[c])};if(typeof e.whereIn!=="function")e.whereIn=async function(c,l){if(!c||typeof c!=="string")throw Error(`[ORM] ${t.name}.whereIn requires a column name`);if(!Array.isArray(l))throw Error(`[ORM] ${t.name}.whereIn requires an array of values`);if(l.length===0)return[];let f=e.where;if(typeof f!=="function")return[];let d=f.call(e,c,"in",l);if(d&&typeof d.get==="function")return await d.get();return await d};let s=[["latest","desc"],["oldest","asc"]];for(let[c,l]of s)if(typeof e[c]!=="function")e[c]=async function(f="created_at"){let d=e,p=typeof d.query==="function"?d.query():d;if(typeof p?.orderBy==="function"){let h=p.orderBy(f,l);if(typeof h.first==="function")return await h.first();if(typeof h.get==="function")return(await h.get())?.[0]??null}let m=e.all;if(typeof m!=="function")return null;return[...await m.call(e)||[]].sort((h,b)=>{let k=h?.[f],R=b?.[f];if(k===R)return 0;return(k>R?1:-1)*(l==="desc"?-1:1)})[0]??null};let u=$n(t.traits?.useSearch,t);if(u){let c=u.index??t.table??Z(`${t.name}s`);if(typeof e.search!=="function")e.search=function(l,f){return zo(e,c,l,f,u.searchable)};if(typeof e.makeAllSearchable!=="function")e.makeAllSearchable=async function(l=500){let f=e.all;if(typeof f!=="function")throw Error(`[ORM] ${t.name}.makeAllSearchable cannot run: the underlying query builder did not expose all()`);let{useSearchEngine:d}=await import("@stacksjs/search-engine"),p=d(),m=0,g=e.query;if(typeof g==="function")try{let b=g.call(e);if(b&&typeof b.chunk==="function")return await b.chunk(l,async(k)=>{let R=await ct(k,u);if(R.length>0)await p.addDocuments(c,R);m+=R.length}),m}catch{}let w=await f.call(e)||[],h=await ct(w,u);if(h.length>0)await p.addDocuments(c,h);return h.length};if(typeof e.removeAllFromSearch!=="function")e.removeAllFromSearch=async function(){let{useSearchEngine:l}=await import("@stacksjs/search-engine"),f=l();if(typeof f.deleteAllDocuments==="function"){await f.deleteAllDocuments(c);return}let d=e.all,p=typeof d==="function"?await d.call(e)||[]:[],m=l();for(let g of p){let w=g?.id??g?._attributes?.id;if(w!=null)await m.deleteDocument(c,Number(w))}}}}async function ct(e,t){if(e.length===0)return[];if(typeof t.shapeMany==="function"){let r=await t.shapeMany(e);if(!Array.isArray(r)||r.length!==e.length)throw TypeError(`[orm/search] shapeMany returned ${Array.isArray(r)?r.length:typeof r} documents for ${e.length} rows. It must return one document per row, in order, or documents are indexed under the wrong ids.`);return r.filter(Boolean)}return(await Promise.all(e.map((r)=>Qo(r,t)))).filter(Boolean)}function En(e){let t=new Set,n=e.attributes??{};for(let[r,o]of Object.entries(n))if(o?.hidden)t.add(r);return t}function Vo(e,t){if(!e||t.size===0)return e;let n={};for(let[r,o]of Object.entries(e))if(!t.has(r))n[r]=o;return n}async function Qo(e,t){if(typeof t.shape==="function")try{return await t.shape(e)}catch{return}let n=e?.toSearchableObject?.();if(n!==void 0)return n;return Vo(e?._attributes??(typeof e?.toJSON==="function"?e.toJSON():null),t.hidden??new Set)}function zo(e,t,n,r,o){let i=o&&o.length>0?{query_by:[...o].join(",")}:{},a={q:n,...i,...r??{}},s={with(u){return a={...a,...u},s},where(u){return a={...a,filter:u},s},async get(){let{useSearchEngine:u}=await import("@stacksjs/search-engine");return(await u().search(t,a))?.hits??[]},async paginate(u,c=1){let{useSearchEngine:l}=await import("@stacksjs/search-engine"),d=await l().search(t,{...a,limit:u,offset:(c-1)*u});return{hits:d.hits??[],total:Number(d.estimatedTotalHits??d.nbHits??d.total??0),page:c,perPage:u}},async raw(){let{useSearchEngine:u}=await import("@stacksjs/search-engine");return await u().search(t,a)}};return s}function jn(e){let t=Z(e);return t===e?[e]:[e,t]}async function at(e,t){if(!e||typeof e!=="object")return;let n=e._attributes??e;for(let r of t)for(let o of jn(r)){if(!(o in n))continue;let i=n[o];if(!K(i))continue;n[o]=await xe(i)}}function Ho(e,t){if(t.length===0)return;let n=async(s)=>{if(Array.isArray(s)){for(let u of s)await at(u,t);return s}if(s&&typeof s==="object"&&Array.isArray(s.data)){for(let u of s.data)await at(u,t);return s}if(s)await at(s,t);return s},r=["find","first","last","all","firstOrFail","findOrFail","findMany"];for(let s of r){let u=e[s];if(typeof u!=="function")continue;e[s]=async function(...c){let l=await u.apply(this,c);return await n(l)}}let o=["create","createMany","firstOrCreate","updateOrCreate","make"];for(let s of o){let u=e[s];if(typeof u!=="function")continue;e[s]=async function(...c){let l=await u.apply(this,c);return await n(l)}}for(let s of["update","forceUpdate"]){let u=e[s];if(typeof u!=="function")continue;e[s]=async function(c,l){let f=await u.call(this,c,l);return await n(f)}}let i=["first","firstOrFail","get","all","find","findOrFail","last","paginate","simplePaginate"],a=(s)=>{if(!s||typeof s!=="object")return s;let u=s;if(u.__stacksEncryptedReads)return s;for(let c of i){let l=u[c];if(typeof l!=="function")continue;u[c]=async function(...f){return await n(await l.apply(this,f))}}for(let c of["where","whereIn","whereNull","whereNotNull","orWhere","orderBy","orderByDesc","limit","offset","with"]){let l=u[c];if(typeof l!=="function")continue;u[c]=function(...f){return a(l.apply(this,f))}}return Object.defineProperty(u,"__stacksEncryptedReads",{value:!0,enumerable:!1}),s};for(let s of["where","whereIn","whereNull","whereNotNull","orderBy","orderByDesc","limit","query"]){let u=e[s];if(typeof u!=="function")continue;e[s]=function(...c){return a(u.apply(this,c))}}}function Jo(e,t){if(t.length===0)return;let n=async(i)=>{if(!i||typeof i!=="object"||Array.isArray(i))return i;let a={...i};for(let s of t)for(let u of jn(s))if(u in a)a[u]=await Pe(a[u]);return a},r=["create","firstOrCreate","updateOrCreate","forceCreate"],o=e.createMany;if(typeof o==="function")e.createMany=async function(i,...a){let s=Array.isArray(i)?await Promise.all(i.map(n)):i;return await o.call(this,s,...a)};for(let i of r){let a=e[i];if(typeof a!=="function")continue;e[i]=async function(...s){if(s[0]=await n(s[0]),s[1])s[1]=await n(s[1]);return await a.apply(this,s)}}for(let i of["update","forceUpdate"]){let a=e[i];if(typeof a!=="function")continue;e[i]=async function(s,u){let c=await n(u);return await a.call(this,s,c)}}}function Yo(e,t){let n=e.create;if(typeof n==="function")e.create=async function(o,...i){q(t,o);let a=await Te(t,o);return await n.call(this,a,...i)};let r=e.createMany;if(typeof r==="function")e.createMany=async function(o,...i){let a=[];for(let s of o)q(t,s),a.push(await Te(t,s));return await r.call(this,a,...i)};for(let o of["firstOrCreate","updateOrCreate"]){let i=e[o];if(typeof i!=="function")continue}}function Xo(e,t){if(!Et(t))return;let n=String(t?.name??e.name??"Model"),r=(s,u)=>{if(Eo())return;if(!s||typeof s!=="object"||Array.isArray(s))return;let c=jt(s,t,u);if(!c.valid)throw new Cn(n,c.errors)},o=e.create;if(typeof o==="function")e.create=async function(s,...u){return r(s,"creating"),await o.call(this,s,...u)};let i=e.createMany;if(typeof i==="function")e.createMany=async function(s,...u){if(Array.isArray(s))for(let c of s)r(c,"creating");return await i.call(this,s,...u)};let a=e.update;if(typeof a==="function")e.update=async function(s,u,...c){return r(u,"updating"),await a.call(this,s,u,...c)}}function Zo(e,t){let n=["create","firstOrCreate","updateOrCreate"],r=e.createMany;if(typeof r==="function")e.createMany=async function(i,...a){let s=Array.isArray(i)?i.map((u)=>u&&typeof u==="object"&&!Array.isArray(u)?it(u,t,"set"):u):i;return await r.call(this,s,...a)};for(let i of n){let a=e[i];if(typeof a==="function")e[i]=async function(...s){if(_.debug(`[orm] ${i.charAt(0).toUpperCase()+i.slice(1)} ${String(e.name||"unknown")}`,s[0]),s[0]&&typeof s[0]==="object"&&!Array.isArray(s[0]))s[0]=it(s[0],t,"set");return await a.apply(this,s)}}let o=e.update;if(typeof o==="function")e.update=async function(i,a){let s=a&&typeof a==="object"&&!Array.isArray(a)?it(a,t,"set"):a;return await o.call(this,i,s)}}var Tn=new Set(["useUuid","useTimestamps","timestampable","useSoftDeletes","softDeletable","useApi","useAuth","authenticatable","useSearch","searchable","useSeeder","seedable","useSocials","billable","observe","useAudit","useActivityLog","prunable","sharding","likeable","taggable","categorizable","commentable","commentables","broadcastOn","broadcastWith","gdpr"]);function Fn(e){_.debug(`[orm] Defining model: ${e.name} (table: ${e.table})`);for(let g of Object.keys(e.traits??{}))if(!Tn.has(g))_.warn(`[orm] Model '${e.name}' declares an unknown trait '${g}'. It does nothing. Known traits: ${[...Tn].sort().join(", ")}.`);let t=ei(e),n=ni(e),r=ti(t,n),o=ri(e);e.__traitMethods=o;let i=e.traits;if((i?.useAuth||i?.authenticatable)&&e.name!=="PersonalAccessToken"){let g=e.morphMany;if(!g||!("tokenable"in g))e.morphMany={...g??{},tokenable:"PersonalAccessToken"}}let a=r?{...e,hooks:{...e.hooks,...r}}:e,u=Co(a);if(Go(u,e.casts),Wo(u,a),Yo(u,a),e.casts&&Object.keys(e.casts).length>0)Zo(u,e.casts);let c=Ce(e);if(c.length>0)Jo(u,c),Ho(u,c);let l=e.traits?.useSoftDeletes;if(l)oi(u,a,l);let f=e.traits?.useAudit;if(f){let g=kt(f);Tt(u,e.name,e.primaryKey||"id",g)}let d=ln(e.traits?.useActivityLog);if(d)dn(u,e.name,e.primaryKey||"id",d,[...En(e)]);Xo(u,a);let p=u;p.withoutValidation=function(g){return jo(g)},p.withoutEvents=function(g){return j(g)};for(let g of["create","createMany","update","firstOrCreate","updateOrCreate","forceCreate","forceUpdate","delete","forceDelete","softDelete","restore"]){let w=u[g];if(typeof w!=="function")continue;let h=`${g}Quietly`;if(typeof u[h]==="function")continue;u[h]=function(...b){return j(()=>w.apply(u,b))}}let m=Object.assign(u,o,{...e,getDefinition:()=>e,_isStacksModel:!0});return vo(e.name,m),Object.defineProperty(m,lt,{value:e,enumerable:!1,configurable:!0}),m}function ei(e){let t=e.traits?.observe;if(!t)return;let n=e.name.toLowerCase(),r=(d)=>{let p=d?.attributes;if(!p||typeof p!=="object")return d;let m=e.primaryKey||"id",g={...p};if(g[m]===void 0&&d[m]!==void 0)g[m]=d[m];return g},o=async(d,p)=>{if(F())return;try{let{dispatch:m}=ke??=await import("@stacksjs/events");await m(d,p)}catch(m){if(m&&typeof m==="object"&&"code"in m&&m.code==="MODULE_NOT_FOUND")return;if(console.error(`[ORM] Event '${d}' handler error:`,m),process.env.STACKS_ORM_EVENT_ERRORS!=="swallow")throw m}},i=e.traits?.broadcastOn,a=e.traits?.broadcastWith,s=typeof i==="function"&&typeof a==="function",u=async(d,p)=>{if(!s)return;if(F())return;try{let m=i(p),g=Array.isArray(m)?m:[m],w=a(p),b=(await import("@stacksjs/realtime").catch(()=>null))?.broadcast;if(typeof b!=="function")return;for(let k of g){if(typeof k!=="string"||k.length===0)continue;await b(k,d,w)}}catch(m){if(m&&typeof m==="object"&&"code"in m&&m.code==="MODULE_NOT_FOUND")return;if(console.error(`[ORM] Broadcast '${d}' handler error:`,m),process.env.STACKS_ORM_BROADCAST_ERRORS==="throw")throw m}},c=async(d,p)=>{if(F())return!0;let m;try{m=ke??=await import("@stacksjs/events");let{dispatchAndCollect:g}=m,w=await g(d,p);if(w.some((b)=>b.ok&&b.value===!1))return!1;let h=w.find((b)=>!b.ok);if(h&&!h.ok)throw h.error}catch(g){if(!m&&g&&typeof g==="object"&&"code"in g&&g.code==="MODULE_NOT_FOUND")return!0;if(console.error(`[ORM] Before-event '${d}' handler error:`,g),process.env.STACKS_ORM_EVENT_ERRORS!=="swallow")throw g}return!0},l=t===!0?["create","update","delete"]:Array.isArray(t)?t:[],f={};if(l.includes("create"))f.beforeCreate=async(d)=>{if(_.debug(`[orm] Create ${n}`,d),!await c(`${n}:saving`,d))throw Error(`[ORM] ${n}:saving event cancelled the operation`);if(!await c(`${n}:creating`,d))throw Error(`[ORM] ${n}:creating event cancelled the operation`)},f.afterCreate=async(d)=>{let p=r(d);await o(`${n}:created`,p),await o(`${n}:saved`,p),await u(`${n}:created`,d)};if(l.includes("update"))f.beforeUpdate=async(d)=>{if(_.debug(`[orm] Update ${n}#${d?.id??"unknown"}`,d),!await c(`${n}:saving`,d))throw Error(`[ORM] ${n}:saving event cancelled the operation`);if(!await c(`${n}:updating`,d))throw Error(`[ORM] ${n}:updating event cancelled the operation`)},f.afterUpdate=async(d)=>{let p=r(d);await o(`${n}:updated`,p),await o(`${n}:saved`,p),await u(`${n}:updated`,d)};if(l.includes("delete"))f.beforeDelete=async(d)=>{if(_.debug(`[orm] Delete ${n}#${d?.id??"unknown"}`),!await c(`${n}:deleting`,d))throw Error(`[ORM] ${n}:deleting event cancelled the operation`)},f.afterDelete=async(d)=>{await o(`${n}:deleted`,r(d)),await u(`${n}:deleted`,d)};return f}function ti(...e){let t={},n=new Set;for(let r of e){if(!r)continue;for(let o of Object.keys(r))n.add(o)}for(let r of n){let o=e.map((i)=>i?.[r]).filter((i)=>typeof i==="function");if(!o.length)continue;t[r]=async(...i)=>{for(let a of o)await a(...i)}}return Object.keys(t).length?t:void 0}function $n(e,t){if(!e)return null;let n=e===!0?{}:typeof e==="object"?{...e}:null;if(!n)return null;if(t)n.hidden=En(t);return n}function ni(e){let t=$n(e.traits?.useSearch,e);if(!t)return;let n=t,r=n.index??e.table??Z(`${e.name}s`);async function o(s){if(typeof n.shapeMany==="function")try{let[l]=await ct([s],n);return l}catch(l){_.warn(`[orm/search] shapeMany() threw for ${e.name}: ${l.message}`);return}if(typeof n.shape==="function")try{return await n.shape(s)}catch(l){_.warn(`[orm/search] shape() threw for ${e.name}: ${l.message}`);return}let c=v(s).toSearchableObject?.();if(c!==void 0)return c;return s?._attributes??(typeof s?.toJSON==="function"?s.toJSON():null)}let i=async(s)=>{if(F())return;let u=await o(s);if(!u)return;if(t.queueable){try{let{Jobs:c}=await import("@stacksjs/queue");await c.dispatch("SyncSearchIndexJob",{index:r,op:"upsert",doc:u})}catch(c){_.warn(`[orm/search] queue dispatch failed for ${e.name}; falling back to inline: ${c.message}`),await _n(r,u,e.name)}return}await _n(r,u,e.name)};return{afterCreate:i,afterUpdate:i,afterDelete:async(s)=>{if(F())return;let u=s?.id??s?._attributes?.id;if(u==null)return;if(t.queueable){try{let{Jobs:c}=await import("@stacksjs/queue");await c.dispatch("SyncSearchIndexJob",{index:r,op:"delete",id:Number(u)})}catch(c){_.warn(`[orm/search] queue dispatch failed for ${e.name}#${u}; falling back to inline: ${c.message}`),await Sn(r,Number(u),e.name)}return}await Sn(r,Number(u),e.name)}}}var Rn=new Map;function In(e,t){let n=Rn.get(e)??0;if(Rn.set(e,n+1),n===0)_.warn(`[orm/search] ${t}`);else if(n===9)_.warn(`[orm/search] ${e} is still failing; further identical warnings suppressed for this process.`)}async function _n(e,t,n){try{let{useSearchEngine:r}=await import("@stacksjs/search-engine");await r().addDocument(e,t)}catch(r){In(`index:${n}`,`Failed to index ${n}: ${r.message}`)}}async function Sn(e,t,n){try{let{useSearchEngine:r}=await import("@stacksjs/search-engine");await r().deleteDocument(e,t)}catch(r){In(`remove:${n}`,`Failed to remove ${n}#${t}: ${r.message}`)}}function ri(e){let t={},{table:n,traits:r}=e;if(!r)return t;if(r.taggable)t._taggable=Ee(n);if(r.categorizable)t._categorizable=je(n);if(r.commentable)t._commentable=Oe(n);if(r.billable)t._billable=St(n);if(r.likeable){let i=typeof r.likeable==="object"?r.likeable:void 0;t._likeable=Fe(n,i)}let o=r.useAuth||r.authenticatable;if(typeof o==="object"&&o&&"useTwoFactor"in o&&o.useTwoFactor)t._twoFactor=tn();return t}function oi(e,t,n){let r=nn(e,t.primaryKey||"id"),o=rn(n),i=t,a=t.name.toLowerCase(),s=t.traits?.observe!=null&&t.traits?.observe!==!1,u=async(p)=>{if(!s||F())return!0;try{let{dispatchAsync:m}=ke??=await import("@stacksjs/events"),g=await m(`${a}:restoring`,{id:p});if(Array.isArray(g)&&g.some((w)=>w===!1))return!1}catch(m){if(m?.code!=="MODULE_NOT_FOUND")console.error(`[ORM] Before-event '${a}:restoring' handler error:`,m)}return!0},c=async(p)=>{if(!s||F())return;try{let{dispatch:m}=ke??=await import("@stacksjs/events");await m(`${a}:restored`,{id:p})}catch(m){if(m?.code!=="MODULE_NOT_FOUND")console.error(`[ORM] Event '${a}:restored' handler error:`,m)}},l=process.env.STACKS_ORM_CASCADE_SWALLOW!=="true",f=async(p)=>{if(!o.cascade?.length||!l){let g=await r.softDelete(p);if(g&&o.cascade?.length)await Y(i,o,p,"softDelete");return g}let{db:m}=await import("@stacksjs/database/runtime");return await m.transaction(async()=>{let g=await r.softDelete(p);if(g)await Y(i,o,p,"softDelete");return g})},d=async(p)=>{if(!await u(p))return!1;if(!o.cascade?.length||!l){let h=await r.restore(p);if(h){if(o.cascade?.length)await Y(i,o,p,"restore");await c(p)}return h}let{db:g}=await import("@stacksjs/database/runtime"),w=await g.transaction(async()=>{let h=await r.restore(p);if(h)await Y(i,o,p,"restore");return h});if(w)await c(p);return w};e.softDelete=f,e.restore=d,e.forceDelete=r.forceDelete,e.withTrashed=r.withTrashed,e.onlyTrashed=r.onlyTrashed,e.delete=f}function ii(e){if(e==null)return e;if(Array.isArray(e))return e.map((n)=>ii(n));if(typeof e!=="object")return e;let t=e;if(typeof t.toJSON==="function")return t.toJSON();if(t._attributes&&typeof t._attributes==="object")return t._attributes;return e}var ai=["belongsTo","hasOne","hasMany","belongsToMany","morphMany","morphOne"],si=["traits","dashboard"];function ui(e){let t=e?.[lt];if(t&&typeof t==="object")return t;if(e&&typeof e==="object"&&"name"in e&&"attributes"in e)return e;throw TypeError("extendModel() expects a model created by defineModel(), or a model definition. Import the framework model itself rather than its table name.")}function ci(e,t){let n=Array.isArray(e)?e:[],r=Array.isArray(t)?t:[];if(!n.length&&!r.length)return;return[...new Set([...n,...r])]}function li(e){if(!e)return 0;return Object.values(e).reduce((t,n)=>{let r=Number(n?.order);return Number.isFinite(r)&&r>t?r:t},0)}function di(e,t){let n={...e,...t},r=e.attributes??{},o=t.attributes??{};if(t.attributes){let i=li(r),a=Object.fromEntries(Object.entries(o).map(([s,u])=>{let c=!(s in r),l=Number.isFinite(Number(u?.order));if(c&&!l)return[s,{...u,order:++i}];return[s,u]}));n.attributes={...r,...a}}for(let i of ai){let a=ci(e[i],t[i]);if(a)n[i]=a}for(let i of si){let a=e[i],s=t[i];if(a&&s&&typeof a==="object"&&typeof s==="object")n[i]={...a,...s}}return n}function Pc(e,t){return Fn(di(ui(e),t))}import hi from"process";import{log as ki}from"@stacksjs/logging";import{path as S}from"@stacksjs/path";import{fs as ee}from"@stacksjs/storage";import{Database as fi}from"bun:sqlite";import{existsSync as pi,readdirSync as mi,readFileSync as gi}from"fs";function yi(e){return e.startsWith("sqlite_")||e.startsWith("_qb_tmp_")}function wi(e,t){let n=e.toUpperCase();if(n.includes("BOOL"))return t==="postgres"?"boolean":"number";if(n.includes("DATE")||n.includes("TIME"))return"string";if(n.includes("INT"))return"number";if(n.includes("CHAR")||n.includes("CLOB")||n.includes("TEXT"))return"string";if(n.includes("REAL")||n.includes("FLOA")||n.includes("DOUB")||n.includes("NUMERIC")||n.includes("DEC"))return"number";if(n.includes("BLOB"))return"Uint8Array";return"unknown"}function bi(e,t){try{return e.exec(t),{ok:!0}}catch(n){if(/CREATE\s+TRIGGER/i.test(t))return{ok:!1,error:n.message};let r=0;for(let o of t.split(/;\s*$/m)){if(!o.trim())continue;try{e.exec(o),r++}catch(i){if(/duplicate column name/i.test(i.message))r++}}return r>0?{ok:!0}:{ok:!1,error:n.message}}}function Bn(e,t="sqlite"){let n=[];if(!pi(e))return{tables:[],errors:n};let r;try{r=mi(e).filter((i)=>i.endsWith(".sql")).sort()}catch(i){return{tables:[],errors:[{file:e,error:i.message}]}}let o=new fi(":memory:");try{for(let s of r){let u=`${e}/${s}`,c;try{c=gi(u,"utf-8")}catch(f){n.push({file:u,error:f.message});continue}let l=bi(o,c);if(!l.ok)n.push({file:u,error:l.error??"could not be applied"})}let i=o.query("SELECT name FROM sqlite_master WHERE type = 'table' ORDER BY name").all().map((s)=>s.name).filter((s)=>!yi(s)),a=[];for(let s of i){let u=o.query(`PRAGMA table_info("${s.replace(/"/g,'""')}")`).all();if(u.length===0)continue;let c={};for(let l of u){let f=wi(l.type??"",t),d=l.notnull===0&&l.pk===0;c[l.name]=d&&f!=="unknown"?`${f} | null`:f}a.push({table:s,columns:c})}return{tables:a,errors:n}}finally{o.close()}}function Ti(e){if(e)return e;let t=String(hi.env.DB_CONNECTION??"").toLowerCase();return t==="postgres"||t==="mysql"?t:"sqlite"}function Re(e){return e==="postgres"?"boolean":"number"}function O(e){return e.replace(/([A-Z]+)([A-Z][a-z])/g,"$1_$2").replace(/([a-z\d])([A-Z])/g,"$1_$2").toLowerCase()}function Ri(e,t){let n=e.default;if(typeof n==="boolean")return Re(t);if(typeof n==="number")return"number";if(typeof n==="string")return"string";return"unknown"}function _i(e){let t=e.validation;if(!t||typeof t!=="object")return null;let n=t.rule;return n&&typeof n==="object"?n:null}function Si(e){if(!e||String(e.name??"")!=="enum")return null;let n=(Array.isArray(e.allowedValues)?e.allowedValues:[]).filter((r)=>typeof r==="string"||typeof r==="number").map((r)=>typeof r==="number"?String(r):JSON.stringify(r));return n.length>0?n.join(" | "):null}function Ai(e,t){let n=_i(e),r=Si(n);if(r!==null)return e.nullable===!0?`${r} | null`:r;let o=typeof e.type==="string"?e.type.toLowerCase():String(n?.name??"").toLowerCase(),i=(()=>{switch(o){case"string":case"text":case"longtext":case"mediumtext":case"tinytext":case"char":case"varchar":case"enum":case"uuid":case"date":case"datetime":case"timestamp":case"timestamptz":case"password":case"time":case"year":return"string";case"number":case"integer":case"int":case"tinyint":case"smallint":case"mediumint":case"float":case"double":case"decimal":case"numeric":return"number";case"bigint":return"number | bigint";case"boolean":case"bool":return Re(t);case"json":case"jsonb":return"unknown";case"binary":case"blob":case"bytea":return"Uint8Array";case"unix":return"number";case"array":return"unknown[]";case"object":return"Record<string, unknown>";default:return Ri(e,t)}})();return e.nullable===!0?`${i} | null`:i}function Pi(e){let t={},n=e.belongsTo;if(!n)return t;let r=Array.isArray(n)?n:Object.values(n);for(let o of r){if(typeof o==="string"){t[`${O(o)}_id`]="number";continue}if(o&&typeof o==="object"){let i=o;if(typeof i.foreignKey==="string"){t[i.foreignKey]="number";continue}if(typeof i.model==="string")t[`${O(i.model)}_id`]="number"}}return t}function xi(e,t){let[n,r]=[O(e),O(t)].sort();return`${n}_${r}`}function Ci(e,t){let n=e.default,r=typeof n==="string"?"string":typeof n==="number"?"number":typeof n==="boolean"?Re(t):n instanceof Date?"string":"unknown";return e.nullable?`${r} | null`:r}function vi(e,t,n){let r=t.belongsToMany;if(!r)return[];let o=[],i=Array.isArray(r)?r:Object.values(r);for(let a of i){let s,u,c,l,f={},d=!0;if(typeof a==="string")s=a;else if(a&&typeof a==="object"&&"model"in a){let h=a;if(s=h.model,"pivotTable"in h||"firstForeignKey"in h||"secondForeignKey"in h)u=h.pivotTable,c=h.firstForeignKey,l=h.secondForeignKey;else{let b=a;u=b.table,c=b.foreignKey,l=b.relatedKey,f=b.pivot?.columns??{},d=Boolean(b.pivot?.timestamps)}}else continue;let p=u??xi(e,s),m=c??`${O(e)}_id`,g=l??`${O(s)}_id`,w={id:"number",[m]:"number",[g]:"number"};for(let[h,b]of Object.entries(f))w[h]=Ci(b,n);if(d)w.created_at="string",w.updated_at="string | null";o.push({table:p,columns:w})}return o}function Mi(e){return{email_verified_at:"string | null",password_changed_at:"string | null",two_factor_secret:"string | null",two_factor_enabled:`${Re(e)} | null`,two_factor_last_used_step:"number | null",stripe_id:"string | null"}}function Oi(e,t){let n={id:"number"},r=e.traits??{};if(r.useUuid)n.uuid="string";if((r.useTimestamps??r.timestampable)!==!1)n.created_at="string",n.updated_at="string | null";if(r.useSoftDeletes??r.softDeletable)n.deleted_at="string | null";if((e.table??"")==="users"||e.name==="User")Object.assign(n,Mi(t));return n}function Di(e,t){let n={},r=e.attributes??{};for(let[o,i]of Object.entries(r))n[O(o)]=Ai(i,t);return n}function Nn(e,t,n=2){let r=" ".repeat(n),o=" ".repeat(n+1),i=Object.entries(t).map(([s,u])=>`${o}${s}: ${u}`).join(`
|
|
8
|
-
`),
|
|
2
|
+
var dt=(e,n,t)=>()=>{if(e)try{n=e(e=0)}catch(r){t=[r]}if(t)throw t[0];return n};var Wn=import.meta.require;import{readdirSync as zr}from"fs";import{basename as Hr,extname as qt,join as Jr}from"path";function Yr(e){let n=[],t=(r)=>{let o;try{o=zr(r,{withFileTypes:!0})}catch{return}for(let a of o){let i=Jr(r,a.name);if(a.isDirectory()){t(i);continue}if(![".ts",".js"].includes(qt(a.name)))continue;if(a.name.startsWith(".")||a.name.startsWith("index"))continue;n.push(i)}};return t(e),n.sort()}async function Lt(e,n,t){for(let r of Yr(e))try{let o=qt(r),a=await import(`${r}?t=${Date.now()}`),i=a.default??a,s=i.name??Hr(r,o);n[s]={...i,name:s}}catch(o){t?.(r,o)}}async function Gt(e){let n={};return await Lt(e.defaultsRoot,n,e.onImportError),await Lt(e.userRoot,n,e.onImportError),n}var Ut=()=>{};import{path as Kt}from"@stacksjs/path";async function Ue(){return Gt({defaultsRoot:Kt.frameworkPath("defaults/app/Models"),userRoot:Kt.userModelsPath()})}var Ke=dt(()=>{Ut()});import"@stacksjs/validation/runtime";import{log as Ae}from"@stacksjs/cli";import{db as ft,mutationCount as pt}from"@stacksjs/database/runtime";async function Vn(e,n={}){let{olderThanDays:t=30,column:r="created_at",query:o}=n;try{if(o){let u=ft.deleteFrom(e);u=o(u);let c=pt(await u.execute());return Ae.info(`Pruned ${c} records from ${e}`),c}let a=new Date;a.setDate(a.getDate()-t);let i=await ft.deleteFrom(e).where(r,"<",a.toISOString()).execute(),s=pt(i);return Ae.info(`Pruned ${s} records from ${e} older than ${t} days`),s}catch(a){throw Ae.error(`Failed to prune ${e}:`,a),a}}async function Ns(e,n={}){return Vn(e,n)}function Ls(e){if(!e?.prunable)return null;if(typeof e.prunable==="boolean")return{olderThanDays:30,column:"created_at"};return e.prunable}import{createCipheriv as Qn,createDecipheriv as zn,createHash as Hn,randomBytes as Jn}from"crypto";import{log as oe}from"@stacksjs/logging";var mt="enc:",gt="aes-256-gcm",Yn=12,re=null;async function yt(){if(re)return re;let e=process.env.APP_KEY;if(!e)try{e=(await import("@stacksjs/config").catch(()=>null))?.config?.app?.key}catch{}if(!e)return null;return re=Hn("sha256").update(e).digest(),re}function K(e){return typeof e==="string"&&e.startsWith(mt)}async function Pe(e){if(e==null)return e;if(K(e))return e;if(typeof e!=="string")return e;let n=await yt();if(!n)return oe.warn("[orm] encrypted attribute: APP_KEY not set - storing value in plaintext"),e;let t=Jn(Yn),r=Qn(gt,n,t),o=Buffer.concat([r.update(e,"utf8"),r.final()]),a=r.getAuthTag();return`${mt}${t.toString("base64")}:${a.toString("base64")}:${o.toString("base64")}`}async function xe(e){if(e==null)return e;if(typeof e!=="string")return e;if(!K(e))return e;try{let n=await yt();if(!n)return oe.warn("[orm] encrypted attribute: APP_KEY not set - cannot decrypt"),null;let[,t,r,o]=e.split(":");if(!t||!r||!o)return oe.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=zn(gt,n,a);return u.setAuthTag(i),Buffer.concat([u.update(s),u.final()]).toString("utf8")}catch(n){return oe.warn("[orm] encrypted attribute: decrypt failed (key rotation? corrupted ciphertext?)",{error:n}),null}}function Ce(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 Xn}from"@stacksjs/database/runtime";import{log as B}from"@stacksjs/logging";var Zn=[/^password$/i,/^password_hash$/i,/^api_key$/i,/_token$/i,/_secret$/i,/^remember_token$/i],bt="model_audits",ve=null;function er(e){ve=e}async function ae(){if(ve!=null)return ve;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 W(e){if(!e||typeof e!=="object")return null;let n={};for(let[t,r]of Object.entries(e)){if(Zn.some((o)=>o.test(t)))continue;n[t]=r}return n}function I(e){if(!e||typeof e!=="object")return null;let n=e;if(n._attributes&&typeof n._attributes==="object")return{...n._attributes};return{...e}}function tr(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 ie(e,n=!1){try{let{db:t}=await import("@stacksjs/database/runtime");await t.insertInto(bt).values({auditable_type:e.auditable_type,auditable_id:e.auditable_id,event:e.event,old_values:e.old_values?JSON.stringify(e.old_values):null,new_values:e.new_values?JSON.stringify(e.new_values):null,user_id:e.user_id,created_at:Xn()}).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 ht(e){return{async audits(n){try{let{db:t}=await import("@stacksjs/database/runtime");return(await t.selectFrom(bt).selectAll().where("auditable_type","=",e).where("auditable_id","=",n).orderBy("created_at","desc").execute()??[]).map((o)=>({...o,old_values:typeof o.old_values==="string"?wt(o.old_values):o.old_values,new_values:typeof o.new_values==="string"?wt(o.new_values):o.new_values}))}catch(t){return B.warn(`[orm] audits() lookup failed for ${e}#${String(n)}`,{error:t}),[]}}}}function wt(e){try{return JSON.parse(e)}catch{return e}}function kt(e){if(e&&typeof e==="object"&&"transactional"in e)return{transactional:e.transactional===!0};return{transactional:!1}}function Tt(e,n,t="id",r={}){let o=r.transactional===!0,a=e;if(typeof e.audits!=="function")e.audits=ht(n).audits;let i=async(f)=>{if(!o)return await f();let{db:d}=await import("@stacksjs/database/runtime");return await d.transaction(async()=>f())},s=e.create;if(typeof s==="function")e.create=async function(...f){return await i(async()=>{let d=await s.apply(this,f);try{let p=I(d),m=p?.[t];if(m!=null){let g=await ae();await ie({auditable_type:n,auditable_id:m,event:"created",old_values:null,new_values:W(p),user_id:g},o)}}catch(p){if(B.warn(`[orm] audit(create) failed for ${n}`,{error:p}),o)throw p}return d})};let u=e.createMany;if(typeof u==="function")e.createMany=async function(...f){return await i(async()=>{let d=await u.apply(this,f);try{let p=Array.isArray(d)&&d.length?await ae():null;for(let m of Array.isArray(d)?d:[]){let g=I(m),w=g?.[t];if(w==null)continue;await ie({auditable_type:n,auditable_id:w,event:"created",old_values:null,new_values:W(g),user_id:p},o)}}catch(p){if(B.warn(`[orm] audit(createMany) failed for ${n}`,{error:p}),o)throw p}return d})};let c=e.update;if(typeof c==="function")e.update=async function(f,d){return await i(async()=>{let p=a.find,m=typeof p==="function"?I(await p.call(a,f)):null,g=await c.call(this,f,d);try{let w=I(g)??(typeof p==="function"?I(await p.call(a,f)):null),{old:h,next:b}=tr(m,w);if(b&&Object.keys(b).length>0){let k=await ae();await ie({auditable_type:n,auditable_id:f,event:"updated",old_values:W(h),new_values:W(b),user_id:k},o)}}catch(w){if(B.warn(`[orm] audit(update) failed for ${n}#${String(f)}`,{error:w}),o)throw w}return g})};let l=(f)=>{let d=e[f];if(typeof d!=="function")return;e[f]=async function(p){return await i(async()=>{let m=a.find,g=typeof m==="function"?I(await m.call(a,p)):null,w=await d.call(this,p);try{if(w!==!1&&g){let h=await ae();await ie({auditable_type:n,auditable_id:p,event:"deleted",old_values:W(g),new_values:null,user_id:h},o)}}catch(h){if(B.warn(`[orm] audit(${f}) failed for ${n}#${String(p)}`,{error:h}),o)throw h}return w})}};l("delete"),l("softDelete")}import{db as nr,sql as rr,sqlDateTime as Me}from"@stacksjs/database/runtime";function C(e,n){if(typeof e!=="number"||!Number.isFinite(e)||e<=0)throw Error(`[orm/commentable] ${n} requires a positive numeric id (received ${String(e)})`)}var V="commentable_upvotes",Q="commentables";function or(e){let n=e;return n.code==="SQLITE_CONSTRAINT_UNIQUE"||n.code==="SQLITE_CONSTRAINT"||n.code==="23505"||n.errno===1062||/unique|duplicate/i.test(n.message??"")}var Rt=["pending","approved"];function Oe(e){let n=nr;return{async comments(t){return C(t,"comments"),await n.selectFrom("commentables").where("commentables_id","=",t).where("commentables_type","=",e).selectAll().orderBy("id","asc").execute()},async commentCount(t){let r=await n.selectFrom("commentables").select(rr`count(*) as count`).where("commentables_id","=",t).where("commentables_type","=",e).executeTakeFirst();return Number(r?.count)||0},async addComment(t,r,o={}){if(C(t,"addComment"),!r||typeof r.body!=="string"||r.body.trim().length===0)throw Error("[orm/commentable] addComment requires a non-empty comment.body");if(r.title!=null&&typeof r.title!=="string")throw Error("[orm/commentable] addComment requires comment.title to be a string when given");let a=o.status??"pending";if(!Rt.includes(a))throw Error(`[orm/commentable] addComment status must be one of ${Rt.join(", ")} (received ${String(a)})`);let i={title:r.title?.trim()??"",body:r.body,commentables_id:t,commentables_type:e,status:a,approved_at:a==="approved"?Date.now():null,created_at:Me(),updated_at:Me()};for(let c of["author_name","author_email","user_id"])if(r[c]!=null)i[c]=r[c];let s=await n.insertInto("commentables").values(i).returningAll().executeTakeFirst();if(s&&typeof s==="object"&&"id"in s)return s;let u=s?.lastInsertRowid;if(u==null)return s;return await n.selectFrom("commentables").where("id","=",Number(u)).selectAll().executeTakeFirst()},async approvedComments(t){return await n.selectFrom("commentables").where("commentables_id","=",t).where("commentables_type","=",e).where("status","=","approved").selectAll().orderBy("id","asc").execute()},async pendingComments(t){return await n.selectFrom("commentables").where("commentables_id","=",t).where("commentables_type","=",e).where("status","=","pending").selectAll().orderBy("id","asc").execute()},async rejectedComments(t){return await n.selectFrom("commentables").where("commentables_id","=",t).where("commentables_type","=",e).where("status","=","rejected").selectAll().orderBy("id","asc").execute()},async upvoteComment(t,r){C(t,"upvoteComment"),C(r,"upvoteComment");let o=()=>n.selectFrom(V).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(V).values({upvoteable_id:t,upvoteable_type:Q,user_id:r,created_at:Me()}).execute()}catch(i){if(!or(i))throw i}return await o()},async removeCommentUpvote(t,r){C(t,"removeCommentUpvote"),C(r,"removeCommentUpvote"),await n.deleteFrom(V).where("upvoteable_id","=",t).where("upvoteable_type","=",Q).where("user_id","=",r).execute()},async commentUpvoteCount(t){C(t,"commentUpvoteCount");let r=await n.selectFrom(V).select("count(*) as count").where("upvoteable_id","=",t).where("upvoteable_type","=",Q).executeTakeFirst();return Number(r?.count)||0},async hasUpvotedComment(t,r){return C(t,"hasUpvotedComment"),C(r,"hasUpvotedComment"),!!await n.selectFrom(V).where("upvoteable_id","=",t).where("upvoteable_type","=",Q).where("user_id","=",r).selectAll().executeTakeFirst()}}}import{db as ar,sql as ir,sqlDateTime as St}from"@stacksjs/database/runtime";function De(e,n){if(typeof e!=="number"||!Number.isFinite(e)||e<=0)throw Error(`[orm/taggable] ${n} requires a positive numeric id (received ${String(e)})`)}function Ee(e){let n=ar;return{async tags(t){return De(t,"tags"),await n.selectFrom("taggables").where("taggable_id","=",t).where("taggable_type","=",e).selectAll().execute()},async tagCount(t){De(t,"tagCount");let r=await n.selectFrom("taggables").select(ir`count(*) as count`).where("taggable_id","=",t).where("taggable_type","=",e).executeTakeFirst();return Number(r?.count)||0},async addTag(t,r){if(De(t,"addTag"),!r||typeof r.name!=="string"||r.name.trim().length===0)throw Error("[orm/taggable] addTag requires a non-empty tag.name");return await n.insertInto("taggables").values({...r,taggable_id:t,taggable_type:e,slug:r.name.toLowerCase().replace(/[^a-z0-9]+/g,"-"),is_active:!0,created_at:St(),updated_at:St()}).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 sr,sqlDateTime as se}from"@stacksjs/database/runtime";function je(e){let n=sr;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:se(),updated_at:se()}).execute(),i=await a();return await n.insertInto("categorizable_models").values({categorizable_id:r,categorizable_type:e,category_id:i?.id,created_at:se(),updated_at:se()}).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 ur,sqlDateTime as cr}from"@stacksjs/database/runtime";function Fe(e,n){let t=ur,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=cr();try{return await t.insertInto(r).values({[o]:a,user_id:i,created_at:s,updated_at:s}).returningAll().executeTakeFirst()}catch(u){let c=u;if(!(c.code==="SQLITE_CONSTRAINT_UNIQUE"||c.code==="SQLITE_CONSTRAINT"||c.code==="23505"||c.errno===1062||/unique|duplicate/i.test(c.message??"")))throw u;let f=await t.selectFrom(r).where(o,"=",a).where("user_id","=",i).selectAll().executeTakeFirst();if(f)return f;throw u}},async unlike(a,i){await t.deleteFrom(r).where(o,"=",a).where("user_id","=",i).execute()},async isLiked(a,i){return!!await t.selectFrom(r).where(o,"=",a).where("user_id","=",i).selectAll().executeTakeFirst()},async likedBy(a){return(await t.selectFrom(r).select([o]).where("user_id","=",a).execute()).map((s)=>Number(s[o])).filter(Boolean)}}}import{createRequire as lr}from"module";import{db as dr}from"@stacksjs/database/runtime";var fr=lr(import.meta.url);class $e extends Error{constructor(e){super(`No subscription ${e} belongs to this user`);this.name="SubscriptionNotOwnedError"}}function _t(e){let n=dr;return{async syncStripeCustomerDetails(t,r){let{manageCustomer:o}=await import("@stacksjs/payments");return await o.syncStripeCustomerDetails(t,r)},async createStripeUser(t,r){let{manageCustomer:o}=await import("@stacksjs/payments");return await o.createStripeCustomer(t,r)},async updateStripeUser(t,r){let{manageCustomer:o}=await import("@stacksjs/payments");return await o.updateStripeCustomer(t,r)},async deleteStripeUser(t){let{manageCustomer:r}=await import("@stacksjs/payments");return await r.deleteStripeUser(t)},async createOrGetStripeUser(t,r){let{manageCustomer:o}=await import("@stacksjs/payments");return await o.createOrGetStripeUser(t,r)},async retrieveStripeUser(t){let{manageCustomer:r}=await import("@stacksjs/payments");return await r.retrieveStripeUser(t)},async defaultPaymentMethod(t){let{managePaymentMethod:r}=await import("@stacksjs/payments");return await r.retrieveDefaultPaymentMethod(t)},async setDefaultPaymentMethod(t,r){let{managePaymentMethod:o}=await import("@stacksjs/payments");return typeof r==="string"?await o.setUserDefaultPayment(t,r):await o.setDefaultPaymentMethod(t,r)},async deletePaymentMethod(t,r){let{managePaymentMethod:o}=await import("@stacksjs/payments");return await o.deletePaymentMethod(t,r)},async addPaymentMethod(t,r){let{managePaymentMethod:o}=await import("@stacksjs/payments");return await o.addPaymentMethod(t,r)},async paymentMethods(t,r){let{managePaymentMethod:o}=await import("@stacksjs/payments");return await o.listPaymentMethods(t,r)},async newSubscription(t,r,o,a={}){let{manageSubscription:i}=await import("@stacksjs/payments"),s=await i.create(t,r,o,a),c=s.latest_invoice?.payment_intent;return{subscription:s,paymentIntent:c}},async updateSubscription(t,r,o,a={}){let{manageSubscription:i}=await import("@stacksjs/payments"),s=await i.update(t,r,o,a),c=s.latest_invoice?.payment_intent;return{subscription:s,paymentIntent:c}},async cancelSubscription(t,r,o={}){if(!await n.selectFrom("subscriptions").where("provider_id","=",r).where("user_id","=",t.id).select(["id"]).executeTakeFirst())throw new $e(r);let{manageSubscription:i}=await import("@stacksjs/payments");return{subscription:await i.cancel(r,o)}},async activeSubscription(t){let{manageSubscription:r}=await import("@stacksjs/payments"),o=await n.selectFrom("subscriptions").where("user_id","=",t.id).where("provider_status","=","active").selectAll().executeTakeFirst();if(o){let a=await r.retrieve(t,o.provider_id||"");return{subscription:o,providerSubscription:a}}return},async checkout(t,r,o={}){let{manageCheckout:a,manageCustomer:i}=await import("@stacksjs/payments"),s={};if(o.enableTax)s.automatic_tax={enabled:!0},delete o.enableTax;if(o.allowPromotions)s.allow_promotion_codes=!0,delete o.allowPromotions;let l={...{mode:"payment",customer:(await i.createOrGetStripeUser(t,{})).id,line_items:r.map((f)=>({price:f.priceId,quantity:f.quantity||1}))},...s,...o};return await a.create(t,l)},async createSetupIntent(t,r={}){let{manageSetupIntent:o}=await import("@stacksjs/payments");return await o.create(t,r)},async createPayment(t,r,o={}){let{manageCharge:a}=await import("@stacksjs/payments");return await a.createPayment(t,r,o)},async storeTransaction(t,r,o){let{manageTransaction:a}=await import("@stacksjs/payments");return await a.store(t,r,o)},async subscriptionHistory(t){let{manageInvoice:r}=await import("@stacksjs/payments");return await r.list(t)},async transactionHistory(t){let{manageTransaction:r}=await import("@stacksjs/payments");return await r.list(t)},async connectAccount(t,r={}){let o=r.accountColumn||"stripe_account_id",a=(t._attributes??t)[o];if(!a)return null;let i=await z();try{return await i.accounts.retrieve(a)}catch{return null}},async createConnectAccount(t,r={}){let o=r.accountColumn||"stripe_account_id",a=t._attributes??t,i=a[o],s=await z();if(!i){let{stacksIdempotencyKey: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 z()).accountLinks.create({account:i,refresh_url:r.refreshUrl,return_url:r.returnUrl,type:r.type??"account_onboarding"})).url,accountId:i}},async syncConnectStatus(t,r={}){let o=r.accountColumn||"stripe_account_id",a=r.chargesColumn||"charges_enabled",i=r.payoutsColumn||"payouts_enabled",s=t._attributes??t,u=s[o];if(!u)return{chargesEnabled:!1,payoutsEnabled:!1};let l=await(await z()).accounts.retrieve(u),f=!!l.charges_enabled,d=!!l.payouts_enabled,p=r.modelTable||e;return await n.updateTable(p).set({[a]:f,[i]:d}).where("id","=",Number(s.id)).execute(),{chargesEnabled:f,payoutsEnabled:d}},async chargeWithSplit(t,r){let o=await z(),a=r.accountColumn||"stripe_account_id",i=t._attributes??t,s=r.connectAccountId||i[a],u={amount:r.amountCents,currency:r.currency||"usd",automatic_payment_methods:{enabled:!0},metadata:r.metadata};if(s){if(u.transfer_data={destination:s},r.platformFeeCents)u.application_fee_amount=r.platformFeeCents}let{freshIdempotencyKey:c}=await import("@stacksjs/payments");return await o.paymentIntents.create(u,{idempotencyKey:c("payment_intent.create",i.id,r.amountCents)})}}}var pr={syncStripeCustomerDetails:!0,createStripeUser:!0,updateStripeUser:!0,deleteStripeUser:!0,createOrGetStripeUser:!0,retrieveStripeUser:!0,defaultPaymentMethod:!0,setDefaultPaymentMethod:!0,deletePaymentMethod:!0,addPaymentMethod:!0,paymentMethods:!0,newSubscription:!0,updateSubscription:!0,cancelSubscription:!0,activeSubscription:!0,checkout:!0,createSetupIntent:!0,createPayment:!0,storeTransaction:!0,subscriptionHistory:!0,transactionHistory:!0,connectAccount:!0,createConnectAccount:!0,connectOnboardLink:!0,syncConnectStatus:!0,chargeWithSplit:!0},ue=Object.freeze(Object.keys(pr));function mr(e){return ue.every((n)=>typeof Reflect.get(e,n)==="function")}function z(){let e=globalThis.process?.env?.STRIPE_SECRET_KEY;if(!e)throw Error("Stripe Connect: STRIPE_SECRET_KEY not configured");let n;try{n=fr("stripe")}catch{throw Error("Stripe Connect is being used but the `stripe` package is not installed. It is an opt-in dependency - run `bun add stripe` to enable Stripe Connect.")}return new n(e,{apiVersion:n.API_VERSION})}import{isUniqueViolation as Dr}from"@stacksjs/error-handling";import{isUniqueViolation as gr}from"@stacksjs/error-handling";function yr(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(gr(e))return{status:409,body:{error:`${n} already exists`}};return{status:500,body:{error:`Failed to ${t} ${n}`,detail:String(e)}}}function P(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 wr(e){let n={};for(let[t,r]of Object.entries(e))n[P(t)]=r;return n}function iu(e,n){let t=String(n||"").replace(/^\/+|\/+$/g,""),r=String(e).replace(/^\/+/,"");return`/api/${t?`${t}/`:""}${r}`}function Mt(e){if(!e)return null;let n=e.attributes??{};if(Object.prototype.hasOwnProperty.call(n,"teamId")||Object.prototype.hasOwnProperty.call(n,"team_id"))return"team_id";return e.belongsTo?.some((t)=>t==="Team")?"team_id":null}function Ot(e){if(!e)return null;let n=e.attributes??{};if(Object.prototype.hasOwnProperty.call(n,"userId")||Object.prototype.hasOwnProperty.call(n,"user_id"))return"user_id";return e.belongsTo?.some((t)=>t==="User")?"user_id":null}function su(e){return e?.ownership===!1}function uu(e,n,t){let r=Object.keys(e).find((a)=>P(a)===P(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(P(a)===P(n))delete o[a];return o[n]=t,{data:o}}function br(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=P(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 hr(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??=Tr(n);let a=r.get(o);if(a!==o&&a in e)t[o]=e[a]}return t}function kr(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 At=new WeakMap,Pt=new WeakMap;function Be(e){let n=At.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:P(r)}));return At.set(e,t),t}function Tr(e){let n=Be(e),t=Pt.get(n);if(t)return t;let r=new Map(n.map(({field:o,snake:a})=>[o,a]));return Pt.set(n,r),r}function cu(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 lu(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 Rr=["id","uuid","created_at","updated_at","deleted_at"];function du(e,n){let t=new Map;for(let r of[...Object.keys(e??{}),...Rr]){let o=P(r);if(!/^\w+$/.test(o))continue;t.set(r,o),t.set(o,o)}for(let r of n)t.delete(r),t.delete(P(r));return t}function fu(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 Sr={string:{get:(e)=>e!=null?String(e):null,set:(e)=>e!=null?String(e):null},number:{get:(e)=>e!=null?Number(e):null,set:(e)=>e!=null?Number(e):null},integer:{get:(e)=>e!=null?Math.trunc(Number(e)):null,set:(e)=>e!=null?Math.trunc(Number(e)):null},float:{get:(e)=>e!=null?Number.parseFloat(String(e)):null,set:(e)=>e!=null?Number.parseFloat(String(e)):null},boolean:{get:(e)=>e===1||e==="1"||e===!0||e==="true",set:(e)=>e===!0||e===1||e==="1"||e==="true"?1:0},json:{get:(e)=>e==null?null:typeof e==="string"?Ar(e):e,set:(e)=>e==null?null:typeof e==="string"?e:JSON.stringify(e)},datetime:{get:(e)=>e?new Date(e):null,set:(e)=>e instanceof Date?e.toISOString():e},date:{get:(e)=>e?new Date(e):null,set:(e)=>e instanceof Date?e.toISOString().split("T")[0]:e},array:{get:(e)=>e==null?[]:Array.isArray(e)?e:typeof e==="string"?Pr(e):[],set:(e)=>e==null?null:Array.isArray(e)?JSON.stringify(e):e}},xt=new WeakMap;function _r(e,n){let t=xt.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"?Sr[a]:a;r.push({attr:o,snake:P(o),definition:a,caster:i})}return xt.set(e,r),r}function Ar(e){try{return JSON.parse(e)}catch{return e}}function Pr(e){try{return JSON.parse(e)}catch{return[]}}function pu(e,n,t){if(!e||typeof e!=="object"||!n)return e;let r=Object.keys(n);if(r.length===0)return e;let o=_r(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 Ct=new WeakMap;function xr(e){let n=Ct.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 Ct.set(e,t),t}function Dt(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 Et(e,n,t){let r=n?.attributes;if(!r||typeof r!=="object")return{valid:!0};let o=xr(r);if(o.length===0)return{valid:!0};let a={},i=!1;for(let s of o){let{definition:u,field:c,hasDefault:l,rule:f}=s,d=Object.prototype.hasOwnProperty.call(e,c);if(!d&&t==="updating")continue;let p=d?e[c]:l?u.default:void 0,m=kr(f,p),g=f.validate(m);if(!g?.valid&&Array.isArray(g?.errors)&&g.errors.length>0)i=!0,a[c]=g.errors.map((w)=>u.validation?.message?.[w?.code]??w?.message??"invalid")}return i?{valid:!1,errors:a}:{valid:!0}}function Cr(e,n){return`${e}\x00${vr(n)}`}function mu(e){let n=new Map;for(let t of e){let r=Cr(String(t.method??""),String(t.path??""));if(!n.has(r))n.set(r,t)}return n}function vr(e){return e.replace(/\{[^}]*\}/g,"{}").replace(/:[^/]+/g,"{}")}function Ie(e){if(Array.isArray(e))return e.filter((n)=>typeof n==="string"&&n.length>0);return typeof e==="string"&&e?[e]:[]}function gu(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?Ie(o.read):["auth"],write:"write"in o?Ie(o.write):["auth"],declared:!0}}let r=Ie(t);return{read:r,write:r,declared:!0}}var vt=15,Mr=100;function yu(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(vt),10),o=Math.min(Number.isFinite(r)?Math.max(1,r):vt,Mr);return{page:t,perPage:o,offset:(t-1)*o}}function ce(e,n){let t=new URL(e.toString());return t.searchParams.set("page",String(n)),`${t.pathname}${t.search}`}function Or(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?ce(e,n-1):null,next_page_url:o?ce(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=ce(e,1),u.last_page_url=ce(e,c)}return u}function wu(e,n,t,r,o,a){let{page:i,...s}=Or(e,n,t,r,o,a);return{current_page:i,...s}}function bu(e,n){return(n??e??"").toString().trim().toLowerCase()==="warn"?"warn":"deny"}function hu(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 Er(e){if(e?.ownership===!1)return null;if(e?.ownership)return e.ownership;let n=Mt(e);if(n)return{field:n,resolve:async(r,o)=>{let{resolveAuthenticatedTeamId:a}=await import("@stacksjs/auth");return a(Ne(o))}};let t=Ot(e);if(t)return{field:t,resolve:async(r)=>r?.id??null};return null}function Ne(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 jr(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 Fr(e="id"){return{field:e,resolve:async(n)=>n?.id??null}}function $r(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(Ne(t));if(a==null)return[];return(await o.where("team_id",a).get()??[]).map((s)=>s.id).filter((s)=>s!=null)}catch{return[]}}}}function Ir(e="id"){return{field:e,resolve:async(n,t)=>{try{let{resolveAuthenticatedTeamId:r}=await import("@stacksjs/auth");return await r(Ne(t))}catch{return null}}}}function Br(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=Er(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 Nr}from"@stacksjs/router";var jt=new WeakMap;function Ft(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 Lr(e,n){if(typeof e.find==="function")return e.find(n);let t=await e.findMany?.([n]);return Ft(t??[]).get(n)}async function qr(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=Ft(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 Au(e,n){let t=Nr();if(!t)return Lr(e,n);let r=jt.get(t);if(!r)r=new WeakMap,jt.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(()=>{qr(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 vu}from"@stacksjs/database/runtime";class Gr{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 Le}from"@stacksjs/database/runtime";async function qe(e,n){return await Le.transaction(e,n)}async function Du(e){return await Le.savepoint(e)}function Eu(e,n){return Le.transactional(e,n)}import{randomUUID as Xr}from"crypto";import{db as x,getDatabaseDialect as Zr,parseSqlDateTime as eo,sqlDateTime as Qt}from"@stacksjs/database/runtime";import{plural as Ur,snakeCase as H}from"@stacksjs/strings";var $t=new Set(["anonymize","delete","keep"]),It=new Set(["anonymize","delete"]),Bt=new Set(["consent","contract","legal_obligation","vital_interests","public_task","legitimate_interests"]),M="User";class Ge extends Error{problems;constructor(e){super(`GDPR declarations cannot be honoured:
|
|
3
|
+
${e.map((n)=>` - ${n.model}: ${n.message}`).join(`
|
|
4
|
+
`)}`);this.name="GdprDeclarationError",this.problems=e}}function Kr(e){return(Array.isArray(e)?e.map((t)=>[t.name??"",t]):Object.entries(e)).map(([t,r])=>({name:String(r?.name??t),definition:r})).filter((t)=>t.name&&t.definition&&typeof t.definition==="object").sort((t,r)=>t.name.localeCompare(r.name))}function Nt(e,n){return n.table??H(Ur(e))}function Wr(e){let n=e.belongsTo,t=Array.isArray(n)?n:n&&typeof n==="object"?Object.values(n):[],r=[];for(let o of t){if(typeof o==="string"){r.push({model:o,foreignKey:`${H(o)}_id`});continue}if(o&&typeof o==="object"&&typeof o.model==="string"){let a=o;r.push({model:a.model,foreignKey:a.foreignKey??`${H(a.model)}_id`})}}return r}function Vr(e){if(e===!0)return{};if(e&&typeof e==="object")return e;return null}function Qr(e,n){if(n.anonymize!==void 0)return{perRow:!1,value:n.anonymize};if(!(e.required===!0&&e.nullable!==!0))return{perRow:!1,value:null};let r=e.validation?.rule?.name??e.type??"string";if(r==="string"||r==="text")return e.unique?{perRow:!0,value:null}:{perRow:!1,value:"[erased]"};if(e.unique)return{problem:`is a NOT NULL unique ${r} column; declare personal: { anonymize: <value> } or make it nullable`};if(r==="number"||r==="integer"||r==="float"||r==="decimal")return{perRow:!1,value:0};if(r==="boolean")return{perRow:!1,value:!1};if(r==="json")return{perRow:!1,value:"{}"};return{problem:`is a NOT NULL ${r} column with no safe placeholder; declare personal: { anonymize: <value> }`}}function le(e){let n=new Map,t=new Map,r=[],o=[],a=(s,u)=>{o.push({model:s,message:u})};for(let{name:s,definition:u}of Kr(e)){let c=u.attributes??{},l=u.traits?.gdpr,f=Wr(u),d=f.find((T)=>T.model===M),p=Object.entries(c).map(([T,A])=>({attribute:T,shape:A,options:Vr(A?.personal)})).filter((T)=>T.options!==null);if(!l&&p.length===0){if(d&&s!==M)r.push(s);continue}if(l!==void 0&&(l===null||typeof l!=="object")){a(s,"`traits.gdpr` must be an object");continue}let m=Nt(s,u),g=u.primaryKey??"id",w=null,h,b=l?.subject;if(b===void 0){if(s===M)w={kind:"column",columns:[g],where:{}};else if(d)w={kind:"column",columns:[d.foreignKey],where:{}}}else if(typeof b==="string")w={kind:"column",columns:[b],where:{}};else if(Array.isArray(b))w={kind:"column",columns:[...b].map(String),where:{}};else if(b&&typeof b==="object"&&"column"in b)w={kind:"column",columns:Array.isArray(b.column)?[...b.column].map(String):[String(b.column)],where:{...b.where??{}}};else if(b&&typeof b==="object"&&"via"in b){let T=f.find((A)=>A.model===b.via);if(!T)a(s,`subject { via: '${b.via}' } names a model this one does not declare in belongsTo`);else h=T.model,w={kind:"via",model:T.model,foreignKey:T.foreignKey}}else if(b&&typeof b==="object"&&"email"in b)w={kind:"email",column:String(b.email)};else a(s,"subject must be a column name, a list of columns, { column, where }, { via } or { email }");if(w?.kind==="column"&&w.columns.length===0)a(s,"subject names no column");let k=l?.erasure??"anonymize";if(!$t.has(k))a(s,`erasure must be one of ${[...$t].join(", ")}, got '${String(k)}'`);let R=null;if(l?.retention!==void 0){let T=l.retention,A=T?.action??"delete";if(!T||typeof T!=="object"||!Number.isInteger(T.days)||T.days<=0)a(s,"retention.days must be a positive whole number of days");else if(!It.has(A))a(s,`retention.action must be one of ${[...It].join(", ")}, got '${String(A)}'`);else R={days:T.days,column:T.column??"created_at",action:A}}if(l?.basis!==void 0&&!Bt.has(l.basis))a(s,`basis must be one of ${[...Bt].join(", ")}, got '${String(l.basis)}'`);let te=k==="anonymize"&&w!==null||R?.action==="anonymize",U=[];for(let{attribute:T,shape:A,options:_e}of p){let ne=Qr(A,_e);if("problem"in ne){if(te)a(s,`personal attribute '${T}' ${ne.problem}`);U.push({attribute:T,column:H(T),export:_e.export!==!1,perRow:!1,anonymizeTo:null});continue}U.push({attribute:T,column:H(T),export:_e.export!==!1,perRow:ne.perRow,anonymizeTo:ne.value})}if(w!==null&&k==="anonymize"&&U.length===0)a(s,"declares a subject but no personal attributes, so 'anonymize' would change nothing; mark the personal attributes, or declare erasure 'keep' or 'delete'");if(R?.action==="anonymize"&&U.length===0)a(s,"retention anonymizes, but no attribute is marked personal");if(n.set(s,{model:s,table:m,primaryKey:g,subject:w,personal:U,erasure:k,retention:R,purpose:l?.purpose??null,basis:l?.basis??null,depth:0,exportColumns:[...new Set([g,"uuid","created_at","updated_at"])]}),h)t.set(s,h)}let i=(s,u)=>{let c=t.get(s);if(!c)return 0;if(u.has(s))return null;if(!n.get(c)?.subject)return null;u.add(s);let f=i(c,u);return f===null?null:f+1};for(let s of n.values()){let u=t.get(s.model);if(!u)continue;if(!n.get(u)?.subject){a(s.model,`subject { via: '${u}' } points at a model that declares no subject of its own`);continue}let l=i(s.model,new Set);if(l===null)a(s.model,`subject { via: '${u}' } is part of a cycle`);else s.depth=l}return{models:[...n.values()],unclassified:r.sort(),problems:o}}function de(e){if(e.problems.length)throw new Ge(e.problems);return e}var fe="gdpr_requests",We=500;class pe extends Error{constructor(e){super(`No user matches '${String(e)}'.`);this.name="GdprSubjectNotFoundError"}}async function me(e){if(e)return de(le(e));await Promise.resolve().then(() => Ke());return de(le(await Ue()))}async function zt(e=x){let n=String(Zr()),t=n==="sqlite"?"SELECT name FROM sqlite_master WHERE type = 'table'":n==="mysql"?"SELECT TABLE_NAME AS name FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE()":n==="postgres"?"SELECT table_name AS name FROM information_schema.tables WHERE table_schema = current_schema()":null;if(!t)return null;let r=await e.unsafe(t).execute();return new Set(r.map((o)=>String(o.name??o.NAME??"").toLowerCase()).filter(Boolean))}var to=/no such table|does not exist|doesn't exist|unknown table|undefined table|ER_NO_SUCH_TABLE/i;async function ge(e,n=x){let t=await zt(n);if(t)return t.has(e.toLowerCase());try{return await n.selectFrom(e).selectAll().limit(1).execute(),!0}catch(r){if(to.test(r instanceof Error?r.message:String(r)))return!1;throw r}}function no(e){let n=e.models.find((t)=>t.model===M);return{table:n?.table??"users",primaryKey:n?.primaryKey??"id"}}function ro(e){if(typeof e==="number")return{kind:"id",value:e};let n=String(e).trim();if(/^\d+$/.test(n))return{kind:"id",value:Number(n)};if(n.includes("@"))return{kind:"email",value:n};return{kind:"uuid",value:n}}async function oo(e,n={},t=x){let r=await me(n.models);return Qe(r,e,t)}async function Qe(e,n,t){let{table:r,primaryKey:o}=no(e),a=ro(n),i;if(a.kind==="id")i=(await t.selectFrom(r).selectAll().where(o,"=",a.value).limit(1).execute())[0];else if(a.kind==="email"){for(let s of new Set([a.value,a.value.toLowerCase()]))if(i=(await t.selectFrom(r).selectAll().where("email","=",s).limit(1).execute())[0],i)break}else i=(await t.selectFrom(r).selectAll().where("uuid","=",a.value).limit(1).execute())[0];if(!i)return null;return{id:i[o],email:typeof i.email==="string"?i.email:null}}function ze(e,n=We){let t=[];for(let r=0;r<e.length;r+=n)t.push(e.slice(r,r+n));return t}function ao(e,n){let t=new Map;for(let r of e)t.set(String(r[n]),r);return[...t.values()].sort((r,o)=>String(r[n]).localeCompare(String(o[n]),void 0,{numeric:!0}))}async function He(e,n,t,r,o){let a=o.get(t.model);if(a)return a;let i=t.subject,s=[];if(i?.kind==="column")for(let u of i.columns){let c=e.selectFrom(t.table).selectAll().where(u,"=",r.id);for(let[l,f]of Object.entries(i.where))c=c.where(l,"=",f);s.push(...await c.execute())}else if(i?.kind==="email"){if(r.email)for(let u of new Set([r.email,r.email.toLowerCase()]))s.push(...await e.selectFrom(t.table).selectAll().where(i.column,"=",u).execute())}else if(i?.kind==="via"){let u=n.get(i.model),l=(await He(e,n,u,r,o)).map((f)=>f[u.primaryKey]).filter((f)=>f!==null&&f!==void 0);for(let f of ze(l))s.push(...await e.selectFrom(t.table).selectAll().where(i.foreignKey,"in",f).execute())}return s=ao(s,t.primaryKey),o.set(t.model,s),s}function Wt(e){if(typeof e==="bigint")return Number.isSafeInteger(Number(e))?Number(e):e.toString();if(e instanceof Date)return e.toISOString();return e}function io(e,n){let t={};for(let r of e.exportColumns)if(r in n)t[r]=Wt(n[r]);for(let r of e.personal)if(r.export&&r.column in n)t[r.column]=Wt(n[r.column]);return t}function Ve(e,n){let t={};for(let r of e.personal)t[r.column]=r.perRow?`erased-${String(n[e.primaryKey])}`:r.anonymizeTo;return t}function so(e,n){if(e===n)return!0;if(e===null||e===void 0||n===null||n===void 0)return(e===null||e===void 0)&&(n===null||n===void 0);if(typeof n==="boolean")return Number(e)===Number(n);return String(e)===String(n)}function Ht(e,n){let t=Ve(e,n);return Object.entries(t).some(([r,o])=>!so(n[r],o))}async function Jt(e,n,t){if(!t.length)return;if(n.personal.some((o)=>o.perRow)){for(let o of t)await e.updateTable(n.table).set(Ve(n,o)).where(n.primaryKey,"=",o[n.primaryKey]).execute();return}let r=Ve(n,t[0]);for(let o of ze(t.map((a)=>a[n.primaryKey])))await e.updateTable(n.table).set(r).where(n.primaryKey,"in",o).execute()}async function Yt(e,n,t){for(let r of ze(t.map((o)=>o[n.primaryKey])))await e.deleteFrom(n.table).where(n.primaryKey,"in",r).execute()}async function Je(e,n,t,r,o){let a=Qt(new Date);await e.insertInto(fe).values({uuid:Xr(),type:n,subject_id:t!==null&&Number.isSafeInteger(Number(t))?Number(t):null,actor:r,status:"completed",summary:JSON.stringify(t!==null&&!Number.isSafeInteger(Number(t))?{subject:String(t),...o}:o),occurred_at:a,created_at:a}).execute()}async function Ye(){if(!await ge(fe))throw Error(`The '${fe}' table does not exist, so this request cannot be recorded. Run \`buddy migrate\` first.`)}async function Xe(e){let n=[],t=[],r=await zt(),o=new Map;for(let a of e){if(!o.has(a.table))o.set(a.table,r?r.has(a.table.toLowerCase()):await ge(a.table));if(o.get(a.table))n.push(a);else t.push(a.table)}return{present:n,skipped:[...new Set(t)].sort()}}async function uo(e,n={}){let t=await me(n.models),r=await Qe(t,e,x);if(!r)throw new pe(e);await Ye();let o=t.models.filter((l)=>l.subject),{present:a}=await Xe(o),i=new Map(a.map((l)=>[l.model,l]));for(let l of a)if(l.subject?.kind==="via"&&!i.has(l.subject.model))i.delete(l.model);let s=new Map,u={},c={};for(let l of[...i.values()].sort((f,d)=>f.model.localeCompare(d.model))){let f=await He(x,i,l,r,s);if(!f.length)continue;u[l.model]=f.map((d)=>io(l,d)),c[l.model]={purpose:l.purpose,basis:l.basis,retentionDays:l.retention?.days??null}}return await Je(x,"access",r.id,n.actor??"system",{models:Object.fromEntries(Object.entries(u).map(([l,f])=>[l,f.length]))}),{subject:{id:r.id},generatedAt:new Date().toISOString(),data:u,processing:c}}function co(e){return[...e].sort((n,t)=>{let r=n.model===M?1:0,o=t.model===M?1:0;if(r!==o)return r-o;if(n.depth!==t.depth)return t.depth-n.depth;return n.model.localeCompare(t.model)})}async function lo(e,n={}){let t=n.dryRun===!0,r=await me(n.models),o=await Qe(r,e,x);if(!o)throw new pe(e);if(!t)await Ye();let a=r.models.filter((d)=>d.subject),{present:i,skipped:s}=await Xe(a),u=new Map(i.map((d)=>[d.model,d]));for(let d of i)if(d.subject?.kind==="via"&&!u.has(d.subject.model))u.delete(d.model);let c=async(d)=>{let p=new Map;for(let g of u.values())await He(d,u,g,o,p);let m=[];for(let g of co([...u.values()])){let w=p.get(g.model)??[];if(g.erasure==="delete"){if(!t)await Yt(d,g,w);m.push({model:g.model,table:g.table,action:"delete",matched:w.length,changed:w.length,fields:[]})}else if(g.erasure==="anonymize"){let h=w.filter((b)=>Ht(g,b));if(!t)await Jt(d,g,h);m.push({model:g.model,table:g.table,action:"anonymize",matched:w.length,changed:h.length,fields:g.personal.map((b)=>b.column)})}else m.push({model:g.model,table:g.table,action:"keep",matched:w.length,changed:0,fields:[]})}if(!t)await Je(d,"erasure",o.id,n.actor??"system",{changes:m.map(({model:g,action:w,matched:h,changed:b})=>({model:g,action:w,matched:h,changed:b})),skipped:s});return m},l=t?await c(x):await qe(c),f=!1;if(!t&&n.revokeCredentials!==!1)f=await fo(o.id);return{subject:{id:o.id},dryRun:t,changes:l.sort((d,p)=>d.model.localeCompare(p.model)),skipped:s,credentialsRevoked:f}}async function fo(e){let n;try{n=await import("@stacksjs/auth")}catch{return!1}let t=Number(e);if(!Number.isSafeInteger(t))return!1;if(n.revokeAllTokens&&await ge("oauth_access_tokens"))await n.revokeAllTokens(t);if(n.sessionDestroyAll)await n.sessionDestroyAll(t);return!0}var Vt=86400000;async function po(e={}){let n=e.dryRun===!0,t=e.now??new Date,o=(await me(e.models)).models.filter((c)=>c.retention);if(!o.length)return{dryRun:n,cutoffs:{},changes:[],skipped:[]};if(!n)await Ye();let{present:a,skipped:i}=await Xe(o),s=[],u={};for(let c of a){let l=c.retention,f=new Date(t.getTime()-l.days*Vt),d=Qt(new Date(f.getTime()+Vt));u[c.model]=f.toISOString();let p=[],m;for(;;){let h=x.selectFrom(c.table).selectAll().where(l.column,"<",d);if(m!==void 0)h=h.where(c.primaryKey,">",m);let b=await h.orderBy(c.primaryKey,"asc").limit(We).execute();if(!b.length)break;for(let k of b){let R=eo(k[l.column]);if(R&&R.getTime()<f.getTime())p.push(k)}if(m=b[b.length-1][c.primaryKey],b.length<We)break}let g=l.action==="delete"?p:p.filter((w)=>Ht(c,w));if(!n&&g.length)await qe(async(w)=>{if(l.action==="delete")await Yt(w,c,g);else await Jt(w,c,g)});s.push({model:c.model,table:c.table,action:l.action,matched:p.length,changed:g.length,fields:l.action==="anonymize"?c.personal.map((w)=>w.column):[]})}if(!n&&s.some((c)=>c.changed>0))await Je(x,"retention",null,e.actor??"scheduler",{changes:s.map(({model:c,action:l,matched:f,changed:d})=>({model:c,action:l,matched:f,changed:d})),cutoffs:u});return{dryRun:n,cutoffs:u,changes:s.sort((c,l)=>c.model.localeCompare(l.model)),skipped:i}}Ke();function mo(e){let n=e.subject;if(!n)return"none (not reachable by access or erasure)";if(n.kind==="via")return`via ${n.model} (\`${n.foreignKey}\`)`;if(n.kind==="email")return`email address in \`${n.column}\``;let t=n.columns.map((o)=>`\`${o}\``).join(" or "),r=Object.entries(n.where).map(([o,a])=>`${o} = ${String(a)}`).join(", ");return r?`${t} where ${r}`:t}function go(e){return{entries:e.models.map((t)=>({model:t.model,table:t.table,subject:mo(t),personal:t.personal.map((r)=>r.column),notExported:t.personal.filter((r)=>!r.export).map((r)=>r.column),erasure:t.subject?t.erasure:null,retention:t.retention?`${t.retention.action} after ${t.retention.days} days (\`${t.retention.column}\`)`:null,basis:t.basis,purpose:t.purpose})).sort((t,r)=>t.model.localeCompare(r.model)),unclassified:[...e.unclassified].sort()}}function J(e){return(e??"-").replaceAll("|","\\|").replaceAll(`
|
|
5
|
+
`," ")}function yo(e,n="markdown"){if(n==="json")return`${JSON.stringify(e,null,2)}
|
|
6
|
+
`;let t=["# Processing register","","<!-- Generated by `buddy gdpr:register` from the model declarations. Do not edit by hand. -->","","Every model that declares personal data or a `gdpr` trait, what erasure does to its rows, and how long they are kept. Change the model, then regenerate this file.","","| Model | Table | Subject | Personal data | Erasure | Retention | Basis | Purpose |","| --- | --- | --- | --- | --- | --- | --- | --- |"];for(let r of e.entries){let o=r.personal.length?r.personal.map((a)=>r.notExported.includes(a)?`\`${a}\` (not exported)`:`\`${a}\``).join(", "):"-";t.push(`| ${[r.model,`\`${r.table}\``,J(r.subject),o,J(r.erasure),J(r.retention),J(r.basis),J(r.purpose)].join(" | ")} |`)}if(t.push(""),t.push("## Unclassified"),t.push(""),e.unclassified.length){t.push("These models belong to a user but declare neither personal attributes nor a `gdpr` trait, so access and erasure do not reach them. Classify each one, even if only as `erasure: 'keep'`."),t.push("");for(let r of e.unclassified)t.push(`- ${r}`)}else t.push("None. Every model that belongs to a user is classified.");return t.push(""),t.join(`
|
|
7
|
+
`)}export*from"@stacksjs/model-meta";import{createModel as vo,registerModel as Mo}from"@stacksjs/query-builder";import{log as S}from"@stacksjs/logging/runtime";import{snakeCase as Z}from"@stacksjs/strings";import{AsyncLocalStorage as _n}from"async_hooks";import{toCursorPaginator as Oo,toPaginator as Do,toSimplePaginator as Eo}from"@stacksjs/pagination";function et(e,n){let t=rt(),r=t?Ze(t,"per_page"):void 0,o=t?Ze(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 tt(e,n){let t=rt(),r=t?Zt(t,"cursor"):void 0,o=t?Ze(t,"per_page"):void 0,a=e!==void 0?Math.max(1,Math.floor(e)):Math.min(100,Math.max(1,o??15)),s=Xt(n!==void 0?n:r??null);return{perPage:a,cursor:s}}function Xt(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 nt(e){let n=rt();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?E(t,{cursor:e.next_cursor}):null,e.prev_page_url=e.prev_cursor!==null?E(t,{cursor:e.prev_cursor}):null,e;let o=e.current_page;if(e.prev_page_url=o>1?E(t,{page:o-1}):null,"total"in e){let a=e.last_page;e.next_page_url=o<a?E(t,{page:o+1}):null,e.first_page_url=E(t,{page:1}),e.last_page_url=E(t,{page:a})}else e.next_page_url=e.has_more_pages?E(t,{page:o+1}):null;return e}function E(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 N;function rt(){if(N===null)return;if(N===void 0)try{let n=Wn("@stacksjs/router");if(typeof n.getCurrentRequest==="function")N=n.getCurrentRequest;else{N=null;return}}catch{N=null;return}return N()}function Ze(e,n){let t=Zt(e,n);if(t===void 0)return;let r=Number(t);return Number.isFinite(r)?r:void 0}function Zt(e,n){let t=e.query?.[n];if(t===void 0)return;return Array.isArray(t)?t[0]:t}function en(){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 wo,sqlDateTime as bo}from"@stacksjs/database/runtime";import{log as L}from"@stacksjs/logging";var ye="deleted_at";function tn(e,n="id"){return{async softDelete(t){let r=bo(),o=e.where(n,t);if(typeof o?.update==="function")return await o.update({[ye]:r}),!0;return!1},async restore(t){let r=e.where(n,t).withTrashed();if(typeof r?.update==="function")return await r.update({[ye]:null}),!0;return!1},async forceDelete(t){let r=e.where(n,t),o=typeof r?.withTrashed==="function"?r.withTrashed():r;if(typeof o?.forceDelete==="function")return wo(await o.forceDelete())>0;return!1},withTrashed(){return typeof e.query==="function"?e.query():e},onlyTrashed(){let t=typeof e.query==="function"?e.query():e;if(typeof t?.whereNotNull==="function")return t.whereNotNull(ye);return t?.where?.(ye,"!=",null)??t}}}function nn(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 ho(e,n){let t=e.hasMany??[],r=e.hasOne??[],o=t.some((l)=>ot(l,n,!0)),a=r.some((l)=>ot(l,n,!1));if(!o&&!a)return L.warn(`[orm] soft-delete cascade: '${n}' is not a declared hasMany/hasOne relation - skipping`),null;let s=(o?t:r).find((l)=>ot(l,n,o))??null;if(!s)return null;let c=globalThis[s];if(!c)return L.warn(`[orm] soft-delete cascade: model '${s}' is not yet on globalThis - skipping cascade for '${n}'`),null;return{className:s,model:c}}function ot(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 ko(e,n,t,r,o){try{let a=t.where;if(typeof a!=="function"){L.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"){L.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"){L.debug("[orm] cascade restore: child has no restore() - nothing to do");return}let s=t.withTrashed,c=(typeof s==="function"?s.call(t):t).where?.(r,n),l=typeof c?.get==="function"?await c.get():[],f=t.primaryKey||"id";for(let d of l){let p=d?.[f];if(p!=null)await i.call(t,p)}}}catch(a){if(L.warn(`[orm] soft-delete cascade ${o} on ${e}#${String(n)} failed`,{error:a}),process.env.STACKS_ORM_CASCADE_SWALLOW!=="true")throw a}}async function Y(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=ho(e,i);if(!s)continue;await ko(s.className,t,s.model,a,r)}}import{sqlDateTime as So}from"@stacksjs/database/runtime";import{log as To}from"@stacksjs/logging";var Ro=[/^password$/i,/^password_hash$/i,/^api_key$/i,/_token$/i,/_secret$/i,/^remember_token$/i],rn=null;async function on(){if(rn!=null)return rn;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 an(){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 sn(e){if(!e||typeof e!=="object")return null;let n={};for(let[t,r]of Object.entries(e)){if(Ro.some((o)=>o.test(t)))continue;n[t]=r}return n}function un(e,n,t){To.warn(`[orm] ${e} row write failed for ${n}: ${t?.message??String(t)}`)}var _o="activities";function cn(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 Ao(e,n,t=[]){let r=sn(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 Po(e,n,t){return t==null?`${e} was ${n}`:`${e} ${String(t)} was ${n}`}async function xo(e){try{let{db:n}=await import("@stacksjs/database/runtime");await n.insertInto(_o).values({type:e.type,description:e.description,subject_type:e.subject_type,subject_id:e.subject_id,causer:e.causer,properties:e.properties?JSON.stringify(e.properties):null,ip_address:e.ip_address,user_id:e.user_id,created_at:So()}).executeTakeFirst()}catch(n){un("activity",`${e.subject_type}#${String(e.subject_id)}`,n)}}async function Co(e){let{attributes:n,event:t,modelName:r,options:o,primaryKey:a}=e,i=n?.[a]??null,s=await on();await xo({type:`${r.toLowerCase()}.${t}`,description:Po(r,t,i),subject_type:r,subject_id:i,properties:Ao(n,o,e.hidden),causer:s==null?null:`User:${String(s)}`,user_id:s,ip_address:await an()})}function we(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 ln(e,n,t,r,o=[]){if(n==="Activity")return;let a=e,i=async(d)=>typeof a.find==="function"?we(await a.find(d)):null,s=async(d,p)=>{await Co({modelName:n,event:d,attributes:p,primaryKey:t,options:r,hidden:o})},u=e.create;if(typeof u==="function")e.create=async function(...d){let p=await u.apply(this,d);return await s("created",we(p)),p};let c=e.createMany;if(typeof c==="function")e.createMany=async function(...d){let p=await c.apply(this,d);for(let m of Array.isArray(p)?p:[])await s("created",we(m));return p};let l=e.update;if(typeof l==="function")e.update=async function(d,p){let m=await l.call(this,d,p);return await s("updated",we(m)??await i(d)),m};let f=e.delete;if(typeof f==="function")e.delete=async function(d){let p=await i(d),m=await f.call(this,d);return await s("deleted",p??{[t]:d}),m}}var ke,An=new _n;function F(){return An.getStore()?.suppressed===!0}function j(e){return Promise.resolve(An.run({suppressed:!0},e))}var Pn=new _n;function jo(){return Pn.getStore()?.suppressed===!0}function Fo(e){return Promise.resolve(Pn.run({suppressed:!0},e))}var lt=Symbol.for("stacks.orm.modelDefinition");class xn 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 dn=new Set,$o=4096,fn=Object.create(null),pn=0;function X(e){let n=fn[e];if(n!==void 0)return n;let t=Z(e);if(pn<$o)fn[e]=t,pn++;return t}function Io(e,n){let t=typeof e==="string"?e.slice(0,80):String(e),r=`${typeof e}:${t}`;if(dn.has(r))return;dn.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 Bo={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 Io(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 No(e){return typeof e==="string"?Bo[e]:e}var mn=new WeakMap;function Cn(e){let n=Object.keys(e),t=mn.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:No(a)}});return mn.set(e,r),r}function at(e,n,t){if(!e||typeof e!=="object")return e;let r={...e};for(let{attr:o,caster:a}of Cn(n))if(o in r)r[o]=a[t].call(a,r[o]);return r}function be(e){return e==="_attributes"||e==="_original"||e==="_definition"||e==="_hasSaved"||e==="_relations"}var st=Symbol.for("stacks.modelInstanceProxy"),gn,yn=new WeakMap,Lo={tags:{bag:"_taggable",mode:"id"},tagCount:{bag:"_taggable",mode:"id"},addTag:{bag:"_taggable",mode:"id"},activeTags:{bag:"_taggable",mode:"id"},inactiveTags:{bag:"_taggable",mode:"id"},removeTag:{bag:"_taggable",mode:"id"},categories:{bag:"_categorizable",mode:"id"},categoryCount:{bag:"_categorizable",mode:"id"},addCategory:{bag:"_categorizable",mode:"id"},activeCategories:{bag:"_categorizable",mode:"id"},inactiveCategories:{bag:"_categorizable",mode:"id"},removeCategory:{bag:"_categorizable",mode:"id"},comments:{bag:"_commentable",mode:"id"},commentCount:{bag:"_commentable",mode:"id"},addComment:{bag:"_commentable",mode:"id"},approvedComments:{bag:"_commentable",mode:"id"},pendingComments:{bag:"_commentable",mode:"id"},rejectedComments:{bag:"_commentable",mode:"id"},likes:{bag:"_likeable",mode:"id"},likeCount:{bag:"_likeable",mode:"id"},like:{bag:"_likeable",mode:"id"},unlike:{bag:"_likeable",mode:"id"},isLiked:{bag:"_likeable",mode:"id"},...Object.fromEntries(ue.map((e)=>[e,{bag:"_billable",mode:"model"}])),generateTwoFactorForModel:{bag:"_twoFactor",mode:"model"},verifyTwoFactorCode:{bag:"_twoFactor",mode:"model"}};function qo(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 he(e,n,t){if(e&&typeof e.then==="function")return e.then((r)=>r===n?t:r);return e===n?t:e}function v(e,n){if(!e||typeof e!=="object")return e;let t=e;if(t[st])return e;let r=t._attributes;if(!r||typeof r!=="object")return e;if(n){for(let{attr:a,caster:i}of Cn(n))if(Object.hasOwn(r,a))r[a]=i.get.call(i,r[a])}let o=n?yn.get(n):gn;if(!o)if(o={get(a,i,s){let u=a;if(i===st)return!0;if(i==="saveAsync")return async function(){let l=u._definition,f=l?.set;if(f&&typeof u.isDirty==="function"){for(let[p,m]of Object.entries(f)){if(typeof m!=="function")continue;if(!u.isDirty(p))continue;let g=m(u._attributes),w=g&&typeof g.then==="function"?await g:g;u._attributes[p]=w}let d=l.set;l.set={};try{return he(u.save(),a,s)}finally{l.set=d}}return he(u.save(),a,s)};if(i==="save")return function(){let l=u._definition,f=l?.set;if(f&&Object.keys(f).length>0&&typeof u.isDirty==="function"){for(let[p,m]of Object.entries(f)){if(typeof m!=="function")continue;if(!u.isDirty(p))continue;let g=m(u._attributes);if(g&&typeof g.then==="function")throw Error(`Setter for "${p}" returned a Promise - use \`saveAsync()\` instead of \`save()\` when a model has async setters.`);u._attributes[p]=g}let d=l.set;l.set={};try{return he(u.save(),a,s)}finally{l.set=d}}return he(u.save(),a,s)};if(i==="updateAsync")return async function(l){if(l&&typeof l==="object"&&!Array.isArray(l))for(let[f,d]of Object.entries(l))s[f]=d;return s.saveAsync()};if(i==="saveQuietly")return function(){return j(()=>u.save())};if(i==="saveAsyncQuietly")return function(){return j(()=>s.saveAsync())};if(i==="updateQuietly")return function(l){return j(()=>u.update(l))};if(i==="updateAsyncQuietly")return function(l){return j(()=>s.updateAsync(l))};if(i==="deleteQuietly")return function(){return j(()=>u.delete())};if(i==="toSearchableObject")return function(){let d=u._definition?.traits?.useSearch;if(!d)return null;let p=u._attributes;if(!p)return null;if(d===!0){let b={...p};if(p.id!=null)b.id=String(p.id);return b}let m={},g=d.displayable?.length?d.displayable:[...d.searchable??[],...d.filterable??[],...d.sortable??[],"id"],w=d.denormalize??{},h=u._relations;for(let b of g){let k=Z(b),R=p[k]??p[b];if(R!==void 0){m[k]=R;continue}let te=w[b]??w[k];if(te){m[k]=qo(h,te);continue}m[k]=void 0}if(p.id!=null)m.id=String(p.id);return m};if(typeof i==="string"&&!be(i)){let l=u._attributes;if(l&&Object.hasOwn(l,i))return l[i];let f=u._relations;if(f&&Object.hasOwn(f,i)){let p=f[i];if(Array.isArray(p))return p.map((m)=>v(m,n));return p&&typeof p==="object"?v(p,n):p}let d=Lo[i];if(d){let g=u._definition?.__traitMethods?.[d.bag]?.[i];if(typeof g==="function")return d.mode==="model"?(...w)=>g(s,...w):(...w)=>g(u.id,...w)}if(l){let p=X(i);if(p!==i&&Object.hasOwn(l,p))return l[p]}}let c=Reflect.get(u,i,u);return typeof c==="function"?c.bind(u):c},set(a,i,s,u){let c=a;if(typeof i==="string"&&!be(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=X(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"&&!be(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=X(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"&&!be(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)yn.set(n,o);else gn=o;return new Proxy(e,o)}var vn=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}),Go={paginate:Do,simplePaginate:Eo,cursorPaginate:Oo},wn=Symbol.for("stacks.queryBuilderProxy");function bn(e,n,t){if(vn[n]){if(Array.isArray(e))return e.map((o)=>v(o,t));let r=Go[n];if(r&&e&&Array.isArray(e.data)){let o=e.data.map((i)=>v(i,t)),a=r({...e,data:o});return nt(a)}if(e&&Array.isArray(e.data))return{...e,data:e.data.map((o)=>v(o,t))};return v(e,t)}if(e&&typeof e==="object"&&typeof e.get==="function")return Mn(e,t);return e}function Mn(e,n){if(!e||typeof e!=="object")return e;if(e[wn])return e;return new Proxy(e,{get(t,r,o){if(r===wn)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}=et(s[0],s[1]);u=[l,f]}else if(i==="cursorPaginate"){let{perPage:l,cursor:f}=tt(s[0],s[1]);u=[l,f,s[2],s[3]]}let c=a.apply(t,u);if(!vn[i]&&c===t)return o;if(c&&typeof c.then==="function")return c.then((l)=>bn(l,i,n));return bn(c,i,n)}}})}function Uo(e,n){let t=(i)=>Array.isArray(i)?i.map((s)=>v(s,n)):v(i,n),r=["find","first","last","all","firstOrFail","findOrFail","findMany"];for(let i of r){let s=e[i];if(typeof s!=="function")continue;e[i]=function(...u){let c=s.apply(this,u);if(c&&typeof c.then==="function")return c.then(t);return t(c)}}let o=["create","createMany","firstOrCreate","updateOrCreate","make"];for(let i of o){let s=e[i];if(typeof s!=="function")continue;e[i]=function(...u){let c=s.apply(this,u);if(c&&typeof c.then==="function")return c.then(t);return t(c)}}let a=["query","where","orWhere","whereIn","whereNotIn","whereNull","whereNotNull","whereLike","whereBetween","whereNotBetween","orderBy","orderByDesc","select","with","limit","take","skip","latest","oldest"];for(let i of a){let s=e[i];if(typeof s!=="function")continue;e[i]=function(...u){let c=s.apply(this,u);return Mn(c,n)}}}class On 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 ut 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 Ko=new Set(["id","created_at","updated_at","deleted_at","uuid"]),hn=new WeakMap;function Wo(e){let n=hn.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=X(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 hn.set(e,a),a}function q(e,n,t={}){if(t.force)return n;if(!n||typeof n!=="object"||Array.isArray(n))return n;let r=e.attributes;if(!r)return n;let{allowed:o,guarded:a}=Wo(r);for(let i in n){if(!Object.hasOwn(n,i))continue;let s=X(i);if(Ko.has(s))continue;if(a.has(s))throw new ut(e.name,i,"guarded");if(s.endsWith("_id"))continue;if(!o.has(s))throw new ut(e.name,i,"not-fillable")}return n}async function Te(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){S.error(`[orm] ${e.name}.set.${o} threw - skipping setter`,i)}}return r}function Vo(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){S.debug(`[orm] ${n.name}.update called with empty data - short-circuiting and returning current row`);let p=e.find;return typeof p==="function"?await p.call(e,c):null}q(n,l);let f=await Te(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 Te(n,l);await o("forceUpdate").call(e,t,c).update(f);let d=e.find;return typeof d==="function"?await d.call(e,c):null};if(typeof e.forceCreate!=="function")e.forceCreate=async function(c){if(!c||typeof c!=="object"||Array.isArray(c))throw Error(`[ORM] ${n.name}.forceCreate requires a data object`);let l=e.make;if(typeof l==="function"){let f=await l.call(e);if(f&&typeof f.forceFill==="function"&&typeof f.save==="function"){f.forceFill(c);let d=await f.save();return d&&typeof d==="object"&&d!==f&&!d[st]?f:d??f}}if(typeof r!=="function")throw Error(`[ORM] ${n.name}.forceCreate cannot create: the underlying query builder did not expose create()`);return await r.call(e,c)};if(e.delete=async function(c){if(c==null)throw Error(`[ORM] ${n.name}.delete requires an id as the first argument`);if(!await a("delete").call(e,c))return!1;return await o("delete").call(e,t,c).delete(),!0},typeof e.findOrFail!=="function")e.findOrFail=async function(c){let l=await a("findOrFail").call(e,c);if(l==null)throw new On(n.name,c);return l};if(typeof e.exists!=="function")e.exists=async function(c){if(c==null)return!1;let l=o("exists").call(e,t,c);if(typeof l.count==="function"){let d=await l.count();return Number(d)>0}let f=e.find;return typeof f==="function"?await f.call(e,c)!=null:!1};if(typeof e.firstOrCreate!=="function")e.firstOrCreate=async function(c,l={}){if(!c||typeof c!=="object"||Array.isArray(c))throw Error(`[ORM] ${n.name}.firstOrCreate requires a where-attrs object`);let f=o("firstOrCreate").call(e,c),d=typeof f.first==="function"?await f.first():await f;if(d)return d;let p={...c,...l};return q(n,p),await i("firstOrCreate").call(e,p)};if(typeof e.updateOrCreate!=="function")e.updateOrCreate=async function(c,l){if(!c||typeof c!=="object"||Array.isArray(c))throw Error(`[ORM] ${n.name}.updateOrCreate requires a where-attrs object`);if(!l||typeof l!=="object"||Array.isArray(l))throw Error(`[ORM] ${n.name}.updateOrCreate requires a values object`);let f=o("updateOrCreate").call(e,c),d=typeof f.first==="function"?await f.first():await f;if(d){q(n,l);let m=d[t];await o("updateOrCreate").call(e,t,m).update(l);let g=e.find;return typeof g==="function"?await g.call(e,m):{...d,...l}}let p={...c,...l};return q(n,p),await i("updateOrCreate").call(e,p)};if(typeof e.count!=="function")e.count=async function(){let c=e;if(typeof c.query==="function"){let d=c.query();if(typeof d?.count==="function"){let p=await d.count();return Number(p)||0}}let{all:l,get:f}=e;if(typeof l==="function")return(await l.call(e)||[]).length;if(typeof f==="function")return(await f.call(e)||[]).length;return 0};if(typeof e.pluck!=="function")e.pluck=async function(c){if(!c||typeof c!=="string")throw Error(`[ORM] ${n.name}.pluck requires a column name`);let l=e.all;return((typeof l==="function"?await l.call(e):[])||[]).map((d)=>d?.[c])};if(typeof e.whereIn!=="function")e.whereIn=async function(c,l){if(!c||typeof c!=="string")throw Error(`[ORM] ${n.name}.whereIn requires a column name`);if(!Array.isArray(l))throw Error(`[ORM] ${n.name}.whereIn requires an array of values`);if(l.length===0)return[];let f=e.where;if(typeof f!=="function")return[];let d=f.call(e,c,"in",l);if(d&&typeof d.get==="function")return await d.get();return await d};let s=[["latest","desc"],["oldest","asc"]];for(let[c,l]of s)if(typeof e[c]!=="function")e[c]=async function(f="created_at"){let d=e,p=typeof d.query==="function"?d.query():d;if(typeof p?.orderBy==="function"){let h=p.orderBy(f,l);if(typeof h.first==="function")return await h.first();if(typeof h.get==="function")return(await h.get())?.[0]??null}let m=e.all;if(typeof m!=="function")return null;return[...await m.call(e)||[]].sort((h,b)=>{let k=h?.[f],R=b?.[f];if(k===R)return 0;return(k>R?1:-1)*(l==="desc"?-1:1)})[0]??null};let u=Fn(n.traits?.useSearch,n);if(u){let c=u.index??n.table??Z(`${n.name}s`);if(typeof e.search!=="function")e.search=function(l,f){return Ho(e,c,l,f,u.searchable)};if(typeof e.makeAllSearchable!=="function")e.makeAllSearchable=async function(l=500){let f=e.all;if(typeof f!=="function")throw Error(`[ORM] ${n.name}.makeAllSearchable cannot run: the underlying query builder did not expose all()`);let{useSearchEngine:d}=await import("@stacksjs/search-engine"),p=d(),m=0,g=e.query;if(typeof g==="function")try{let b=g.call(e);if(b&&typeof b.chunk==="function")return await b.chunk(l,async(k)=>{let R=await ct(k,u);if(R.length>0)await p.addDocuments(c,R);m+=R.length}),m}catch{}let w=await f.call(e)||[],h=await ct(w,u);if(h.length>0)await p.addDocuments(c,h);return h.length};if(typeof e.removeAllFromSearch!=="function")e.removeAllFromSearch=async function(){let{searchEngineReady:l}=await import("@stacksjs/search-engine");await(await l()).deleteAllDocuments(c)}}}async function ct(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)=>zo(r,n)))).filter(Boolean)}function Dn(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 Qo(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 zo(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 Qo(e?._attributes??(typeof e?.toJSON==="function"?e.toJSON():null),n.hidden??new Set)}function Ho(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){if(!Number.isInteger(u)||u<1)throw TypeError(`[orm/search] paginate() needs a positive integer page size, got ${u}`);if(!Number.isInteger(c)||c<1)throw TypeError(`[orm/search] paginate() pages are 1-based, got ${c}`);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 En(e){let n=Z(e);return n===e?[e]:[e,n]}async function it(e,n){if(!e||typeof e!=="object")return;let t=e._attributes??e;for(let r of n)for(let o of En(r)){if(!(o in t))continue;let a=t[o];if(!K(a))continue;t[o]=await xe(a)}}function Jo(e,n){if(n.length===0)return;let t=async(s)=>{if(Array.isArray(s)){for(let u of s)await it(u,n);return s}if(s&&typeof s==="object"&&Array.isArray(s.data)){for(let u of s.data)await it(u,n);return s}if(s)await it(s,n);return s},r=["find","first","last","all","firstOrFail","findOrFail","findMany"];for(let s of r){let u=e[s];if(typeof u!=="function")continue;e[s]=async function(...c){let l=await u.apply(this,c);return await t(l)}}let o=["create","createMany","firstOrCreate","updateOrCreate","make"];for(let s of o){let u=e[s];if(typeof u!=="function")continue;e[s]=async function(...c){let l=await u.apply(this,c);return await t(l)}}for(let s of["update","forceUpdate"]){let u=e[s];if(typeof u!=="function")continue;e[s]=async function(c,l){let f=await u.call(this,c,l);return await t(f)}}let a=["first","firstOrFail","get","all","find","findOrFail","last","paginate","simplePaginate"],i=(s)=>{if(!s||typeof s!=="object")return s;let u=s;if(u.__stacksEncryptedReads)return s;for(let c of a){let l=u[c];if(typeof l!=="function")continue;u[c]=async function(...f){return await t(await l.apply(this,f))}}for(let c of["where","whereIn","whereNull","whereNotNull","orWhere","orderBy","orderByDesc","limit","offset","with"]){let l=u[c];if(typeof l!=="function")continue;u[c]=function(...f){return i(l.apply(this,f))}}return Object.defineProperty(u,"__stacksEncryptedReads",{value:!0,enumerable:!1}),s};for(let s of["where","whereIn","whereNull","whereNotNull","orderBy","orderByDesc","limit","query"]){let u=e[s];if(typeof u!=="function")continue;e[s]=function(...c){return i(u.apply(this,c))}}}function Yo(e,n){if(n.length===0)return;let t=async(a)=>{if(!a||typeof a!=="object"||Array.isArray(a))return a;let i={...a};for(let s of n)for(let u of En(s))if(u in i)i[u]=await Pe(i[u]);return i},r=["create","firstOrCreate","updateOrCreate","forceCreate"],o=e.createMany;if(typeof o==="function")e.createMany=async function(a,...i){let s=Array.isArray(a)?await Promise.all(a.map(t)):a;return await o.call(this,s,...i)};for(let a of r){let i=e[a];if(typeof i!=="function")continue;e[a]=async function(...s){if(s[0]=await t(s[0]),s[1])s[1]=await t(s[1]);return await i.apply(this,s)}}for(let a of["update","forceUpdate"]){let i=e[a];if(typeof i!=="function")continue;e[a]=async function(s,u){let c=await t(u);return await i.call(this,s,c)}}}function Xo(e,n){let t=e.create;if(typeof t==="function")e.create=async function(o,...a){q(n,o);let i=await Te(n,o);return await t.call(this,i,...a)};let r=e.createMany;if(typeof r==="function")e.createMany=async function(o,...a){let i=[];for(let s of o)q(n,s),i.push(await Te(n,s));return await r.call(this,i,...a)};for(let o of["firstOrCreate","updateOrCreate"]){let a=e[o];if(typeof a!=="function")continue}}function Zo(e,n){if(!Dt(n))return;let t=String(n?.name??e.name??"Model"),r=(s,u)=>{if(jo())return;if(!s||typeof s!=="object"||Array.isArray(s))return;let c=Et(s,n,u);if(!c.valid)throw new xn(t,c.errors)},o=e.create;if(typeof o==="function")e.create=async function(s,...u){return r(s,"creating"),await o.call(this,s,...u)};let a=e.createMany;if(typeof a==="function")e.createMany=async function(s,...u){if(Array.isArray(s))for(let c of s)r(c,"creating");return await a.call(this,s,...u)};let i=e.update;if(typeof i==="function")e.update=async function(s,u,...c){return r(u,"updating"),await i.call(this,s,u,...c)}}function ea(e,n){let t=["create","firstOrCreate","updateOrCreate"],r=e.createMany;if(typeof r==="function")e.createMany=async function(a,...i){let s=Array.isArray(a)?a.map((u)=>u&&typeof u==="object"&&!Array.isArray(u)?at(u,n,"set"):u):a;return await r.call(this,s,...i)};for(let a of t){let i=e[a];if(typeof i==="function")e[a]=async function(...s){if(S.debug(`[orm] ${a.charAt(0).toUpperCase()+a.slice(1)} ${String(e.name||"unknown")}`,s[0]),s[0]&&typeof s[0]==="object"&&!Array.isArray(s[0]))s[0]=at(s[0],n,"set");return await i.apply(this,s)}}let o=e.update;if(typeof o==="function")e.update=async function(a,i){let s=i&&typeof i==="object"&&!Array.isArray(i)?at(i,n,"set"):i;return await o.call(this,a,s)}}var kn=new Set(["useUuid","useTimestamps","timestampable","useSoftDeletes","softDeletable","useApi","useAuth","authenticatable","useSearch","searchable","useSeeder","seedable","useSocials","billable","observe","useAudit","useActivityLog","prunable","sharding","likeable","taggable","categorizable","commentable","commentables","broadcastOn","broadcastWith","gdpr"]);function jn(e){S.debug(`[orm] Defining model: ${e.name} (table: ${e.table})`);for(let g of Object.keys(e.traits??{}))if(!kn.has(g))S.warn(`[orm] Model '${e.name}' declares an unknown trait '${g}'. It does nothing. Known traits: ${[...kn].sort().join(", ")}.`);let n=ta(e),t=ra(e),r=na(n,t),o=oa(e);e.__traitMethods=o;let a=e.traits;if((a?.useAuth||a?.authenticatable)&&e.name!=="PersonalAccessToken"){let g=e.morphMany;if(!g||!("tokenable"in g))e.morphMany={...g??{},tokenable:"PersonalAccessToken"}}let i=r?{...e,hooks:{...e.hooks,...r}}:e,u=vo(i);if(Uo(u,e.casts),Vo(u,i),Xo(u,i),e.casts&&Object.keys(e.casts).length>0)ea(u,e.casts);let c=Ce(e);if(c.length>0)Yo(u,c),Jo(u,c);let l=e.traits?.useSoftDeletes;if(l)aa(u,i,l);let f=e.traits?.useAudit;if(f){let g=kt(f);Tt(u,e.name,e.primaryKey||"id",g)}let d=cn(e.traits?.useActivityLog);if(d)ln(u,e.name,e.primaryKey||"id",d,[...Dn(e)]);Zo(u,i);let p=u;p.withoutValidation=function(g){return Fo(g)},p.withoutEvents=function(g){return j(g)};for(let g of["create","createMany","update","firstOrCreate","updateOrCreate","forceCreate","forceUpdate","delete","forceDelete","softDelete","restore"]){let w=u[g];if(typeof w!=="function")continue;let h=`${g}Quietly`;if(typeof u[h]==="function")continue;u[h]=function(...b){return j(()=>w.apply(u,b))}}let m=Object.assign(u,o,{...e,getDefinition:()=>e,_isStacksModel:!0});return Mo(e.name,m),Object.defineProperty(m,lt,{value:e,enumerable:!1,configurable:!0}),m}function ta(e){let n=e.traits?.observe;if(!n)return;let t=e.name.toLowerCase(),r=(d)=>{let p=d?.attributes;if(!p||typeof p!=="object")return d;let m=e.primaryKey||"id",g={...p};if(g[m]===void 0&&d[m]!==void 0)g[m]=d[m];return g},o=async(d,p)=>{if(F())return;try{let{dispatch:m}=ke??=await import("@stacksjs/events");await m(d,p)}catch(m){if(m&&typeof m==="object"&&"code"in m&&m.code==="MODULE_NOT_FOUND")return;if(console.error(`[ORM] Event '${d}' handler error:`,m),process.env.STACKS_ORM_EVENT_ERRORS!=="swallow")throw m}},a=e.traits?.broadcastOn,i=e.traits?.broadcastWith,s=typeof a==="function"&&typeof i==="function",u=async(d,p)=>{if(!s)return;if(F())return;try{let m=a(p),g=Array.isArray(m)?m:[m],w=i(p),b=(await import("@stacksjs/realtime").catch(()=>null))?.broadcast;if(typeof b!=="function")return;for(let k of g){if(typeof k!=="string"||k.length===0)continue;await b(k,d,w)}}catch(m){if(m&&typeof m==="object"&&"code"in m&&m.code==="MODULE_NOT_FOUND")return;if(console.error(`[ORM] Broadcast '${d}' handler error:`,m),process.env.STACKS_ORM_BROADCAST_ERRORS==="throw")throw m}},c=async(d,p)=>{if(F())return!0;let m;try{m=ke??=await import("@stacksjs/events");let{dispatchAndCollect:g}=m,w=await g(d,p);if(w.some((b)=>b.ok&&b.value===!1))return!1;let h=w.find((b)=>!b.ok);if(h&&!h.ok)throw h.error}catch(g){if(!m&&g&&typeof g==="object"&&"code"in g&&g.code==="MODULE_NOT_FOUND")return!0;if(console.error(`[ORM] Before-event '${d}' handler error:`,g),process.env.STACKS_ORM_EVENT_ERRORS!=="swallow")throw g}return!0},l=n===!0?["create","update","delete"]:Array.isArray(n)?n:[],f={};if(l.includes("create"))f.beforeCreate=async(d)=>{if(S.debug(`[orm] Create ${t}`,d),!await c(`${t}:saving`,d))throw Error(`[ORM] ${t}:saving event cancelled the operation`);if(!await c(`${t}:creating`,d))throw Error(`[ORM] ${t}:creating event cancelled the operation`)},f.afterCreate=async(d)=>{let p=r(d);await o(`${t}:created`,p),await o(`${t}:saved`,p),await u(`${t}:created`,d)};if(l.includes("update"))f.beforeUpdate=async(d)=>{if(S.debug(`[orm] Update ${t}#${d?.id??"unknown"}`,d),!await c(`${t}:saving`,d))throw Error(`[ORM] ${t}:saving event cancelled the operation`);if(!await c(`${t}:updating`,d))throw Error(`[ORM] ${t}:updating event cancelled the operation`)},f.afterUpdate=async(d)=>{let p=r(d);await o(`${t}:updated`,p),await o(`${t}:saved`,p),await u(`${t}:updated`,d)};if(l.includes("delete"))f.beforeDelete=async(d)=>{if(S.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 na(...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 Fn(e,n){if(!e)return null;let t=e===!0?{}:typeof e==="object"?{...e}:null;if(!t)return null;if(n)t.hidden=Dn(n);return t}function ra(e){let n=Fn(e.traits?.useSearch,e);if(!n)return;let t=n,r=t.index??e.table??Z(`${e.name}s`);async function o(s){if(typeof t.shapeMany==="function")try{let[l]=await ct([s],t);return l}catch(l){S.warn(`[orm/search] shapeMany() threw for ${e.name}: ${l.message}`);return}if(typeof t.shape==="function")try{return await t.shape(s)}catch(l){S.warn(`[orm/search] shape() threw for ${e.name}: ${l.message}`);return}let c=v(s).toSearchableObject?.();if(c!==void 0)return c;return s?._attributes??(typeof s?.toJSON==="function"?s.toJSON():null)}let a=async(s)=>{if(F())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){S.warn(`[orm/search] queue dispatch failed for ${e.name}; falling back to inline: ${c.message}`),await Rn(r,u,e.name)}return}await Rn(r,u,e.name)};return{afterCreate:a,afterUpdate:a,afterDelete:async(s)=>{if(F())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){S.warn(`[orm/search] queue dispatch failed for ${e.name}#${u}; falling back to inline: ${c.message}`),await Sn(r,Number(u),e.name)}return}await Sn(r,Number(u),e.name)}}}var Tn=new Map;function $n(e,n){let t=Tn.get(e)??0;if(Tn.set(e,t+1),t===0)S.warn(`[orm/search] ${n}`);else if(t===9)S.warn(`[orm/search] ${e} is still failing; further identical warnings suppressed for this process.`)}async function Rn(e,n,t){try{let{useSearchEngine:r}=await import("@stacksjs/search-engine");await r().addDocument(e,n)}catch(r){$n(`index:${t}`,`Failed to index ${t}: ${r.message}`)}}async function Sn(e,n,t){try{let{useSearchEngine:r}=await import("@stacksjs/search-engine");await r().deleteDocument(e,n)}catch(r){$n(`remove:${t}`,`Failed to remove ${t}#${n}: ${r.message}`)}}function oa(e){let n={},{table:t,traits:r}=e;if(!r)return n;if(r.taggable)n._taggable=Ee(t);if(r.categorizable)n._categorizable=je(t);if(r.commentable)n._commentable=Oe(t);if(r.billable)n._billable=_t(t);if(r.likeable){let a=typeof r.likeable==="object"?r.likeable:void 0;n._likeable=Fe(t,a)}let o=r.useAuth||r.authenticatable;if(typeof o==="object"&&o&&"useTwoFactor"in o&&o.useTwoFactor)n._twoFactor=en();return n}function aa(e,n,t){let r=tn(e,n.primaryKey||"id"),o=nn(t),a=n,i=n.name.toLowerCase(),s=n.traits?.observe!=null&&n.traits?.observe!==!1,u=async(p)=>{if(!s||F())return!0;try{let{dispatchAsync:m}=ke??=await import("@stacksjs/events"),g=await m(`${i}:restoring`,{id:p});if(Array.isArray(g)&&g.some((w)=>w===!1))return!1}catch(m){if(m?.code!=="MODULE_NOT_FOUND")console.error(`[ORM] Before-event '${i}:restoring' handler error:`,m)}return!0},c=async(p)=>{if(!s||F())return;try{let{dispatch:m}=ke??=await import("@stacksjs/events");await m(`${i}:restored`,{id:p})}catch(m){if(m?.code!=="MODULE_NOT_FOUND")console.error(`[ORM] Event '${i}:restored' handler error:`,m)}},l=process.env.STACKS_ORM_CASCADE_SWALLOW!=="true",f=async(p)=>{if(!o.cascade?.length||!l){let g=await r.softDelete(p);if(g&&o.cascade?.length)await Y(a,o,p,"softDelete");return g}let{db:m}=await import("@stacksjs/database/runtime");return await m.transaction(async()=>{let g=await r.softDelete(p);if(g)await Y(a,o,p,"softDelete");return g})},d=async(p)=>{if(!await u(p))return!1;if(!o.cascade?.length||!l){let h=await r.restore(p);if(h){if(o.cascade?.length)await Y(a,o,p,"restore");await c(p)}return h}let{db:g}=await import("@stacksjs/database/runtime"),w=await g.transaction(async()=>{let h=await r.restore(p);if(h)await Y(a,o,p,"restore");return h});if(w)await c(p);return w};e.softDelete=f,e.restore=d,e.forceDelete=r.forceDelete,e.withTrashed=r.withTrashed,e.onlyTrashed=r.onlyTrashed,e.delete=f}function ia(e){if(e==null)return e;if(Array.isArray(e))return e.map((t)=>ia(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 sa=["belongsTo","hasOne","hasMany","belongsToMany","morphMany","morphOne"],ua=["traits","dashboard"];function ca(e){let n=e?.[lt];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 la(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 da(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 fa(e,n){let t={...e,...n},r=e.attributes??{},o=n.attributes??{};if(n.attributes){let a=da(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 sa){let i=la(e[a],n[a]);if(i)t[a]=i}for(let a of ua){let i=e[a],s=n[a];if(i&&s&&typeof i==="object"&&typeof s==="object")t[a]={...i,...s}}return t}function vc(e,n){return jn(fa(ca(e),n))}import ka from"process";import{log as Ta}from"@stacksjs/logging";import{path as _}from"@stacksjs/path";import{fs as ee}from"@stacksjs/storage";import{Database as pa}from"bun:sqlite";import{existsSync as ma,readdirSync as ga,readFileSync as ya}from"fs";function wa(e){return e.startsWith("sqlite_")||e.startsWith("_qb_tmp_")}function ba(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 ha(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(a){if(/duplicate column name/i.test(a.message))r++}}return r>0?{ok:!0}:{ok:!1,error:t.message}}}function In(e,n="sqlite"){let t=[];if(!ma(e))return{tables:[],errors:t};let r;try{r=ga(e).filter((a)=>a.endsWith(".sql")).sort()}catch(a){return{tables:[],errors:[{file:e,error:a.message}]}}let o=new pa(":memory:");try{for(let s of r){let u=`${e}/${s}`,c;try{c=ya(u,"utf-8")}catch(f){t.push({file:u,error:f.message});continue}let l=ha(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)=>!wa(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=ba(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 Ra(e){if(e)return e;let n=String(ka.env.DB_CONNECTION??"").toLowerCase();return n==="postgres"||n==="mysql"?n:"sqlite"}function Re(e){return e==="postgres"?"boolean":"number"}function O(e){return e.replace(/([A-Z]+)([A-Z][a-z])/g,"$1_$2").replace(/([a-z\d])([A-Z])/g,"$1_$2").toLowerCase()}function Sa(e,n){let t=e.default;if(typeof t==="boolean")return Re(n);if(typeof t==="number")return"number";if(typeof t==="string")return"string";return"unknown"}function _a(e){let n=e.validation;if(!n||typeof n!=="object")return null;let t=n.rule;return t&&typeof t==="object"?t:null}function Aa(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 Pa(e,n){let t=_a(e),r=Aa(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 Re(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 Sa(e,n)}})();return e.nullable===!0?`${a} | null`:a}function xa(e){let n={},t=e.belongsTo;if(!t)return n;let r=Array.isArray(t)?t:Object.values(t);for(let o of r){if(typeof o==="string"){n[`${O(o)}_id`]="number";continue}if(o&&typeof o==="object"){let a=o;if(typeof a.foreignKey==="string"){n[a.foreignKey]="number";continue}if(typeof a.model==="string")n[`${O(a.model)}_id`]="number"}}return n}function Ca(e,n){let[t,r]=[O(e),O(n)].sort();return`${t}_${r}`}function va(e,n){let t=e.default,r=typeof t==="string"?"string":typeof t==="number"?"number":typeof t==="boolean"?Re(n):t instanceof Date?"string":"unknown";return e.nullable?`${r} | null`:r}function Ma(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 h=i;if(s=h.model,"pivotTable"in h||"firstForeignKey"in h||"secondForeignKey"in h)u=h.pivotTable,c=h.firstForeignKey,l=h.secondForeignKey;else{let b=i;u=b.table,c=b.foreignKey,l=b.relatedKey,f=b.pivot?.columns??{},d=Boolean(b.pivot?.timestamps)}}else continue;let p=u??Ca(e,s),m=c??`${O(e)}_id`,g=l??`${O(s)}_id`,w={id:"number",[m]:"number",[g]:"number"};for(let[h,b]of Object.entries(f))w[h]=va(b,t);if(d)w.created_at="string",w.updated_at="string | null";o.push({table:p,columns:w})}return o}function Oa(e){return{email_verified_at:"string | null",password_changed_at:"string | null",two_factor_secret:"string | null",two_factor_enabled:`${Re(e)} | null`,two_factor_last_used_step:"number | null",stripe_id:"string | null"}}function Da(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,Oa(n));return t}function Ea(e,n){let t={},r=e.attributes??{};for(let[o,a]of Object.entries(r))t[O(o)]=Pa(a,n);return t}function Bn(e,n,t=2){let r=" ".repeat(t),o=" ".repeat(t+1),a=Object.entries(n).map(([s,u])=>`${o}${s}: ${u}`).join(`
|
|
8
|
+
`),i=/^[A-Z_a-z]\w*$/.test(e)?e:`'${e}'`;return`${r}${i}: {
|
|
9
9
|
${o}// columns
|
|
10
|
-
${
|
|
11
|
-
${r}}`}var
|
|
10
|
+
${a}
|
|
11
|
+
${r}}`}var ja=`/* eslint-disable */
|
|
12
12
|
// AUTO-GENERATED by \`buddy generate:db-types\` \u2014 do not edit.
|
|
13
13
|
// Regenerate after adding/removing a model or changing its attributes.
|
|
14
14
|
// See stacksjs/stacks#1923.
|
|
15
15
|
|
|
16
16
|
declare module '@stacksjs/database' {
|
|
17
17
|
interface DatabaseSchema {
|
|
18
|
-
`,
|
|
18
|
+
`,Fa=` }
|
|
19
19
|
}
|
|
20
20
|
|
|
21
21
|
export {}
|
|
22
|
-
|
|
23
|
-
`;function
|
|
24
|
-
`),p=`${
|
|
25
|
-
${
|
|
26
|
-
`);return`${
|
|
27
|
-
${qn(t)}`}import{isCursorPaginator as gl,isPaginator as yl,isSimplePaginator as wl,toCursorPaginator as bl,toPaginator as hl,toSimplePaginator as kl}from"@stacksjs/pagination";import{configureOrm as Ni}from"@stacksjs/query-builder";function Li(){try{let e=process.env.DB_DATABASE_PATH||"database/stacks.sqlite";if((process.env.DB_CONNECTION||"sqlite")==="sqlite")Ni({database:e})}catch{}}Li();async function Un(e){for(let t=0;;t++){let n=await import(e);try{return n.default}catch(r){if(t<5&&r instanceof ReferenceError&&/before initialization/.test(r.message)){await new Promise((o)=>setTimeout(o,0));continue}throw r}}}async function _e(e,t=[""]){let{path:n}=await import("@stacksjs/path"),r=n.userModelsPath(`${e}.ts`);try{if(await Bun.file(r).exists())return await Un(r)}catch(o){console.error(`[orm] Failed to import userland model ${e} from ${r} - falling back to framework default. Reason:`,o)}for(let o of t){let i=o?`${o}/`:"",a=n.frameworkPath(`defaults/app/Models/${i}${e}.ts`);try{if(await Bun.file(a).exists())return await Un(a)}catch(s){console.error(`[orm] Failed to import framework default model ${e} from ${a} - trying next subdir. Reason:`,s)}}return null}var D={},Kn=()=>{},Nc=new Promise((e)=>{Kn=e});function y(e){return new Proxy(function(){},{get(t,n){if(n==="then")return;let r=D[e];if(r==null)return;let o=r[n];return typeof o==="function"?o.bind(r):o},set(t,n,r){let o=D[e];if(o==null)return!1;return o[n]=r,!0},has(t,n){let r=D[e];return r==null?!1:(n in r)},apply(t,n,r){let o=D[e];if(o==null||typeof o!=="function")return;return o.apply(n,r)}})}var qi=y("User"),Gi=y("Job"),Ui=y("FailedJob"),Ki=[["Referral",[""],"auth"],["ReferralCode",[""],"auth"],["Team",[""],"auth"],["TeamInvitation",[""],"auth"],["TeamMember",[""],"auth"],["SocialAccount",[""],"auth"],["Subscriber",[""],"auth"],["SubscriberEmail",[""],"auth"],["Subscription",[""],"auth"],["Categorizable",["Content"],"cms"],["Post",["Content"],"cms"],["Page",["Content"],"cms"],["PageRevision",["Content"],"cms"],["Redirect",["Content"],"cms"],["Menu",["Content"],"cms"],["MenuItem",["Content"],"cms"],["Author",["Content"],"cms"],["Comment",[""],"cms"],["Tag",[""],"cms"],["Site",[""],"auth"],["SiteDomain",[""],"auth"],["MagicLinkToken",[""],"auth"],["SmsOptOut",[""],"auth"],["GdprRequest",[""],"auth"],["Form",["Forms"],"forms"],["FormField",["Forms"],"forms"],["FormSubmission",["Forms"],"forms"],["Activity",[""],"dashboard"],["Board",[""],"dashboard"],["BoardColumn",[""],"dashboard"],["Card",[""],"dashboard"],["CardComment",[""],"dashboard"],["Deployment",[""],"dashboard"],["Label",[""],"dashboard"],["Release",[""],"dashboard"],["Notification",[""],"dashboard"],["NotificationDelivery",[""],"dashboard"],["PersonalAccessToken",[""],"dashboard"],["MailPreference",[""],"dashboard"],["Log",[""],"dashboard"],["Request",[""],"dashboard"],["AnalyticsEvent",[""],"dashboard"],["QueryLog",[""],"dashboard"],["StorageItem",[""],"dashboard"],["StorageItemTask",[""],"dashboard"],["Error",[""],"monitoring"],["Websocket",["realtime"],"realtime"],["Campaign",[""],"marketing"],["CampaignSend",[""],"marketing"],["EmailList",[""],"marketing"],["EmailListSubscriber",[""],"marketing"],["EmailIdempotency",[""],"marketing"],["EmailSuppression",[""],"marketing"],["EmailWebhookEvent",[""],"marketing"],["SocialPost",[""],"marketing"],["Automation",[""],"marketing"],["AutomationRun",[""],"marketing"],["CampaignVariant",[""],"marketing"],["CommunicationSuppression",[""],"marketing"],["ConsentEvent",[""],"marketing"],["SenderDomain",[""],"marketing"],["UsageEvent",[""],"marketing"],["PaymentMethod",[""],"commerce"],["PaymentProduct",[""],"commerce"],["PaymentTransaction",[""],"commerce"],["Order",["commerce"],"commerce"],["OrderIdempotency",["commerce"],"commerce"],["OrderItem",["commerce"],"commerce"],["Cart",["commerce"],"commerce"],["CartItem",["commerce"],"commerce"],["Customer",["commerce"],"commerce"],["Product",["commerce"],"commerce"],["ProductVariant",["commerce"],"commerce"],["ProductUnit",["commerce"],"commerce"],["Manufacturer",["commerce"],"commerce"],["Category",["commerce"],"commerce"],["Coupon",["commerce"],"commerce"],["GiftCard",["commerce"],"commerce"],["LicenseKey",["commerce"],"commerce"],["Review",["commerce"],"commerce"],["Receipt",["commerce"],"commerce"],["PrintDevice",["commerce"],"commerce"],["ShippingMethod",["commerce"],"commerce"],["ShippingRate",["commerce"],"commerce"],["ShippingZone",["commerce"],"commerce"],["DeliveryRoute",["commerce"],"commerce"],["DeliveryStop",["commerce"],"commerce"],["DigitalDelivery",["commerce"],"commerce"],["Courier",["commerce"],"commerce"],["CourierPing",["commerce"],"commerce"],["TaxRate",["commerce"],"commerce"],["WaitlistProduct",["commerce"],"commerce"],["WaitlistRestaurant",["commerce"],"commerce"],["Auction",["commerce"],"commerce"],["AuctionItem",["commerce"],"commerce"],["Bid",["commerce"],"commerce"],["Pledge",["commerce"],"commerce"],["LoyaltyPoint",["commerce"],"commerce"],["LoyaltyReward",["commerce"],"commerce"],["Payment",["commerce"],"commerce"],["Transaction",["commerce"],"commerce"]];queueMicrotask(async()=>{try{let{feature:e}=await import("@stacksjs/config"),t=await _e("User");if(t)D.User=t;if(e("queue")){let n=await _e("Job");if(n)D.Job=n;let r=await _e("FailedJob");if(r)D.FailedJob=r}for(let[n,r,o]of Ki){if(!e(o))continue;let i=await _e(n,r);if(i)D[n]=i}}catch(e){console.error("[orm] deferred model load failed:",e)}finally{Kn()}});var Wi=y("Activity"),Vi=y("AnalyticsEvent"),Qi=y("Automation"),zi=y("AutomationRun"),Hi=y("Auction"),Ji=y("CampaignVariant"),Yi=y("CommunicationSuppression"),Xi=y("ConsentEvent"),Zi=y("SenderDomain"),ea=y("UsageEvent"),ta=y("AuctionItem"),na=y("Author"),ra=y("Bid"),oa=y("Board"),ia=y("BoardColumn"),aa=y("Campaign"),sa=y("Card"),ua=y("CardComment"),ca=y("Cart"),la=y("CartItem"),da=y("Category"),fa=y("Comment"),pa=y("Coupon"),ma=y("Customer"),ga=y("DeliveryRoute"),ya=y("DeliveryStop"),wa=y("Deployment"),ba=y("DigitalDelivery"),ha=y("Courier"),ka=y("CourierPing"),Ta=y("CampaignSend"),Ra=y("EmailList"),_a=y("EmailListSubscriber"),Sa=y("Form"),Aa=y("FormField"),Pa=y("FormSubmission"),xa=y("MagicLinkToken"),Ca=y("Menu"),va=y("MenuItem"),Ma=y("PageRevision"),Oa=y("Pledge"),Da=y("Redirect"),Ea=y("Site"),ja=y("SiteDomain"),Fa=y("SmsOptOut"),$a=y("GdprRequest"),Lc=y("StorageItem"),qc=y("StorageItemTask"),Ia=y("EmailIdempotency"),Ba=y("EmailSuppression"),Na=y("EmailWebhookEvent"),La=y("Error"),qa=y("GiftCard"),Ga=y("Label"),Ua=y("LicenseKey"),Ka=y("Log"),Wa=y("LoyaltyPoint"),Va=y("LoyaltyReward"),Qa=y("MailPreference"),za=y("Manufacturer"),Ha=y("Notification"),Ja=y("NotificationDelivery"),Ya=y("Order"),Xa=y("OrderIdempotency"),Gc=y("PersonalAccessToken"),Za=y("OrderItem"),es=y("Page"),ts=y("Payment"),ns=y("PaymentMethod"),rs=y("PaymentProduct"),os=y("PaymentTransaction"),is=y("Post"),as=y("Categorizable"),ss=y("PrintDevice"),us=y("Product"),cs=y("ProductUnit"),ls=y("ProductVariant"),ds=y("QueryLog"),fs=y("Receipt"),Uc=y("Referral"),Kc=y("ReferralCode"),ps=y("Release"),ms=y("Request"),gs=y("Review"),ys=y("ShippingMethod"),ws=y("ShippingRate"),bs=y("ShippingZone"),hs=y("SocialPost"),ks=y("SocialAccount"),Ts=y("Subscriber"),Rs=y("SubscriberEmail"),_s=y("Subscription"),Ss=y("Tag"),As=y("TaxRate"),Ps=y("Team"),xs=y("TeamInvitation"),Cs=y("TeamMember"),vs=y("Transaction"),Ms=y("WaitlistProduct"),Os=y("WaitlistRestaurant"),Ds=y("Websocket"),Wn={User:qi,Job:Gi,FailedJob:Ui,Activity:Wi,AnalyticsEvent:Vi,Automation:Qi,AutomationRun:zi,Auction:Hi,AuctionItem:ta,Author:na,Bid:ra,Board:oa,BoardColumn:ia,Campaign:aa,CampaignSend:Ta,CampaignVariant:Ji,Card:sa,CardComment:ua,Cart:ca,CartItem:la,Categorizable:as,Category:da,Comment:fa,Coupon:pa,Customer:ma,CommunicationSuppression:Yi,ConsentEvent:Xi,DeliveryRoute:ga,DeliveryStop:ya,Deployment:wa,DigitalDelivery:ba,Courier:ha,CourierPing:ka,EmailList:Ra,EmailListSubscriber:_a,EmailIdempotency:Ia,EmailSuppression:Ba,EmailWebhookEvent:Na,ErrorModel:La,Form:Sa,FormField:Aa,FormSubmission:Pa,GdprRequest:$a,GiftCard:qa,Label:Ga,LicenseKey:Ua,Log:Ka,LoyaltyPoint:Wa,LoyaltyReward:Va,MailPreference:Qa,Manufacturer:za,Notification:Ha,MagicLinkToken:xa,Menu:Ca,MenuItem:va,NotificationDelivery:Ja,Order:Ya,OrderIdempotency:Xa,OrderItem:Za,Page:es,PageRevision:Ma,Payment:ts,PaymentMethod:ns,PaymentProduct:rs,PaymentTransaction:os,Pledge:Oa,Post:is,PrintDevice:ss,Product:us,ProductUnit:cs,ProductVariant:ls,QueryLog:ds,Receipt:fs,Release:ps,Request:ms,Review:gs,ShippingMethod:ys,Redirect:Da,SenderDomain:Zi,ShippingRate:ws,ShippingZone:bs,Site:Ea,SiteDomain:ja,SmsOptOut:Fa,SocialAccount:ks,SocialPost:hs,Subscriber:Ts,SubscriberEmail:Rs,Subscription:_s,Tag:Ss,TaxRate:As,Team:Ps,TeamInvitation:xs,TeamMember:Cs,Transaction:vs,UsageEvent:ea,WaitlistProduct:Ms,WaitlistRestaurant:Os,Websocket:Ds},G=globalThis;for(let[e,t]of Object.entries(Wn))if(t&&G[e]===void 0)G[e]=t;var Wc=Object.keys(Wn);async function Es(e){if(!e)return[];try{if(typeof e.all==="function"){let t=await e.all();return Array.isArray(t)?t:[]}if(typeof e.get==="function"){let t=await e.get();return Array.isArray(t)?t:[]}}catch{}return[]}function js(e,t,n=""){if(!e)return n;try{if(typeof e.get==="function"){let o=e.get(t);if(o!==void 0&&o!==null)return o}}catch{}let r=e?.[t];return r!==void 0&&r!==null?r:n}if(G.safeAll===void 0)G.safeAll=Es;if(G.safeGet===void 0)G.safeGet=js;export{Wi as Activity,Vi as AnalyticsEvent,Hi as Auction,ta as AuctionItem,na as Author,Qi as Automation,zi as AutomationRun,ue as BILLABLE_INSTANCE_METHODS,ra as Bid,oa as Board,ia as BoardColumn,aa as Campaign,Ta as CampaignSend,Ji as CampaignVariant,sa as Card,ua as CardComment,ca as Cart,la as CartItem,as as Categorizable,da as Category,fa as Comment,Yi as CommunicationSuppression,Xi as ConsentEvent,pa as Coupon,ha as Courier,ka as CourierPing,ma as Customer,ga as DeliveryRoute,ya as DeliveryStop,wa as Deployment,ba as DigitalDelivery,Ia as EmailIdempotency,Ra as EmailList,_a as EmailListSubscriber,Ba as EmailSuppression,Na as EmailWebhookEvent,La as ErrorModel,Ui as FailedJob,Sa as Form,Aa as FormField,Pa as FormSubmission,fe as GDPR_AUDIT_TABLE,M as GDPR_SUBJECT_MODEL,Ge as GdprDeclarationError,$a as GdprRequest,pe as GdprSubjectNotFoundError,qa as GiftCard,Gi as Job,Ga as Label,Ua as LicenseKey,Ka as Log,Wa as LoyaltyPoint,Va as LoyaltyReward,lt as MODEL_DEFINITION,xa as MagicLinkToken,Qa as MailPreference,za as Manufacturer,ut as MassAssignmentException,Ca as Menu,va as MenuItem,Dn as ModelNotFoundError,Cn as ModelValidationError,Ha as Notification,Ja as NotificationDelivery,Ya as Order,Xa as OrderIdempotency,Za as OrderItem,es as Page,Ma as PageRevision,ts as Payment,ns as PaymentMethod,rs as PaymentProduct,os as PaymentTransaction,Gc as PersonalAccessToken,Oa as Pledge,is as Post,ss as PrintDevice,us as Product,cs as ProductUnit,ls as ProductVariant,ds as QueryLog,fs as Receipt,Da as Redirect,Uc as Referral,Kc as ReferralCode,ps as Release,ms as Request,gs as Review,Zi as SenderDomain,ys as ShippingMethod,ws as ShippingRate,bs as ShippingZone,Ea as Site,ja as SiteDomain,Fa as SmsOptOut,ks as SocialAccount,hs as SocialPost,Lc as StorageItem,qc as StorageItemTask,qr as SubqueryBuilder,Ts as Subscriber,Rs as SubscriberEmail,_s as Subscription,$e as SubscriptionNotOwnedError,Ss as Tag,As as TaxRate,Ps as Team,xs as TeamInvitation,Cs as TeamMember,vs as Transaction,ea as UsageEvent,qi as User,Ms as WaitlistProduct,Os as WaitlistRestaurant,Ds as Websocket,de as assertGdprPlan,Ru as batchLoad,Ii as buildDatabaseSchema,mo as buildProcessingRegister,Ce as collectEncryptedAttributes,ht as createAuditMethods,je as createCategorizableMethods,Oe as createCommentableMethods,Fe as createLikeableMethods,Ee as createTaggableMethods,Er as customerOwnership,Pu as db,xe as decryptValue,Fn as defineModel,Pe as encryptValue,nt as enrichPaginatorUrls,co as eraseSubject,so as exportSubjectData,Pc as extendModel,hr as filterFillable,ge as gdprTableExists,Lt as gdprTableName,Ns as getPrunableConfig,br as getWritableFields,gr as isBillable,gl as isCursorPaginator,K as isEncrypted,yl as isPaginator,wl as isSimplePaginator,Mt as isUniqueViolation,Ue as loadGdprModels,yr as mapWriteError,Bs as massPrunable,di as mergeModelDefinition,Wc as modelGlobalNames,Nc as ormReady,Ir as parentOwnership,Zt as parseCursor,ct as projectDocumentsFromTrait,Qn as prunable,fo as pruneRetainedData,Bi as renderDatabaseTypeFile,go as renderProcessingRegister,tt as resolveCursorArgs,le as resolveGdprPlan,ro as resolveGdprSubject,et as resolvePageArgs,vu as savepoint,jr as selfOwnership,tr as setAuditUser,Fr as siteOwnership,$r as teamMembershipOwnership,ii as toAttrs,bl as toCursorPaginator,hl as toPaginator,kl as toSimplePaginator,wr as toSnakeCaseKeys,qe as transaction,Mu as transactional,j as withoutEvents,jo as withoutValidation};
|
|
22
|
+
`,$a="/* 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",Ia=`}
|
|
23
|
+
`;function Nn(e){return e==="framework"?$a:ja}function Ln(e){return e==="framework"?Ia:Fa}async function qn(e,n,t=[]){let r=[];if(!ee.existsSync(e))return r;let o=ee.readdirSync(e,{withFileTypes:!0});for(let a of o){let i=_.join(e,a.name);if(a.isDirectory()){if(n){let s=await qn(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 Ba(e={}){let n=Ra(e.dialect),t=e.modelsDir??_.userModelsPath(),r=e.defaultsDir??_.frameworkPath("defaults/app/Models"),o=e.outFile??_.projectPath("database/types.d.ts"),a=[],i=[];for(let[m,g]of[[t,!1],[r,!0]])try{let w=await qn(m,g,a);i.push(...w)}catch(w){a.push({file:m,error:w.message})}let s=new Map;for(let m of i)s.set(m.model.name??_.basename(m.filePath).replace(/\.ts$/,""),m);for(let m of i)if(m.filePath.startsWith(t))s.set(m.model.name??_.basename(m.filePath).replace(/\.ts$/,""),m);let u=[];for(let[m,{model:g}]of s){let w=g.table??`${O(m)}s`,h={...Da(g,n),...Ea(g,n),...xa(g)};u.push({table:w,model:m,columns:h})}let c=new Map;for(let[m,{model:g}]of s)for(let w of Ma(m,g,n)){if(c.has(w.table))continue;c.set(w.table,{table:w.table,model:`(${w.table} pivot)`,columns:w.columns})}if(u.push(...c.values()),e.migrationsDir!==!1){let m=e.migrationsDir??_.resolve(_.dirname(o),"migrations"),g=new Set(u.map((h)=>h.table)),w=In(m,n);for(let h of w.tables){if(g.has(h.table))continue;g.add(h.table),u.push({table:h.table,model:`(${h.table} migration)`,columns:h.columns})}a.push(...w.errors)}u.sort((m,g)=>m.table.localeCompare(g.table));let l=e.target??"app",f=l==="framework"?1:2,d=u.map((m)=>Bn(m.table,m.columns,f)).join(`
|
|
24
|
+
`),p=`${Nn(l)}${d}
|
|
25
|
+
${Ln(l)}`;if(!e.dryRun){let m=_.dirname(o);if(!ee.existsSync(m))ee.mkdirSync(m,{recursive:!0});ee.writeFileSync(o,p,"utf-8"),Ta.success(`[generate:db-types] wrote ${u.length} table(s) to ${o}`)}return{outFile:o,tables:u,errors:a,content:p}}function Na(e,n="app"){let t=[...e].sort((r,o)=>r.table.localeCompare(o.table)).map((r)=>Bn(r.table,r.columns,n==="framework"?1:2)).join(`
|
|
26
|
+
`);return`${Nn(n)}${t}
|
|
27
|
+
${Ln(n)}`}import{isCursorPaginator as bl,isPaginator as hl,isSimplePaginator as kl,toCursorPaginator as Tl,toPaginator as Rl,toSimplePaginator as Sl}from"@stacksjs/pagination";import{configureOrm as La}from"@stacksjs/query-builder";function qa(){try{let e=process.env.DB_DATABASE_PATH||"database/stacks.sqlite";if((process.env.DB_CONNECTION||"sqlite")==="sqlite")La({database:e})}catch{}}qa();async function Gn(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 Se(e,n=[""]){let{path:t}=await import("@stacksjs/path"),r=t.userModelsPath(`${e}.ts`);try{if(await Bun.file(r).exists())return await Gn(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 Gn(i)}catch(s){console.error(`[orm] Failed to import framework default model ${e} from ${i} - trying next subdir. Reason:`,s)}}return null}var D={},Un=()=>{},Gc=new Promise((e)=>{Un=e});function y(e){return new Proxy(function(){},{get(n,t){if(t==="then")return;let r=D[e];if(r==null)return;let o=r[t];return typeof o==="function"?o.bind(r):o},set(n,t,r){let o=D[e];if(o==null)return!1;return o[t]=r,!0},has(n,t){let r=D[e];return r==null?!1:(t in r)},apply(n,t,r){let o=D[e];if(o==null||typeof o!=="function")return;return o.apply(t,r)}})}var Ga=y("User"),Ua=y("Job"),Ka=y("FailedJob"),Wa=[["Referral",[""],"auth"],["ReferralCode",[""],"auth"],["Team",[""],"auth"],["TeamInvitation",[""],"auth"],["TeamMember",[""],"auth"],["SocialAccount",[""],"auth"],["Subscriber",[""],"auth"],["SubscriberEmail",[""],"auth"],["Subscription",[""],"auth"],["Categorizable",["Content"],"cms"],["Post",["Content"],"cms"],["Page",["Content"],"cms"],["PageRevision",["Content"],"cms"],["Redirect",["Content"],"cms"],["Menu",["Content"],"cms"],["MenuItem",["Content"],"cms"],["Author",["Content"],"cms"],["Comment",[""],"cms"],["Tag",[""],"cms"],["Site",[""],"auth"],["SiteDomain",[""],"auth"],["MagicLinkToken",[""],"auth"],["SmsOptOut",[""],"auth"],["GdprRequest",[""],"auth"],["Form",["Forms"],"forms"],["FormField",["Forms"],"forms"],["FormSubmission",["Forms"],"forms"],["Activity",[""],"dashboard"],["Board",[""],"dashboard"],["BoardColumn",[""],"dashboard"],["Card",[""],"dashboard"],["CardComment",[""],"dashboard"],["Deployment",[""],"dashboard"],["Label",[""],"dashboard"],["Release",[""],"dashboard"],["Notification",[""],"dashboard"],["NotificationDelivery",[""],"dashboard"],["PersonalAccessToken",[""],"dashboard"],["MailPreference",[""],"dashboard"],["Log",[""],"dashboard"],["Request",[""],"dashboard"],["AnalyticsEvent",[""],"dashboard"],["QueryLog",[""],"dashboard"],["StorageItem",[""],"dashboard"],["StorageItemTask",[""],"dashboard"],["Error",[""],"monitoring"],["Websocket",["realtime"],"realtime"],["Campaign",[""],"marketing"],["CampaignSend",[""],"marketing"],["EmailList",[""],"marketing"],["EmailListSubscriber",[""],"marketing"],["EmailIdempotency",[""],"marketing"],["EmailSuppression",[""],"marketing"],["EmailWebhookEvent",[""],"marketing"],["SocialPost",[""],"marketing"],["Automation",[""],"marketing"],["AutomationRun",[""],"marketing"],["CampaignVariant",[""],"marketing"],["CommunicationSuppression",[""],"marketing"],["ConsentEvent",[""],"marketing"],["SenderDomain",[""],"marketing"],["UsageEvent",[""],"marketing"],["PaymentMethod",[""],"commerce"],["PaymentProduct",[""],"commerce"],["PaymentTransaction",[""],"commerce"],["Order",["commerce"],"commerce"],["OrderIdempotency",["commerce"],"commerce"],["OrderItem",["commerce"],"commerce"],["Cart",["commerce"],"commerce"],["CartItem",["commerce"],"commerce"],["Customer",["commerce"],"commerce"],["Product",["commerce"],"commerce"],["ProductVariant",["commerce"],"commerce"],["ProductUnit",["commerce"],"commerce"],["Manufacturer",["commerce"],"commerce"],["Category",["commerce"],"commerce"],["Coupon",["commerce"],"commerce"],["GiftCard",["commerce"],"commerce"],["LicenseKey",["commerce"],"commerce"],["Review",["commerce"],"commerce"],["Receipt",["commerce"],"commerce"],["PrintDevice",["commerce"],"commerce"],["ShippingMethod",["commerce"],"commerce"],["ShippingRate",["commerce"],"commerce"],["ShippingZone",["commerce"],"commerce"],["DeliveryRoute",["commerce"],"commerce"],["DeliveryStop",["commerce"],"commerce"],["DigitalDelivery",["commerce"],"commerce"],["Courier",["commerce"],"commerce"],["CourierPing",["commerce"],"commerce"],["TaxRate",["commerce"],"commerce"],["WaitlistProduct",["commerce"],"commerce"],["WaitlistRestaurant",["commerce"],"commerce"],["Auction",["commerce"],"commerce"],["AuctionItem",["commerce"],"commerce"],["Bid",["commerce"],"commerce"],["Pledge",["commerce"],"commerce"],["LoyaltyPoint",["commerce"],"commerce"],["LoyaltyReward",["commerce"],"commerce"],["Payment",["commerce"],"commerce"],["Transaction",["commerce"],"commerce"]];queueMicrotask(async()=>{try{let{feature:e}=await import("@stacksjs/config"),n=await Se("User");if(n)D.User=n;if(e("queue")){let t=await Se("Job");if(t)D.Job=t;let r=await Se("FailedJob");if(r)D.FailedJob=r}for(let[t,r,o]of Wa){if(!e(o))continue;let a=await Se(t,r);if(a)D[t]=a}}catch(e){console.error("[orm] deferred model load failed:",e)}finally{Un()}});var Va=y("Activity"),Qa=y("AnalyticsEvent"),za=y("Automation"),Ha=y("AutomationRun"),Ja=y("Auction"),Ya=y("CampaignVariant"),Xa=y("CommunicationSuppression"),Za=y("ConsentEvent"),ei=y("SenderDomain"),ti=y("UsageEvent"),ni=y("AuctionItem"),ri=y("Author"),oi=y("Bid"),ai=y("Board"),ii=y("BoardColumn"),si=y("Campaign"),ui=y("Card"),ci=y("CardComment"),li=y("Cart"),di=y("CartItem"),fi=y("Category"),pi=y("Comment"),mi=y("Coupon"),gi=y("Customer"),yi=y("DeliveryRoute"),wi=y("DeliveryStop"),bi=y("Deployment"),hi=y("DigitalDelivery"),ki=y("Courier"),Ti=y("CourierPing"),Ri=y("CampaignSend"),Si=y("EmailList"),_i=y("EmailListSubscriber"),Ai=y("Form"),Pi=y("FormField"),xi=y("FormSubmission"),Ci=y("MagicLinkToken"),vi=y("Menu"),Mi=y("MenuItem"),Oi=y("PageRevision"),Di=y("Pledge"),Ei=y("Redirect"),ji=y("Site"),Fi=y("SiteDomain"),$i=y("SmsOptOut"),Ii=y("GdprRequest"),Uc=y("StorageItem"),Kc=y("StorageItemTask"),Bi=y("EmailIdempotency"),Ni=y("EmailSuppression"),Li=y("EmailWebhookEvent"),qi=y("Error"),Gi=y("GiftCard"),Ui=y("Label"),Ki=y("LicenseKey"),Wi=y("Log"),Vi=y("LoyaltyPoint"),Qi=y("LoyaltyReward"),zi=y("MailPreference"),Hi=y("Manufacturer"),Ji=y("Notification"),Yi=y("NotificationDelivery"),Xi=y("Order"),Zi=y("OrderIdempotency"),Wc=y("PersonalAccessToken"),es=y("OrderItem"),ts=y("Page"),ns=y("Payment"),rs=y("PaymentMethod"),os=y("PaymentProduct"),as=y("PaymentTransaction"),is=y("Post"),ss=y("Categorizable"),us=y("PrintDevice"),cs=y("Product"),ls=y("ProductUnit"),ds=y("ProductVariant"),fs=y("QueryLog"),ps=y("Receipt"),Vc=y("Referral"),Qc=y("ReferralCode"),ms=y("Release"),gs=y("Request"),ys=y("Review"),ws=y("ShippingMethod"),bs=y("ShippingRate"),hs=y("ShippingZone"),ks=y("SocialPost"),Ts=y("SocialAccount"),Rs=y("Subscriber"),Ss=y("SubscriberEmail"),_s=y("Subscription"),As=y("Tag"),Ps=y("TaxRate"),xs=y("Team"),Cs=y("TeamInvitation"),vs=y("TeamMember"),Ms=y("Transaction"),Os=y("WaitlistProduct"),Ds=y("WaitlistRestaurant"),Es=y("Websocket"),Kn={User:Ga,Job:Ua,FailedJob:Ka,Activity:Va,AnalyticsEvent:Qa,Automation:za,AutomationRun:Ha,Auction:Ja,AuctionItem:ni,Author:ri,Bid:oi,Board:ai,BoardColumn:ii,Campaign:si,CampaignSend:Ri,CampaignVariant:Ya,Card:ui,CardComment:ci,Cart:li,CartItem:di,Categorizable:ss,Category:fi,Comment:pi,Coupon:mi,Customer:gi,CommunicationSuppression:Xa,ConsentEvent:Za,DeliveryRoute:yi,DeliveryStop:wi,Deployment:bi,DigitalDelivery:hi,Courier:ki,CourierPing:Ti,EmailList:Si,EmailListSubscriber:_i,EmailIdempotency:Bi,EmailSuppression:Ni,EmailWebhookEvent:Li,ErrorModel:qi,Form:Ai,FormField:Pi,FormSubmission:xi,GdprRequest:Ii,GiftCard:Gi,Label:Ui,LicenseKey:Ki,Log:Wi,LoyaltyPoint:Vi,LoyaltyReward:Qi,MailPreference:zi,Manufacturer:Hi,Notification:Ji,MagicLinkToken:Ci,Menu:vi,MenuItem:Mi,NotificationDelivery:Yi,Order:Xi,OrderIdempotency:Zi,OrderItem:es,Page:ts,PageRevision:Oi,Payment:ns,PaymentMethod:rs,PaymentProduct:os,PaymentTransaction:as,Pledge:Di,Post:is,PrintDevice:us,Product:cs,ProductUnit:ls,ProductVariant:ds,QueryLog:fs,Receipt:ps,Release:ms,Request:gs,Review:ys,ShippingMethod:ws,Redirect:Ei,SenderDomain:ei,ShippingRate:bs,ShippingZone:hs,Site:ji,SiteDomain:Fi,SmsOptOut:$i,SocialAccount:Ts,SocialPost:ks,Subscriber:Rs,SubscriberEmail:Ss,Subscription:_s,Tag:As,TaxRate:Ps,Team:xs,TeamInvitation:Cs,TeamMember:vs,Transaction:Ms,UsageEvent:ti,WaitlistProduct:Os,WaitlistRestaurant:Ds,Websocket:Es},G=globalThis;for(let[e,n]of Object.entries(Kn))if(n&&G[e]===void 0)G[e]=n;var zc=Object.keys(Kn);async function js(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 Fs(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(G.safeAll===void 0)G.safeAll=js;if(G.safeGet===void 0)G.safeGet=Fs;export{Va as Activity,Qa as AnalyticsEvent,Ja as Auction,ni as AuctionItem,ri as Author,za as Automation,Ha as AutomationRun,ue as BILLABLE_INSTANCE_METHODS,oi as Bid,ai as Board,ii as BoardColumn,si as Campaign,Ri as CampaignSend,Ya as CampaignVariant,ui as Card,ci as CardComment,li as Cart,di as CartItem,ss as Categorizable,fi as Category,pi as Comment,Xa as CommunicationSuppression,Za as ConsentEvent,mi as Coupon,ki as Courier,Ti as CourierPing,gi as Customer,yi as DeliveryRoute,wi as DeliveryStop,bi as Deployment,hi as DigitalDelivery,Bi as EmailIdempotency,Si as EmailList,_i as EmailListSubscriber,Ni as EmailSuppression,Li as EmailWebhookEvent,qi as ErrorModel,Ka as FailedJob,Ai as Form,Pi as FormField,xi as FormSubmission,fe as GDPR_AUDIT_TABLE,M as GDPR_SUBJECT_MODEL,Ge as GdprDeclarationError,Ii as GdprRequest,pe as GdprSubjectNotFoundError,Gi as GiftCard,Ua as Job,Ui as Label,Ki as LicenseKey,Wi as Log,Vi as LoyaltyPoint,Qi as LoyaltyReward,lt as MODEL_DEFINITION,Ci as MagicLinkToken,zi as MailPreference,Hi as Manufacturer,ut as MassAssignmentException,vi as Menu,Mi as MenuItem,On as ModelNotFoundError,xn as ModelValidationError,Ji as Notification,Yi as NotificationDelivery,Xi as Order,Zi as OrderIdempotency,es as OrderItem,ts as Page,Oi as PageRevision,ns as Payment,rs as PaymentMethod,os as PaymentProduct,as as PaymentTransaction,Wc as PersonalAccessToken,Di as Pledge,is as Post,us as PrintDevice,cs as Product,ls as ProductUnit,ds as ProductVariant,fs as QueryLog,ps as Receipt,Ei as Redirect,Vc as Referral,Qc as ReferralCode,ms as Release,gs as Request,ys as Review,ei as SenderDomain,ws as ShippingMethod,bs as ShippingRate,hs as ShippingZone,ji as Site,Fi as SiteDomain,$i as SmsOptOut,Ts as SocialAccount,ks as SocialPost,Uc as StorageItem,Kc as StorageItemTask,Gr as SubqueryBuilder,Rs as Subscriber,Ss as SubscriberEmail,_s as Subscription,$e as SubscriptionNotOwnedError,As as Tag,Ps as TaxRate,xs as Team,Cs as TeamInvitation,vs as TeamMember,Ms as Transaction,ti as UsageEvent,Ga as User,Os as WaitlistProduct,Ds as WaitlistRestaurant,Es as Websocket,de as assertGdprPlan,Au as batchLoad,Ba as buildDatabaseSchema,go as buildProcessingRegister,Ce as collectEncryptedAttributes,ht as createAuditMethods,je as createCategorizableMethods,Oe as createCommentableMethods,Fe as createLikeableMethods,Ee as createTaggableMethods,jr as customerOwnership,vu as db,xe as decryptValue,jn as defineModel,Pe as encryptValue,nt as enrichPaginatorUrls,lo as eraseSubject,uo as exportSubjectData,vc as extendModel,hr as filterFillable,ge as gdprTableExists,Nt as gdprTableName,Ls as getPrunableConfig,br as getWritableFields,mr as isBillable,bl as isCursorPaginator,K as isEncrypted,hl as isPaginator,kl as isSimplePaginator,Dr as isUniqueViolation,Ue as loadGdprModels,yr as mapWriteError,Ns as massPrunable,fa as mergeModelDefinition,zc as modelGlobalNames,Gc as ormReady,Br as parentOwnership,Xt as parseCursor,ct as projectDocumentsFromTrait,Vn as prunable,po as pruneRetainedData,Na as renderDatabaseTypeFile,yo as renderProcessingRegister,tt as resolveCursorArgs,le as resolveGdprPlan,oo as resolveGdprSubject,et as resolvePageArgs,Du as savepoint,Fr as selfOwnership,er as setAuditUser,$r as siteOwnership,Ir as teamMembershipOwnership,ia as toAttrs,Tl as toCursorPaginator,Rl as toPaginator,Sl as toSimplePaginator,wr as toSnakeCaseKeys,qe as transaction,Eu as transactional,j as withoutEvents,Fo as withoutValidation};
|
package/dist/routes.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
var st=(e,t,n)=>()=>{if(e)try{t=e(e=0)}catch(r){n=[r]}if(n)throw n[0];return t};var Dt=import.meta.require;import{readdirSync as wt}from"fs";import{basename as bt,extname as Le,join as Rt}from"path";function kt(e){let t=[],n=(r)=>{let o;try{o=wt(r,{withFileTypes:!0})}catch{return}for(let s of o){let i=Rt(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 kt(e))try{let o=Le(r),s=await import(`${r}?t=${Date.now()}`),i=s.default??s,c=i.name??bt(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}var qe=()=>{};import _t from"process";import{route as B}from"@stacksjs/router";import{env as F}from"@stacksjs/env";import{projectPath as Se,storagePath as St}from"@stacksjs/path";import{createQueryBuilder as xt,defaultConfig as ze,setConfig as He}from"@stacksjs/query-builder";import{HttpError as L}from"@stacksjs/error-handling";import{log as H}from"@stacksjs/logging/runtime";function it(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(it(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??=ut(t);let s=r.get(o);if(s!==o&&s in e)n[o]=e[s]}return n}function at(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 Oe=new WeakMap,ve=new WeakMap;function ge(e){let t=Oe.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 Oe.set(e,n),n}function ut(e){let t=ge(e),n=ve.get(t);if(n)return n;let r=new Map(t.map(({field:o,snake:s})=>[o,s]));return ve.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 lt=["id","uuid","created_at","updated_at","deleted_at"];function Ee(e,t){let n=new Map;for(let r of[...Object.keys(e??{}),...lt]){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 je(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 ct={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"?ft(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"?gt(e):[],set:(e)=>e==null?null:Array.isArray(e)?JSON.stringify(e):e}},Ae=new WeakMap;function dt(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"?ct[s]:s;r.push({attr:o,snake:_(o),definition:s,caster:i})}return Ae.set(e,r),r}function ft(e){try{return JSON.parse(e)}catch{return e}}function gt(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=dt(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 pt(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 Pt(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=pt(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 J=I?e[u]:T?f.default:void 0,Q=at(P,J),N=P.validate(Q);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${yt(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 yt(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,mt=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,mt);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 ht(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}=ht(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.`}qe();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 jt(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 Ft(e="id"){return{field:e,resolve:async(t)=>t?.id??null}}function Ut(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 Bt(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 Qt(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 Ot=Se("config/qb.ts");try{let e=(await import(Ot)).default;He(e??ze)}catch{H.debug("[orm] No config/qb.ts override found - deriving config from DB_CONNECTION");let e=F.DB_CONNECTION||"sqlite",t=e==="turso"||e==="libsql",n=t?"sqlite":e;He({...ze,dialect:n,database:t?{database:F.TURSO_DATABASE_URL||"",url:F.TURSO_DATABASE_URL||"",authToken:F.TURSO_AUTH_TOKEN||void 0}:n==="sqlite"?{database:F.DB_DATABASE_PATH||"database/stacks.sqlite"}:{database:F.DB_DATABASE||"stacks",host:F.DB_HOST||"127.0.0.1",port:F.DB_PORT||(n==="postgres"?5432:3306),username:F.DB_USERNAME||(n==="postgres"?"postgres":"root"),password:F.DB_PASSWORD||""}})}var ke=await Ve({defaultsRoot:St("framework/defaults/app/Models"),userRoot:Se("app/Models"),onImportError:(e,t)=>H.warn(`[orm] Could not load model ${e}: ${t.message}`)}),vt=xt(),A=vt,Je=Fe(B.routes);function z(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 H.debug(`[orm] Skipping generated ${e} ${t} - already defined${o&&o!==t?` as ${o}`:""}.`),!0}function et(e){if(!e.attributes)return[];return Object.entries(e.attributes).filter(([t,n])=>n.hidden===!0).map(([t])=>t)}function Ke(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 Ge(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(Ke(_(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||Ke(_(T.modelName)),J=et(P),Q=(N)=>G(ne(N,P),J);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(),V=new Map;for(let S of K??[])V.set(String(S.id),Q(S));for(let S of e)S[u]=V.get(String(S[N]))??null}else{let N=String(t.name??""),C=`${_(N)}_id`,K=[...new Set(e.map((v)=>v.id).filter((v)=>v!=null))];if(!K.length){for(let v of e)v[u]=[];continue}let V=await A.selectFrom(I).whereIn(C,K).get(),S=new Map;for(let v of V??[]){let E=String(v[C]),Z=S.get(E)??[];Z.push(Q(v)),S.set(E,Z)}for(let v of e)v[u]=S.get(String(v.id))??[]}}return e}async function Xe(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 Ye(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 L(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 L(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 L)throw n;throw new L(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 At(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=At(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 Ze(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 tt=await(async()=>{let e=_t.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)}})(),nt=[];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=et(t),u=Ce(o,r.prefix),T=Ee(t.attributes,f),{read:P,write:I,declared:J}=Ue(n),Q=["store","update","destroy"].some((y)=>s.includes(y));if(Q&&J&&I.length===0)H.warn(`[orm] ${e}: registering UNAUTHENTICATED mutating routes at ${u} (explicit \`middleware: []\` opt-out)`);if(["index","show"].some((y)=>s.includes(y))&&J&&P.length===0)H.debug(`[orm] ${e}: registering public read routes at ${u} (declared \`middleware.read: []\`)`);let C=!!ie(t),K=C&&!P.includes("auth")?["auth",...P]:P,V=Ie(t),S=Q&&!C&&!V;if(S)nt.push(e);if(Q&&V)H.debug(`[orm] ${e}: registering unscoped mutating routes at ${u} (declared \`ownership: false\`)`);let v=S&&tt==="deny",E=(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")&&!z("GET",u))E(B.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=je(p,h,T);let M=new Set(["page","per_page","sort","fields","search","include","limit","offset","with_count","withTrashed","onlyTrashed"]);for(let[x,O]of a.searchParams.entries()){if(M.has(x)||!O)continue;if(!/^[a-z_][a-z0-9_]*$/i.test(x))continue;let q=T.get(x);if(q)p=p.where(q,"=",O)}let R=a.searchParams.get("search");if(R&&c.length>0){let x=c.slice(0,5);p=p.where((O)=>{for(let q of x)O=O.orWhere(_(q),"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)p=p.select(x)}let D=!!t.traits?.useSoftDeletes,b=a.searchParams.get("withTrashed")==="true",j=a.searchParams.get("onlyTrashed")==="true";if(D&&!b)p=j?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 U=await p.limit(g+1).offset(w).get()||[],W=U.length>g,re=(W?U.slice(0,g):U).map((x)=>G(ne(x,t),f)),xe=a.searchParams.get("include");if(xe)re=await Ge(re,t,xe,ke);let rt=a.searchParams.get("with_count")==="true",ee;if(rt)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 O=await x.count(),q=typeof O==="number"?O:Number(O?.count??O);if(Number.isFinite(q))ee=q}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 ot=we(a,l,g,re.length,W,ee);return new Response(JSON.stringify({data:re,...ot}),{status:200,headers:oe})}catch(a){if(a instanceof L){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")&&!z("GET",`${u}/{id}`))E(B.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 Ge([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 L){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(!v&&s.includes("store")&&!z("POST",u))E(B.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 Ze(t,"creating",w,y);for(let[j,m]of Object.entries(b))if(m!==void 0&&m!==null&&g[j]===void 0)g[j]=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 Xe(g,t),R=de(Ye(M,t)),k=await A.insertInto(i).values(R).execute(),D=R;try{let b=k?.lastInsertRowid??k?.insertId??k;if(b){let j=await A.selectFrom(i).where({id:b}).executeTakeFirst();if(j)D=j}}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(!v&&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 Ze(t,"updating",p,a);for(let[U,W]of Object.entries(m))if(W!==void 0&&W!==null&&h[U]===void 0)h[U]=W}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 U=Object.keys(h).find((W)=>_(W)===_(k.field));if(U!==void 0&&!te(h[U],k.value))return d({error:`Cannot reassign ${e} ownership`},403)}if(t.traits?.useTimestamps!==!1)h.updated_at=new Date().toISOString();let D=await Xe(h,t),b=de(Ye(D,t));await A.updateTable(i).set(b).where({id:l}).execute();let j={...R,...b};try{let m=await A.selectFrom(i).where({id:l}).executeTakeFirst();if(m)j=m}catch{}return d({data:G(ne(j,t),f)})}catch(l){let{status:g,body:w}=ce(l,e,"update");return d(w,g)}};if(!z("PUT",`${u}/{id}`))E(B.put(`${u}/{id}`,y),I);if(!z("PATCH",`${u}/{id}`))E(B.patch(`${u}/{id}`,y),I)}let Z=!!t.traits?.useSoftDeletes;if(!v&&s.includes("destroy")&&!z("DELETE",`${u}/{id}`))E(B.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 L){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(!v&&s.includes("destroy")&&!z("POST",`${u}/bulk-delete`))E(B.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 L){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(nt,tt);if(e)H.warn(e)}var en=B;export{en as default};
|
|
2
|
+
var st=(e,t,n)=>()=>{if(e)try{t=e(e=0)}catch(r){n=[r]}if(n)throw n[0];return t};var Pt=import.meta.require;import{readdirSync as ht}from"fs";import{basename as bt,extname as Le,join as Rt}from"path";function kt(e){let t=[],n=(r)=>{let o;try{o=ht(r,{withFileTypes:!0})}catch{return}for(let s of o){let i=Rt(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 Qe(e,t,n){for(let r of kt(e))try{let o=Le(r),s=await import(`${r}?t=${Date.now()}`),i=s.default??s,c=i.name??bt(r,o);t[c]={...i,name:c}}catch(o){n?.(r,o)}}async function Ve(e){let t={};return await Qe(e.defaultsRoot,t,e.onImportError),await Qe(e.userRoot,t,e.onImportError),t}var He=()=>{};import _t from"process";import{parseBearerToken as St,route as B}from"@stacksjs/router";import{env as F}from"@stacksjs/env";import{projectPath as Se,storagePath as xt}from"@stacksjs/path";import{createQueryBuilder as vt,defaultConfig as qe,setConfig as ze}from"@stacksjs/query-builder";import{HttpError as L}from"@stacksjs/error-handling";import{log as z}from"@stacksjs/logging/runtime";import{isUniqueViolation as jt}from"@stacksjs/error-handling";import{isUniqueViolation as it}from"@stacksjs/error-handling";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(it(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 Pe(e,t){let n=String(t||"").replace(/^\/+|\/+$/g,""),r=String(e).replace(/^\/+/,"");return`/api/${n?`${n}/`:""}${r}`}function Ce(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??=ut(t);let s=r.get(o);if(s!==o&&s in e)n[o]=e[s]}return n}function at(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 ut(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 lt=["id","uuid","created_at","updated_at","deleted_at"];function je(e,t){let n=new Map;for(let r of[...Object.keys(e??{}),...lt]){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 ct={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"?ft(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"?gt(e):[],set:(e)=>e==null?null:Array.isArray(e)?JSON.stringify(e):e}},Ae=new WeakMap;function dt(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"?ct[s]:s;r.push({attr:o,snake:_(o),definition:s,caster:i})}return Ae.set(e,r),r}function ft(e){try{return JSON.parse(e)}catch{return e}}function gt(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=dt(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 pt(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 It(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=pt(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:C}=c,I=Object.prototype.hasOwnProperty.call(e,u);if(!I&&n==="updating")continue;let J=I?e[u]:T?f.default:void 0,W=at(C,J),N=C.validate(W);if(!N?.valid&&Array.isArray(N?.errors)&&N.errors.length>0)i=!0,s[u]=N.errors.map((P)=>f.validation?.message?.[P?.code]??P?.message??"invalid")}return i?{valid:!1,errors:s}:{valid:!0}}function we(e,t){return`${e}\x00${yt(t)}`}function Fe(e){let t=new Map;for(let n of e){let r=we(String(n.method??""),String(n.path??""));if(!t.has(r))t.set(r,n)}return t}function yt(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,mt=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,mt);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 wt(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 he(e,t,n,r,o,s){let{page:i,...c}=wt(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 We(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.`}He();function ie(e){if(e?.ownership===!1)return null;if(e?.ownership)return e.ownership;let t=Ce(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 Wt(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 Qt(e="id"){return{field:e,resolve:async(t)=>t?.id??null}}function Lt(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 Vt(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 Ht(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 Ot=Se("config/qb.ts");try{let e=(await import(Ot)).default;ze(e??qe)}catch{z.debug("[orm] No config/qb.ts override found - deriving config from DB_CONNECTION");let e=F.DB_CONNECTION||"sqlite",t=e==="turso"||e==="libsql",n=t?"sqlite":e;ze({...qe,dialect:n,database:t?{database:F.TURSO_DATABASE_URL||"",url:F.TURSO_DATABASE_URL||"",authToken:F.TURSO_AUTH_TOKEN||void 0}:n==="sqlite"?{database:F.DB_DATABASE_PATH||"database/stacks.sqlite"}:{database:F.DB_DATABASE||"stacks",host:F.DB_HOST||"127.0.0.1",port:F.DB_PORT||(n==="postgres"?5432:3306),username:F.DB_USERNAME||(n==="postgres"?"postgres":"root"),password:F.DB_PASSWORD||""}})}var ke=await Ve({defaultsRoot:xt("framework/defaults/app/Models"),userRoot:Se("app/Models"),onImportError:(e,t)=>z.warn(`[orm] Could not load model ${e}: ${t.message}`)}),At=vt(),A=At,Je=Fe(B.routes);function q(e,t){let n=we(e,t),r=Je.get(n);if(!r)return Je.set(n,{method:e,path:t}),!1;let o=String(r.path??"");return z.debug(`[orm] Skipping generated ${e} ${t} - already defined${o&&o!==t?` as ${o}`:""}.`),!0}function et(e){if(!e.attributes)return[];return Object.entries(e.attributes).filter(([t,n])=>n.hidden===!0).map(([t])=>t)}function Ke(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 Ge(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(Ke(_(u)),{kind:"hasMany",modelName:u});for(let u of o){let T=f.get(u);if(!T)continue;let C=r[T.modelName];if(!C)continue;let I=C.table||Ke(_(T.modelName)),J=et(C),W=(N)=>G(ne(N,C),J);if(T.kind==="belongsTo"||T.kind==="hasOne"){let N=`${_(T.modelName)}_id`,P=[...new Set(e.map((S)=>S[N]).filter((S)=>S!=null))];if(!P.length){for(let S of e)S[u]=null;continue}let K=await A.selectFrom(I).whereIn("id",P).get(),V=new Map;for(let S of K??[])V.set(String(S.id),W(S));for(let S of e)S[u]=V.get(String(S[N]))??null}else{let N=String(t.name??""),P=`${_(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 V=await A.selectFrom(I).whereIn(P,K).get(),S=new Map;for(let O of V??[]){let j=String(O[P]),Z=S.get(j)??[];Z.push(W(O)),S.set(j,Z)}for(let O of e)O[u]=S.get(String(O.id))??[]}}return e}async function Xe(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 Ye(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 L(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 L(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 L)throw n;throw new L(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 Tt(e){let t=e.bearerToken;if(typeof t==="function"){let n=t.call(e);if(n)return n}return St(e.headers?.get?.("authorization")??null)}async function X(e){let t=e._authenticatedUser;if(t)return t;let n=Tt(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 Ze(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 tt=await(async()=>{let e=_t.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)}})(),nt=[];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=et(t),u=Pe(o,r.prefix),T=je(t.attributes,f),{read:C,write:I,declared:J}=Ue(n),W=["store","update","destroy"].some((y)=>s.includes(y));if(W&&J&&I.length===0)z.warn(`[orm] ${e}: registering UNAUTHENTICATED mutating routes at ${u} (explicit \`middleware: []\` opt-out)`);if(["index","show"].some((y)=>s.includes(y))&&J&&C.length===0)z.debug(`[orm] ${e}: registering public read routes at ${u} (declared \`middleware.read: []\`)`);let P=!!ie(t),K=P&&!C.includes("auth")?["auth",...C]:C,V=Ie(t),S=W&&!P&&!V;if(S)nt.push(e);if(W&&V)z.debug(`[orm] ${e}: registering unscoped mutating routes at ${u} (declared \`ownership: false\`)`);let O=S&&tt==="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")&&!q("GET",u))j(B.get(u,async(y)=>{try{let a=new URL(y.url),{page:l,perPage:g,offset:h}=Be(a.searchParams),w=a.searchParams.get("sort"),p=A.selectFrom(i);p=Ee(p,w,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 H=T.get(x);if(H)p=p.where(H,"=",v)}let R=a.searchParams.get("search");if(R&&c.length>0){let x=c.slice(0,5);p=p.where((v)=>{for(let H of x)v=v.orWhere(_(H),"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=P?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=he(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 U=await p.limit(g+1).offset(h).get()||[],Q=U.length>g,re=(Q?U.slice(0,g):U).map((x)=>G(ne(x,t),f)),xe=a.searchParams.get("include");if(xe)re=await Ge(re,t,xe,ke);let rt=a.searchParams.get("with_count")==="true",ee;if(rt)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(),H=typeof v==="number"?v:Number(v?.count??v);if(Number.isFinite(H))ee=H}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 ot=he(a,l,g,re.length,Q,ee);return new Response(JSON.stringify({data:re,...ot}),{status:200,headers:oe})}catch(a){if(a instanceof L){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")&&!q("GET",`${u}/{id}`))j(B.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 h=P?await Y(t,await X(y),y):{enforced:!1,value:null,field:"",bypass:!1};if(h.enforced&&!h.bypass){if(h.value==null||!te(l[h.field],h.value))return d({error:`${e} not found`},404)}let w=G(ne(l,t),f),p=g.searchParams.get("include");if(p){let[b]=await Ge([w],t,p,ke);w=b}let M=w?.updated_at||w?.created_at,R=M?`W/"${w.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"]=h.enforced&&!h.bypass?"private, no-store":"public, max-age=30, must-revalidate",D.Vary="Authorization",new Response(JSON.stringify({data:w}),{status:200,headers:D})}catch(a){if(a instanceof L){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")&&!q("POST",u))j(B.post(u,async(y)=>{try{let a=await _e(y),l=pe(a,f),g=fe(l,c),h=await X(y);if(h){let b=await Ze(t,"creating",h,y);for(let[E,m]of Object.entries(b))if(m!==void 0&&m!==null&&g[E]===void 0)g[E]=m}let w=await Y(t,h,y);if(w.enforced&&!w.bypass){if(!h)return d({error:"Auth required"},401);let b=Ne(g,w.field,w.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 Xe(g,t),R=de(Ye(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),h=pe(g,f),w=fe(h,c),p=await X(a);if(p){let m=await Ze(t,"updating",p,a);for(let[U,Q]of Object.entries(m))if(Q!==void 0&&Q!==null&&w[U]===void 0)w[U]=Q}if(Object.keys(w).length===0)return d({error:"No fillable fields provided"},422);let M=me(w,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 U=Object.keys(w).find((Q)=>_(Q)===_(k.field));if(U!==void 0&&!te(w[U],k.value))return d({error:`Cannot reassign ${e} ownership`},403)}if(t.traits?.useTimestamps!==!1)w.updated_at=new Date().toISOString();let D=await Xe(w,t),b=de(Ye(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:h}=ce(l,e,"update");return d(h,g)}};if(!q("PUT",`${u}/{id}`))j(B.put(`${u}/{id}`,y),I);if(!q("PATCH",`${u}/{id}`))j(B.patch(`${u}/{id}`,y),I)}let Z=!!t.traits?.useSoftDeletes;if(!O&&s.includes("destroy")&&!q("DELETE",`${u}/{id}`))j(B.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),h=await Y(t,g,y);if(h.enforced&&!h.bypass){if(!g)return d({error:"Auth required"},401);let w=l[h.field];if(!te(w,h.value))return d({error:`Not your ${e}`},403)}if(Z){let w=new Date().toISOString();await A.updateTable(i).set({deleted_at:w,updated_at:w}).where({id:a}).execute()}else await A.deleteFrom(i).where({id:a}).execute();return new Response(null,{status:204})}catch(a){if(a instanceof L){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")&&!q("POST",`${u}/bulk-delete`))j(B.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=[],h=[];for(let R of l){let k=ue(R);if(k!=null)g.push(k);else h.push(R)}if(h.length>0)return d({error:"Invalid IDs in batch",invalid:h},422);let w=await X(y),p=await Y(t,w,y);if(p.enforced&&!p.bypass){if(!w)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 L){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=We(nt,tt);if(e)z.warn(e)}var on=B;export{on 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.75.
|
|
5
|
+
"version": "0.75.74",
|
|
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.75.
|
|
67
|
-
"@stacksjs/cli": "0.75.
|
|
68
|
-
"@stacksjs/config": "0.75.
|
|
69
|
-
"@stacksjs/database": "0.75.
|
|
70
|
-
"@stacksjs/env": "0.75.
|
|
71
|
-
"@stacksjs/error-handling": "0.75.
|
|
72
|
-
"@stacksjs/events": "0.75.
|
|
73
|
-
"@stacksjs/logging": "0.75.
|
|
74
|
-
"@stacksjs/model-meta": "0.75.
|
|
75
|
-
"@stacksjs/pagination": "0.75.
|
|
76
|
-
"@stacksjs/path": "0.75.
|
|
77
|
-
"@stacksjs/query-builder": "0.75.
|
|
78
|
-
"@stacksjs/realtime": "0.75.
|
|
79
|
-
"@stacksjs/router": "0.75.
|
|
80
|
-
"@stacksjs/storage": "0.75.
|
|
81
|
-
"@stacksjs/strings": "0.75.
|
|
66
|
+
"@stacksjs/cache": "0.75.74",
|
|
67
|
+
"@stacksjs/cli": "0.75.74",
|
|
68
|
+
"@stacksjs/config": "0.75.74",
|
|
69
|
+
"@stacksjs/database": "0.75.74",
|
|
70
|
+
"@stacksjs/env": "0.75.74",
|
|
71
|
+
"@stacksjs/error-handling": "0.75.74",
|
|
72
|
+
"@stacksjs/events": "0.75.74",
|
|
73
|
+
"@stacksjs/logging": "0.75.74",
|
|
74
|
+
"@stacksjs/model-meta": "0.75.74",
|
|
75
|
+
"@stacksjs/pagination": "0.75.74",
|
|
76
|
+
"@stacksjs/path": "0.75.74",
|
|
77
|
+
"@stacksjs/query-builder": "0.75.74",
|
|
78
|
+
"@stacksjs/realtime": "0.75.74",
|
|
79
|
+
"@stacksjs/router": "0.75.74",
|
|
80
|
+
"@stacksjs/storage": "0.75.74",
|
|
81
|
+
"@stacksjs/strings": "0.75.74",
|
|
82
82
|
"@stacksjs/ts-validation": "^0.5.6",
|
|
83
|
-
"@stacksjs/validation": "0.75.
|
|
83
|
+
"@stacksjs/validation": "0.75.74",
|
|
84
84
|
"bun-query-builder": "^0.3.5"
|
|
85
85
|
},
|
|
86
86
|
"peerDependencies": {
|
|
87
|
-
"@stacksjs/auth": "0.75.
|
|
88
|
-
"@stacksjs/payments": "0.75.
|
|
89
|
-
"@stacksjs/queue": "0.75.
|
|
90
|
-
"@stacksjs/search-engine": "0.75.
|
|
87
|
+
"@stacksjs/auth": "0.75.74",
|
|
88
|
+
"@stacksjs/payments": "0.75.74",
|
|
89
|
+
"@stacksjs/queue": "0.75.74",
|
|
90
|
+
"@stacksjs/search-engine": "0.75.74",
|
|
91
91
|
"stripe": "23.0.0"
|
|
92
92
|
},
|
|
93
93
|
"peerDependenciesMeta": {
|
|
@@ -108,7 +108,7 @@
|
|
|
108
108
|
}
|
|
109
109
|
},
|
|
110
110
|
"devDependencies": {
|
|
111
|
-
"@stacksjs/types": "0.75.
|
|
111
|
+
"@stacksjs/types": "0.75.74",
|
|
112
112
|
"better-dx": "^0.2.24",
|
|
113
113
|
"stripe": "23.0.0"
|
|
114
114
|
}
|