@stacksjs/orm 0.75.94 → 0.75.96

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.
@@ -224,7 +224,83 @@ export declare function routeShape(path: string): string;
224
224
  * opens writes at the same time. That is a worse trade than the bug being fixed,
225
225
  * so `{ read: [], write: ['auth'] }` says it exactly.
226
226
  */
227
- export declare function resolveApiMiddleware(useApi: unknown): { read: string[], write: string[], declared: boolean };
227
+ export declare function resolveApiMiddleware(useApi: unknown, dashboard?: unknown): { read: string[], write: string[], declared: boolean };
228
+ /**
229
+ * The `role:` middleware entry a model's `dashboard.roles` implies, or null.
230
+ *
231
+ * #1843 gave models a `dashboard.roles` list and taught the sidebar to hide
232
+ * rows whose roles a viewer does not hold. Nothing carried that list to the
233
+ * routes behind those rows, so a model declaring `roles: ['admin']` registered
234
+ * `['auth']`: the row vanished and `GET /api/<uri>` still returned every row of
235
+ * it to anyone signed in, `DELETE` and `bulk-delete` included. A hidden row is
236
+ * presentation, and the field is called `roles` - an app writing one is saying
237
+ * who may reach the model (stacksjs/stacks#2883).
238
+ *
239
+ * One entry rather than one per role, because `role:a,b` is Role.ts's any-of
240
+ * form and matches what the list means in the sidebar.
241
+ *
242
+ * `enforce: false` opts out, for a row hidden only to reduce clutter. It has to
243
+ * be the boolean: a truthy-looking typo must not reopen what the roles closed,
244
+ * so anything else reads as unset.
245
+ */
246
+ export declare function dashboardRoleMiddleware(dashboard: unknown): string | null;
247
+ /**
248
+ * Per-ability middleware for a model's generated routes.
249
+ *
250
+ * `resolveApiMiddleware` answers "may look" and "may change", which is as fine
251
+ * as the read/write split goes. It cannot say "may create, may not delete",
252
+ * because store and destroy share the write bucket - and that distinction is
253
+ * most of what giving a role fewer ACTIONS means (stacksjs/stacks#2883). An
254
+ * ability key overrides the side it belongs to:
255
+ *
256
+ * `middleware: { read: ['auth'], write: ['auth'], destroy: ['auth', 'role:admin'] }`
257
+ *
258
+ * reads as everyone signed in may read and write, and only an admin may delete.
259
+ * Declaring an ability and no side leaves the other four on the secure default,
260
+ * so narrowing one route never widens another.
261
+ *
262
+ * The coarse sides come back too: the boot warnings are phrased in terms of
263
+ * reads and writes, and they stay the right granularity for "this model
264
+ * publishes mutating routes to everyone".
265
+ */
266
+ export declare function resolveAbilityMiddleware(useApi: unknown, dashboard?: unknown): { abilities: Record<ApiAbility, string[]>, read: string[], write: string[], declared: boolean };
267
+ /**
268
+ * The one-line-per-boot report about models whose `dashboard.roles` gates the
269
+ * sidebar row while their own `useApi.middleware` leaves an ability public.
270
+ *
271
+ * `dashboard: { roles: ['admin'] }` beside `middleware: { read: [] }` says two
272
+ * opposite things: admins only, and anyone at all. Neither half can be assumed
273
+ * to be the mistake, so the generator honours the explicit middleware and names
274
+ * the pairing here. Aggregated into one line for the reason the sibling
275
+ * row-scoping report is (see `describeUnscopedMutatingModels`).
276
+ *
277
+ * Named per ability rather than per side, because that is the granularity the
278
+ * middleware resolves at: `middleware: { destroy: [] }` opens one route, and
279
+ * saying "write" would overstate it by two.
280
+ *
281
+ * Returns null when there is nothing to report, so the caller logs nothing.
282
+ */
283
+ export declare function describeContradictoryRoleGates(entries: ReadonlyArray<{ model: string, abilities: readonly string[] }>): string | null;
284
+ /**
285
+ * Consult a model's policy for one ability (stacksjs/stacks#2883).
286
+ *
287
+ * `policy.ts` declared Nova's vocabulary and nothing consulted it, because
288
+ * nothing could: resolution keyed on `args[0].constructor.name` and the
289
+ * generated handlers hold rows the query builder returned, whose constructor is
290
+ * `Object`. `Gate.inspectFor` resolves by model name, and this turns its
291
+ * three-state answer into the one thing a handler needs.
292
+ *
293
+ * Returns null to mean "nothing about this request changes", for both of the
294
+ * cases where that is right: no policy registered (the state all 107 framework
295
+ * models and every existing app are in, which is what keeps this from being a
296
+ * breaking change) and a policy that allowed it.
297
+ *
298
+ * Dependency-injected rather than importing the Gate itself, so the three
299
+ * decisions here - skip when unpoliced, fail open when the module is missing,
300
+ * fail closed when a policy throws - are testable without an auth module, a
301
+ * database or an HTTP request. The handlers are not.
302
+ */
303
+ export declare function policyDecision(modelName: string, ability: 'viewAny' | 'view' | 'create' | 'update' | 'delete', deps: PolicyGateDeps, subject?: unknown): Promise<PolicyVerdict | null>;
228
304
  /**
229
305
  * Resolve `?page=` / `?per_page=` for the index route into a clamped,
230
306
  * NaN-safe `{ page, perPage, offset }`.
@@ -324,6 +400,31 @@ export declare const SYSTEM_COLUMNS: string[];
324
400
  * ```
325
401
  */
326
402
  export declare const AUTO_CRUD_CASTERS: Record<string, { get: (v: unknown) => unknown, set: (v: unknown) => unknown }>;
403
+ /**
404
+ * The abilities the `useApi` trait generates, in the order its `routes` list
405
+ * names them. The same five strings, so a model declaring
406
+ * `routes: ['index', 'show']` and `middleware: { show: [...] }` is using one
407
+ * vocabulary rather than two.
408
+ */
409
+ export declare const API_ABILITIES: readonly ['index', 'show', 'store', 'update', 'destroy'];
410
+ /**
411
+ * The policy ability each generated route asks about.
412
+ *
413
+ * Matches the `Policy` interface in `@stacksjs/auth` rather than this file's
414
+ * own {@link API_ABILITIES}: a policy speaks Nova's vocabulary, where reading a
415
+ * collection is `viewAny` and reading one row is `view`.
416
+ * @defaultValue
417
+ * ```ts
418
+ * {
419
+ * index: 'viewAny',
420
+ * show: 'view',
421
+ * store: 'create',
422
+ * update: 'update',
423
+ * destroy: 'delete'
424
+ * }
425
+ * ```
426
+ */
427
+ export declare const POLICY_ABILITY: Record<ApiAbility, 'viewAny' | 'view' | 'create' | 'update' | 'delete'>;
327
428
  // Default page size for the auto-CRUD index route. Matches the
328
429
  // request-aware Model.paginate() / resolvePageArgs default (15) so the
329
430
  // REST list endpoint and the in-process paginator agree out of the box.
@@ -348,6 +449,29 @@ export declare interface RegisteredRouteLike {
348
449
  method?: string
349
450
  path?: unknown
350
451
  }
452
+ /** What a policy answered, flattened to what a route handler needs. */
453
+ export declare interface PolicyVerdict {
454
+ status: 403
455
+ message: string
456
+ }
457
+ /**
458
+ * As much of `@stacksjs/auth`'s Gate as a policy check needs.
459
+ *
460
+ * `user` is `any` rather than `unknown` on purpose. This is a structural
461
+ * description of a module this package must not import - the auth package
462
+ * imports the ORM's types - and the real `inspectFor` takes `UserModel | null`,
463
+ * which an `unknown` parameter is not assignable to. `authedUserFromRequest`
464
+ * already hands the user across the same boundary the same way.
465
+ */
466
+ export declare interface PolicyGate {
467
+ hasPolicy: (model: string) => boolean
468
+ inspectFor: (model: string, ability: string, user: any, ...args: any[]) => Promise<{ isAllowed: boolean, message?: string } | null>
469
+ }
470
+ /** The two things a policy check needs from the outside world. */
471
+ export declare interface PolicyGateDeps {
472
+ gate: () => Promise<PolicyGate | null>
473
+ user: () => Promise<any>
474
+ }
351
475
  /**
352
476
  * Pagination `meta` for the auto-CRUD index envelope (`{ data, meta }`).
353
477
  *
@@ -410,6 +534,7 @@ export declare interface IndexPaginator {
410
534
  */
411
535
  export type WriteValidationResult = | { valid: true }
412
536
  | { valid: false, errors: Record<string, string[]> }
537
+ export type ApiAbility = (typeof API_ABILITIES)[number];
413
538
  /**
414
539
  * What to do about a model whose generated mutating routes have no row-level
415
540
  * scoping. See `ApiSecurityOptions` in @stacksjs/types for the full reasoning.
package/dist/index.js CHANGED
@@ -1,27 +1,27 @@
1
1
  // @bun
2
- var pt=(e,n,t)=>()=>{if(e)try{n=e(e=0)}catch(r){t=[r]}if(t)throw t[0];return n};var zn=import.meta.require;import{readdirSync as Yr}from"fs";import{basename as Xr,extname as Ut,join as Zr}from"path";function eo(e){let n=[],t=(r)=>{let o;try{o=Yr(r,{withFileTypes:!0})}catch{return}for(let a of o){let i=Zr(r,a.name);if(a.isDirectory()){t(i);continue}if(![".ts",".js"].includes(Ut(a.name)))continue;if(a.name.startsWith(".")||a.name.startsWith("index"))continue;n.push(i)}};return t(e),n.sort()}async function Gt(e,n,t,r){for(let o of eo(e))try{let a=Ut(o),i=await import(`${o}?t=${Date.now()}`),s=i.default??i,u=s.name??Xr(o,a);t.models[u]={...s,name:u},t.origins[u]=n}catch(a){r?.(o,a)}}async function to(e){let n={models:{},origins:{}};return await Gt(e.defaultsRoot,"default",n,e.onImportError),await Gt(e.userRoot,"app",n,e.onImportError),n}async function Kt(e){return(await to(e)).models}function Uu(e,n){let t,r="default";if(n!==void 0&&n!==null)t=n.split(","),r="env";else if(typeof e==="string")t=[e],r="config";else if(Array.isArray(e)&&e.every((a)=>typeof a==="string"))t=e,r="config";if(t===void 0)return{all:!0,own:!1,names:new Set,source:r};let o=t.map((a)=>a.trim().toLowerCase()).filter(Boolean);if(o.length===0||o.includes("none"))return{all:!1,own:!1,names:new Set,source:r};if(o.includes("all"))return{all:!0,own:!1,names:new Set,source:r};return{all:!1,own:o.includes("own"),names:new Set(o.filter((a)=>a!=="own")),source:r}}function Ku(e,n){let t={},r=new Set;for(let[o,a]of Object.entries(e.models)){if(!a?.traits?.useApi)continue;let i=o.toLowerCase(),s=n.names.has(i);if(s)r.add(i);if(n.all||s||n.own&&e.origins[o]==="app")t[o]=a}return{models:t,unmatched:[...n.names].filter((o)=>!r.has(o)).sort()}}var Wt=()=>{};import{path as Vt}from"@stacksjs/path";async function We(){return Kt({defaultsRoot:Vt.frameworkPath("defaults/app/Models"),userRoot:Vt.userModelsPath()})}var Ve=pt(()=>{Wt()});import"@stacksjs/validation/runtime";import{log as xe}from"@stacksjs/cli";import{db as mt,mutationCount as gt}from"@stacksjs/database/runtime";async function Hn(e,n={}){let{olderThanDays:t=30,column:r="created_at",query:o}=n;try{if(o){let u=mt.deleteFrom(e);u=o(u);let c=gt(await u.execute());return xe.info(`Pruned ${c} records from ${e}`),c}let a=new Date;a.setDate(a.getDate()-t);let i=await mt.deleteFrom(e).where(r,"<",a.toISOString()).execute(),s=gt(i);return xe.info(`Pruned ${s} records from ${e} older than ${t} days`),s}catch(a){throw xe.error(`Failed to prune ${e}:`,a),a}}async function Us(e,n={}){return Hn(e,n)}function Ks(e){if(!e?.prunable)return null;if(typeof e.prunable==="boolean")return{olderThanDays:30,column:"created_at"};return e.prunable}import{createCipheriv as Jn,createDecipheriv as Yn,createHash as Xn,randomBytes as Zn}from"crypto";import{log as ie}from"@stacksjs/logging";var yt="enc:",wt="aes-256-gcm",er=12,ae=null;async function bt(){if(ae)return ae;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 ae=Xn("sha256").update(e).digest(),ae}function V(e){return typeof e==="string"&&e.startsWith(yt)}async function Ce(e){if(e==null)return e;if(V(e))return e;if(typeof e!=="string")return e;let n=await bt();if(!n)return ie.warn("[orm] encrypted attribute: APP_KEY not set - storing value in plaintext"),e;let t=Zn(er),r=Jn(wt,n,t),o=Buffer.concat([r.update(e,"utf8"),r.final()]),a=r.getAuthTag();return`${yt}${t.toString("base64")}:${a.toString("base64")}:${o.toString("base64")}`}async function Me(e){if(e==null)return e;if(typeof e!=="string")return e;if(!V(e))return e;try{let n=await bt();if(!n)return ie.warn("[orm] encrypted attribute: APP_KEY not set - cannot decrypt"),null;let[,t,r,o]=e.split(":");if(!t||!r||!o)return ie.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=Yn(wt,n,a);return u.setAuthTag(i),Buffer.concat([u.update(s),u.final()]).toString("utf8")}catch(n){return ie.warn("[orm] encrypted attribute: decrypt failed (key rotation? corrupted ciphertext?)",{error:n}),null}}function ve(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 tr}from"@stacksjs/database/runtime";import{log as L}from"@stacksjs/logging";var nr=[/^password$/i,/^password_hash$/i,/^api_key$/i,/_token$/i,/_secret$/i,/^remember_token$/i],kt="model_audits",Oe=null;function rr(e){Oe=e}async function se(){if(Oe!=null)return Oe;try{let e=await import("@stacksjs/router").catch(()=>null);if(!e)return null;let n=e.getCurrentRequest;if(typeof n!=="function")return null;let t=n();if(!t)return null;return(t.user??t._user)?.id??null}catch{return null}}function Q(e){if(!e||typeof e!=="object")return null;let n={};for(let[t,r]of Object.entries(e)){if(nr.some((o)=>o.test(t)))continue;n[t]=r}return n}function N(e){if(!e||typeof e!=="object")return null;let n=e;if(n._attributes&&typeof n._attributes==="object")return{...n._attributes};return{...e}}function or(e,n){if(!e||!n)return{old:e,next:n};let t={},r={},o=new Set([...Object.keys(e),...Object.keys(n)]);for(let a of o)if(e[a]!==n[a])t[a]=e[a],r[a]=n[a];return{old:t,next:r}}async function ue(e,n=!1){try{let{db:t}=await import("@stacksjs/database/runtime");await t.insertInto(kt).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:tr()}).executeTakeFirst()}catch(t){if(L.warn(`[orm] audit row write failed for ${e.auditable_type}#${String(e.auditable_id)} (${e.event})`,{error:t}),n)throw t}}function Tt(e){return{async audits(n){try{let{db:t}=await import("@stacksjs/database/runtime");return(await t.selectFrom(kt).selectAll().where("auditable_type","=",e).where("auditable_id","=",n).orderBy("created_at","desc").execute()??[]).map((o)=>({...o,old_values:typeof o.old_values==="string"?ht(o.old_values):o.old_values,new_values:typeof o.new_values==="string"?ht(o.new_values):o.new_values}))}catch(t){return L.warn(`[orm] audits() lookup failed for ${e}#${String(n)}`,{error:t}),[]}}}}function ht(e){try{return JSON.parse(e)}catch{return e}}function Rt(e){if(e&&typeof e==="object"&&"transactional"in e)return{transactional:e.transactional===!0};return{transactional:!1}}function St(e,n,t="id",r={}){let o=r.transactional===!0,a=e;if(typeof e.audits!=="function")e.audits=Tt(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=N(d),m=p?.[t];if(m!=null){let g=await se();await ue({auditable_type:n,auditable_id:m,event:"created",old_values:null,new_values:Q(p),user_id:g},o)}}catch(p){if(L.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 se():null;for(let m of Array.isArray(d)?d:[]){let g=N(m),w=g?.[t];if(w==null)continue;await ue({auditable_type:n,auditable_id:w,event:"created",old_values:null,new_values:Q(g),user_id:p},o)}}catch(p){if(L.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"?N(await p.call(a,f)):null,g=await c.call(this,f,d);try{let w=N(g)??(typeof p==="function"?N(await p.call(a,f)):null),{old:h,next:b}=or(m,w);if(b&&Object.keys(b).length>0){let k=await se();await ue({auditable_type:n,auditable_id:f,event:"updated",old_values:Q(h),new_values:Q(b),user_id:k},o)}}catch(w){if(L.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"?N(await m.call(a,p)):null,w=await d.call(this,p);try{if(w!==!1&&g){let h=await se();await ue({auditable_type:n,auditable_id:p,event:"deleted",old_values:Q(g),new_values:null,user_id:h},o)}}catch(h){if(L.warn(`[orm] audit(${f}) failed for ${n}#${String(p)}`,{error:h}),o)throw h}return w})}};l("delete"),l("softDelete")}import{db as ar,sql as ir,sqlDateTime as De}from"@stacksjs/database/runtime";function M(e,n){if(typeof e!=="number"||!Number.isFinite(e)||e<=0)throw Error(`[orm/commentable] ${n} requires a positive numeric id (received ${String(e)})`)}var z="commentable_upvotes",H="commentables";function sr(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 _t=["pending","approved"];function Ee(e){let n=ar;return{async comments(t){return M(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(ir`count(*) as count`).where("commentables_id","=",t).where("commentables_type","=",e).executeTakeFirst();return Number(r?.count)||0},async addComment(t,r,o={}){if(M(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(!_t.includes(a))throw Error(`[orm/commentable] addComment status must be one of ${_t.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:De(),updated_at:De()};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){M(t,"upvoteComment"),M(r,"upvoteComment");let o=()=>n.selectFrom(z).where("upvoteable_id","=",t).where("upvoteable_type","=",H).where("user_id","=",r).selectAll().executeTakeFirst(),a=await o();if(a)return a;try{await n.insertInto(z).values({upvoteable_id:t,upvoteable_type:H,user_id:r,created_at:De()}).execute()}catch(i){if(!sr(i))throw i}return await o()},async removeCommentUpvote(t,r){M(t,"removeCommentUpvote"),M(r,"removeCommentUpvote"),await n.deleteFrom(z).where("upvoteable_id","=",t).where("upvoteable_type","=",H).where("user_id","=",r).execute()},async commentUpvoteCount(t){M(t,"commentUpvoteCount");let r=await n.selectFrom(z).select("count(*) as count").where("upvoteable_id","=",t).where("upvoteable_type","=",H).executeTakeFirst();return Number(r?.count)||0},async hasUpvotedComment(t,r){return M(t,"hasUpvotedComment"),M(r,"hasUpvotedComment"),!!await n.selectFrom(z).where("upvoteable_id","=",t).where("upvoteable_type","=",H).where("user_id","=",r).selectAll().executeTakeFirst()}}}import{db as ur,sql as cr,sqlDateTime as At}from"@stacksjs/database/runtime";function Fe(e,n){if(typeof e!=="number"||!Number.isFinite(e)||e<=0)throw Error(`[orm/taggable] ${n} requires a positive numeric id (received ${String(e)})`)}function je(e){let n=ur;return{async tags(t){return Fe(t,"tags"),await n.selectFrom("taggables").where("taggable_id","=",t).where("taggable_type","=",e).selectAll().execute()},async tagCount(t){Fe(t,"tagCount");let r=await n.selectFrom("taggables").select(cr`count(*) as count`).where("taggable_id","=",t).where("taggable_type","=",e).executeTakeFirst();return Number(r?.count)||0},async addTag(t,r){if(Fe(t,"addTag"),!r||typeof r.name!=="string"||r.name.trim().length===0)throw Error("[orm/taggable] addTag requires a non-empty tag.name");return await n.insertInto("taggables").values({...r,taggable_id:t,taggable_type:e,slug:r.name.toLowerCase().replace(/[^a-z0-9]+/g,"-"),is_active:!0,created_at:At(),updated_at:At()}).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 lr,sqlDateTime as ce}from"@stacksjs/database/runtime";function $e(e){let n=lr;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:ce(),updated_at:ce()}).execute(),i=await a();return await n.insertInto("categorizable_models").values({categorizable_id:r,categorizable_type:e,category_id:i?.id,created_at:ce(),updated_at:ce()}).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 dr,sqlDateTime as fr}from"@stacksjs/database/runtime";function Ie(e,n){let t=dr,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=fr();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 pr}from"module";import{db as mr}from"@stacksjs/database/runtime";var gr=pr(import.meta.url);class Be extends Error{constructor(e){super(`No subscription ${e} belongs to this user`);this.name="SubscriptionNotOwnedError"}}async function v(){let{paymentDriver:e}=await import("@stacksjs/payments");return e()}async function S(e){let{assertStripeDriver:n}=await import("@stacksjs/payments");n(e)}function Pt(e){let n=mr;return{async paymentCustomer(t){return(await v()).customer(t)},async charge(t,r,o,a={}){return(await v()).charge(t,r,o,a)},async createPayment(t,r,o={}){return(await v()).createPayment(t,r,o)},async checkout(t,r){return(await v()).checkout(t,r)},async paymentMethods(t){return(await v()).paymentMethods(t)},async removePaymentMethod(t,r){return(await v()).removePaymentMethod(t,r)},async newSubscription(t,r,o){return(await v()).subscribe(t,o,{type:r})},async cancelSubscription(t,r,o={}){if(!await n.selectFrom("subscriptions").where("provider_id","=",r).where("user_id","=",t.id).select(["id"]).executeTakeFirst())throw new Be(r);return(await v()).cancelSubscription(r,o)},async activeSubscription(t){let r=await n.selectFrom("subscriptions").where("user_id","=",t.id).where("provider_status","=","active").selectAll().executeTakeFirst();if(!r)return;let o=(await(await v()).subscriptions(t)).find((a)=>a.id===r.provider_id);return o?{subscription:r,providerSubscription:o}:void 0},async syncStripeCustomerDetails(t,r){await S("syncStripeCustomerDetails");let{manageCustomer:o}=await import("@stacksjs/payments");return await o.syncStripeCustomerDetails(t,r)},async createStripeUser(t,r){await S("createStripeUser");let{manageCustomer:o}=await import("@stacksjs/payments");return await o.createStripeCustomer(t,r)},async updateStripeUser(t,r){await S("updateStripeUser");let{manageCustomer:o}=await import("@stacksjs/payments");return await o.updateStripeCustomer(t,r)},async deleteStripeUser(t){await S("deleteStripeUser");let{manageCustomer:r}=await import("@stacksjs/payments");return await r.deleteStripeUser(t)},async createOrGetStripeUser(t,r){await S("createOrGetStripeUser");let{manageCustomer:o}=await import("@stacksjs/payments");return await o.createOrGetStripeUser(t,r)},async retrieveStripeUser(t){await S("retrieveStripeUser");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){await S("setDefaultPaymentMethod");let{managePaymentMethod:o}=await import("@stacksjs/payments");if(typeof r==="string")await o.setUserDefaultPayment(t,r);else await o.setDefaultPaymentMethod(t,r)},async addPaymentMethod(t,r){await S("addPaymentMethod");let{managePaymentMethod:o,toStoredPaymentMethod:a}=await import("@stacksjs/payments");return a(await o.addPaymentMethod(t,r))},async updateSubscription(t,r,o){await S("updateSubscription");let{manageSubscription:a,summarizeSubscription:i}=await import("@stacksjs/payments");return i(await a.update(t,r,o,{}))},async createSetupIntent(t,r={}){await S("createSetupIntent");let{manageSetupIntent:o}=await import("@stacksjs/payments"),a=await o.create(t,r);if(!a.client_secret)throw Error("Stripe returned a SetupIntent without a client secret.");return{id:a.id,clientConfirmation:{provider:"stripe",clientSecret:a.client_secret}}},async storeTransaction(t,r,o){let{manageTransaction:a}=await import("@stacksjs/payments");return await a.store(t,r,o)},async subscriptionHistory(t){await S("subscriptionHistory");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={}){await S("Stripe Connect (connectAccount)");let o=r.accountColumn||"stripe_account_id",a=(t._attributes??t)[o];if(!a)return null;let i=await J();try{return await i.accounts.retrieve(a)}catch{return null}},async createConnectAccount(t,r={}){await S("Stripe Connect (createConnectAccount)");let o=r.accountColumn||"stripe_account_id",a=t._attributes??t,i=a[o],s=await J();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){await S("Stripe Connect (connectOnboardLink)");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 J()).accountLinks.create({account:i,refresh_url:r.refreshUrl,return_url:r.returnUrl,type:r.type??"account_onboarding"})).url,accountId:i}},async syncConnectStatus(t,r={}){await S("Stripe Connect (syncConnectStatus)");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 J()).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){await S("Stripe Connect (chargeWithSplit)");let o=await J(),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 yr={syncStripeCustomerDetails:!0,createStripeUser:!0,updateStripeUser:!0,deleteStripeUser:!0,createOrGetStripeUser:!0,retrieveStripeUser:!0,defaultPaymentMethod:!0,setDefaultPaymentMethod:!0,removePaymentMethod:!0,addPaymentMethod:!0,paymentMethods:!0,paymentCustomer:!0,charge:!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},le=Object.freeze(Object.keys(yr));function wr(e){return le.every((n)=>typeof Reflect.get(e,n)==="function")}function J(){let e=globalThis.process?.env?.STRIPE_SECRET_KEY;if(!e)throw Error("Stripe Connect: STRIPE_SECRET_KEY not configured");let n;try{n=gr("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 jr}from"@stacksjs/error-handling";import{isUniqueViolation as br}from"@stacksjs/error-handling";function hr(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(br(e))return{status:409,body:{error:`${n} already exists`}};return{status:500,body:{error:`Failed to ${t} ${n}`,detail:String(e)}}}function x(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 kr(e){let n={};for(let[t,r]of Object.entries(e))n[x(t)]=r;return n}function lu(e,n){let t=String(n||"").replace(/^\/+|\/+$/g,""),r=String(e).replace(/^\/+/,"");return`/api/${t?`${t}/`:""}${r}`}function Dt(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 Et(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 du(e){return e?.ownership===!1}function fu(e,n,t){let r=Object.keys(e).find((a)=>x(a)===x(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(x(a)===x(n))delete o[a];return o[n]=t,{data:o}}function Tr(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=x(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 Rr(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??=_r(n);let a=r.get(o);if(a!==o&&a in e)t[o]=e[a]}return t}function Sr(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 xt=new WeakMap,Ct=new WeakMap;function Le(e){let n=xt.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:x(r)}));return xt.set(e,t),t}function _r(e){let n=Le(e),t=Ct.get(n);if(t)return t;let r=new Map(n.map(({field:o,snake:a})=>[o,a]));return Ct.set(n,r),r}function pu(e,n){if(!n.length)return e;let t={...e};for(let{field:r,snake:o}of Le(n))if(delete t[r],o!==r)delete t[o];return t}function mu(e,n){if(!e||n.length===0)return e;let t={...e};for(let{field:r,snake:o}of Le(n))if(delete t[r],o!==r)delete t[o];return t}var Ar=["id","uuid","created_at","updated_at","deleted_at"];function gu(e,n){let t=new Map;for(let r of[...Object.keys(e??{}),...Ar]){let o=x(r);if(!/^\w+$/.test(o))continue;t.set(r,o),t.set(o,o)}for(let r of n)t.delete(r),t.delete(x(r));return t}function yu(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 Pr={string:{get:(e)=>e!=null?String(e):null,set:(e)=>e!=null?String(e):null},number:{get:(e)=>e!=null?Number(e):null,set:(e)=>e!=null?Number(e):null},integer:{get:(e)=>e!=null?Math.trunc(Number(e)):null,set:(e)=>e!=null?Math.trunc(Number(e)):null},float:{get:(e)=>e!=null?Number.parseFloat(String(e)):null,set:(e)=>e!=null?Number.parseFloat(String(e)):null},boolean:{get:(e)=>e===1||e==="1"||e===!0||e==="true",set:(e)=>e===!0||e===1||e==="1"||e==="true"?1:0},json:{get:(e)=>e==null?null:typeof e==="string"?Cr(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"?Mr(e):[],set:(e)=>e==null?null:Array.isArray(e)?JSON.stringify(e):e}},Mt=new WeakMap;function xr(e,n){let t=Mt.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"?Pr[a]:a;r.push({attr:o,snake:x(o),definition:a,caster:i})}return Mt.set(e,r),r}function Cr(e){try{return JSON.parse(e)}catch{return e}}function Mr(e){try{return JSON.parse(e)}catch{return[]}}function wu(e,n,t){if(!e||typeof e!=="object"||!n)return e;let r=Object.keys(n);if(r.length===0)return e;let o=xr(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 vt=new WeakMap;function vr(e){let n=vt.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 vt.set(e,t),t}function Ft(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 jt(e,n,t){let r=n?.attributes;if(!r||typeof r!=="object")return{valid:!0};let o=vr(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=Sr(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 Or(e,n){return`${e}\x00${Dr(n)}`}function bu(e){let n=new Map;for(let t of e){let r=Or(String(t.method??""),String(t.path??""));if(!n.has(r))n.set(r,t)}return n}function Dr(e){return e.replace(/\{[^}]*\}/g,"{}").replace(/:[^/]+/g,"{}")}function Ne(e){if(Array.isArray(e))return e.filter((n)=>typeof n==="string"&&n.length>0);return typeof e==="string"&&e?[e]:[]}function hu(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?Ne(o.read):["auth"],write:"write"in o?Ne(o.write):["auth"],declared:!0}}let r=Ne(t);return{read:r,write:r,declared:!0}}var Ot=15,Er=100;function ku(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(Ot),10),o=Math.min(Number.isFinite(r)?Math.max(1,r):Ot,Er);return{page:t,perPage:o,offset:(t-1)*o}}function de(e,n){let t=new URL(e.toString());return t.searchParams.set("page",String(n)),`${t.pathname}${t.search}`}function Fr(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?de(e,n-1):null,next_page_url:o?de(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=de(e,1),u.last_page_url=de(e,c)}return u}function Tu(e,n,t,r,o,a){let{page:i,...s}=Fr(e,n,t,r,o,a);return{current_page:i,...s}}function Ru(e,n){return(n??e??"").toString().trim().toLowerCase()==="warn"?"warn":"deny"}function Su(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 $r(e){if(e?.ownership===!1)return null;if(e?.ownership)return e.ownership;let n=Dt(e);if(n)return{field:n,resolve:async(r,o)=>{let{resolveAuthenticatedTeamId:a}=await import("@stacksjs/auth");return a(qe(o))}};let t=Et(e);if(t)return{field:t,resolve:async(r)=>r?.id??null};return null}function qe(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 Ir(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 Br(e="id"){return{field:e,resolve:async(n)=>n?.id??null}}function Nr(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(qe(t));if(a==null)return[];return(await o.where("team_id",a).get()??[]).map((s)=>s.id).filter((s)=>s!=null)}catch{return[]}}}}function Lr(e="id"){return{field:e,resolve:async(n,t)=>{try{let{resolveAuthenticatedTeamId:r}=await import("@stacksjs/auth");return await r(qe(t))}catch{return null}}}}function qr(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=$r(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 Gr}from"@stacksjs/router";var $t=new WeakMap;function It(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 Ur(e,n){if(typeof e.find==="function")return e.find(n);let t=await e.findMany?.([n]);return It(t??[]).get(n)}async function Kr(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=It(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 Mu(e,n){let t=Gr();if(!t)return Ur(e,n);let r=$t.get(t);if(!r)r=new WeakMap,$t.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(()=>{Kr(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 Eu}from"@stacksjs/database/runtime";class Wr{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 Ge}from"@stacksjs/database/runtime";async function Ue(e,n){return await Ge.transaction(e,n)}async function $u(e){return await Ge.savepoint(e)}function Iu(e,n){return Ge.transactional(e,n)}import{randomUUID as no}from"crypto";import{db as C,getDatabaseDialect as ro,parseSqlDateTime as oo,sqlDateTime as Ht}from"@stacksjs/database/runtime";import{plural as Vr,snakeCase as Y}from"@stacksjs/strings";var Bt=new Set(["anonymize","delete","keep"]),Nt=new Set(["anonymize","delete"]),Lt=new Set(["consent","contract","legal_obligation","vital_interests","public_task","legitimate_interests"]),D="User";class Ke extends Error{problems;constructor(e){super(`GDPR declarations cannot be honoured:
2
+ var mt=(e,n,t)=>()=>{if(e)try{n=e(e=0)}catch(r){t=[r]}if(t)throw t[0];return n};var Jn=import.meta.require;import{readdirSync as no}from"fs";import{basename as ro,extname as Wt,join as oo}from"path";function io(e){let n=[],t=(r)=>{let o;try{o=no(r,{withFileTypes:!0})}catch{return}for(let i of o){let a=oo(r,i.name);if(i.isDirectory()){t(a);continue}if(![".ts",".js"].includes(Wt(i.name)))continue;if(i.name.startsWith(".")||i.name.startsWith("index"))continue;n.push(a)}};return t(e),n.sort()}async function Kt(e,n,t,r){for(let o of io(e))try{let i=Wt(o),a=await import(`${o}?t=${Date.now()}`),s=a.default??a,u=s.name??ro(o,i);t.models[u]={...s,name:u},t.origins[u]=n}catch(i){r?.(o,i)}}async function ao(e){let n={models:{},origins:{}};return await Kt(e.defaultsRoot,"default",n,e.onImportError),await Kt(e.userRoot,"app",n,e.onImportError),n}async function Vt(e){return(await ao(e)).models}function Ju(e,n){let t,r="default";if(n!==void 0&&n!==null)t=n.split(","),r="env";else if(typeof e==="string")t=[e],r="config";else if(Array.isArray(e)&&e.every((i)=>typeof i==="string"))t=e,r="config";if(t===void 0)return{all:!0,own:!1,names:new Set,source:r};let o=t.map((i)=>i.trim().toLowerCase()).filter(Boolean);if(o.length===0||o.includes("none"))return{all:!1,own:!1,names:new Set,source:r};if(o.includes("all"))return{all:!0,own:!1,names:new Set,source:r};return{all:!1,own:o.includes("own"),names:new Set(o.filter((i)=>i!=="own")),source:r}}function Yu(e,n){let t={},r=new Set;for(let[o,i]of Object.entries(e.models)){if(!i?.traits?.useApi)continue;let a=o.toLowerCase(),s=n.names.has(a);if(s)r.add(a);if(n.all||s||n.own&&e.origins[o]==="app")t[o]=i}return{models:t,unmatched:[...n.names].filter((o)=>!r.has(o)).sort()}}var Qt=()=>{};import{path as zt}from"@stacksjs/path";async function Ve(){return Vt({defaultsRoot:zt.frameworkPath("defaults/app/Models"),userRoot:zt.userModelsPath()})}var Qe=mt(()=>{Qt()});import"@stacksjs/validation/runtime";import{log as ve}from"@stacksjs/cli";import{db as gt,mutationCount as yt}from"@stacksjs/database/runtime";async function Yn(e,n={}){let{olderThanDays:t=30,column:r="created_at",query:o}=n;try{if(o){let u=gt.deleteFrom(e);u=o(u);let c=yt(await u.execute());return ve.info(`Pruned ${c} records from ${e}`),c}let i=new Date;i.setDate(i.getDate()-t);let a=await gt.deleteFrom(e).where(r,"<",i.toISOString()).execute(),s=yt(a);return ve.info(`Pruned ${s} records from ${e} older than ${t} days`),s}catch(i){throw ve.error(`Failed to prune ${e}:`,i),i}}async function zs(e,n={}){return Yn(e,n)}function Hs(e){if(!e?.prunable)return null;if(typeof e.prunable==="boolean")return{olderThanDays:30,column:"created_at"};return e.prunable}import{createCipheriv as Xn,createDecipheriv as Zn,createHash as er,randomBytes as tr}from"crypto";import{log as se}from"@stacksjs/logging";var wt="enc:",bt="aes-256-gcm",nr=12,ae=null;async function ht(){if(ae)return ae;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 ae=er("sha256").update(e).digest(),ae}function Q(e){return typeof e==="string"&&e.startsWith(wt)}async function Me(e){if(e==null)return e;if(Q(e))return e;if(typeof e!=="string")return e;let n=await ht();if(!n)return se.warn("[orm] encrypted attribute: APP_KEY not set - storing value in plaintext"),e;let t=tr(nr),r=Xn(bt,n,t),o=Buffer.concat([r.update(e,"utf8"),r.final()]),i=r.getAuthTag();return`${wt}${t.toString("base64")}:${i.toString("base64")}:${o.toString("base64")}`}async function Oe(e){if(e==null)return e;if(typeof e!=="string")return e;if(!Q(e))return e;try{let n=await ht();if(!n)return se.warn("[orm] encrypted attribute: APP_KEY not set - cannot decrypt"),null;let[,t,r,o]=e.split(":");if(!t||!r||!o)return se.warn("[orm] encrypted attribute: malformed envelope, returning null"),null;let i=Buffer.from(t,"base64"),a=Buffer.from(r,"base64"),s=Buffer.from(o,"base64"),u=Zn(bt,n,i);return u.setAuthTag(a),Buffer.concat([u.update(s),u.final()]).toString("utf8")}catch(n){return se.warn("[orm] encrypted attribute: decrypt failed (key rotation? corrupted ciphertext?)",{error:n}),null}}function De(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 rr}from"@stacksjs/database/runtime";import{log as q}from"@stacksjs/logging";var or=[/^password$/i,/^password_hash$/i,/^api_key$/i,/_token$/i,/_secret$/i,/^remember_token$/i],Tt="model_audits",Ee=null;function ir(e){Ee=e}async function ue(){if(Ee!=null)return Ee;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 z(e){if(!e||typeof e!=="object")return null;let n={};for(let[t,r]of Object.entries(e)){if(or.some((o)=>o.test(t)))continue;n[t]=r}return n}function L(e){if(!e||typeof e!=="object")return null;let n=e;if(n._attributes&&typeof n._attributes==="object")return{...n._attributes};return{...e}}function ar(e,n){if(!e||!n)return{old:e,next:n};let t={},r={},o=new Set([...Object.keys(e),...Object.keys(n)]);for(let i of o)if(e[i]!==n[i])t[i]=e[i],r[i]=n[i];return{old:t,next:r}}async function ce(e,n=!1){try{let{db:t}=await import("@stacksjs/database/runtime");await t.insertInto(Tt).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:rr()}).executeTakeFirst()}catch(t){if(q.warn(`[orm] audit row write failed for ${e.auditable_type}#${String(e.auditable_id)} (${e.event})`,{error:t}),n)throw t}}function Rt(e){return{async audits(n){try{let{db:t}=await import("@stacksjs/database/runtime");return(await t.selectFrom(Tt).selectAll().where("auditable_type","=",e).where("auditable_id","=",n).orderBy("created_at","desc").execute()??[]).map((o)=>({...o,old_values:typeof o.old_values==="string"?kt(o.old_values):o.old_values,new_values:typeof o.new_values==="string"?kt(o.new_values):o.new_values}))}catch(t){return q.warn(`[orm] audits() lookup failed for ${e}#${String(n)}`,{error:t}),[]}}}}function kt(e){try{return JSON.parse(e)}catch{return e}}function St(e){if(e&&typeof e==="object"&&"transactional"in e)return{transactional:e.transactional===!0};return{transactional:!1}}function _t(e,n,t="id",r={}){let o=r.transactional===!0,i=e;if(typeof e.audits!=="function")e.audits=Rt(n).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=L(d),m=p?.[t];if(m!=null){let g=await ue();await ce({auditable_type:n,auditable_id:m,event:"created",old_values:null,new_values:z(p),user_id:g},o)}}catch(p){if(q.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 a(async()=>{let d=await u.apply(this,f);try{let p=Array.isArray(d)&&d.length?await ue():null;for(let m of Array.isArray(d)?d:[]){let g=L(m),w=g?.[t];if(w==null)continue;await ce({auditable_type:n,auditable_id:w,event:"created",old_values:null,new_values:z(g),user_id:p},o)}}catch(p){if(q.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 a(async()=>{let p=i.find,m=typeof p==="function"?L(await p.call(i,f)):null,g=await c.call(this,f,d);try{let w=L(g)??(typeof p==="function"?L(await p.call(i,f)):null),{old:h,next:b}=ar(m,w);if(b&&Object.keys(b).length>0){let k=await ue();await ce({auditable_type:n,auditable_id:f,event:"updated",old_values:z(h),new_values:z(b),user_id:k},o)}}catch(w){if(q.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 a(async()=>{let m=i.find,g=typeof m==="function"?L(await m.call(i,p)):null,w=await d.call(this,p);try{if(w!==!1&&g){let h=await ue();await ce({auditable_type:n,auditable_id:p,event:"deleted",old_values:z(g),new_values:null,user_id:h},o)}}catch(h){if(q.warn(`[orm] audit(${f}) failed for ${n}#${String(p)}`,{error:h}),o)throw h}return w})}};l("delete"),l("softDelete")}import{db as sr,sql as ur,sqlDateTime as je}from"@stacksjs/database/runtime";function v(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 H="commentable_upvotes",J="commentables";function cr(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 At=["pending","approved"];function Fe(e){let n=sr;return{async comments(t){return v(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(ur`count(*) as count`).where("commentables_id","=",t).where("commentables_type","=",e).executeTakeFirst();return Number(r?.count)||0},async addComment(t,r,o={}){if(v(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 i=o.status??"pending";if(!At.includes(i))throw Error(`[orm/commentable] addComment status must be one of ${At.join(", ")} (received ${String(i)})`);let a={title:r.title?.trim()??"",body:r.body,commentables_id:t,commentables_type:e,status:i,approved_at:i==="approved"?Date.now():null,created_at:je(),updated_at:je()};for(let c of["author_name","author_email","user_id"])if(r[c]!=null)a[c]=r[c];let s=await n.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 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){v(t,"upvoteComment"),v(r,"upvoteComment");let o=()=>n.selectFrom(H).where("upvoteable_id","=",t).where("upvoteable_type","=",J).where("user_id","=",r).selectAll().executeTakeFirst(),i=await o();if(i)return i;try{await n.insertInto(H).values({upvoteable_id:t,upvoteable_type:J,user_id:r,created_at:je()}).execute()}catch(a){if(!cr(a))throw a}return await o()},async removeCommentUpvote(t,r){v(t,"removeCommentUpvote"),v(r,"removeCommentUpvote"),await n.deleteFrom(H).where("upvoteable_id","=",t).where("upvoteable_type","=",J).where("user_id","=",r).execute()},async commentUpvoteCount(t){v(t,"commentUpvoteCount");let r=await n.selectFrom(H).select("count(*) as count").where("upvoteable_id","=",t).where("upvoteable_type","=",J).executeTakeFirst();return Number(r?.count)||0},async hasUpvotedComment(t,r){return v(t,"hasUpvotedComment"),v(r,"hasUpvotedComment"),!!await n.selectFrom(H).where("upvoteable_id","=",t).where("upvoteable_type","=",J).where("user_id","=",r).selectAll().executeTakeFirst()}}}import{db as lr,sql as dr,sqlDateTime as Pt}from"@stacksjs/database/runtime";function $e(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 Ie(e){let n=lr;return{async tags(t){return $e(t,"tags"),await n.selectFrom("taggables").where("taggable_id","=",t).where("taggable_type","=",e).selectAll().execute()},async tagCount(t){$e(t,"tagCount");let r=await n.selectFrom("taggables").select(dr`count(*) as count`).where("taggable_id","=",t).where("taggable_type","=",e).executeTakeFirst();return Number(r?.count)||0},async addTag(t,r){if($e(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:Pt(),updated_at:Pt()}).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 fr,sqlDateTime as le}from"@stacksjs/database/runtime";function Be(e){let n=fr;async function t(r){return(await n.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 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 i=()=>n.selectFrom("categorizables").where("name","=",o.name).where("categorizable_type","=",e).selectAll().executeTakeFirst(),a=await i();if(!a)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:le(),updated_at:le()}).execute(),a=await i();return await n.insertInto("categorizable_models").values({categorizable_id:r,categorizable_type:e,category_id:a?.id,created_at:le(),updated_at:le()}).execute(),a},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 pr,sqlDateTime as mr}from"@stacksjs/database/runtime";function Ne(e,n){let t=pr,r=n?.table||`${e}_likes`,o=n?.foreignKey||`${e.replace(/s$/,"")}_id`;return{async likes(i){return await t.selectFrom(r).where(o,"=",i).selectAll().execute()},async likeCount(i){let a=await t.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=mr();try{return await t.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 t.selectFrom(r).where(o,"=",i).where("user_id","=",a).selectAll().executeTakeFirst();if(f)return f;throw u}},async unlike(i,a){await t.deleteFrom(r).where(o,"=",i).where("user_id","=",a).execute()},async isLiked(i,a){return!!await t.selectFrom(r).where(o,"=",i).where("user_id","=",a).selectAll().executeTakeFirst()},async likedBy(i){return(await t.selectFrom(r).select([o]).where("user_id","=",i).execute()).map((s)=>Number(s[o])).filter(Boolean)}}}import{createRequire as gr}from"module";import{db as yr}from"@stacksjs/database/runtime";var wr=gr(import.meta.url);class Le extends Error{constructor(e){super(`No subscription ${e} belongs to this user`);this.name="SubscriptionNotOwnedError"}}async function M(){let{paymentDriver:e}=await import("@stacksjs/payments");return e()}async function S(e){let{assertStripeDriver:n}=await import("@stacksjs/payments");n(e)}function xt(e){let n=yr;return{async paymentCustomer(t){return(await M()).customer(t)},async charge(t,r,o,i={}){return(await M()).charge(t,r,o,i)},async createPayment(t,r,o={}){return(await M()).createPayment(t,r,o)},async checkout(t,r){return(await M()).checkout(t,r)},async paymentMethods(t){return(await M()).paymentMethods(t)},async removePaymentMethod(t,r){return(await M()).removePaymentMethod(t,r)},async newSubscription(t,r,o){return(await M()).subscribe(t,o,{type:r})},async cancelSubscription(t,r,o={}){if(!await n.selectFrom("subscriptions").where("provider_id","=",r).where("user_id","=",t.id).select(["id"]).executeTakeFirst())throw new Le(r);return(await M()).cancelSubscription(r,o)},async activeSubscription(t){let r=await n.selectFrom("subscriptions").where("user_id","=",t.id).where("provider_status","=","active").selectAll().executeTakeFirst();if(!r)return;let o=(await(await M()).subscriptions(t)).find((i)=>i.id===r.provider_id);return o?{subscription:r,providerSubscription:o}:void 0},async syncStripeCustomerDetails(t,r){await S("syncStripeCustomerDetails");let{manageCustomer:o}=await import("@stacksjs/payments");return await o.syncStripeCustomerDetails(t,r)},async createStripeUser(t,r){await S("createStripeUser");let{manageCustomer:o}=await import("@stacksjs/payments");return await o.createStripeCustomer(t,r)},async updateStripeUser(t,r){await S("updateStripeUser");let{manageCustomer:o}=await import("@stacksjs/payments");return await o.updateStripeCustomer(t,r)},async deleteStripeUser(t){await S("deleteStripeUser");let{manageCustomer:r}=await import("@stacksjs/payments");return await r.deleteStripeUser(t)},async createOrGetStripeUser(t,r){await S("createOrGetStripeUser");let{manageCustomer:o}=await import("@stacksjs/payments");return await o.createOrGetStripeUser(t,r)},async retrieveStripeUser(t){await S("retrieveStripeUser");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){await S("setDefaultPaymentMethod");let{managePaymentMethod:o}=await import("@stacksjs/payments");if(typeof r==="string")await o.setUserDefaultPayment(t,r);else await o.setDefaultPaymentMethod(t,r)},async addPaymentMethod(t,r){await S("addPaymentMethod");let{managePaymentMethod:o,toStoredPaymentMethod:i}=await import("@stacksjs/payments");return i(await o.addPaymentMethod(t,r))},async updateSubscription(t,r,o){await S("updateSubscription");let{manageSubscription:i,summarizeSubscription:a}=await import("@stacksjs/payments");return a(await i.update(t,r,o,{}))},async createSetupIntent(t,r={}){await S("createSetupIntent");let{manageSetupIntent:o}=await import("@stacksjs/payments"),i=await o.create(t,r);if(!i.client_secret)throw Error("Stripe returned a SetupIntent without a client secret.");return{id:i.id,clientConfirmation:{provider:"stripe",clientSecret:i.client_secret}}},async storeTransaction(t,r,o){let{manageTransaction:i}=await import("@stacksjs/payments");return await i.store(t,r,o)},async subscriptionHistory(t){await S("subscriptionHistory");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={}){await S("Stripe Connect (connectAccount)");let o=r.accountColumn||"stripe_account_id",i=(t._attributes??t)[o];if(!i)return null;let a=await Y();try{return await a.accounts.retrieve(i)}catch{return null}},async createConnectAccount(t,r={}){await S("Stripe Connect (createConnectAccount)");let o=r.accountColumn||"stripe_account_id",i=t._attributes??t,a=i[o],s=await Y();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 n.updateTable(c).set({[o]:a}).where("id","=",Number(i.id)).execute(),l}return await s.accounts.retrieve(a)},async connectOnboardLink(t,r){await S("Stripe Connect (connectOnboardLink)");let o=r.accountColumn||"stripe_account_id",a=(t._attributes??t)[o];if(!a)throw Error("connectOnboardLink: model has no Stripe Connect account; call createConnectAccount first");return{url:(await(await Y()).accountLinks.create({account:a,refresh_url:r.refreshUrl,return_url:r.returnUrl,type:r.type??"account_onboarding"})).url,accountId:a}},async syncConnectStatus(t,r={}){await S("Stripe Connect (syncConnectStatus)");let o=r.accountColumn||"stripe_account_id",i=r.chargesColumn||"charges_enabled",a=r.payoutsColumn||"payouts_enabled",s=t._attributes??t,u=s[o];if(!u)return{chargesEnabled:!1,payoutsEnabled:!1};let l=await(await Y()).accounts.retrieve(u),f=!!l.charges_enabled,d=!!l.payouts_enabled,p=r.modelTable||e;return await n.updateTable(p).set({[i]:f,[a]:d}).where("id","=",Number(s.id)).execute(),{chargesEnabled:f,payoutsEnabled:d}},async chargeWithSplit(t,r){await S("Stripe Connect (chargeWithSplit)");let o=await Y(),i=r.accountColumn||"stripe_account_id",a=t._attributes??t,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 br={syncStripeCustomerDetails:!0,createStripeUser:!0,updateStripeUser:!0,deleteStripeUser:!0,createOrGetStripeUser:!0,retrieveStripeUser:!0,defaultPaymentMethod:!0,setDefaultPaymentMethod:!0,removePaymentMethod:!0,addPaymentMethod:!0,paymentMethods:!0,paymentCustomer:!0,charge:!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},de=Object.freeze(Object.keys(br));function hr(e){return de.every((n)=>typeof Reflect.get(e,n)==="function")}function Y(){let e=globalThis.process?.env?.STRIPE_SECRET_KEY;if(!e)throw Error("Stripe Connect: STRIPE_SECRET_KEY not configured");let n;try{n=wr("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 Lr}from"@stacksjs/error-handling";import{isUniqueViolation as kr}from"@stacksjs/error-handling";function Tr(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(kr(e))return{status:409,body:{error:`${n} already exists`}};return{status:500,body:{error:`Failed to ${t} ${n}`,detail:String(e)}}}function x(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 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))t+="_";t+=String.fromCharCode(o+32)}return t}function Rr(e){let n={};for(let[t,r]of Object.entries(e))n[x(t)]=r;return n}function gu(e,n){let t=String(n||"").replace(/^\/+|\/+$/g,""),r=String(e).replace(/^\/+/,"");return`/api/${t?`${t}/`:""}${r}`}function Et(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 jt(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 yu(e){return e?.ownership===!1}function wu(e,n,t){let r=Object.keys(e).find((i)=>x(i)===x(n));if(Array.isArray(t)){if(r===void 0)return{data:e,error:"Ownership value is required"};if(!t.some((i)=>String(i)===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 i of Object.keys(o))if(x(i)===x(n))delete o[i];return o[n]=t,{data:o}}function Sr(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=x(t.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`;n.push(o)}return[...new Set(n)]}function _r(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??=Pr(n);let i=r.get(o);if(i!==o&&i in e)t[o]=e[i]}return t}function Ar(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]),i=Number(t[3]),a=new Date(Date.UTC(r,o-1,i));if(a.getUTCFullYear()!==r||a.getUTCMonth()!==o-1||a.getUTCDate()!==i)return n;return a}var Ct=new WeakMap,vt=new WeakMap;function qe(e){let n=Ct.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:x(r)}));return Ct.set(e,t),t}function Pr(e){let n=qe(e),t=vt.get(n);if(t)return t;let r=new Map(n.map(({field:o,snake:i})=>[o,i]));return vt.set(n,r),r}function bu(e,n){if(!n.length)return e;let t={...e};for(let{field:r,snake:o}of qe(n))if(delete t[r],o!==r)delete t[o];return t}function hu(e,n){if(!e||n.length===0)return e;let t={...e};for(let{field:r,snake:o}of qe(n))if(delete t[r],o!==r)delete t[o];return t}var xr=["id","uuid","created_at","updated_at","deleted_at"];function ku(e,n){let t=new Map;for(let r of[...Object.keys(e??{}),...xr]){let o=x(r);if(!/^\w+$/.test(o))continue;t.set(r,o),t.set(o,o)}for(let r of n)t.delete(r),t.delete(x(r));return t}function Tu(e,n,t){if(!n)return e;let r=e;for(let o of String(n).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=t.get(s);if(!u)continue;r=r.orderBy(u,a?"desc":"asc")}return r}var Cr={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"?Mr(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"?Or(e):[],set:(e)=>e==null?null:Array.isArray(e)?JSON.stringify(e):e}},Mt=new WeakMap;function vr(e,n){let t=Mt.get(e);if(t&&t.length===n.length){let o=!0;for(let i=0;i<n.length;i++){let a=n[i];if(t[i]?.attr!==a||t[i]?.definition!==e[a]){o=!1;break}}if(o)return t}let r=[];for(let o of n){let i=e[o],a=typeof i==="string"?Cr[i]:i;r.push({attr:o,snake:x(o),definition:i,caster:a})}return Mt.set(e,r),r}function Mr(e){try{return JSON.parse(e)}catch{return e}}function Or(e){try{return JSON.parse(e)}catch{return[]}}function Ru(e,n,t){if(!e||typeof e!=="object"||!n)return e;let r=Object.keys(n);if(r.length===0)return e;let o=vr(n,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[t];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 Ot=new WeakMap;function Dr(e){let n=Ot.get(e);if(n)return n;let t=[];for(let[r,o]of Object.entries(e)){let i=o?.validation?.rule;if(!i||typeof i.validate!=="function")continue;t.push({definition:o,field:r,hasDefault:o!==null&&typeof o==="object"&&Object.prototype.hasOwnProperty.call(o,"default"),rule:i})}return Ot.set(e,t),t}function Ft(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 $t(e,n,t){let r=n?.attributes;if(!r||typeof r!=="object")return{valid:!0};let o=Dr(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&&t==="updating")continue;let p=d?e[c]:l?u.default:void 0,m=Ar(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 Er(e,n){return`${e}\x00${jr(n)}`}function Su(e){let n=new Map;for(let t of e){let r=Er(String(t.method??""),String(t.path??""));if(!n.has(r))n.set(r,t)}return n}function jr(e){return e.replace(/\{[^}]*\}/g,"{}").replace(/:[^/]+/g,"{}")}function pe(e){if(Array.isArray(e))return e.filter((n)=>typeof n==="string"&&n.length>0);return typeof e==="string"&&e?[e]:[]}function Fr(e,n){let t=typeof e==="object"&&e!==null&&"middleware"in e,r=e?.middleware,o=It(n);if(!t)return{read:F(["auth"],o),write:F(["auth"],o),declared:!1};if(r&&typeof r==="object"&&!Array.isArray(r)){let a=r;return{read:F("read"in a?pe(a.read):["auth"],o),write:F("write"in a?pe(a.write):["auth"],o),declared:!0}}let i=pe(r);return{read:F(i,o),write:F(i,o),declared:!0}}function It(e){if(!e||typeof e!=="object")return null;let n=e;if(n.enforce===!1)return null;if(!Array.isArray(n.roles))return null;let t=n.roles.filter((r)=>typeof r==="string").map((r)=>r.trim()).filter((r)=>r.length>0);return t.length>0?`role:${t.join(",")}`:null}var $r=["index","show","store","update","destroy"],Ir={index:"read",show:"read",store:"write",update:"write",destroy:"write"};function _u(e,n){let{read:t,write:r,declared:o}=Fr(e,n),i=It(n),a=e?.middleware,s=a&&typeof a==="object"&&!Array.isArray(a)?a:void 0,u={};for(let c of $r)u[c]=s&&c in s?F(pe(s[c]),i):Ir[c]==="read"?t:r;return{abilities:u,read:t,write:r,declared:o}}function F(e,n){if(!n||e.length===0)return e;if(e.some((t)=>t==="role"||t.startsWith("role:")))return e;return[...e,n]}function Au(e){if(e.length===0)return null;let n=[...e].sort((t,r)=>t.model.localeCompare(r.model)).map((t)=>`${t.model} (${[...t.abilities].join(", ")})`).join(", ");return`[orm] ${e.length} model(s) role-gate their sidebar row and publish part of the matching API to everyone, because \`useApi.middleware\` declares those abilities empty - ${n}. Drop the empty list to let \`dashboard.roles\` gate them, or set \`dashboard.enforce: false\` to keep the row hidden and the API public.`}async function Pu(e,n,t,r){let o;try{o=await t.gate()}catch{return null}if(!o||!o.hasPolicy(e))return null;try{let i=await t.user(),a=r===void 0?await o.inspectFor(e,n,i):await o.inspectFor(e,n,i,r);if(a&&!a.isAllowed)return{status:403,message:a.message||"This action is unauthorized."};return null}catch{return{status:403,message:"This action is unauthorized."}}}var Dt=15,Br=100;function xu(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(Dt),10),o=Math.min(Number.isFinite(r)?Math.max(1,r):Dt,Br);return{page:t,perPage:o,offset:(t-1)*o}}function fe(e,n){let t=new URL(e.toString());return t.searchParams.set("page",String(n)),`${t.pathname}${t.search}`}function Nr(e,n,t,r,o,i){let a=(n-1)*t,s=r===0,u={page:n,per_page:t,from:s?null:a+1,to:s?null:a+r,has_more_pages:o,prev_page_url:n>1?fe(e,n-1):null,next_page_url:o?fe(e,n+1):null};if(i!==void 0&&!Number.isNaN(i)){let c=Math.max(1,Math.ceil(i/t));u.total=i,u.last_page=c,u.first_page_url=fe(e,1),u.last_page_url=fe(e,c)}return u}function Cu(e,n,t,r,o,i){let{page:a,...s}=Nr(e,n,t,r,o,i);return{current_page:a,...s}}function vu(e,n){return(n??e??"").toString().trim().toLowerCase()==="warn"?"warn":"deny"}function Mu(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 qr(e){if(e?.ownership===!1)return null;if(e?.ownership)return e.ownership;let n=Et(e);if(n)return{field:n,resolve:async(r,o)=>{let{resolveAuthenticatedTeamId:i}=await import("@stacksjs/auth");return i(Ge(o))}};let t=jt(e);if(t)return{field:t,resolve:async(r)=>r?.id??null};return null}function Ge(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 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 Gr(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 Ur(e="id"){return{field:e,resolve:async(n)=>n?.id??null}}function Kr(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")]),i=await r(Ge(t));if(i==null)return[];return(await o.where("team_id",i).get()??[]).map((s)=>s.id).filter((s)=>s!=null)}catch{return[]}}}}function Wr(e="id"){return{field:e,resolve:async(n,t)=>{try{let{resolveAuthenticatedTeamId:r}=await import("@stacksjs/auth");return await r(Ge(t))}catch{return null}}}}function Vr(e,n){return{field:n,resolve:async(t,r)=>{try{let o=await import("@stacksjs/orm"),i=o.models?.[e]??o[e]?.definition??null,a=qr(i);if(!a?.field||typeof a.resolve!=="function")return[];let s=await a.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(a.field,s).get():await u.where(a.field,s).get())??[]).map((l)=>l.id).filter((l)=>l!=null)}catch{return[]}}}}import{getCurrentRequest as Qr}from"@stacksjs/router";var Bt=new WeakMap;function Nt(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 zr(e,n){if(typeof e.find==="function")return e.find(n);let t=await e.findMany?.([n]);return Nt(t??[]).get(n)}async function Hr(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((i)=>e.find?.(i))),o=Nt(r??[]);for(let i of t.resolvers)i.resolve(o.get(i.key))}catch(r){for(let o of t.resolvers)o.reject(r)}}function $u(e,n){let t=Qr();if(!t)return zr(e,n);let r=Bt.get(t);if(!r)r=new WeakMap,Bt.set(t,r);let o=r.get(e);if(!o)o={cache:new Map},r.set(e,o);let i=o.cache.get(n);if(i)return i.then();let a=o.pending;if(!a){a={keys:[],resolvers:[]},o.pending=a;let c=a,l=o;queueMicrotask(()=>{Hr(e,l,c)})}let s=new Promise((c,l)=>{a.keys.push(n),a.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 Lu}from"@stacksjs/database/runtime";class Jr{conditions=[];where(e,...n){let[t,r]=n,o=r===void 0?"=":t,i=r===void 0?t:r;this.addCondition("and","where",e,o,i)}orWhere(e,...n){let[t,r]=n,o=r===void 0?"=":t,i=r===void 0?t:r;this.addCondition("or","where",e,o,i)}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 Ue}from"@stacksjs/database/runtime";async function Ke(e,n){return await Ue.transaction(e,n)}async function Uu(e){return await Ue.savepoint(e)}function Ku(e,n){return Ue.transactional(e,n)}import{randomUUID as so}from"crypto";import{db as C,getDatabaseDialect as uo,parseSqlDateTime as co,sqlDateTime as Yt}from"@stacksjs/database/runtime";import{plural as Yr,snakeCase as X}from"@stacksjs/strings";var Lt=new Set(["anonymize","delete","keep"]),qt=new Set(["anonymize","delete"]),Gt=new Set(["consent","contract","legal_obligation","vital_interests","public_task","legitimate_interests"]),D="User";class We extends Error{problems;constructor(e){super(`GDPR declarations cannot be honoured:
3
3
  ${e.map((n)=>` - ${n.model}: ${n.message}`).join(`
4
- `)}`);this.name="GdprDeclarationError",this.problems=e}}function Qr(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 qt(e,n){return n.table??Y(Vr(e))}function zr(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:`${Y(o)}_id`});continue}if(o&&typeof o==="object"&&typeof o.model==="string"){let a=o;r.push({model:a.model,foreignKey:a.foreignKey??`${Y(a.model)}_id`})}}return r}function Hr(e){if(e===!0)return{};if(e&&typeof e==="object")return e;return null}function Jr(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 fe(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 Qr(e)){let c=u.attributes??{},l=u.traits?.gdpr,f=zr(u),d=f.find((T)=>T.model===D),p=Object.entries(c).map(([T,P])=>({attribute:T,shape:P,options:Hr(P?.personal)})).filter((T)=>T.options!==null);if(!l&&p.length===0){if(d&&s!==D)r.push(s);continue}if(l!==void 0&&(l===null||typeof l!=="object")){a(s,"`traits.gdpr` must be an object");continue}let m=qt(s,u),g=u.primaryKey??"id",w=null,h,b=l?.subject;if(b===void 0){if(s===D)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((P)=>P.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(!Bt.has(k))a(s,`erasure must be one of ${[...Bt].join(", ")}, got '${String(k)}'`);let R=null;if(l?.retention!==void 0){let T=l.retention,P=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(!Nt.has(P))a(s,`retention.action must be one of ${[...Nt].join(", ")}, got '${String(P)}'`);else R={days:T.days,column:T.column??"created_at",action:P}}if(l?.basis!==void 0&&!Lt.has(l.basis))a(s,`basis must be one of ${[...Lt].join(", ")}, got '${String(l.basis)}'`);let re=k==="anonymize"&&w!==null||R?.action==="anonymize",W=[];for(let{attribute:T,shape:P,options:Pe}of p){let oe=Jr(P,Pe);if("problem"in oe){if(re)a(s,`personal attribute '${T}' ${oe.problem}`);W.push({attribute:T,column:Y(T),export:Pe.export!==!1,perRow:!1,anonymizeTo:null});continue}W.push({attribute:T,column:Y(T),export:Pe.export!==!1,perRow:oe.perRow,anonymizeTo:oe.value})}if(w!==null&&k==="anonymize"&&W.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"&&W.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:W,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 pe(e){if(e.problems.length)throw new Ke(e.problems);return e}var me="gdpr_requests",Qe=500;class ge extends Error{constructor(e){super(`No user matches '${String(e)}'.`);this.name="GdprSubjectNotFoundError"}}async function ye(e){if(e)return pe(fe(e));await Promise.resolve().then(() => Ve());return pe(fe(await We()))}async function Jt(e=C){let n=String(ro()),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 ao=/no such table|does not exist|doesn't exist|unknown table|undefined table|ER_NO_SUCH_TABLE/i;async function we(e,n=C){let t=await Jt(n);if(t)return t.has(e.toLowerCase());try{return await n.selectFrom(e).selectAll().limit(1).execute(),!0}catch(r){if(ao.test(r instanceof Error?r.message:String(r)))return!1;throw r}}function io(e){let n=e.models.find((t)=>t.model===D);return{table:n?.table??"users",primaryKey:n?.primaryKey??"id"}}function so(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 uo(e,n={},t=C){let r=await ye(n.models);return He(r,e,t)}async function He(e,n,t){let{table:r,primaryKey:o}=io(e),a=so(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 Je(e,n=Qe){let t=[];for(let r=0;r<e.length;r+=n)t.push(e.slice(r,r+n));return t}function co(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 Ye(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 Ye(e,n,u,r,o)).map((f)=>f[u.primaryKey]).filter((f)=>f!==null&&f!==void 0);for(let f of Je(l))s.push(...await e.selectFrom(t.table).selectAll().where(i.foreignKey,"in",f).execute())}return s=co(s,t.primaryKey),o.set(t.model,s),s}function Qt(e){if(typeof e==="bigint")return Number.isSafeInteger(Number(e))?Number(e):e.toString();if(e instanceof Date)return e.toISOString();return e}function lo(e,n){let t={};for(let r of e.exportColumns)if(r in n)t[r]=Qt(n[r]);for(let r of e.personal)if(r.export&&r.column in n)t[r.column]=Qt(n[r.column]);return t}function ze(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 fo(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 Yt(e,n){let t=ze(e,n);return Object.entries(t).some(([r,o])=>!fo(n[r],o))}async function Xt(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(ze(n,o)).where(n.primaryKey,"=",o[n.primaryKey]).execute();return}let r=ze(n,t[0]);for(let o of Je(t.map((a)=>a[n.primaryKey])))await e.updateTable(n.table).set(r).where(n.primaryKey,"in",o).execute()}async function Zt(e,n,t){for(let r of Je(t.map((o)=>o[n.primaryKey])))await e.deleteFrom(n.table).where(n.primaryKey,"in",r).execute()}async function Xe(e,n,t,r,o){let a=Ht(new Date);await e.insertInto(me).values({uuid:no(),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 Ze(){if(!await we(me))throw Error(`The '${me}' table does not exist, so this request cannot be recorded. Run \`buddy migrate\` first.`)}async function et(e){let n=[],t=[],r=await Jt(),o=new Map;for(let a of e){if(!o.has(a.table))o.set(a.table,r?r.has(a.table.toLowerCase()):await we(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 po(e,n={}){let t=await ye(n.models),r=await He(t,e,C);if(!r)throw new ge(e);await Ze();let o=t.models.filter((l)=>l.subject),{present:a}=await et(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 Ye(C,i,l,r,s);if(!f.length)continue;u[l.model]=f.map((d)=>lo(l,d)),c[l.model]={purpose:l.purpose,basis:l.basis,retentionDays:l.retention?.days??null}}return await Xe(C,"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 mo(e){return[...e].sort((n,t)=>{let r=n.model===D?1:0,o=t.model===D?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 go(e,n={}){let t=n.dryRun===!0,r=await ye(n.models),o=await He(r,e,C);if(!o)throw new ge(e);if(!t)await Ze();let a=r.models.filter((d)=>d.subject),{present:i,skipped:s}=await et(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 Ye(d,u,g,o,p);let m=[];for(let g of mo([...u.values()])){let w=p.get(g.model)??[];if(g.erasure==="delete"){if(!t)await Zt(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)=>Yt(g,b));if(!t)await Xt(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 Xe(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(C):await Ue(c),f=!1;if(!t&&n.revokeCredentials!==!1)f=await yo(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 yo(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 we("oauth_access_tokens"))await n.revokeAllTokens(t);if(n.sessionDestroyAll)await n.sessionDestroyAll(t);return!0}var zt=86400000;async function wo(e={}){let n=e.dryRun===!0,t=e.now??new Date,o=(await ye(e.models)).models.filter((c)=>c.retention);if(!o.length)return{dryRun:n,cutoffs:{},changes:[],skipped:[]};if(!n)await Ze();let{present:a,skipped:i}=await et(o),s=[],u={};for(let c of a){let l=c.retention,f=new Date(t.getTime()-l.days*zt),d=Ht(new Date(f.getTime()+zt));u[c.model]=f.toISOString();let p=[],m;for(;;){let h=C.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(Qe).execute();if(!b.length)break;for(let k of b){let R=oo(k[l.column]);if(R&&R.getTime()<f.getTime())p.push(k)}if(m=b[b.length-1][c.primaryKey],b.length<Qe)break}let g=l.action==="delete"?p:p.filter((w)=>Yt(c,w));if(!n&&g.length)await Ue(async(w)=>{if(l.action==="delete")await Zt(w,c,g);else await Xt(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 Xe(C,"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}}Ve();function bo(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 ho(e){return{entries:e.models.map((t)=>({model:t.model,table:t.table,subject:bo(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 X(e){return(e??"-").replaceAll("|","\\|").replaceAll(`
5
- `," ")}function ko(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}\``,X(r.subject),o,X(r.erasure),X(r.retention),X(r.basis),X(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 Eo,registerModel as Fo}from"@stacksjs/query-builder";import{log as _}from"@stacksjs/logging/runtime";import{snakeCase as te}from"@stacksjs/strings";import{AsyncLocalStorage as Pn}from"async_hooks";import{toCursorPaginator as jo,toPaginator as $o,toSimplePaginator as Io}from"@stacksjs/pagination";function nt(e,n){let t=at(),r=t?tt(t,"per_page"):void 0,o=t?tt(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 rt(e,n){let t=at(),r=t?tn(t,"cursor"):void 0,o=t?tt(t,"per_page"):void 0,a=e!==void 0?Math.max(1,Math.floor(e)):Math.min(100,Math.max(1,o??15)),s=en(n!==void 0?n:r??null);return{perPage:a,cursor:s}}function en(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 ot(e){let n=at();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?j(t,{cursor:e.next_cursor}):null,e.prev_page_url=e.prev_cursor!==null?j(t,{cursor:e.prev_cursor}):null,e;let o=e.current_page;if(e.prev_page_url=o>1?j(t,{page:o-1}):null,"total"in e){let a=e.last_page;e.next_page_url=o<a?j(t,{page:o+1}):null,e.first_page_url=j(t,{page:1}),e.last_page_url=j(t,{page:a})}else e.next_page_url=e.has_more_pages?j(t,{page:o+1}):null;return e}function j(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 q;function at(){if(q===null)return;if(q===void 0)try{let n=zn("@stacksjs/router");if(typeof n.getCurrentRequest==="function")q=n.getCurrentRequest;else{q=null;return}}catch{q=null;return}return q()}function tt(e,n){let t=tn(e,n);if(t===void 0)return;let r=Number(t);return Number.isFinite(r)?r:void 0}function tn(e,n){let t=e.query?.[n];if(t===void 0)return;return Array.isArray(t)?t[0]:t}function nn(){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 To,sqlDateTime as Ro}from"@stacksjs/database/runtime";import{log as G}from"@stacksjs/logging";var be="deleted_at";function rn(e,n="id"){return{async softDelete(t){let r=Ro(),o=e.where(n,t);if(typeof o?.update==="function")return await o.update({[be]:r}),!0;return!1},async restore(t){let r=e.where(n,t).withTrashed();if(typeof r?.update==="function")return await r.update({[be]: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 To(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(be);return t?.where?.(be,"!=",null)??t}}}function on(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 So(e,n){let t=e.hasMany??[],r=e.hasOne??[],o=t.some((l)=>it(l,n,!0)),a=r.some((l)=>it(l,n,!1));if(!o&&!a)return G.warn(`[orm] soft-delete cascade: '${n}' is not a declared hasMany/hasOne relation - skipping`),null;let s=(o?t:r).find((l)=>it(l,n,o))??null;if(!s)return null;let c=globalThis[s];if(!c)return G.warn(`[orm] soft-delete cascade: model '${s}' is not yet on globalThis - skipping cascade for '${n}'`),null;return{className:s,model:c}}function it(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 _o(e,n,t,r,o){try{let a=t.where;if(typeof a!=="function"){G.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"){G.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"){G.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(G.warn(`[orm] soft-delete cascade ${o} on ${e}#${String(n)} failed`,{error:a}),process.env.STACKS_ORM_CASCADE_SWALLOW!=="true")throw a}}async function Z(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=So(e,i);if(!s)continue;await _o(s.className,t,s.model,a,r)}}import{sqlDateTime as xo}from"@stacksjs/database/runtime";import{log as Ao}from"@stacksjs/logging";var Po=[/^password$/i,/^password_hash$/i,/^api_key$/i,/_token$/i,/_secret$/i,/^remember_token$/i],an=null;async function sn(){if(an!=null)return an;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 un(){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 cn(e){if(!e||typeof e!=="object")return null;let n={};for(let[t,r]of Object.entries(e)){if(Po.some((o)=>o.test(t)))continue;n[t]=r}return n}function ln(e,n,t){Ao.warn(`[orm] ${e} row write failed for ${n}: ${t?.message??String(t)}`)}var Co="activities";function dn(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 Mo(e,n,t=[]){let r=cn(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 vo(e,n,t){return t==null?`${e} was ${n}`:`${e} ${String(t)} was ${n}`}async function Oo(e){try{let{db:n}=await import("@stacksjs/database/runtime");await n.insertInto(Co).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:xo()}).executeTakeFirst()}catch(n){ln("activity",`${e.subject_type}#${String(e.subject_id)}`,n)}}async function Do(e){let{attributes:n,event:t,modelName:r,options:o,primaryKey:a}=e,i=n?.[a]??null,s=await sn();await Oo({type:`${r.toLowerCase()}.${t}`,description:vo(r,t,i),subject_type:r,subject_id:i,properties:Mo(n,o,e.hidden),causer:s==null?null:`User:${String(s)}`,user_id:s,ip_address:await un()})}function he(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 fn(e,n,t,r,o=[]){if(n==="Activity")return;let a=e,i=async(d)=>typeof a.find==="function"?he(await a.find(d)):null,s=async(d,p)=>{await Do({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",he(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",he(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",he(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 Re,xn=new Pn;function B(){return xn.getStore()?.suppressed===!0}function I(e){return Promise.resolve(xn.run({suppressed:!0},e))}var Cn=new Pn;function Bo(){return Cn.getStore()?.suppressed===!0}function No(e){return Promise.resolve(Cn.run({suppressed:!0},e))}var ft=Symbol.for("stacks.orm.modelDefinition");class Mn 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 pn=new Set,Lo=4096,mn=Object.create(null),gn=0;function ee(e){let n=mn[e];if(n!==void 0)return n;let t=te(e);if(gn<Lo)mn[e]=t,gn++;return t}function qo(e,n){let t=typeof e==="string"?e.slice(0,80):String(e),r=`${typeof e}:${t}`;if(pn.has(r))return;pn.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 Go={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 qo(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 Uo(e){return typeof e==="string"?Go[e]:e}var yn=new WeakMap;function vn(e){let n=Object.keys(e),t=yn.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:Uo(a)}});return yn.set(e,r),r}function st(e,n,t){if(!e||typeof e!=="object")return e;let r={...e};for(let{attr:o,caster:a}of vn(n))if(o in r)r[o]=a[t].call(a,r[o]);return r}function ke(e){return e==="_attributes"||e==="_original"||e==="_definition"||e==="_hasSaved"||e==="_relations"}var ct=Symbol.for("stacks.modelInstanceProxy"),wn,bn=new WeakMap,Ko={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(le.map((e)=>[e,{bag:"_billable",mode:"model"}])),generateTwoFactorForModel:{bag:"_twoFactor",mode:"model"},verifyTwoFactorCode:{bag:"_twoFactor",mode:"model"}};function Wo(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 Te(e,n,t){if(e&&typeof e.then==="function")return e.then((r)=>r===n?t:r);return e===n?t:e}function O(e,n){if(!e||typeof e!=="object")return e;let t=e;if(t[ct])return e;let r=t._attributes;if(!r||typeof r!=="object")return e;if(n){for(let{attr:a,caster:i}of vn(n))if(Object.hasOwn(r,a))r[a]=i.get.call(i,r[a])}let o=n?bn.get(n):wn;if(!o)if(o={get(a,i,s){let u=a;if(i===ct)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 Te(u.save(),a,s)}finally{l.set=d}}return Te(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 Te(u.save(),a,s)}finally{l.set=d}}return Te(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 I(()=>u.save())};if(i==="saveAsyncQuietly")return function(){return I(()=>s.saveAsync())};if(i==="updateQuietly")return function(l){return I(()=>u.update(l))};if(i==="updateAsyncQuietly")return function(l){return I(()=>s.updateAsync(l))};if(i==="deleteQuietly")return function(){return I(()=>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=te(b),R=p[k]??p[b];if(R!==void 0){m[k]=R;continue}let re=w[b]??w[k];if(re){m[k]=Wo(h,re);continue}m[k]=void 0}if(p.id!=null)m.id=String(p.id);return m};if(typeof i==="string"&&!ke(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)=>O(m,n));return p&&typeof p==="object"?O(p,n):p}let d=Ko[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=ee(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"&&!ke(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=ee(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"&&!ke(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=ee(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"&&!ke(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)bn.set(n,o);else wn=o;return new Proxy(e,o)}var On=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}),Vo={paginate:$o,simplePaginate:Io,cursorPaginate:jo},hn=Symbol.for("stacks.queryBuilderProxy");function kn(e,n,t){if(On[n]){if(Array.isArray(e))return e.map((o)=>O(o,t));let r=Vo[n];if(r&&e&&Array.isArray(e.data)){let o=e.data.map((i)=>O(i,t)),a=r({...e,data:o});return ot(a)}if(e&&Array.isArray(e.data))return{...e,data:e.data.map((o)=>O(o,t))};return O(e,t)}if(e&&typeof e==="object"&&typeof e.get==="function")return Dn(e,t);return e}function Dn(e,n){if(!e||typeof e!=="object")return e;if(e[hn])return e;return new Proxy(e,{get(t,r,o){if(r===hn)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}=nt(s[0],s[1]);u=[l,f]}else if(i==="cursorPaginate"){let{perPage:l,cursor:f}=rt(s[0],s[1]);u=[l,f,s[2],s[3]]}let c=a.apply(t,u);if(!On[i]&&c===t)return o;if(c&&typeof c.then==="function")return c.then((l)=>kn(l,i,n));return kn(c,i,n)}}})}function Qo(e,n){let t=(i)=>Array.isArray(i)?i.map((s)=>O(s,n)):O(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 Dn(c,n)}}}class En 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 lt 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 zo=new Set(["id","created_at","updated_at","deleted_at","uuid"]),Tn=new WeakMap;function Ho(e){let n=Tn.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=ee(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 Tn.set(e,a),a}function U(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}=Ho(r);for(let i in n){if(!Object.hasOwn(n,i))continue;let s=ee(i);if(zo.has(s))continue;if(a.has(s))throw new lt(e.name,i,"guarded");if(s.endsWith("_id"))continue;if(!o.has(s))throw new lt(e.name,i,"not-fillable")}return n}async function Se(e,n){let t=e.set;if(!t||typeof t!=="object")return n;let r={...n};for(let[o,a]of Object.entries(t)){if(typeof a!=="function"||!(o in r))continue;try{r[o]=await a(r)}catch(i){_.error(`[orm] ${e.name}.set.${o} threw - skipping setter`,i)}}return r}function Jo(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){_.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}U(n,l);let f=await Se(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 Se(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[ct]?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 En(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 U(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){U(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 U(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=In(n.traits?.useSearch,n);if(u){let c=u.index??n.table??te(`${n.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] ${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 dt(k,u);if(R.length>0)await p.addDocuments(c,R);m+=R.length}),m}catch{}let w=await f.call(e)||[],h=await dt(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 dt(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)=>Xo(r,n)))).filter(Boolean)}function Fn(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 Yo(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 Xo(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 Yo(e?._attributes??(typeof e?.toJSON==="function"?e.toJSON():null),n.hidden??new Set)}function Zo(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 jn(e){let n=te(e);return n===e?[e]:[e,n]}async function ut(e,n){if(!e||typeof e!=="object")return;let t=e._attributes??e;for(let r of n)for(let o of jn(r)){if(!(o in t))continue;let a=t[o];if(!V(a))continue;t[o]=await Me(a)}}function ea(e,n){if(n.length===0)return;let t=async(s)=>{if(Array.isArray(s)){for(let u of s)await ut(u,n);return s}if(s&&typeof s==="object"&&Array.isArray(s.data)){for(let u of s.data)await ut(u,n);return s}if(s)await ut(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 ta(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 jn(s))if(u in i)i[u]=await Ce(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 na(e,n){let t=e.create;if(typeof t==="function")e.create=async function(o,...a){U(n,o);let i=await Se(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)U(n,s),i.push(await Se(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 ra(e,n){if(!Ft(n))return;let t=String(n?.name??e.name??"Model"),r=(s,u)=>{if(Bo())return;if(!s||typeof s!=="object"||Array.isArray(s))return;let c=jt(s,n,u);if(!c.valid)throw new Mn(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 oa(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)?st(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(_.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]=st(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)?st(i,n,"set"):i;return await o.call(this,a,s)}}var Rn=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 $n(e){_.debug(`[orm] Defining model: ${e.name} (table: ${e.table})`);for(let g of Object.keys(e.traits??{}))if(!Rn.has(g))_.warn(`[orm] Model '${e.name}' declares an unknown trait '${g}'. It does nothing. Known traits: ${[...Rn].sort().join(", ")}.`);let n=aa(e),t=sa(e),r=ia(n,t),o=ua(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=Eo(i);if(Qo(u,e.casts),Jo(u,i),na(u,i),e.casts&&Object.keys(e.casts).length>0)oa(u,e.casts);let c=ve(e);if(c.length>0)ta(u,c),ea(u,c);let l=e.traits?.useSoftDeletes;if(l)ca(u,i,l);let f=e.traits?.useAudit;if(f){let g=Rt(f);St(u,e.name,e.primaryKey||"id",g)}let d=dn(e.traits?.useActivityLog);if(d)fn(u,e.name,e.primaryKey||"id",d,[...Fn(e)]);ra(u,i);let p=u;p.withoutValidation=function(g){return No(g)},p.withoutEvents=function(g){return I(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 I(()=>w.apply(u,b))}}let m=Object.assign(u,o,{...e,getDefinition:()=>e,_isStacksModel:!0});return Fo(e.name,m),Object.defineProperty(m,ft,{value:e,enumerable:!1,configurable:!0}),m}function aa(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(B())return;try{let{dispatch:m}=Re??=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(B())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(B())return!0;let m;try{m=Re??=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(_.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(_.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(_.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 ia(...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 In(e,n){if(!e)return null;let t=e===!0?{}:typeof e==="object"?{...e}:null;if(!t)return null;if(n)t.hidden=Fn(n);return t}function sa(e){let n=In(e.traits?.useSearch,e);if(!n)return;let t=n,r=t.index??e.table??te(`${e.name}s`);async function o(s){if(typeof t.shapeMany==="function")try{let[l]=await dt([s],t);return l}catch(l){_.warn(`[orm/search] shapeMany() threw for ${e.name}: ${l.message}`);return}if(typeof t.shape==="function")try{return await t.shape(s)}catch(l){_.warn(`[orm/search] shape() threw for ${e.name}: ${l.message}`);return}let c=O(s).toSearchableObject?.();if(c!==void 0)return c;return s?._attributes??(typeof s?.toJSON==="function"?s.toJSON():null)}let a=async(s)=>{if(B())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){_.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:a,afterUpdate:a,afterDelete:async(s)=>{if(B())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){_.warn(`[orm/search] queue dispatch failed for ${e.name}#${u}; falling back to inline: ${c.message}`),await An(r,Number(u),e.name)}return}await An(r,Number(u),e.name)}}}var Sn=new Map;function Bn(e,n){let t=Sn.get(e)??0;if(Sn.set(e,t+1),t===0)_.warn(`[orm/search] ${n}`);else if(t===9)_.warn(`[orm/search] ${e} is still failing; further identical warnings suppressed for this process.`)}async function _n(e,n,t){try{let{useSearchEngine:r}=await import("@stacksjs/search-engine");await r().addDocument(e,n)}catch(r){Bn(`index:${t}`,`Failed to index ${t}: ${r.message}`)}}async function An(e,n,t){try{let{useSearchEngine:r}=await import("@stacksjs/search-engine");await r().deleteDocument(e,n)}catch(r){Bn(`remove:${t}`,`Failed to remove ${t}#${n}: ${r.message}`)}}function ua(e){let n={},{table:t,traits:r}=e;if(!r)return n;if(r.taggable)n._taggable=je(t);if(r.categorizable)n._categorizable=$e(t);if(r.commentable)n._commentable=Ee(t);if(r.billable)n._billable=Pt(t);if(r.likeable){let a=typeof r.likeable==="object"?r.likeable:void 0;n._likeable=Ie(t,a)}let o=r.useAuth||r.authenticatable;if(typeof o==="object"&&o&&"useTwoFactor"in o&&o.useTwoFactor)n._twoFactor=nn();return n}function ca(e,n,t){let r=rn(e,n.primaryKey||"id"),o=on(t),a=n,i=n.name.toLowerCase(),s=n.traits?.observe!=null&&n.traits?.observe!==!1,u=async(p)=>{if(!s||B())return!0;try{let{dispatchAsync:m}=Re??=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||B())return;try{let{dispatch:m}=Re??=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 Z(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 Z(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 Z(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 Z(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 la(e){if(e==null)return e;if(Array.isArray(e))return e.map((t)=>la(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 da=["belongsTo","hasOne","hasMany","belongsToMany","morphMany","morphOne"],fa=["traits","dashboard"];function pa(e){let n=e?.[ft];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 ma(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 ga(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 ya(e,n){let t={...e,...n},r=e.attributes??{},o=n.attributes??{};if(n.attributes){let a=ga(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 da){let i=ma(e[a],n[a]);if(i)t[a]=i}for(let a of fa){let i=e[a],s=n[a];if(i&&s&&typeof i==="object"&&typeof s==="object")t[a]={...i,...s}}return t}function jc(e,n){return $n(ya(pa(e),n))}import Ln from"process";import{log as _a}from"@stacksjs/logging";import{path as A}from"@stacksjs/path";import{fs as ne}from"@stacksjs/storage";import{Database as wa}from"bun:sqlite";import{existsSync as ba,readdirSync as ha,readFileSync as ka}from"fs";function Ta(e){return e.startsWith("sqlite_")||e.startsWith("_qb_tmp_")}function Ra(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 Sa(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 Nn(e,n="sqlite"){let t=[];if(!ba(e))return{tables:[],errors:t};let r;try{r=ha(e).filter((a)=>a.endsWith(".sql")).sort()}catch(a){return{tables:[],errors:[{file:e,error:a.message}]}}let o=new wa(":memory:");try{for(let s of r){let u=`${e}/${s}`,c;try{c=ka(u,"utf-8")}catch(f){t.push({file:u,error:f.message});continue}let l=Sa(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)=>!Ta(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=Ra(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 Aa(e){if(e)return e;if(Ln.env.STACKS_CANONICAL_FEATURES==="1")return"sqlite";let n=String(Ln.env.DB_CONNECTION??"").toLowerCase();return n==="postgres"||n==="mysql"?n:"sqlite"}function _e(e){return e==="postgres"?"boolean":"number"}function E(e){return e.replace(/([A-Z]+)([A-Z][a-z])/g,"$1_$2").replace(/([a-z\d])([A-Z])/g,"$1_$2").toLowerCase()}function Pa(e,n){let t=e.default;if(typeof t==="boolean")return _e(n);if(typeof t==="number")return"number";if(typeof t==="string")return"string";return"unknown"}function xa(e){let n=e.validation;if(!n||typeof n!=="object")return null;let t=n.rule;return t&&typeof t==="object"?t:null}function Ca(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 Ma(e,n){let t=xa(e),r=Ca(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 _e(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 Pa(e,n)}})();return e.nullable===!0?`${a} | null`:a}function va(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[`${E(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[`${E(a.model)}_id`]="number"}}return n}function Oa(e,n){let[t,r]=[E(e),E(n)].sort();return`${t}_${r}`}function Da(e,n){let t=e.default,r=typeof t==="string"?"string":typeof t==="number"?"number":typeof t==="boolean"?_e(n):t instanceof Date?"string":"unknown";return e.nullable?`${r} | null`:r}function Ea(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??Oa(e,s),m=c??`${E(e)}_id`,g=l??`${E(s)}_id`,w={id:"number",[m]:"number",[g]:"number"};for(let[h,b]of Object.entries(f))w[h]=Da(b,t);if(d)w.created_at="string",w.updated_at="string | null";o.push({table:p,columns:w})}return o}function Fa(e){return{email_verified_at:"string | null",password_changed_at:"string | null",two_factor_secret:"string | null",two_factor_enabled:`${_e(e)} | null`,two_factor_last_used_step:"number | null",stripe_id:"string | null"}}function ja(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,Fa(n));return t}function $a(e,n){let t={},r=e.attributes??{};for(let[o,a]of Object.entries(r))t[E(o)]=Ma(a,n);return t}function qn(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}: {
4
+ `)}`);this.name="GdprDeclarationError",this.problems=e}}function Xr(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 Ut(e,n){return n.table??X(Yr(e))}function Zr(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:`${X(o)}_id`});continue}if(o&&typeof o==="object"&&typeof o.model==="string"){let i=o;r.push({model:i.model,foreignKey:i.foreignKey??`${X(i.model)}_id`})}}return r}function eo(e){if(e===!0)return{};if(e&&typeof e==="object")return e;return null}function to(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 me(e){let n=new Map,t=new Map,r=[],o=[],i=(s,u)=>{o.push({model:s,message:u})};for(let{name:s,definition:u}of Xr(e)){let c=u.attributes??{},l=u.traits?.gdpr,f=Zr(u),d=f.find((T)=>T.model===D),p=Object.entries(c).map(([T,P])=>({attribute:T,shape:P,options:eo(P?.personal)})).filter((T)=>T.options!==null);if(!l&&p.length===0){if(d&&s!==D)r.push(s);continue}if(l!==void 0&&(l===null||typeof l!=="object")){i(s,"`traits.gdpr` must be an object");continue}let m=Ut(s,u),g=u.primaryKey??"id",w=null,h,b=l?.subject;if(b===void 0){if(s===D)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((P)=>P.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(!Lt.has(k))i(s,`erasure must be one of ${[...Lt].join(", ")}, got '${String(k)}'`);let R=null;if(l?.retention!==void 0){let T=l.retention,P=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(!qt.has(P))i(s,`retention.action must be one of ${[...qt].join(", ")}, got '${String(P)}'`);else R={days:T.days,column:T.column??"created_at",action:P}}if(l?.basis!==void 0&&!Gt.has(l.basis))i(s,`basis must be one of ${[...Gt].join(", ")}, got '${String(l.basis)}'`);let oe=k==="anonymize"&&w!==null||R?.action==="anonymize",V=[];for(let{attribute:T,shape:P,options:Ce}of p){let ie=to(P,Ce);if("problem"in ie){if(oe)i(s,`personal attribute '${T}' ${ie.problem}`);V.push({attribute:T,column:X(T),export:Ce.export!==!1,perRow:!1,anonymizeTo:null});continue}V.push({attribute:T,column:X(T),export:Ce.export!==!1,perRow:ie.perRow,anonymizeTo:ie.value})}if(w!==null&&k==="anonymize"&&V.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"&&V.length===0)i(s,"retention anonymizes, but no attribute is marked personal");if(n.set(s,{model:s,table:m,primaryKey:g,subject:w,personal:V,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 a=(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=a(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){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:[...n.values()],unclassified:r.sort(),problems:o}}function ge(e){if(e.problems.length)throw new We(e.problems);return e}var ye="gdpr_requests",ze=500;class we extends Error{constructor(e){super(`No user matches '${String(e)}'.`);this.name="GdprSubjectNotFoundError"}}async function be(e){if(e)return ge(me(e));await Promise.resolve().then(() => Qe());return ge(me(await Ve()))}async function Xt(e=C){let n=String(uo()),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 lo=/no such table|does not exist|doesn't exist|unknown table|undefined table|ER_NO_SUCH_TABLE/i;async function he(e,n=C){let t=await Xt(n);if(t)return t.has(e.toLowerCase());try{return await n.selectFrom(e).selectAll().limit(1).execute(),!0}catch(r){if(lo.test(r instanceof Error?r.message:String(r)))return!1;throw r}}function fo(e){let n=e.models.find((t)=>t.model===D);return{table:n?.table??"users",primaryKey:n?.primaryKey??"id"}}function po(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 mo(e,n={},t=C){let r=await be(n.models);return Je(r,e,t)}async function Je(e,n,t){let{table:r,primaryKey:o}=fo(e),i=po(n),a;if(i.kind==="id")a=(await t.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 t.selectFrom(r).selectAll().where("email","=",s).limit(1).execute())[0],a)break}else a=(await t.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 Ye(e,n=ze){let t=[];for(let r=0;r<e.length;r+=n)t.push(e.slice(r,r+n));return t}function go(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 Xe(e,n,t,r,o){let i=o.get(t.model);if(i)return i;let a=t.subject,s=[];if(a?.kind==="column")for(let u of a.columns){let c=e.selectFrom(t.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(t.table).selectAll().where(a.column,"=",u).execute())}else if(a?.kind==="via"){let u=n.get(a.model),l=(await Xe(e,n,u,r,o)).map((f)=>f[u.primaryKey]).filter((f)=>f!==null&&f!==void 0);for(let f of Ye(l))s.push(...await e.selectFrom(t.table).selectAll().where(a.foreignKey,"in",f).execute())}return s=go(s,t.primaryKey),o.set(t.model,s),s}function Ht(e){if(typeof e==="bigint")return Number.isSafeInteger(Number(e))?Number(e):e.toString();if(e instanceof Date)return e.toISOString();return e}function yo(e,n){let t={};for(let r of e.exportColumns)if(r in n)t[r]=Ht(n[r]);for(let r of e.personal)if(r.export&&r.column in n)t[r.column]=Ht(n[r.column]);return t}function He(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 wo(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 Zt(e,n){let t=He(e,n);return Object.entries(t).some(([r,o])=>!wo(n[r],o))}async function en(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(He(n,o)).where(n.primaryKey,"=",o[n.primaryKey]).execute();return}let r=He(n,t[0]);for(let o of Ye(t.map((i)=>i[n.primaryKey])))await e.updateTable(n.table).set(r).where(n.primaryKey,"in",o).execute()}async function tn(e,n,t){for(let r of Ye(t.map((o)=>o[n.primaryKey])))await e.deleteFrom(n.table).where(n.primaryKey,"in",r).execute()}async function Ze(e,n,t,r,o){let i=Yt(new Date);await e.insertInto(ye).values({uuid:so(),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:i,created_at:i}).execute()}async function et(){if(!await he(ye))throw Error(`The '${ye}' table does not exist, so this request cannot be recorded. Run \`buddy migrate\` first.`)}async function tt(e){let n=[],t=[],r=await Xt(),o=new Map;for(let i of e){if(!o.has(i.table))o.set(i.table,r?r.has(i.table.toLowerCase()):await he(i.table));if(o.get(i.table))n.push(i);else t.push(i.table)}return{present:n,skipped:[...new Set(t)].sort()}}async function bo(e,n={}){let t=await be(n.models),r=await Je(t,e,C);if(!r)throw new we(e);await et();let o=t.models.filter((l)=>l.subject),{present:i}=await tt(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 Xe(C,a,l,r,s);if(!f.length)continue;u[l.model]=f.map((d)=>yo(l,d)),c[l.model]={purpose:l.purpose,basis:l.basis,retentionDays:l.retention?.days??null}}return await Ze(C,"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 ho(e){return[...e].sort((n,t)=>{let r=n.model===D?1:0,o=t.model===D?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 ko(e,n={}){let t=n.dryRun===!0,r=await be(n.models),o=await Je(r,e,C);if(!o)throw new we(e);if(!t)await et();let i=r.models.filter((d)=>d.subject),{present:a,skipped:s}=await tt(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 Xe(d,u,g,o,p);let m=[];for(let g of ho([...u.values()])){let w=p.get(g.model)??[];if(g.erasure==="delete"){if(!t)await tn(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)=>Zt(g,b));if(!t)await en(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 Ze(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(C):await Ke(c),f=!1;if(!t&&n.revokeCredentials!==!1)f=await To(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 To(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 he("oauth_access_tokens"))await n.revokeAllTokens(t);if(n.sessionDestroyAll)await n.sessionDestroyAll(t);return!0}var Jt=86400000;async function Ro(e={}){let n=e.dryRun===!0,t=e.now??new Date,o=(await be(e.models)).models.filter((c)=>c.retention);if(!o.length)return{dryRun:n,cutoffs:{},changes:[],skipped:[]};if(!n)await et();let{present:i,skipped:a}=await tt(o),s=[],u={};for(let c of i){let l=c.retention,f=new Date(t.getTime()-l.days*Jt),d=Yt(new Date(f.getTime()+Jt));u[c.model]=f.toISOString();let p=[],m;for(;;){let h=C.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(ze).execute();if(!b.length)break;for(let k of b){let R=co(k[l.column]);if(R&&R.getTime()<f.getTime())p.push(k)}if(m=b[b.length-1][c.primaryKey],b.length<ze)break}let g=l.action==="delete"?p:p.filter((w)=>Zt(c,w));if(!n&&g.length)await Ke(async(w)=>{if(l.action==="delete")await tn(w,c,g);else await en(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 Ze(C,"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:a}}Qe();function So(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,i])=>`${o} = ${String(i)}`).join(", ");return r?`${t} where ${r}`:t}function _o(e){return{entries:e.models.map((t)=>({model:t.model,table:t.table,subject:So(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 Z(e){return(e??"-").replaceAll("|","\\|").replaceAll(`
5
+ `," ")}function Ao(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((i)=>r.notExported.includes(i)?`\`${i}\` (not exported)`:`\`${i}\``).join(", "):"-";t.push(`| ${[r.model,`\`${r.table}\``,Z(r.subject),o,Z(r.erasure),Z(r.retention),Z(r.basis),Z(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 Bo,registerModel as No}from"@stacksjs/query-builder";import{log as _}from"@stacksjs/logging/runtime";import{snakeCase as ne}from"@stacksjs/strings";import{AsyncLocalStorage as Cn}from"async_hooks";import{toCursorPaginator as Lo,toPaginator as qo,toSimplePaginator as Go}from"@stacksjs/pagination";function rt(e,n){let t=at(),r=t?nt(t,"per_page"):void 0,o=t?nt(t,"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(n??o??1));return{perPage:i,page:a}}function ot(e,n){let t=at(),r=t?rn(t,"cursor"):void 0,o=t?nt(t,"per_page"):void 0,i=e!==void 0?Math.max(1,Math.floor(e)):Math.min(100,Math.max(1,o??15)),s=nn(n!==void 0?n:r??null);return{perPage:i,cursor:s}}function nn(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 it(e){let n=at();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?I(t,{cursor:e.next_cursor}):null,e.prev_page_url=e.prev_cursor!==null?I(t,{cursor:e.prev_cursor}):null,e;let o=e.current_page;if(e.prev_page_url=o>1?I(t,{page:o-1}):null,"total"in e){let i=e.last_page;e.next_page_url=o<i?I(t,{page:o+1}):null,e.first_page_url=I(t,{page:1}),e.last_page_url=I(t,{page:i})}else e.next_page_url=e.has_more_pages?I(t,{page:o+1}):null;return e}function I(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 G;function at(){if(G===null)return;if(G===void 0)try{let n=Jn("@stacksjs/router");if(typeof n.getCurrentRequest==="function")G=n.getCurrentRequest;else{G=null;return}}catch{G=null;return}return G()}function nt(e,n){let t=rn(e,n);if(t===void 0)return;let r=Number(t);return Number.isFinite(r)?r:void 0}function rn(e,n){let t=e.query?.[n];if(t===void 0)return;return Array.isArray(t)?t[0]:t}function on(){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"),i=String(e.id??e.get?.("id")??e.get?.("email")??t),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(n,t))return await o.recordFailedAttempt(a),!1;try{let{cache:u}=await import("@stacksjs/cache"),c=`2fa:used:${i}:${n}`;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 Po,sqlDateTime as xo}from"@stacksjs/database/runtime";import{log as U}from"@stacksjs/logging";var ke="deleted_at";function an(e,n="id"){return{async softDelete(t){let r=xo(),o=e.where(n,t);if(typeof o?.update==="function")return await o.update({[ke]:r}),!0;return!1},async restore(t){let r=e.where(n,t).withTrashed();if(typeof r?.update==="function")return await r.update({[ke]: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 Po(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(ke);return t?.where?.(ke,"!=",null)??t}}}function sn(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 Co(e,n){let t=e.hasMany??[],r=e.hasOne??[],o=t.some((l)=>st(l,n,!0)),i=r.some((l)=>st(l,n,!1));if(!o&&!i)return U.warn(`[orm] soft-delete cascade: '${n}' is not a declared hasMany/hasOne relation - skipping`),null;let s=(o?t:r).find((l)=>st(l,n,o))??null;if(!s)return null;let c=globalThis[s];if(!c)return U.warn(`[orm] soft-delete cascade: model '${s}' is not yet on globalThis - skipping cascade for '${n}'`),null;return{className:s,model:c}}function st(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 vo(e,n,t,r,o){try{let i=t.where;if(typeof i!=="function"){U.warn(`[orm] cascade ${o}: child model has no .where()`);return}if(o==="softDelete"){let a=t.softDelete;if(typeof a==="function"){let u=i.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 a.call(t,d)}return}let s=i.call(t,r,n);if(typeof s?.delete==="function"){U.debug(`[orm] cascade soft-delete: child has no softDeletes trait, hard-deleting from ${String(t.table??"?")}`),await s.delete();return}}else{let a=t.restore;if(typeof a!=="function"){U.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 a.call(t,p)}}}catch(i){if(U.warn(`[orm] soft-delete cascade ${o} on ${e}#${String(n)} failed`,{error:i}),process.env.STACKS_ORM_CASCADE_SWALLOW!=="true")throw i}}async function ee(e,n,t,r){let o=n.cascade;if(!o||o.length===0)return;let i=`${e.name.toLowerCase()}_id`;for(let a of o){let s=Co(e,a);if(!s)continue;await vo(s.className,t,s.model,i,r)}}import{sqlDateTime as Do}from"@stacksjs/database/runtime";import{log as Mo}from"@stacksjs/logging";var Oo=[/^password$/i,/^password_hash$/i,/^api_key$/i,/_token$/i,/_secret$/i,/^remember_token$/i],un=null;async function cn(){if(un!=null)return un;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 ln(){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 dn(e){if(!e||typeof e!=="object")return null;let n={};for(let[t,r]of Object.entries(e)){if(Oo.some((o)=>o.test(t)))continue;n[t]=r}return n}function fn(e,n,t){Mo.warn(`[orm] ${e} row write failed for ${n}: ${t?.message??String(t)}`)}var Eo="activities";function pn(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 jo(e,n,t=[]){let r=dn(e);if(!r)return null;let o=new Set(t),i=n.logOnly??n.include,a=new Set(n.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 Fo(e,n,t){return t==null?`${e} was ${n}`:`${e} ${String(t)} was ${n}`}async function $o(e){try{let{db:n}=await import("@stacksjs/database/runtime");await n.insertInto(Eo).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:Do()}).executeTakeFirst()}catch(n){fn("activity",`${e.subject_type}#${String(e.subject_id)}`,n)}}async function Io(e){let{attributes:n,event:t,modelName:r,options:o,primaryKey:i}=e,a=n?.[i]??null,s=await cn();await $o({type:`${r.toLowerCase()}.${t}`,description:Fo(r,t,a),subject_type:r,subject_id:a,properties:jo(n,o,e.hidden),causer:s==null?null:`User:${String(s)}`,user_id:s,ip_address:await ln()})}function Te(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 mn(e,n,t,r,o=[]){if(n==="Activity")return;let i=e,a=async(d)=>typeof i.find==="function"?Te(await i.find(d)):null,s=async(d,p)=>{await Io({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",Te(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",Te(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",Te(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??{[t]:d}),m}}var _e,vn=new Cn;function N(){return vn.getStore()?.suppressed===!0}function B(e){return Promise.resolve(vn.run({suppressed:!0},e))}var Mn=new Cn;function Uo(){return Mn.getStore()?.suppressed===!0}function Ko(e){return Promise.resolve(Mn.run({suppressed:!0},e))}var pt=Symbol.for("stacks.orm.modelDefinition");class On 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 gn=new Set,Wo=4096,yn=Object.create(null),wn=0;function te(e){let n=yn[e];if(n!==void 0)return n;let t=ne(e);if(wn<Wo)yn[e]=t,wn++;return t}function Vo(e,n){let t=typeof e==="string"?e.slice(0,80):String(e),r=`${typeof e}:${t}`;if(gn.has(r))return;gn.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 Qo={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 Vo(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 zo(e){return typeof e==="string"?Qo[e]:e}var bn=new WeakMap;function Dn(e){let n=Object.keys(e),t=bn.get(e);if(t&&t.length===n.length){let o=!0;for(let i=0;i<n.length;i++){let a=n[i];if(t[i]?.attr!==a||t[i]?.definition!==e[a]){o=!1;break}}if(o)return t}let r=n.map((o)=>{let i=e[o];return{attr:o,definition:i,caster:zo(i)}});return bn.set(e,r),r}function ut(e,n,t){if(!e||typeof e!=="object")return e;let r={...e};for(let{attr:o,caster:i}of Dn(n))if(o in r)r[o]=i[t].call(i,r[o]);return r}function Re(e){return e==="_attributes"||e==="_original"||e==="_definition"||e==="_hasSaved"||e==="_relations"}var lt=Symbol.for("stacks.modelInstanceProxy"),hn,kn=new WeakMap,Ho={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(de.map((e)=>[e,{bag:"_billable",mode:"model"}])),generateTwoFactorForModel:{bag:"_twoFactor",mode:"model"},verifyTwoFactorCode:{bag:"_twoFactor",mode:"model"}};function Jo(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 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 Se(e,n,t){if(e&&typeof e.then==="function")return e.then((r)=>r===n?t:r);return e===n?t:e}function O(e,n){if(!e||typeof e!=="object")return e;let t=e;if(t[lt])return e;let r=t._attributes;if(!r||typeof r!=="object")return e;if(n){for(let{attr:i,caster:a}of Dn(n))if(Object.hasOwn(r,i))r[i]=a.get.call(a,r[i])}let o=n?kn.get(n):hn;if(!o)if(o={get(i,a,s){let u=i;if(a===lt)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 Se(u.save(),i,s)}finally{l.set=d}}return Se(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 Se(u.save(),i,s)}finally{l.set=d}}return Se(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 B(()=>u.save())};if(a==="saveAsyncQuietly")return function(){return B(()=>s.saveAsync())};if(a==="updateQuietly")return function(l){return B(()=>u.update(l))};if(a==="updateAsyncQuietly")return function(l){return B(()=>s.updateAsync(l))};if(a==="deleteQuietly")return function(){return B(()=>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=ne(b),R=p[k]??p[b];if(R!==void 0){m[k]=R;continue}let oe=w[b]??w[k];if(oe){m[k]=Jo(h,oe);continue}m[k]=void 0}if(p.id!=null)m.id=String(p.id);return m};if(typeof a==="string"&&!Re(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)=>O(m,n));return p&&typeof p==="object"?O(p,n):p}let d=Ho[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=te(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"&&!Re(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=te(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"&&!Re(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=te(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"&&!Re(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)}},n)kn.set(n,o);else hn=o;return new Proxy(e,o)}var En=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}),Yo={paginate:qo,simplePaginate:Go,cursorPaginate:Lo},Tn=Symbol.for("stacks.queryBuilderProxy");function Rn(e,n,t){if(En[n]){if(Array.isArray(e))return e.map((o)=>O(o,t));let r=Yo[n];if(r&&e&&Array.isArray(e.data)){let o=e.data.map((a)=>O(a,t)),i=r({...e,data:o});return it(i)}if(e&&Array.isArray(e.data))return{...e,data:e.data.map((o)=>O(o,t))};return O(e,t)}if(e&&typeof e==="object"&&typeof e.get==="function")return jn(e,t);return e}function jn(e,n){if(!e||typeof e!=="object")return e;if(e[Tn])return e;return new Proxy(e,{get(t,r,o){if(r===Tn)return!0;let i=Reflect.get(t,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}=rt(s[0],s[1]);u=[l,f]}else if(a==="cursorPaginate"){let{perPage:l,cursor:f}=ot(s[0],s[1]);u=[l,f,s[2],s[3]]}let c=i.apply(t,u);if(!En[a]&&c===t)return o;if(c&&typeof c.then==="function")return c.then((l)=>Rn(l,a,n));return Rn(c,a,n)}}})}function Xo(e,n){let t=(a)=>Array.isArray(a)?a.map((s)=>O(s,n)):O(a,n),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(t);return t(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(t);return t(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 jn(c,n)}}}class Fn 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 dt 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 Zo=new Set(["id","created_at","updated_at","deleted_at","uuid"]),Sn=new WeakMap;function ei(e){let n=Sn.get(e);if(n)return n;let t=new Set,r=new Set,o=new Set;for(let[a,s]of Object.entries(e)){let u=te(a);if(t.add(u),s?.fillable===!0)r.add(u);if(s?.guarded===!0)o.add(u)}let i={allowed:r.size>0?r:t,guarded:o};return Sn.set(e,i),i}function K(e,n,t={}){if(t.force)return n;if(!n||typeof n!=="object"||Array.isArray(n))return n;let r=e.attributes;if(!r)return n;let{allowed:o,guarded:i}=ei(r);for(let a in n){if(!Object.hasOwn(n,a))continue;let s=te(a);if(Zo.has(s))continue;if(i.has(s))throw new dt(e.name,a,"guarded");if(s.endsWith("_id"))continue;if(!o.has(s))throw new dt(e.name,a,"not-fillable")}return n}async function Ae(e,n){let t=e.set;if(!t||typeof t!=="object")return n;let r={...n};for(let[o,i]of Object.entries(t)){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 ti(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 i(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 a(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){_.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}K(n,l);let f=await Ae(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 Ae(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[lt]?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 i("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 i("findOrFail").call(e,c);if(l==null)throw new Fn(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 K(n,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] ${n.name}.updateOrCreate requires a where-attrs object`);if(!l||typeof l!=="object"||Array.isArray(l))throw Error(`[ORM] ${n.name}.updateOrCreate requires a values object`);let f=o("updateOrCreate").call(e,c),d=typeof f.first==="function"?await f.first():await f;if(d){K(n,l);let 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 K(n,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] ${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=Nn(n.traits?.useSearch,n);if(u){let c=u.index??n.table??ne(`${n.name}s`);if(typeof e.search!=="function")e.search=function(l,f){return oi(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 ft(k,u);if(R.length>0)await p.addDocuments(c,R);m+=R.length}),m}catch{}let w=await f.call(e)||[],h=await ft(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 ft(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)=>ri(r,n)))).filter(Boolean)}function $n(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 ni(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 ri(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 ni(e?._attributes??(typeof e?.toJSON==="function"?e.toJSON():null),n.hidden??new Set)}function oi(e,n,t,r,o){let i=o&&o.length>0?{query_by:[...o].join(",")}:{},a={q:t,...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(n,a))?.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,{...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(n,a)}};return s}function In(e){let n=ne(e);return n===e?[e]:[e,n]}async function ct(e,n){if(!e||typeof e!=="object")return;let t=e._attributes??e;for(let r of n)for(let o of In(r)){if(!(o in t))continue;let i=t[o];if(!Q(i))continue;t[o]=await Oe(i)}}function ii(e,n){if(n.length===0)return;let t=async(s)=>{if(Array.isArray(s)){for(let u of s)await ct(u,n);return s}if(s&&typeof s==="object"&&Array.isArray(s.data)){for(let u of s.data)await ct(u,n);return s}if(s)await ct(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 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 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 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 ai(e,n){if(n.length===0)return;let t=async(i)=>{if(!i||typeof i!=="object"||Array.isArray(i))return i;let a={...i};for(let s of n)for(let u of In(s))if(u in a)a[u]=await Me(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(t)):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 t(s[0]),s[1])s[1]=await t(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 t(u);return await a.call(this,s,c)}}}function si(e,n){let t=e.create;if(typeof t==="function")e.create=async function(o,...i){K(n,o);let a=await Ae(n,o);return await t.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)K(n,s),a.push(await Ae(n,s));return await r.call(this,a,...i)};for(let o of["firstOrCreate","updateOrCreate"]){let i=e[o];if(typeof i!=="function")continue}}function ui(e,n){if(!Ft(n))return;let t=String(n?.name??e.name??"Model"),r=(s,u)=>{if(Uo())return;if(!s||typeof s!=="object"||Array.isArray(s))return;let c=$t(s,n,u);if(!c.valid)throw new On(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 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 ci(e,n){let t=["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)?ut(u,n,"set"):u):i;return await r.call(this,s,...a)};for(let i of t){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]=ut(s[0],n,"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)?ut(a,n,"set"):a;return await o.call(this,i,s)}}var _n=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 Bn(e){_.debug(`[orm] Defining model: ${e.name} (table: ${e.table})`);for(let g of Object.keys(e.traits??{}))if(!_n.has(g))_.warn(`[orm] Model '${e.name}' declares an unknown trait '${g}'. It does nothing. Known traits: ${[..._n].sort().join(", ")}.`);let n=li(e),t=fi(e),r=di(n,t),o=pi(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=Bo(a);if(Xo(u,e.casts),ti(u,a),si(u,a),e.casts&&Object.keys(e.casts).length>0)ci(u,e.casts);let c=De(e);if(c.length>0)ai(u,c),ii(u,c);let l=e.traits?.useSoftDeletes;if(l)mi(u,a,l);let f=e.traits?.useAudit;if(f){let g=St(f);_t(u,e.name,e.primaryKey||"id",g)}let d=pn(e.traits?.useActivityLog);if(d)mn(u,e.name,e.primaryKey||"id",d,[...$n(e)]);ui(u,a);let p=u;p.withoutValidation=function(g){return Ko(g)},p.withoutEvents=function(g){return B(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 B(()=>w.apply(u,b))}}let m=Object.assign(u,o,{...e,getDefinition:()=>e,_isStacksModel:!0});return No(e.name,m),Object.defineProperty(m,pt,{value:e,enumerable:!1,configurable:!0}),m}function li(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(N())return;try{let{dispatch:m}=_e??=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(N())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(N())return!0;let m;try{m=_e??=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(_.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(_.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(_.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 di(...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((i)=>i?.[r]).filter((i)=>typeof i==="function");if(!o.length)continue;n[r]=async(...i)=>{for(let a of o)await a(...i)}}return Object.keys(n).length?n:void 0}function Nn(e,n){if(!e)return null;let t=e===!0?{}:typeof e==="object"?{...e}:null;if(!t)return null;if(n)t.hidden=$n(n);return t}function fi(e){let n=Nn(e.traits?.useSearch,e);if(!n)return;let t=n,r=t.index??e.table??ne(`${e.name}s`);async function o(s){if(typeof t.shapeMany==="function")try{let[l]=await ft([s],t);return l}catch(l){_.warn(`[orm/search] shapeMany() threw for ${e.name}: ${l.message}`);return}if(typeof t.shape==="function")try{return await t.shape(s)}catch(l){_.warn(`[orm/search] shape() threw for ${e.name}: ${l.message}`);return}let c=O(s).toSearchableObject?.();if(c!==void 0)return c;return s?._attributes??(typeof s?.toJSON==="function"?s.toJSON():null)}let i=async(s)=>{if(N())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){_.warn(`[orm/search] queue dispatch failed for ${e.name}; falling back to inline: ${c.message}`),await Pn(r,u,e.name)}return}await Pn(r,u,e.name)};return{afterCreate:i,afterUpdate:i,afterDelete:async(s)=>{if(N())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){_.warn(`[orm/search] queue dispatch failed for ${e.name}#${u}; falling back to inline: ${c.message}`),await xn(r,Number(u),e.name)}return}await xn(r,Number(u),e.name)}}}var An=new Map;function Ln(e,n){let t=An.get(e)??0;if(An.set(e,t+1),t===0)_.warn(`[orm/search] ${n}`);else if(t===9)_.warn(`[orm/search] ${e} is still failing; further identical warnings suppressed for this process.`)}async function Pn(e,n,t){try{let{useSearchEngine:r}=await import("@stacksjs/search-engine");await r().addDocument(e,n)}catch(r){Ln(`index:${t}`,`Failed to index ${t}: ${r.message}`)}}async function xn(e,n,t){try{let{useSearchEngine:r}=await import("@stacksjs/search-engine");await r().deleteDocument(e,n)}catch(r){Ln(`remove:${t}`,`Failed to remove ${t}#${n}: ${r.message}`)}}function pi(e){let n={},{table:t,traits:r}=e;if(!r)return n;if(r.taggable)n._taggable=Ie(t);if(r.categorizable)n._categorizable=Be(t);if(r.commentable)n._commentable=Fe(t);if(r.billable)n._billable=xt(t);if(r.likeable){let i=typeof r.likeable==="object"?r.likeable:void 0;n._likeable=Ne(t,i)}let o=r.useAuth||r.authenticatable;if(typeof o==="object"&&o&&"useTwoFactor"in o&&o.useTwoFactor)n._twoFactor=on();return n}function mi(e,n,t){let r=an(e,n.primaryKey||"id"),o=sn(t),i=n,a=n.name.toLowerCase(),s=n.traits?.observe!=null&&n.traits?.observe!==!1,u=async(p)=>{if(!s||N())return!0;try{let{dispatchAsync:m}=_e??=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||N())return;try{let{dispatch:m}=_e??=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 ee(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 ee(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 ee(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 ee(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 gi(e){if(e==null)return e;if(Array.isArray(e))return e.map((t)=>gi(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 yi=["belongsTo","hasOne","hasMany","belongsToMany","morphMany","morphOne"],wi=["traits","dashboard"];function bi(e){let n=e?.[pt];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 hi(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 ki(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 Ti(e,n){let t={...e,...n},r=e.attributes??{},o=n.attributes??{};if(n.attributes){let i=ki(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]}));t.attributes={...r,...a}}for(let i of yi){let a=hi(e[i],n[i]);if(a)t[i]=a}for(let i of wi){let a=e[i],s=n[i];if(a&&s&&typeof a==="object"&&typeof s==="object")t[i]={...a,...s}}return t}function Gc(e,n){return Bn(Ti(bi(e),n))}import Gn from"process";import{log as vi}from"@stacksjs/logging";import{path as A}from"@stacksjs/path";import{fs as re}from"@stacksjs/storage";import{Database as Ri}from"bun:sqlite";import{existsSync as Si,readdirSync as _i,readFileSync as Ai}from"fs";function Pi(e){return e.startsWith("sqlite_")||e.startsWith("_qb_tmp_")}function xi(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 Ci(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(i){if(/duplicate column name/i.test(i.message))r++}}return r>0?{ok:!0}:{ok:!1,error:t.message}}}function qn(e,n="sqlite"){let t=[];if(!Si(e))return{tables:[],errors:t};let r;try{r=_i(e).filter((i)=>i.endsWith(".sql")).sort()}catch(i){return{tables:[],errors:[{file:e,error:i.message}]}}let o=new Ri(":memory:");try{for(let s of r){let u=`${e}/${s}`,c;try{c=Ai(u,"utf-8")}catch(f){t.push({file:u,error:f.message});continue}let l=Ci(o,c);if(!l.ok)t.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)=>!Pi(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=xi(l.type??"",n),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:t}}finally{o.close()}}function Mi(e){if(e)return e;if(Gn.env.STACKS_CANONICAL_FEATURES==="1")return"sqlite";let n=String(Gn.env.DB_CONNECTION??"").toLowerCase();return n==="postgres"||n==="mysql"?n:"sqlite"}function Pe(e){return e==="postgres"?"boolean":"number"}function E(e){return e.replace(/([A-Z]+)([A-Z][a-z])/g,"$1_$2").replace(/([a-z\d])([A-Z])/g,"$1_$2").toLowerCase()}function Oi(e,n){let t=e.default;if(typeof t==="boolean")return Pe(n);if(typeof t==="number")return"number";if(typeof t==="string")return"string";return"unknown"}function Di(e){let n=e.validation;if(!n||typeof n!=="object")return null;let t=n.rule;return t&&typeof t==="object"?t:null}function Ei(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 ji(e,n){let t=Di(e),r=Ei(t);if(r!==null)return e.nullable===!0?`${r} | null`:r;let o=typeof e.type==="string"?e.type.toLowerCase():String(t?.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 Pe(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 Oi(e,n)}})();return e.nullable===!0?`${i} | null`:i}function Fi(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[`${E(o)}_id`]="number";continue}if(o&&typeof o==="object"){let i=o;if(typeof i.foreignKey==="string"){n[i.foreignKey]="number";continue}if(typeof i.model==="string")n[`${E(i.model)}_id`]="number"}}return n}function $i(e,n){let[t,r]=[E(e),E(n)].sort();return`${t}_${r}`}function Ii(e,n){let t=e.default,r=typeof t==="string"?"string":typeof t==="number"?"number":typeof t==="boolean"?Pe(n):t instanceof Date?"string":"unknown";return e.nullable?`${r} | null`:r}function Bi(e,n,t){let r=n.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??$i(e,s),m=c??`${E(e)}_id`,g=l??`${E(s)}_id`,w={id:"number",[m]:"number",[g]:"number"};for(let[h,b]of Object.entries(f))w[h]=Ii(b,t);if(d)w.created_at="string",w.updated_at="string | null";o.push({table:p,columns:w})}return o}function Ni(e){return{email_verified_at:"string | null",password_changed_at:"string | null",two_factor_secret:"string | null",two_factor_enabled:`${Pe(e)} | null`,two_factor_last_used_step:"number | null",stripe_id:"string | null"}}function Li(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,Ni(n));return t}function qi(e,n){let t={},r=e.attributes??{};for(let[o,i]of Object.entries(r))t[E(o)]=ji(i,n);return t}function Un(e,n,t=2){let r=" ".repeat(t),o=" ".repeat(t+1),i=Object.entries(n).map(([s,u])=>`${o}${s}: ${u}`).join(`
8
+ `),a=/^[A-Z_a-z]\w*$/.test(e)?e:`'${e}'`;return`${r}${a}: {
9
9
  ${o}// columns
10
- ${a}
11
- ${r}}`}var Ia=`/* eslint-disable */
10
+ ${i}
11
+ ${r}}`}var Gi=`/* 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
- `,Ba=` }
18
+ `,Ui=` }
19
19
  }
20
20
 
21
21
  export {}
22
- `,Na="/* 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",La=`}
23
- `;function Gn(e){return e==="framework"?Na:Ia}function Un(e){return e==="framework"?La:Ba}async function Kn(e,n,t=[]){let r=[];if(!ne.existsSync(e))return r;let o=ne.readdirSync(e,{withFileTypes:!0});for(let a of o){let i=A.join(e,a.name);if(a.isDirectory()){if(n){let s=await Kn(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(A.isAbsolute(i)?import(i):import(A.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 qa(e={}){let n=Aa(e.dialect),t=e.modelsDir??A.userModelsPath(),r=e.defaultsDir??A.frameworkPath("defaults/app/Models"),o=e.outFile??A.projectPath("database/types.d.ts"),a=[],i=[];for(let[m,g]of[[t,!1],[r,!0]])try{let w=await Kn(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??A.basename(m.filePath).replace(/\.ts$/,""),m);for(let m of i)if(m.filePath.startsWith(t))s.set(m.model.name??A.basename(m.filePath).replace(/\.ts$/,""),m);let u=[];for(let[m,{model:g}]of s){let w=g.table??`${E(m)}s`,h={...ja(g,n),...$a(g,n),...va(g)};u.push({table:w,model:m,columns:h})}let c=new Map;for(let[m,{model:g}]of s)for(let w of Ea(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??A.resolve(A.dirname(o),"migrations"),g=new Set(u.map((h)=>h.table)),w=Nn(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)=>qn(m.table,m.columns,f)).join(`
24
- `),p=`${Gn(l)}${d}
25
- ${Un(l)}`;if(!e.dryRun){let m=A.dirname(o);if(!ne.existsSync(m))ne.mkdirSync(m,{recursive:!0});ne.writeFileSync(o,p,"utf-8"),_a.success(`[generate:db-types] wrote ${u.length} table(s) to ${o}`)}return{outFile:o,tables:u,errors:a,content:p}}function Ga(e,n="app"){let t=[...e].sort((r,o)=>r.table.localeCompare(o.table)).map((r)=>qn(r.table,r.columns,n==="framework"?1:2)).join(`
26
- `);return`${Gn(n)}${t}
27
- ${Un(n)}`}import{isCursorPaginator as Pl,isPaginator as xl,isSimplePaginator as Cl,toCursorPaginator as Ml,toPaginator as vl,toSimplePaginator as Ol}from"@stacksjs/pagination";import{configureOrm as Ua}from"@stacksjs/query-builder";function Ka(){try{let e=process.env.DB_DATABASE_PATH||"database/stacks.sqlite";if((process.env.DB_CONNECTION||"sqlite")==="sqlite")Ua({database:e})}catch{}}Ka();async function Wn(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 Ae(e,n=[""]){let{path:t}=await import("@stacksjs/path"),r=t.userModelsPath(`${e}.ts`);try{if(await Bun.file(r).exists())return await Wn(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 Wn(i)}catch(s){console.error(`[orm] Failed to import framework default model ${e} from ${i} - trying next subdir. Reason:`,s)}}return null}var F={},Vn=()=>{},zc=new Promise((e)=>{Vn=e});function y(e){return new Proxy(function(){},{get(n,t){if(t==="then")return;let r=F[e];if(r==null)return;let o=r[t];return typeof o==="function"?o.bind(r):o},set(n,t,r){let o=F[e];if(o==null)return!1;return o[t]=r,!0},has(n,t){let r=F[e];return r==null?!1:(t in r)},apply(n,t,r){let o=F[e];if(o==null||typeof o!=="function")return;return o.apply(t,r)}})}var Wa=y("User"),Va=y("Job"),Qa=y("FailedJob"),za=[["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"],["CardAttachment",[""],"dashboard"],["CardComment",[""],"dashboard"],["Deployment",[""],"dashboard"],["FeedbackToken",[""],"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"],["PaymentWebhookEvent",["commerce"],"commerce"],["Transaction",["commerce"],"commerce"]];queueMicrotask(async()=>{try{let{feature:e}=await import("@stacksjs/config"),n=await Ae("User");if(n)F.User=n;if(e("queue")){let t=await Ae("Job");if(t)F.Job=t;let r=await Ae("FailedJob");if(r)F.FailedJob=r}for(let[t,r,o]of za){if(!e(o))continue;let a=await Ae(t,r);if(a)F[t]=a}}catch(e){console.error("[orm] deferred model load failed:",e)}finally{Vn()}});var Ha=y("Activity"),Ja=y("AnalyticsEvent"),Ya=y("Automation"),Xa=y("AutomationRun"),Za=y("Auction"),ei=y("CampaignVariant"),ti=y("CommunicationSuppression"),ni=y("ConsentEvent"),ri=y("SenderDomain"),oi=y("UsageEvent"),ai=y("AuctionItem"),ii=y("Author"),si=y("Bid"),ui=y("Board"),ci=y("BoardColumn"),li=y("Campaign"),di=y("Card"),Hc=y("CardAttachment"),fi=y("CardComment"),pi=y("Cart"),mi=y("CartItem"),gi=y("Category"),yi=y("Comment"),wi=y("Coupon"),bi=y("Customer"),hi=y("DeliveryRoute"),ki=y("DeliveryStop"),Ti=y("Deployment"),Jc=y("FeedbackToken"),Ri=y("DigitalDelivery"),Si=y("Courier"),_i=y("CourierPing"),Ai=y("CampaignSend"),Pi=y("EmailList"),xi=y("EmailListSubscriber"),Ci=y("Form"),Mi=y("FormField"),vi=y("FormSubmission"),Oi=y("MagicLinkToken"),Di=y("Menu"),Ei=y("MenuItem"),Fi=y("PageRevision"),ji=y("Pledge"),$i=y("Redirect"),Ii=y("Site"),Bi=y("SiteDomain"),Ni=y("SmsOptOut"),Li=y("GdprRequest"),Yc=y("StorageItem"),Xc=y("StorageItemTask"),qi=y("EmailIdempotency"),Gi=y("EmailSuppression"),Ui=y("EmailWebhookEvent"),Ki=y("Error"),Wi=y("GiftCard"),Vi=y("Label"),Qi=y("LicenseKey"),zi=y("Log"),Hi=y("LoyaltyPoint"),Ji=y("LoyaltyReward"),Yi=y("MailPreference"),Xi=y("Manufacturer"),Zi=y("Notification"),es=y("NotificationDelivery"),ts=y("Order"),ns=y("OrderIdempotency"),Zc=y("PersonalAccessToken"),rs=y("OrderItem"),os=y("Page"),as=y("Payment"),is=y("PaymentWebhookEvent"),ss=y("PaymentMethod"),us=y("PaymentProduct"),cs=y("PaymentTransaction"),ls=y("Post"),ds=y("Categorizable"),fs=y("PrintDevice"),ps=y("Product"),ms=y("ProductUnit"),gs=y("ProductVariant"),ys=y("QueryLog"),ws=y("Receipt"),el=y("Referral"),tl=y("ReferralCode"),bs=y("Release"),hs=y("Request"),ks=y("Review"),Ts=y("ShippingMethod"),Rs=y("ShippingRate"),Ss=y("ShippingZone"),_s=y("SocialPost"),As=y("SocialAccount"),Ps=y("Subscriber"),xs=y("SubscriberEmail"),Cs=y("Subscription"),Ms=y("Tag"),vs=y("TaxRate"),Os=y("Team"),Ds=y("TeamInvitation"),Es=y("TeamMember"),Fs=y("Transaction"),js=y("WaitlistProduct"),$s=y("WaitlistRestaurant"),Is=y("Websocket"),Qn={User:Wa,Job:Va,FailedJob:Qa,Activity:Ha,AnalyticsEvent:Ja,Automation:Ya,AutomationRun:Xa,Auction:Za,AuctionItem:ai,Author:ii,Bid:si,Board:ui,BoardColumn:ci,Campaign:li,CampaignSend:Ai,CampaignVariant:ei,Card:di,CardComment:fi,Cart:pi,CartItem:mi,Categorizable:ds,Category:gi,Comment:yi,Coupon:wi,Customer:bi,CommunicationSuppression:ti,ConsentEvent:ni,DeliveryRoute:hi,DeliveryStop:ki,Deployment:Ti,DigitalDelivery:Ri,Courier:Si,CourierPing:_i,EmailList:Pi,EmailListSubscriber:xi,EmailIdempotency:qi,EmailSuppression:Gi,EmailWebhookEvent:Ui,ErrorModel:Ki,Form:Ci,FormField:Mi,FormSubmission:vi,GdprRequest:Li,GiftCard:Wi,Label:Vi,LicenseKey:Qi,Log:zi,LoyaltyPoint:Hi,LoyaltyReward:Ji,MailPreference:Yi,Manufacturer:Xi,Notification:Zi,MagicLinkToken:Oi,Menu:Di,MenuItem:Ei,NotificationDelivery:es,Order:ts,OrderIdempotency:ns,OrderItem:rs,Page:os,PageRevision:Fi,Payment:as,PaymentMethod:ss,PaymentProduct:us,PaymentTransaction:cs,PaymentWebhookEvent:is,Pledge:ji,Post:ls,PrintDevice:fs,Product:ps,ProductUnit:ms,ProductVariant:gs,QueryLog:ys,Receipt:ws,Release:bs,Request:hs,Review:ks,ShippingMethod:Ts,Redirect:$i,SenderDomain:ri,ShippingRate:Rs,ShippingZone:Ss,Site:Ii,SiteDomain:Bi,SmsOptOut:Ni,SocialAccount:As,SocialPost:_s,Subscriber:Ps,SubscriberEmail:xs,Subscription:Cs,Tag:Ms,TaxRate:vs,Team:Os,TeamInvitation:Ds,TeamMember:Es,Transaction:Fs,UsageEvent:oi,WaitlistProduct:js,WaitlistRestaurant:$s,Websocket:Is},K=globalThis;for(let[e,n]of Object.entries(Qn))if(n&&K[e]===void 0)K[e]=n;var nl=Object.keys(Qn);async function Bs(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 Ns(e,n,t=""){if(!e)return t;try{if(typeof e.get==="function"){let o=e.get(n);if(o!==void 0&&o!==null)return o}}catch{}let r=e?.[n];return r!==void 0&&r!==null?r:t}if(K.safeAll===void 0)K.safeAll=Bs;if(K.safeGet===void 0)K.safeGet=Ns;export{Ha as Activity,Ja as AnalyticsEvent,Za as Auction,ai as AuctionItem,ii as Author,Ya as Automation,Xa as AutomationRun,le as BILLABLE_INSTANCE_METHODS,si as Bid,ui as Board,ci as BoardColumn,li as Campaign,Ai as CampaignSend,ei as CampaignVariant,di as Card,Hc as CardAttachment,fi as CardComment,pi as Cart,mi as CartItem,ds as Categorizable,gi as Category,yi as Comment,ti as CommunicationSuppression,ni as ConsentEvent,wi as Coupon,Si as Courier,_i as CourierPing,bi as Customer,hi as DeliveryRoute,ki as DeliveryStop,Ti as Deployment,Ri as DigitalDelivery,qi as EmailIdempotency,Pi as EmailList,xi as EmailListSubscriber,Gi as EmailSuppression,Ui as EmailWebhookEvent,Ki as ErrorModel,Qa as FailedJob,Jc as FeedbackToken,Ci as Form,Mi as FormField,vi as FormSubmission,me as GDPR_AUDIT_TABLE,D as GDPR_SUBJECT_MODEL,Ke as GdprDeclarationError,Li as GdprRequest,ge as GdprSubjectNotFoundError,Wi as GiftCard,Va as Job,Vi as Label,Qi as LicenseKey,zi as Log,Hi as LoyaltyPoint,Ji as LoyaltyReward,ft as MODEL_DEFINITION,Oi as MagicLinkToken,Yi as MailPreference,Xi as Manufacturer,lt as MassAssignmentException,Di as Menu,Ei as MenuItem,En as ModelNotFoundError,Mn as ModelValidationError,Zi as Notification,es as NotificationDelivery,ts as Order,ns as OrderIdempotency,rs as OrderItem,os as Page,Fi as PageRevision,as as Payment,ss as PaymentMethod,us as PaymentProduct,cs as PaymentTransaction,is as PaymentWebhookEvent,Zc as PersonalAccessToken,ji as Pledge,ls as Post,fs as PrintDevice,ps as Product,ms as ProductUnit,gs as ProductVariant,ys as QueryLog,ws as Receipt,$i as Redirect,el as Referral,tl as ReferralCode,bs as Release,hs as Request,ks as Review,ri as SenderDomain,Ts as ShippingMethod,Rs as ShippingRate,Ss as ShippingZone,Ii as Site,Bi as SiteDomain,Ni as SmsOptOut,As as SocialAccount,_s as SocialPost,Yc as StorageItem,Xc as StorageItemTask,Wr as SubqueryBuilder,Ps as Subscriber,xs as SubscriberEmail,Cs as Subscription,Be as SubscriptionNotOwnedError,Ms as Tag,vs as TaxRate,Os as Team,Ds as TeamInvitation,Es as TeamMember,Fs as Transaction,oi as UsageEvent,Wa as User,js as WaitlistProduct,$s as WaitlistRestaurant,Is as Websocket,pe as assertGdprPlan,Mu as batchLoad,qa as buildDatabaseSchema,ho as buildProcessingRegister,ve as collectEncryptedAttributes,Tt as createAuditMethods,$e as createCategorizableMethods,Ee as createCommentableMethods,Ie as createLikeableMethods,je as createTaggableMethods,Ir as customerOwnership,Eu as db,Me as decryptValue,$n as defineModel,Ce as encryptValue,ot as enrichPaginatorUrls,go as eraseSubject,po as exportSubjectData,jc as extendModel,Rr as filterFillable,we as gdprTableExists,qt as gdprTableName,Ks as getPrunableConfig,Tr as getWritableFields,wr as isBillable,Pl as isCursorPaginator,V as isEncrypted,xl as isPaginator,Cl as isSimplePaginator,jr as isUniqueViolation,We as loadGdprModels,hr as mapWriteError,Us as massPrunable,ya as mergeModelDefinition,nl as modelGlobalNames,zc as ormReady,qr as parentOwnership,en as parseCursor,dt as projectDocumentsFromTrait,Hn as prunable,wo as pruneRetainedData,Ga as renderDatabaseTypeFile,ko as renderProcessingRegister,rt as resolveCursorArgs,fe as resolveGdprPlan,uo as resolveGdprSubject,nt as resolvePageArgs,$u as savepoint,Br as selfOwnership,rr as setAuditUser,Nr as siteOwnership,Lr as teamMembershipOwnership,la as toAttrs,Ml as toCursorPaginator,vl as toPaginator,Ol as toSimplePaginator,kr as toSnakeCaseKeys,Ue as transaction,Iu as transactional,I as withoutEvents,No as withoutValidation};
22
+ `,Ki="/* 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",Wi=`}
23
+ `;function Kn(e){return e==="framework"?Ki:Gi}function Wn(e){return e==="framework"?Wi:Ui}async function Vn(e,n,t=[]){let r=[];if(!re.existsSync(e))return r;let o=re.readdirSync(e,{withFileTypes:!0});for(let i of o){let a=A.join(e,i.name);if(i.isDirectory()){if(n){let s=await Vn(a,!0,t);r.push(...s)}continue}if(!i.name.endsWith(".ts"))continue;if(i.name.startsWith("_")||i.name.startsWith("index"))continue;try{let s=await(A.isAbsolute(a)?import(a):import(A.resolve(a))),u=s.default||s;if(u?.name&&(u.attributes||u.table))r.push({filePath:a,model:u})}catch(s){t.push({file:a,error:s.message})}}return r}async function Vi(e={}){let n=Mi(e.dialect),t=e.modelsDir??A.userModelsPath(),r=e.defaultsDir??A.frameworkPath("defaults/app/Models"),o=e.outFile??A.projectPath("database/types.d.ts"),i=[],a=[];for(let[m,g]of[[t,!1],[r,!0]])try{let w=await Vn(m,g,i);a.push(...w)}catch(w){i.push({file:m,error:w.message})}let s=new Map;for(let m of a)s.set(m.model.name??A.basename(m.filePath).replace(/\.ts$/,""),m);for(let m of a)if(m.filePath.startsWith(t))s.set(m.model.name??A.basename(m.filePath).replace(/\.ts$/,""),m);let u=[];for(let[m,{model:g}]of s){let w=g.table??`${E(m)}s`,h={...Li(g,n),...qi(g,n),...Fi(g)};u.push({table:w,model:m,columns:h})}let c=new Map;for(let[m,{model:g}]of s)for(let w of Bi(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??A.resolve(A.dirname(o),"migrations"),g=new Set(u.map((h)=>h.table)),w=qn(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})}i.push(...w.errors)}u.sort((m,g)=>m.table.localeCompare(g.table));let l=e.target??"app",f=l==="framework"?1:2,d=u.map((m)=>Un(m.table,m.columns,f)).join(`
24
+ `),p=`${Kn(l)}${d}
25
+ ${Wn(l)}`;if(!e.dryRun){let m=A.dirname(o);if(!re.existsSync(m))re.mkdirSync(m,{recursive:!0});re.writeFileSync(o,p,"utf-8"),vi.success(`[generate:db-types] wrote ${u.length} table(s) to ${o}`)}return{outFile:o,tables:u,errors:i,content:p}}function Qi(e,n="app"){let t=[...e].sort((r,o)=>r.table.localeCompare(o.table)).map((r)=>Un(r.table,r.columns,n==="framework"?1:2)).join(`
26
+ `);return`${Kn(n)}${t}
27
+ ${Wn(n)}`}import{isCursorPaginator as El,isPaginator as jl,isSimplePaginator as Fl,toCursorPaginator as $l,toPaginator as Il,toSimplePaginator as Bl}from"@stacksjs/pagination";import{configureOrm as zi}from"@stacksjs/query-builder";function Hi(){try{let e=process.env.DB_DATABASE_PATH||"database/stacks.sqlite";if((process.env.DB_CONNECTION||"sqlite")==="sqlite")zi({database:e})}catch{}}Hi();async function Qn(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 xe(e,n=[""]){let{path:t}=await import("@stacksjs/path"),r=t.userModelsPath(`${e}.ts`);try{if(await Bun.file(r).exists())return await Qn(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 i=o?`${o}/`:"",a=t.frameworkPath(`defaults/app/Models/${i}${e}.ts`);try{if(await Bun.file(a).exists())return await Qn(a)}catch(s){console.error(`[orm] Failed to import framework default model ${e} from ${a} - trying next subdir. Reason:`,s)}}return null}var j={},zn=()=>{},tl=new Promise((e)=>{zn=e});function y(e){return new Proxy(function(){},{get(n,t){if(t==="then")return;let r=j[e];if(r==null)return;let o=r[t];return typeof o==="function"?o.bind(r):o},set(n,t,r){let o=j[e];if(o==null)return!1;return o[t]=r,!0},has(n,t){let r=j[e];return r==null?!1:(t in r)},apply(n,t,r){let o=j[e];if(o==null||typeof o!=="function")return;return o.apply(t,r)}})}var Ji=y("User"),Yi=y("Job"),Xi=y("FailedJob"),Zi=[["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"],["CardAttachment",[""],"dashboard"],["CardComment",[""],"dashboard"],["Deployment",[""],"dashboard"],["FeedbackToken",[""],"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"],["PaymentWebhookEvent",["commerce"],"commerce"],["Transaction",["commerce"],"commerce"]];queueMicrotask(async()=>{try{let{feature:e}=await import("@stacksjs/config"),n=await xe("User");if(n)j.User=n;if(e("queue")){let t=await xe("Job");if(t)j.Job=t;let r=await xe("FailedJob");if(r)j.FailedJob=r}for(let[t,r,o]of Zi){if(!e(o))continue;let i=await xe(t,r);if(i)j[t]=i}}catch(e){console.error("[orm] deferred model load failed:",e)}finally{zn()}});var ea=y("Activity"),ta=y("AnalyticsEvent"),na=y("Automation"),ra=y("AutomationRun"),oa=y("Auction"),ia=y("CampaignVariant"),aa=y("CommunicationSuppression"),sa=y("ConsentEvent"),ua=y("SenderDomain"),ca=y("UsageEvent"),la=y("AuctionItem"),da=y("Author"),fa=y("Bid"),pa=y("Board"),ma=y("BoardColumn"),ga=y("Campaign"),ya=y("Card"),nl=y("CardAttachment"),wa=y("CardComment"),ba=y("Cart"),ha=y("CartItem"),ka=y("Category"),Ta=y("Comment"),Ra=y("Coupon"),Sa=y("Customer"),_a=y("DeliveryRoute"),Aa=y("DeliveryStop"),Pa=y("Deployment"),rl=y("FeedbackToken"),xa=y("DigitalDelivery"),Ca=y("Courier"),va=y("CourierPing"),Ma=y("CampaignSend"),Oa=y("EmailList"),Da=y("EmailListSubscriber"),Ea=y("Form"),ja=y("FormField"),Fa=y("FormSubmission"),$a=y("MagicLinkToken"),Ia=y("Menu"),Ba=y("MenuItem"),Na=y("PageRevision"),La=y("Pledge"),qa=y("Redirect"),Ga=y("Site"),Ua=y("SiteDomain"),Ka=y("SmsOptOut"),Wa=y("GdprRequest"),ol=y("StorageItem"),il=y("StorageItemTask"),Va=y("EmailIdempotency"),Qa=y("EmailSuppression"),za=y("EmailWebhookEvent"),Ha=y("Error"),Ja=y("GiftCard"),Ya=y("Label"),Xa=y("LicenseKey"),Za=y("Log"),es=y("LoyaltyPoint"),ts=y("LoyaltyReward"),ns=y("MailPreference"),rs=y("Manufacturer"),os=y("Notification"),is=y("NotificationDelivery"),as=y("Order"),ss=y("OrderIdempotency"),al=y("PersonalAccessToken"),us=y("OrderItem"),cs=y("Page"),ls=y("Payment"),ds=y("PaymentWebhookEvent"),fs=y("PaymentMethod"),ps=y("PaymentProduct"),ms=y("PaymentTransaction"),gs=y("Post"),ys=y("Categorizable"),ws=y("PrintDevice"),bs=y("Product"),hs=y("ProductUnit"),ks=y("ProductVariant"),Ts=y("QueryLog"),Rs=y("Receipt"),sl=y("Referral"),ul=y("ReferralCode"),Ss=y("Release"),_s=y("Request"),As=y("Review"),Ps=y("ShippingMethod"),xs=y("ShippingRate"),Cs=y("ShippingZone"),vs=y("SocialPost"),Ms=y("SocialAccount"),Os=y("Subscriber"),Ds=y("SubscriberEmail"),Es=y("Subscription"),js=y("Tag"),Fs=y("TaxRate"),$s=y("Team"),Is=y("TeamInvitation"),Bs=y("TeamMember"),Ns=y("Transaction"),Ls=y("WaitlistProduct"),qs=y("WaitlistRestaurant"),Gs=y("Websocket"),Hn={User:Ji,Job:Yi,FailedJob:Xi,Activity:ea,AnalyticsEvent:ta,Automation:na,AutomationRun:ra,Auction:oa,AuctionItem:la,Author:da,Bid:fa,Board:pa,BoardColumn:ma,Campaign:ga,CampaignSend:Ma,CampaignVariant:ia,Card:ya,CardComment:wa,Cart:ba,CartItem:ha,Categorizable:ys,Category:ka,Comment:Ta,Coupon:Ra,Customer:Sa,CommunicationSuppression:aa,ConsentEvent:sa,DeliveryRoute:_a,DeliveryStop:Aa,Deployment:Pa,DigitalDelivery:xa,Courier:Ca,CourierPing:va,EmailList:Oa,EmailListSubscriber:Da,EmailIdempotency:Va,EmailSuppression:Qa,EmailWebhookEvent:za,ErrorModel:Ha,Form:Ea,FormField:ja,FormSubmission:Fa,GdprRequest:Wa,GiftCard:Ja,Label:Ya,LicenseKey:Xa,Log:Za,LoyaltyPoint:es,LoyaltyReward:ts,MailPreference:ns,Manufacturer:rs,Notification:os,MagicLinkToken:$a,Menu:Ia,MenuItem:Ba,NotificationDelivery:is,Order:as,OrderIdempotency:ss,OrderItem:us,Page:cs,PageRevision:Na,Payment:ls,PaymentMethod:fs,PaymentProduct:ps,PaymentTransaction:ms,PaymentWebhookEvent:ds,Pledge:La,Post:gs,PrintDevice:ws,Product:bs,ProductUnit:hs,ProductVariant:ks,QueryLog:Ts,Receipt:Rs,Release:Ss,Request:_s,Review:As,ShippingMethod:Ps,Redirect:qa,SenderDomain:ua,ShippingRate:xs,ShippingZone:Cs,Site:Ga,SiteDomain:Ua,SmsOptOut:Ka,SocialAccount:Ms,SocialPost:vs,Subscriber:Os,SubscriberEmail:Ds,Subscription:Es,Tag:js,TaxRate:Fs,Team:$s,TeamInvitation:Is,TeamMember:Bs,Transaction:Ns,UsageEvent:ca,WaitlistProduct:Ls,WaitlistRestaurant:qs,Websocket:Gs},W=globalThis;for(let[e,n]of Object.entries(Hn))if(n&&W[e]===void 0)W[e]=n;var cl=Object.keys(Hn);async function Us(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 Ks(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(W.safeAll===void 0)W.safeAll=Us;if(W.safeGet===void 0)W.safeGet=Ks;export{ea as Activity,ta as AnalyticsEvent,oa as Auction,la as AuctionItem,da as Author,na as Automation,ra as AutomationRun,de as BILLABLE_INSTANCE_METHODS,fa as Bid,pa as Board,ma as BoardColumn,ga as Campaign,Ma as CampaignSend,ia as CampaignVariant,ya as Card,nl as CardAttachment,wa as CardComment,ba as Cart,ha as CartItem,ys as Categorizable,ka as Category,Ta as Comment,aa as CommunicationSuppression,sa as ConsentEvent,Ra as Coupon,Ca as Courier,va as CourierPing,Sa as Customer,_a as DeliveryRoute,Aa as DeliveryStop,Pa as Deployment,xa as DigitalDelivery,Va as EmailIdempotency,Oa as EmailList,Da as EmailListSubscriber,Qa as EmailSuppression,za as EmailWebhookEvent,Ha as ErrorModel,Xi as FailedJob,rl as FeedbackToken,Ea as Form,ja as FormField,Fa as FormSubmission,ye as GDPR_AUDIT_TABLE,D as GDPR_SUBJECT_MODEL,We as GdprDeclarationError,Wa as GdprRequest,we as GdprSubjectNotFoundError,Ja as GiftCard,Yi as Job,Ya as Label,Xa as LicenseKey,Za as Log,es as LoyaltyPoint,ts as LoyaltyReward,pt as MODEL_DEFINITION,$a as MagicLinkToken,ns as MailPreference,rs as Manufacturer,dt as MassAssignmentException,Ia as Menu,Ba as MenuItem,Fn as ModelNotFoundError,On as ModelValidationError,os as Notification,is as NotificationDelivery,as as Order,ss as OrderIdempotency,us as OrderItem,cs as Page,Na as PageRevision,ls as Payment,fs as PaymentMethod,ps as PaymentProduct,ms as PaymentTransaction,ds as PaymentWebhookEvent,al as PersonalAccessToken,La as Pledge,gs as Post,ws as PrintDevice,bs as Product,hs as ProductUnit,ks as ProductVariant,Ts as QueryLog,Rs as Receipt,qa as Redirect,sl as Referral,ul as ReferralCode,Ss as Release,_s as Request,As as Review,ua as SenderDomain,Ps as ShippingMethod,xs as ShippingRate,Cs as ShippingZone,Ga as Site,Ua as SiteDomain,Ka as SmsOptOut,Ms as SocialAccount,vs as SocialPost,ol as StorageItem,il as StorageItemTask,Jr as SubqueryBuilder,Os as Subscriber,Ds as SubscriberEmail,Es as Subscription,Le as SubscriptionNotOwnedError,js as Tag,Fs as TaxRate,$s as Team,Is as TeamInvitation,Bs as TeamMember,Ns as Transaction,ca as UsageEvent,Ji as User,Ls as WaitlistProduct,qs as WaitlistRestaurant,Gs as Websocket,ge as assertGdprPlan,$u as batchLoad,Vi as buildDatabaseSchema,_o as buildProcessingRegister,De as collectEncryptedAttributes,Rt as createAuditMethods,Be as createCategorizableMethods,Fe as createCommentableMethods,Ne as createLikeableMethods,Ie as createTaggableMethods,Gr as customerOwnership,Lu as db,Oe as decryptValue,Bn as defineModel,Me as encryptValue,it as enrichPaginatorUrls,ko as eraseSubject,bo as exportSubjectData,Gc as extendModel,_r as filterFillable,he as gdprTableExists,Ut as gdprTableName,Hs as getPrunableConfig,Sr as getWritableFields,hr as isBillable,El as isCursorPaginator,Q as isEncrypted,jl as isPaginator,Fl as isSimplePaginator,Lr as isUniqueViolation,Ve as loadGdprModels,Tr as mapWriteError,zs as massPrunable,Ti as mergeModelDefinition,cl as modelGlobalNames,tl as ormReady,Vr as parentOwnership,nn as parseCursor,ft as projectDocumentsFromTrait,Yn as prunable,Ro as pruneRetainedData,Qi as renderDatabaseTypeFile,Ao as renderProcessingRegister,ot as resolveCursorArgs,me as resolveGdprPlan,mo as resolveGdprSubject,rt as resolvePageArgs,Uu as savepoint,Ur as selfOwnership,ir as setAuditUser,Kr as siteOwnership,Wr as teamMembershipOwnership,gi as toAttrs,$l as toCursorPaginator,Il as toPaginator,Bl as toSimplePaginator,Rr as toSnakeCaseKeys,Ke as transaction,Ku as transactional,B as withoutEvents,Ko as withoutValidation};
package/dist/routes.js CHANGED
@@ -1,2 +1,2 @@
1
1
  // @bun
2
- var ct=(e,t,n)=>()=>{if(e)try{t=e(e=0)}catch(r){n=[r]}if(n)throw n[0];return t};var Nt=import.meta.require;import{readdirSync as _t}from"fs";import{basename as xt,extname as Qe,join as At}from"path";function Ot(e){let t=[],n=(r)=>{let o;try{o=_t(r,{withFileTypes:!0})}catch{return}for(let s of o){let i=At(r,s.name);if(s.isDirectory()){n(i);continue}if(![".ts",".js"].includes(Qe(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,r){for(let o of Ot(e))try{let s=Qe(o),i=await import(`${o}?t=${Date.now()}`),l=i.default??i,d=l.name??xt(o,s);n.models[d]={...l,name:d},n.origins[d]=t}catch(s){r?.(o,s)}}async function be(e){let t={models:{},origins:{}};return await We(e.defaultsRoot,"default",t,e.onImportError),await We(e.userRoot,"app",t,e.onImportError),t}async function Vt(e){return(await be(e)).models}function Ve(e,t){let n,r="default";if(t!==void 0&&t!==null)n=t.split(","),r="env";else if(typeof e==="string")n=[e],r="config";else if(Array.isArray(e)&&e.every((s)=>typeof s==="string"))n=e,r="config";if(n===void 0)return{all:!0,own:!1,names:new Set,source:r};let o=n.map((s)=>s.trim().toLowerCase()).filter(Boolean);if(o.length===0||o.includes("none"))return{all:!1,own:!1,names:new Set,source:r};if(o.includes("all"))return{all:!0,own:!1,names:new Set,source:r};return{all:!1,own:o.includes("own"),names:new Set(o.filter((s)=>s!=="own")),source:r}}function He(e,t){let n={},r=new Set;for(let[o,s]of Object.entries(e.models)){if(!s?.traits?.useApi)continue;let i=o.toLowerCase(),l=t.names.has(i);if(l)r.add(i);if(t.all||l||t.own&&e.origins[o]==="app")n[o]=s}return{models:n,unmatched:[...t.names].filter((o)=>!r.has(o)).sort()}}var qe=()=>{};import nt from"process";import{parseBearerToken as vt,route as B}from"@stacksjs/router";import{env as F}from"@stacksjs/env";import{projectPath as Se,storagePath as Tt}from"@stacksjs/path";import{createQueryBuilder as Dt,defaultConfig as ze,setConfig as Je}from"@stacksjs/query-builder";import{HttpError as Q}from"@stacksjs/error-handling";import{log as V}from"@stacksjs/logging/runtime";import{isUniqueViolation as Lt}from"@stacksjs/error-handling";import{isUniqueViolation as dt}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(dt(e))return{status:409,body:{error:`${t} already exists`}};return{status:500,body:{error:`Failed to ${n} ${t}`,detail:String(e)}}}function S(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,l=s>=97&&s<=122||s>=48&&s<=57,d=s>=65&&s<=90&&i>=97&&i<=122;if(r>0&&(l||d))n+="_";n+=String.fromCharCode(o+32)}return n}function de(e){let t={};for(let[n,r]of Object.entries(e))t[S(n)]=r;return t}function De(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 Ce(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 Me(e){return e?.ownership===!1}function $e(e,t,n){let r=Object.keys(e).find((s)=>S(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(s)===S(t))delete o[s];return o[t]=n,{data:o}}function Ie(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=S(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??=gt(t);let s=r.get(o);if(s!==o&&s in e)n[o]=e[s]}return n}function ft(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 xe=new WeakMap,Ae=new WeakMap;function ge(e){let t=xe.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:S(r)}));return xe.set(e,n),n}function gt(e){let t=ge(e),n=Ae.get(t);if(n)return n;let r=new Map(t.map(({field:o,snake:s})=>[o,s]));return Ae.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 pt=["id","uuid","created_at","updated_at","deleted_at"];function Ne(e,t){let n=new Map;for(let r of[...Object.keys(e??{}),...pt]){let o=S(r);if(!/^\w+$/.test(o))continue;n.set(r,o),n.set(o,o)}for(let r of t)n.delete(r),n.delete(S(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("-"),l=i?s.slice(1):s;if(!/^\w+$/.test(l))continue;let d=n.get(l);if(!d)continue;r=r.orderBy(d,i?"desc":"asc")}return r}var yt={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"?wt(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"?ht(e):[],set:(e)=>e==null?null:Array.isArray(e)?JSON.stringify(e):e}},Oe=new WeakMap;function mt(e,t){let n=Oe.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"?yt[s]:s;r.push({attr:o,snake:S(o),definition:s,caster:i})}return Oe.set(e,r),r}function wt(e){try{return JSON.parse(e)}catch{return e}}function ht(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=mt(t,r);if(o.length===0)return e;let s={...e};for(let{attr:i,caster:l,snake:d}of o){if(!l)continue;let u=l[n];if(typeof u!=="function")continue;if(Object.prototype.hasOwnProperty.call(s,i))s[i]=u.call(l,s[i]);if(d!==i&&Object.prototype.hasOwnProperty.call(s,d))s[d]=u.call(l,s[d])}return s}var ve=new WeakMap;function bt(e){let t=ve.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 ve.set(e,n),n}function Ft(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=bt(r);if(o.length===0)return{valid:!0};let s={},i=!1;for(let l of o){let{definition:d,field:u,hasDefault:T,rule:C}=l,M=Object.prototype.hasOwnProperty.call(e,u);if(!M&&n==="updating")continue;let J=M?e[u]:T?d.default:void 0,L=ft(C,J),I=C.validate(L);if(!I?.valid&&Array.isArray(I?.errors)&&I.errors.length>0)i=!0,s[u]=I.errors.map((P)=>d.validation?.message?.[P?.code]??P?.message??"invalid")}return i?{valid:!1,errors:s}:{valid:!0}}function we(e,t){return`${e}\x00${Rt(t)}`}function Ee(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 Rt(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 Fe(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 Te=15,kt=100;function Ue(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(Te),10),o=Math.min(Number.isFinite(r)?Math.max(1,r):Te,kt);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 St(e,t,n,r,o,s){let i=(t-1)*n,l=r===0,d={page:t,per_page:n,from:l?null:i+1,to:l?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));d.total=s,d.last_page=u,d.first_page_url=se(e,1),d.last_page_url=se(e,u)}return d}function he(e,t,n,r,o,s){let{page:i,...l}=St(e,t,n,r,o,s);return{current_page:i,...l}}function Be(e,t){return(t??e??"").toString().trim().toLowerCase()==="warn"?"warn":"deny"}function Le(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=Ce(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 zt(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 Jt(e="id"){return{field:e,resolve:async(t)=>t?.id??null}}function Kt(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((l)=>l.id).filter((l)=>l!=null)}catch{return[]}}}}function Gt(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 Xt(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 l=await i.resolve(n,r);if(l==null||Array.isArray(l)&&l.length===0)return[];let d=o[e];if(!d)return[];return((Array.isArray(l)?await d.whereIn(i.field,l).get():await d.where(i.field,l).get())??[]).map((T)=>T.id).filter((T)=>T!=null)}catch{return[]}}}}var Pt=Se("config/qb.ts");try{let e=(await import(Pt)).default;Je(e??ze)}catch{V.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;Je({...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 rt=await be({defaultsRoot:Tt("framework/defaults/app/Models"),userRoot:Se("app/Models"),onImportError:(e,t)=>V.warn(`[orm] Could not load model ${e}: ${t.message}`)}),Ke=rt.models,Ct=Dt(),v=Ct,Ge=Ee(B.routes);function z(e,t){let n=we(e,t),r=Ge.get(n);if(!r)return Ge.set(n,{method:e,path:t}),!1;let o=String(r.path??"");return V.debug(`[orm] Skipping generated ${e} ${t} - already defined${o&&o!==t?` as ${o}`:""}.`),!0}function ot(e){if(!e.attributes)return[];return Object.entries(e.attributes).filter(([t,n])=>n.hidden===!0).map(([t])=>t)}function Xe(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 Ye(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:[],l=Array.isArray(t.hasOne)?t.hasOne:[],d=new Map;for(let u of s)d.set(S(u),{kind:"belongsTo",modelName:u});for(let u of l)d.set(S(u),{kind:"hasOne",modelName:u});for(let u of i)d.set(Xe(S(u)),{kind:"hasMany",modelName:u});for(let u of o){let T=d.get(u);if(!T)continue;let C=r[T.modelName];if(!C)continue;let M=C.table||Xe(S(T.modelName)),J=ot(C),L=(I)=>G(ne(I,C),J);if(T.kind==="belongsTo"||T.kind==="hasOne"){let I=`${S(T.modelName)}_id`,P=[...new Set(e.map((_)=>_[I]).filter((_)=>_!=null))];if(!P.length){for(let _ of e)_[u]=null;continue}let K=await v.selectFrom(M).whereIn("id",P).get(),H=new Map;for(let _ of K??[])H.set(String(_.id),L(_));for(let _ of e)_[u]=H.get(String(_[I]))??null}else{let I=String(t.name??""),P=`${S(I)}_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 H=await v.selectFrom(M).whereIn(P,K).get(),_=new Map;for(let O of H??[]){let j=String(O[P]),Z=_.get(j)??[];Z.push(L(O)),_.set(j,Z)}for(let O of e)O[u]=_.get(String(O.id))??[]}}return e}async function Ze(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 et(e,t){return ye(e,t?.casts,"set")}function ne(e,t){return ye(e,t?.casts,"get")}function f(e,t=200){return new Response(JSON.stringify(e),{status:t,headers:{"Content-Type":"application/json"}})}var ae=1048576;async function ke(e){if(Number(e.headers?.get?.("content-length")??0)>ae)throw new Q(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 Q(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 Q)throw n;throw new Q(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 Mt(e){let t=e.bearerToken;if(typeof t==="function"){let n=t.call(e);if(n)return n}return vt(e.headers?.get?.("authorization")??null)}async function X(e){let t=e._authenticatedUser;if(t)return t;let n=Mt(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 tt(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,l]of Object.entries(o))try{s[i]=typeof l==="function"?await l(n,r):l}catch{}return s}return{}}var st=await(async()=>{try{return(await import(Se("config/security.ts"))).default?.api}catch{return}})(),it=Be(st?.rowScoping,nt.env.STACKS_API_ROW_SCOPING),$t=(()=>{let e=Ve(st?.models,nt.env.STACKS_MODEL_APIS),{models:t,unmatched:n}=He(rt,e);if(n.length>0){let r=e.source==="env"?"STACKS_MODEL_APIS":"security.api.models";V.warn(`[orm] ${r} names ${n.length===1?"a model":"models"} with no \`useApi\` trait, so no API was generated for ${n.join(", ")}.`)}return t})(),at=[];for(let[e,t]of Object.entries($t)){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,l=Ie(t),d=ot(t),u=De(o,r.prefix),T=Ne(t.attributes,d),{read:C,write:M,declared:J}=Fe(n),L=["store","update","destroy"].some((y)=>s.includes(y));if(L&&J&&M.length===0)V.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)V.debug(`[orm] ${e}: registering public read routes at ${u} (declared \`middleware.read: []\`)`);let P=!!ie(t),K=P&&!C.includes("auth")?["auth",...C]:C,H=Me(t),_=L&&!P&&!H;if(_)at.push(e);if(L&&H)V.debug(`[orm] ${e}: registering unscoped mutating routes at ${u} (declared \`ownership: false\`)`);let O=_&&it==="deny",j=(y,a=K)=>{let c=y;for(let g of a)if(c&&typeof c.middleware==="function")c=c.middleware(g);return c};if(s.includes("index")&&!z("GET",u))j(B.get(u,async(y)=>{try{let a=new URL(y.url),{page:c,perPage:g,offset:h}=Ue(a.searchParams),w=a.searchParams.get("sort"),p=v.selectFrom(i);p=je(p,w,T);let N=new Set(["page","per_page","sort","fields","search","include","limit","offset","with_count","withTrashed","onlyTrashed"]);for(let[x,A]of a.searchParams.entries()){if(N.has(x)||!A)continue;if(!/^[a-z_][a-z0-9_]*$/i.test(x))continue;let q=T.get(x);if(q)p=p.where(q,"=",A)}let R=a.searchParams.get("search");if(R&&l.length>0){let x=l.slice(0,5);p=p.where((A)=>{for(let q of x)A=A.orWhere(S(q),"like",`%${R}%`);return A})}let k=a.searchParams.get("fields");if(k){let x=k.split(",").map((A)=>A.trim()).filter((A)=>/^[a-z_][a-z0-9_]*$/i.test(A)).map((A)=>S(A));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,c,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()||[],W=U.length>g,re=(W?U.slice(0,g):U).map((x)=>G(ne(x,t),d)),_e=a.searchParams.get("include");if(_e)re=await Ye(re,t,_e,Ke);let ut=a.searchParams.get("with_count")==="true",ee;if(ut)try{let x=v.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 A=await x.count(),q=typeof A==="number"?A:Number(A?.count??A);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 lt=he(a,c,g,re.length,W,ee);return new Response(JSON.stringify({data:re,...lt}),{status:200,headers:oe})}catch(a){if(a instanceof Q){let c={error:a.message};if(a.details!==void 0)c.details=a.details;return f(c,a.status||400)}return f({error:`Failed to fetch ${o}`,detail:String(a)},500)}}));if(s.includes("show")&&!z("GET",`${u}/{id}`))j(B.get(`${u}/{id}`,async(y)=>{try{let a=ue(y.params?.id);if(a==null)return f({error:"Invalid ID parameter"},400);let c=await v.selectFrom(i).where({id:a}).executeTakeFirst();if(!c)return f({error:`${e} not found`},404);let g=new URL(y.url);if(t.traits?.useSoftDeletes&&c.deleted_at&&g.searchParams.get("withTrashed")!=="true")return f({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(c[h.field],h.value))return f({error:`${e} not found`},404)}let w=G(ne(c,t),d),p=g.searchParams.get("include");if(p){let[b]=await Ye([w],t,p,Ke);w=b}let N=w?.updated_at||w?.created_at,R=N?`W/"${w.id}-${String(N)}"`: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 Q){let c={error:a.message};if(a.details!==void 0)c.details=a.details;return f(c,a.status||400)}return f({error:`Failed to fetch ${e}`,detail:String(a)},500)}}));if(!O&&s.includes("store")&&!z("POST",u))j(B.post(u,async(y)=>{try{let a=await ke(y),c=pe(a,d),g=fe(c,l),h=await X(y);if(h){let b=await tt(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 f({error:"Auth required"},401);let b=$e(g,w.field,w.value);if(b.error)return f({error:b.error},403);g=b.data}if(Object.keys(g).length===0)return f({error:"No fillable fields provided"},422);let p=me(g,t,"creating");if(!p.valid)return f({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 N=await Ze(g,t),R=de(et(N,t)),k=await v.insertInto(i).values(R).execute(),D=R;try{let b=k?.lastInsertRowid??k?.insertId??k;if(b){let E=await v.selectFrom(i).where({id:b}).executeTakeFirst();if(E)D=E}}catch{}return f({data:G(ne(D,t),d)},201)}catch(a){let{status:c,body:g}=ce(a,e,"create");return f(g,c)}}),M);if(!O&&s.includes("update")){let y=async(a)=>{try{let c=ue(a.params?.id);if(c==null)return f({error:"Invalid ID parameter"},400);let g=await ke(a),h=pe(g,d),w=fe(h,l),p=await X(a);if(p){let m=await tt(t,"updating",p,a);for(let[U,W]of Object.entries(m))if(W!==void 0&&W!==null&&w[U]===void 0)w[U]=W}if(Object.keys(w).length===0)return f({error:"No fillable fields provided"},422);let N=me(w,t,"updating");if(!N.valid)return f({success:!1,message:"Validation failed",errors:N.errors},422);let R=await v.selectFrom(i).where({id:c}).executeTakeFirst();if(!R)return f({error:`${e} not found`},404);let k=await Y(t,p,a);if(k.enforced&&!k.bypass){if(!p)return f({error:"Auth required"},401);let m=R[k.field];if(!te(m,k.value))return f({error:`Not your ${e}`},403);let U=Object.keys(w).find((W)=>S(W)===S(k.field));if(U!==void 0&&!te(w[U],k.value))return f({error:`Cannot reassign ${e} ownership`},403)}if(t.traits?.useTimestamps!==!1)w.updated_at=new Date().toISOString();let D=await Ze(w,t),b=de(et(D,t));await v.updateTable(i).set(b).where({id:c}).execute();let E={...R,...b};try{let m=await v.selectFrom(i).where({id:c}).executeTakeFirst();if(m)E=m}catch{}return f({data:G(ne(E,t),d)})}catch(c){let{status:g,body:h}=ce(c,e,"update");return f(h,g)}};if(!z("PUT",`${u}/{id}`))j(B.put(`${u}/{id}`,y),M);if(!z("PATCH",`${u}/{id}`))j(B.patch(`${u}/{id}`,y),M)}let Z=!!t.traits?.useSoftDeletes;if(!O&&s.includes("destroy")&&!z("DELETE",`${u}/{id}`))j(B.delete(`${u}/{id}`,async(y)=>{try{let a=ue(y.params?.id);if(a==null)return f({error:"Invalid ID parameter"},400);let c=await v.selectFrom(i).where({id:a}).executeTakeFirst();if(!c)return f({error:`${e} not found`},404);let g=await X(y),h=await Y(t,g,y);if(h.enforced&&!h.bypass){if(!g)return f({error:"Auth required"},401);let w=c[h.field];if(!te(w,h.value))return f({error:`Not your ${e}`},403)}if(Z){let w=new Date().toISOString();await v.updateTable(i).set({deleted_at:w,updated_at:w}).where({id:a}).execute()}else await v.deleteFrom(i).where({id:a}).execute();return new Response(null,{status:204})}catch(a){if(a instanceof Q){let c={error:a.message};if(a.details!==void 0)c.details=a.details;return f(c,a.status||400)}return f({error:`Failed to delete ${e}`,detail:String(a)},500)}}),M);if(!O&&s.includes("destroy")&&!z("POST",`${u}/bulk-delete`))j(B.post(`${u}/bulk-delete`,async(y)=>{try{let c=(await ke(y))?.ids;if(!Array.isArray(c)||c.length===0)return f({error:"An array of IDs is required"},422);if(c.length>100)return f({error:"Cannot delete more than 100 records at once"},422);let g=[],h=[];for(let R of c){let k=ue(R);if(k!=null)g.push(k);else h.push(R)}if(h.length>0)return f({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 f({error:"Auth required"},401);if(p.value==null)return f({error:"Caller has no ownership identity"},403);let R=await v.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 f({error:`Cannot delete ${e} you don't own`,ids:D},403)}let N=new Date().toISOString();for(let R of g)if(Z)await v.updateTable(i).set({deleted_at:N,updated_at:N}).where({id:R}).execute();else await v.deleteFrom(i).where({id:R}).execute();return f({message:`Successfully deleted ${g.length} ${o}`})}catch(a){if(a instanceof Q){let c={error:a.message};if(a.details!==void 0)c.details=a.details;return f(c,a.status||400)}return f({error:`Failed to bulk delete ${o}`,detail:String(a)},500)}}),M)}{let e=Le(at,it);if(e)V.warn(e)}var dn=B;export{dn as default};
2
+ var kt=(e,t,n)=>()=>{if(e)try{t=e(e=0)}catch(r){n=[r]}if(n)throw n[0];return t};var qt=import.meta.require;import{readdirSync as jt}from"fs";import{basename as Et,extname as Xe,join as Ft}from"path";function Ut(e){let t=[],n=(r)=>{let o;try{o=jt(r,{withFileTypes:!0})}catch{return}for(let i of o){let s=Ft(r,i.name);if(i.isDirectory()){n(s);continue}if(![".ts",".js"].includes(Xe(i.name)))continue;if(i.name.startsWith(".")||i.name.startsWith("index"))continue;t.push(s)}};return n(e),t.sort()}async function Ye(e,t,n,r){for(let o of Ut(e))try{let i=Xe(o),s=await import(`${o}?t=${Date.now()}`),c=s.default??s,f=c.name??Et(o,i);n.models[f]={...c,name:f},n.origins[f]=t}catch(i){r?.(o,i)}}async function xe(e){let t={models:{},origins:{}};return await Ye(e.defaultsRoot,"default",t,e.onImportError),await Ye(e.userRoot,"app",t,e.onImportError),t}async function sn(e){return(await xe(e)).models}function Ze(e,t){let n,r="default";if(t!==void 0&&t!==null)n=t.split(","),r="env";else if(typeof e==="string")n=[e],r="config";else if(Array.isArray(e)&&e.every((i)=>typeof i==="string"))n=e,r="config";if(n===void 0)return{all:!0,own:!1,names:new Set,source:r};let o=n.map((i)=>i.trim().toLowerCase()).filter(Boolean);if(o.length===0||o.includes("none"))return{all:!1,own:!1,names:new Set,source:r};if(o.includes("all"))return{all:!0,own:!1,names:new Set,source:r};return{all:!1,own:o.includes("own"),names:new Set(o.filter((i)=>i!=="own")),source:r}}function et(e,t){let n={},r=new Set;for(let[o,i]of Object.entries(e.models)){if(!i?.traits?.useApi)continue;let s=o.toLowerCase(),c=t.names.has(s);if(c)r.add(s);if(t.all||c||t.own&&e.origins[o]==="app")n[o]=i}return{models:n,unmatched:[...t.names].filter((o)=>!r.has(o)).sort()}}var tt=()=>{};import dt from"process";import{parseBearerToken as Bt,route as U}from"@stacksjs/router";import{env as E}from"@stacksjs/env";import{projectPath as Oe,storagePath as Lt}from"@stacksjs/path";import{createQueryBuilder as Wt,defaultConfig as nt,setConfig as rt}from"@stacksjs/query-builder";import{HttpError as Q}from"@stacksjs/error-handling";import{log as B}from"@stacksjs/logging/runtime";import{isUniqueViolation as nn}from"@stacksjs/error-handling";import{isUniqueViolation as St}from"@stacksjs/error-handling";function me(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(St(e))return{status:409,body:{error:`${t} already exists`}};return{status:500,body:{error:`Failed to ${n} ${t}`,detail:String(e)}}}function A(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,s=r+1<e.length?e.charCodeAt(r+1):0,c=i>=97&&i<=122||i>=48&&i<=57,f=i>=65&&i<=90&&s>=97&&s<=122;if(r>0&&(c||f))n+="_";n+=String.fromCharCode(o+32)}return n}function we(e){let t={};for(let[n,r]of Object.entries(e))t[A(n)]=r;return t}function je(e,t){let n=String(t||"").replace(/^\/+|\/+$/g,""),r=String(e).replace(/^\/+/,"");return`/api/${n?`${n}/`:""}${r}`}function Ee(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 Fe(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 Ue(e){return e?.ownership===!1}function Be(e,t,n){let r=Object.keys(e).find((i)=>A(i)===A(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(A(i)===A(t))delete o[i];return o[t]=n,{data:o}}function Le(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=A(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 he(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??=_t(t);let i=r.get(o);if(i!==o&&i in e)n[o]=e[i]}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]),i=Number(n[3]),s=new Date(Date.UTC(r,o-1,i));if(s.getUTCFullYear()!==r||s.getUTCMonth()!==o-1||s.getUTCDate()!==i)return t;return s}var Ie=new WeakMap,Ce=new WeakMap;function be(e){let t=Ie.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:A(r)}));return Ie.set(e,n),n}function _t(e){let t=be(e),n=Ce.get(t);if(n)return n;let r=new Map(t.map(({field:o,snake:i})=>[o,i]));return Ce.set(t,r),r}function Re(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 ee(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 xt=["id","uuid","created_at","updated_at","deleted_at"];function We(e,t){let n=new Map;for(let r of[...Object.keys(e??{}),...xt]){let o=A(r);if(!/^\w+$/.test(o))continue;n.set(r,o),n.set(o,o)}for(let r of t)n.delete(r),n.delete(A(r));return n}function Qe(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 s=i.startsWith("-"),c=s?i.slice(1):i;if(!/^\w+$/.test(c))continue;let f=n.get(c);if(!f)continue;r=r.orderBy(f,s?"desc":"asc")}return r}var vt={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"?Ot(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"?Tt(e):[],set:(e)=>e==null?null:Array.isArray(e)?JSON.stringify(e):e}},$e=new WeakMap;function Pt(e,t){let n=$e.get(e);if(n&&n.length===t.length){let o=!0;for(let i=0;i<t.length;i++){let s=t[i];if(n[i]?.attr!==s||n[i]?.definition!==e[s]){o=!1;break}}if(o)return n}let r=[];for(let o of t){let i=e[o],s=typeof i==="string"?vt[i]:i;r.push({attr:o,snake:A(o),definition:i,caster:s})}return $e.set(e,r),r}function Ot(e){try{return JSON.parse(e)}catch{return e}}function Tt(e){try{return JSON.parse(e)}catch{return[]}}function ke(e,t,n){if(!e||typeof e!=="object"||!t)return e;let r=Object.keys(t);if(r.length===0)return e;let o=Pt(t,r);if(o.length===0)return e;let i={...e};for(let{attr:s,caster:c,snake:f}of o){if(!c)continue;let l=c[n];if(typeof l!=="function")continue;if(Object.prototype.hasOwnProperty.call(i,s))i[s]=l.call(c,i[s]);if(f!==s&&Object.prototype.hasOwnProperty.call(i,f))i[f]=l.call(c,i[f])}return i}var Me=new WeakMap;function Dt(e){let t=Me.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 Me.set(e,n),n}function Zt(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 Se(e,t,n){let r=t?.attributes;if(!r||typeof r!=="object")return{valid:!0};let o=Dt(r);if(o.length===0)return{valid:!0};let i={},s=!1;for(let c of o){let{definition:f,field:l,hasDefault:I,rule:_}=c,L=Object.prototype.hasOwnProperty.call(e,l);if(!L&&n==="updating")continue;let X=L?e[l]:I?f.default:void 0,V=At(_,X),C=_.validate(V);if(!C?.valid&&Array.isArray(C?.errors)&&C.errors.length>0)s=!0,i[l]=C.errors.map((N)=>f.validation?.message?.[N?.code]??N?.message??"invalid")}return s?{valid:!1,errors:i}:{valid:!0}}function Ae(e,t){return`${e}\x00${It(t)}`}function Ve(e){let t=new Map;for(let n of e){let r=Ae(String(n.method??""),String(n.path??""));if(!t.has(r))t.set(r,n)}return t}function It(e){return e.replace(/\{[^}]*\}/g,"{}").replace(/:[^/]+/g,"{}")}function de(e){if(Array.isArray(e))return e.filter((t)=>typeof t==="string"&&t.length>0);return typeof e==="string"&&e?[e]:[]}function Ct(e,t){let n=typeof e==="object"&&e!==null&&"middleware"in e,r=e?.middleware,o=fe(t);if(!n)return{read:K(["auth"],o),write:K(["auth"],o),declared:!1};if(r&&typeof r==="object"&&!Array.isArray(r)){let s=r;return{read:K("read"in s?de(s.read):["auth"],o),write:K("write"in s?de(s.write):["auth"],o),declared:!0}}let i=de(r);return{read:K(i,o),write:K(i,o),declared:!0}}function fe(e){if(!e||typeof e!=="object")return null;let t=e;if(t.enforce===!1)return null;if(!Array.isArray(t.roles))return null;let n=t.roles.filter((r)=>typeof r==="string").map((r)=>r.trim()).filter((r)=>r.length>0);return n.length>0?`role:${n.join(",")}`:null}var ie=["index","show","store","update","destroy"],$t={index:"read",show:"read",store:"write",update:"write",destroy:"write"};function Ge(e,t){let{read:n,write:r,declared:o}=Ct(e,t),i=fe(t),s=e?.middleware,c=s&&typeof s==="object"&&!Array.isArray(s)?s:void 0,f={};for(let l of ie)f[l]=c&&l in c?K(de(c[l]),i):$t[l]==="read"?n:r;return{abilities:f,read:n,write:r,declared:o}}function K(e,t){if(!t||e.length===0)return e;if(e.some((n)=>n==="role"||n.startsWith("role:")))return e;return[...e,t]}function ze(e){if(e.length===0)return null;let t=[...e].sort((n,r)=>n.model.localeCompare(r.model)).map((n)=>`${n.model} (${[...n.abilities].join(", ")})`).join(", ");return`[orm] ${e.length} model(s) role-gate their sidebar row and publish part of the matching API to everyone, because \`useApi.middleware\` declares those abilities empty - ${t}. Drop the empty list to let \`dashboard.roles\` gate them, or set \`dashboard.enforce: false\` to keep the row hidden and the API public.`}async function He(e,t,n,r){let o;try{o=await n.gate()}catch{return null}if(!o||!o.hasPolicy(e))return null;try{let i=await n.user(),s=r===void 0?await o.inspectFor(e,t,i):await o.inspectFor(e,t,i,r);if(s&&!s.isAllowed)return{status:403,message:s.message||"This action is unauthorized."};return null}catch{return{status:403,message:"This action is unauthorized."}}}var Ne=15,Mt=100;function Je(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(Ne),10),o=Math.min(Number.isFinite(r)?Math.max(1,r):Ne,Mt);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 Nt(e,t,n,r,o,i){let s=(t-1)*n,c=r===0,f={page:t,per_page:n,from:c?null:s+1,to:c?null:s+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 l=Math.max(1,Math.ceil(i/n));f.total=i,f.last_page=l,f.first_page_url=ce(e,1),f.last_page_url=ce(e,l)}return f}function _e(e,t,n,r,o,i){let{page:s,...c}=Nt(e,t,n,r,o,i);return{current_page:s,...c}}function Ke(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.`}tt();function ge(e){if(e?.ownership===!1)return null;if(e?.ownership)return e.ownership;let t=Ee(e);if(t)return{field:t,resolve:async(r,o)=>{let{resolveAuthenticatedTeamId:i}=await import("@stacksjs/auth");return i(ve(o))}};let n=Fe(e);if(n)return{field:n,resolve:async(r)=>r?.id??null};return null}function ve(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 s=i.indexOf("=");if(s===-1)continue;if(i.slice(0,s).trim()===o)return decodeURIComponent(i.slice(s+1).trim())}return null}}}}function un(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 cn(e="id"){return{field:e,resolve:async(t)=>t?.id??null}}function dn(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(ve(n));if(i==null)return[];return(await o.where("team_id",i).get()??[]).map((c)=>c.id).filter((c)=>c!=null)}catch{return[]}}}}function fn(e="id"){return{field:e,resolve:async(t,n)=>{try{let{resolveAuthenticatedTeamId:r}=await import("@stacksjs/auth");return await r(ve(n))}catch{return null}}}}function gn(e,t){return{field:t,resolve:async(n,r)=>{try{let o=await import("@stacksjs/orm"),i=o.models?.[e]??o[e]?.definition??null,s=ge(i);if(!s?.field||typeof s.resolve!=="function")return[];let c=await s.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(s.field,c).get():await f.where(s.field,c).get())??[]).map((I)=>I.id).filter((I)=>I!=null)}catch{return[]}}}}var Qt=Oe("config/qb.ts");try{let e=(await import(Qt)).default;rt(e??nt)}catch{B.debug("[orm] No config/qb.ts override found - deriving config from DB_CONNECTION");let e=E.DB_CONNECTION||"sqlite",t=e==="turso"||e==="libsql",n=t?"sqlite":e;rt({...nt,dialect:n,database:t?{database:E.TURSO_DATABASE_URL||"",url:E.TURSO_DATABASE_URL||"",authToken:E.TURSO_AUTH_TOKEN||void 0}:n==="sqlite"?{database:E.DB_DATABASE_PATH||"database/stacks.sqlite"}:{database:E.DB_DATABASE||"stacks",host:E.DB_HOST||"127.0.0.1",port:E.DB_PORT||(n==="postgres"?5432:3306),username:E.DB_USERNAME||(n==="postgres"?"postgres":"root"),password:E.DB_PASSWORD||""}})}var ft=await xe({defaultsRoot:Lt("framework/defaults/app/Models"),userRoot:Oe("app/Models"),onImportError:(e,t)=>B.warn(`[orm] Could not load model ${e}: ${t.message}`)}),ot=ft.models,Vt=Wt(),D=Vt,it=Ve(U.routes);function q(e,t){let n=Ae(e,t),r=it.get(n);if(!r)return it.set(n,{method:e,path:t}),!1;let o=String(r.path??"");return B.debug(`[orm] Skipping generated ${e} ${t} - already defined${o&&o!==t?` as ${o}`:""}.`),!0}function gt(e){if(!e.attributes)return[];return Object.entries(e.attributes).filter(([t,n])=>n.hidden===!0).map(([t])=>t)}function st(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 at(e,t,n,r){if(!e.length)return e;let o=n.split(",").map((l)=>l.trim()).filter(Boolean);if(!o.length)return e;let i=Array.isArray(t.belongsTo)?t.belongsTo:[],s=Array.isArray(t.hasMany)?t.hasMany:[],c=Array.isArray(t.hasOne)?t.hasOne:[],f=new Map;for(let l of i)f.set(A(l),{kind:"belongsTo",modelName:l});for(let l of c)f.set(A(l),{kind:"hasOne",modelName:l});for(let l of s)f.set(st(A(l)),{kind:"hasMany",modelName:l});for(let l of o){let I=f.get(l);if(!I)continue;let _=r[I.modelName];if(!_)continue;let L=_.table||st(A(I.modelName)),X=gt(_),V=(C)=>ee(ae(C,_),X);if(I.kind==="belongsTo"||I.kind==="hasOne"){let C=`${A(I.modelName)}_id`,N=[...new Set(e.map((v)=>v[C]).filter((v)=>v!=null))];if(!N.length){for(let v of e)v[l]=null;continue}let G=await D.selectFrom(L).whereIn("id",N).get(),Z=new Map;for(let v of G??[])Z.set(String(v.id),V(v));for(let v of e)v[l]=Z.get(String(v[C]))??null}else{let C=String(t.name??""),N=`${A(C)}_id`,G=[...new Set(e.map((M)=>M.id).filter((M)=>M!=null))];if(!G.length){for(let M of e)M[l]=[];continue}let Z=await D.selectFrom(L).whereIn(N,G).get(),v=new Map;for(let M of Z??[]){let re=String(M[N]),z=v.get(re)??[];z.push(V(M)),v.set(re,z)}for(let M of e)M[l]=v.get(String(M.id))??[]}}return e}async function lt(e,t){let n=t?.set;if(!n||typeof n!=="object")return e;let r={...e};for(let[o,i]of Object.entries(n)){if(typeof i!=="function"||!(o in r))continue;try{r[o]=await i(r)}catch{}}return r}function ut(e,t){return ke(e,t?.casts,"set")}function ae(e,t){return ke(e,t?.casts,"get")}function g(e,t=200){return new Response(JSON.stringify(e),{status:t,headers:{"Content-Type":"application/json"}})}var pe=1048576;async function Pe(e){if(Number(e.headers?.get?.("content-length")??0)>pe)throw new Q(413,`Request body exceeds ${pe}-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>pe)throw new Q(413,`Request body exceeds ${pe}-byte limit`);if(!n)return{};let r=JSON.parse(n);return r&&typeof r==="object"&&!Array.isArray(r)?r:{}}catch(n){if(n instanceof Q)throw n;throw new Q(400,`Invalid JSON body: ${n.message}`)}}function ye(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 Gt(e){let t=e.bearerToken;if(typeof t==="function"){let n=t.call(e);if(n)return n}return Bt(e.headers?.get?.("authorization")??null)}async function Y(e){let t=e._authenticatedUser;if(t)return t;let n=Gt(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}}var zt;async function pt(){try{let{Gate:e}=zt??=await import("@stacksjs/auth");return e}catch{return null}}async function Ht(e){let t=await pt();return!!t&&t.hasPolicy(e)}async function te(e,t,n,r){let o=await He(e,t,{gate:pt,user:()=>Y(n)},r);return o?g({error:o.message},o.status):null}function se(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 ne(e,t,n){let r=ge(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,i=null;try{i=await r.resolve(t,n)}catch{i=null}return{enforced:!0,value:i,field:String(r.field),bypass:o}}async function ct(e,t,n,r){let o=e?.authedFill?.[t];if(!o)return{};if(typeof o==="function")try{let i=await o(n,r);return i&&typeof i==="object"?i:{}}catch{return{}}if(typeof o==="object"){let i={};for(let[s,c]of Object.entries(o))try{i[s]=typeof c==="function"?await c(n,r):c}catch{}return i}return{}}var yt=await(async()=>{try{return(await import(Oe("config/security.ts"))).default?.api}catch{return}})(),mt=Ke(yt?.rowScoping,dt.env.STACKS_API_ROW_SCOPING),Jt=(()=>{let e=Ze(yt?.models,dt.env.STACKS_MODEL_APIS),{models:t,unmatched:n}=et(ft,e);if(n.length>0){let r=e.source==="env"?"STACKS_MODEL_APIS":"security.api.models";B.warn(`[orm] ${r} names ${n.length===1?"a model":"models"} with no \`useApi\` trait, so no API was generated for ${n.join(", ")}.`)}return t})(),wt=[],ht=[];for(let[e,t]of Object.entries(Jt)){let n=t.traits?.useApi;if(!n)continue;let r=typeof n==="object"?n:{},o=r.uri||t.table||e.toLowerCase()+"s",i=r.routes||["index","show","store","update","destroy"],s=t.table||o,c=Le(t),f=gt(t),l=je(o,r.prefix),I=We(t.attributes,f),{abilities:_,declared:L}=Ge(n,t.dashboard);if(fe(t.dashboard)){let u=ie.filter((a)=>i.includes(a)&&_[a].length===0);if(u.length>0)ht.push({model:e,abilities:u})}let X=["store","update","destroy"].some((u)=>i.includes(u)),V=ie.filter((u)=>u!=="index"&&u!=="show"&&i.includes(u)&&_[u].length===0);if(L&&V.length>0)B.warn(`[orm] ${e}: registering UNAUTHENTICATED ${V.join(", ")} at ${l} (explicit empty \`middleware\` opt-out)`);let C=ie.filter((u)=>(u==="index"||u==="show")&&i.includes(u)&&_[u].length===0);if(L&&C.length>0)B.debug(`[orm] ${e}: registering public ${C.join(", ")} at ${l} (declared an empty read \`middleware\`)`);let N=!!ge(t),G=(u)=>N&&!u.includes("auth")?["auth",...u]:u,Z=G(_.index),v=G(_.show),M=Ue(t),re=X&&!N&&!M;if(re)wt.push(e);if(X&&M)B.debug(`[orm] ${e}: registering unscoped mutating routes at ${l} (declared \`ownership: false\`)`);let z=re&&mt==="deny",H=(u,a)=>{let d=u;for(let p of a)if(d&&typeof d.middleware==="function")d=d.middleware(p);return d};if(i.includes("index")&&!q("GET",l))H(U.get(l,async(u)=>{try{let a=new URL(u.url),{page:d,perPage:p,offset:w}=Je(a.searchParams),R=a.searchParams.get("sort"),y=await te(e,"viewAny",u);if(y)return y;let h=D.selectFrom(s);h=Qe(h,R,I);let b=new Set(["page","per_page","sort","fields","search","include","limit","offset","with_count","withTrashed","onlyTrashed"]);for(let[O,T]of a.searchParams.entries()){if(b.has(O)||!T)continue;if(!/^[a-z_][a-z0-9_]*$/i.test(O))continue;let J=I.get(O);if(J)h=h.where(J,"=",T)}let k=a.searchParams.get("search");if(k&&c.length>0){let O=c.slice(0,5);h=h.where((T)=>{for(let J of O)T=T.orWhere(A(J),"like",`%${k}%`);return T})}let S=a.searchParams.get("fields");if(S){let O=S.split(",").map((T)=>T.trim()).filter((T)=>/^[a-z_][a-z0-9_]*$/i.test(T)).map((T)=>A(T));if(O.length>0)h=h.select(O)}let P=!!t.traits?.useSoftDeletes,x=a.searchParams.get("withTrashed")==="true",j=a.searchParams.get("onlyTrashed")==="true";if(P&&!x)h=j?h.whereNotNull("deleted_at"):h.whereNull("deleted_at");let m=N?await ne(t,await Y(u),u):{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 O=_e(a,d,p,0,!1,void 0);return new Response(JSON.stringify({data:[],...O}),{status:200,headers:{"Content-Type":"application/json","Cache-Control":"private, no-store",Vary:"Authorization"}})}h=Array.isArray(m.value)?h.where(m.field,"in",m.value):h.where(m.field,"=",m.value)}let F=await h.limit(p+1).offset(w).get()||[],W=F.length>p,le=(W?F.slice(0,p):F).map((O)=>ee(ae(O,t),f)),De=a.searchParams.get("include");if(De)le=await at(le,t,De,ot);let bt=a.searchParams.get("with_count")==="true",oe;if(bt)try{let O=D.selectFrom(s);if(m.enforced&&!m.bypass&&m.value!=null)O=Array.isArray(m.value)?O.where(m.field,"in",m.value):O.where(m.field,"=",m.value);let T=await O.count(),J=typeof T==="number"?T:Number(T?.count??T);if(Number.isFinite(J))oe=J}catch{}let ue={"Content-Type":"application/json"};if(oe!==void 0&&!Number.isNaN(oe))ue["X-Total-Count"]=String(oe);ue["Cache-Control"]=m.enforced&&!m.bypass?"private, no-store":"public, max-age=15, must-revalidate",ue.Vary="Authorization";let Rt=_e(a,d,p,le.length,W,oe);return new Response(JSON.stringify({data:le,...Rt}),{status:200,headers:ue})}catch(a){if(a instanceof Q){let d={error:a.message};if(a.details!==void 0)d.details=a.details;return g(d,a.status||400)}return g({error:`Failed to fetch ${o}`,detail:String(a)},500)}}),Z);if(i.includes("show")&&!q("GET",`${l}/{id}`))H(U.get(`${l}/{id}`,async(u)=>{try{let a=ye(u.params?.id);if(a==null)return g({error:"Invalid ID parameter"},400);let d=await D.selectFrom(s).where({id:a}).executeTakeFirst();if(!d)return g({error:`${e} not found`},404);let p=new URL(u.url);if(t.traits?.useSoftDeletes&&d.deleted_at&&p.searchParams.get("withTrashed")!=="true")return g({error:`${e} not found`},404);let w=N?await ne(t,await Y(u),u):{enforced:!1,value:null,field:"",bypass:!1};if(w.enforced&&!w.bypass){if(w.value==null||!se(d[w.field],w.value))return g({error:`${e} not found`},404)}let R=await te(e,"view",u,d);if(R)return R;let y=ee(ae(d,t),f),h=p.searchParams.get("include");if(h){let[x]=await at([y],t,h,ot);y=x}let b=y?.updated_at||y?.created_at,k=b?`W/"${y.id}-${String(b)}"`:void 0,S=u.headers?.get?.("if-none-match");if(k&&S&&S===k)return new Response(null,{status:304,headers:{ETag:k}});let P={"Content-Type":"application/json"};if(k)P.ETag=k;return P["Cache-Control"]=w.enforced&&!w.bypass?"private, no-store":"public, max-age=30, must-revalidate",P.Vary="Authorization",new Response(JSON.stringify({data:y}),{status:200,headers:P})}catch(a){if(a instanceof Q){let d={error:a.message};if(a.details!==void 0)d.details=a.details;return g(d,a.status||400)}return g({error:`Failed to fetch ${e}`,detail:String(a)},500)}}),v);if(!z&&i.includes("store")&&!q("POST",l))H(U.post(l,async(u)=>{try{let a=await Pe(u),d=Re(a,f),p=he(d,c),w=await Y(u);if(w){let x=await ct(t,"creating",w,u);for(let[j,m]of Object.entries(x))if(m!==void 0&&m!==null&&p[j]===void 0)p[j]=m}let R=await te(e,"create",u);if(R)return R;let y=await ne(t,w,u);if(y.enforced&&!y.bypass){if(!w)return g({error:"Auth required"},401);let x=Be(p,y.field,y.value);if(x.error)return g({error:x.error},403);p=x.data}if(Object.keys(p).length===0)return g({error:"No fillable fields provided"},422);let h=Se(p,t,"creating");if(!h.valid)return g({success:!1,message:"Validation failed",errors:h.errors},422);if(t.traits?.useTimestamps!==!1){let x=new Date().toISOString();p.created_at=x,p.updated_at=x}let b=await lt(p,t),k=we(ut(b,t)),S=await D.insertInto(s).values(k).execute(),P=k;try{let x=S?.lastInsertRowid??S?.insertId??S;if(x){let j=await D.selectFrom(s).where({id:x}).executeTakeFirst();if(j)P=j}}catch{}return g({data:ee(ae(P,t),f)},201)}catch(a){let{status:d,body:p}=me(a,e,"create");return g(p,d)}}),_.store);if(!z&&i.includes("update")){let u=async(a)=>{try{let d=ye(a.params?.id);if(d==null)return g({error:"Invalid ID parameter"},400);let p=await Pe(a),w=Re(p,f),R=he(w,c),y=await Y(a);if(y){let m=await ct(t,"updating",y,a);for(let[F,W]of Object.entries(m))if(W!==void 0&&W!==null&&R[F]===void 0)R[F]=W}if(Object.keys(R).length===0)return g({error:"No fillable fields provided"},422);let h=Se(R,t,"updating");if(!h.valid)return g({success:!1,message:"Validation failed",errors:h.errors},422);let b=await D.selectFrom(s).where({id:d}).executeTakeFirst();if(!b)return g({error:`${e} not found`},404);let k=await te(e,"update",a,b);if(k)return k;let S=await ne(t,y,a);if(S.enforced&&!S.bypass){if(!y)return g({error:"Auth required"},401);let m=b[S.field];if(!se(m,S.value))return g({error:`Not your ${e}`},403);let F=Object.keys(R).find((W)=>A(W)===A(S.field));if(F!==void 0&&!se(R[F],S.value))return g({error:`Cannot reassign ${e} ownership`},403)}if(t.traits?.useTimestamps!==!1)R.updated_at=new Date().toISOString();let P=await lt(R,t),x=we(ut(P,t));await D.updateTable(s).set(x).where({id:d}).execute();let j={...b,...x};try{let m=await D.selectFrom(s).where({id:d}).executeTakeFirst();if(m)j=m}catch{}return g({data:ee(ae(j,t),f)})}catch(d){let{status:p,body:w}=me(d,e,"update");return g(w,p)}};if(!q("PUT",`${l}/{id}`))H(U.put(`${l}/{id}`,u),_.update);if(!q("PATCH",`${l}/{id}`))H(U.patch(`${l}/{id}`,u),_.update)}let Te=!!t.traits?.useSoftDeletes;if(!z&&i.includes("destroy")&&!q("DELETE",`${l}/{id}`))H(U.delete(`${l}/{id}`,async(u)=>{try{let a=ye(u.params?.id);if(a==null)return g({error:"Invalid ID parameter"},400);let d=await D.selectFrom(s).where({id:a}).executeTakeFirst();if(!d)return g({error:`${e} not found`},404);let p=await Y(u),w=await ne(t,p,u);if(w.enforced&&!w.bypass){if(!p)return g({error:"Auth required"},401);let y=d[w.field];if(!se(y,w.value))return g({error:`Not your ${e}`},403)}let R=await te(e,"delete",u,d);if(R)return R;if(Te){let y=new Date().toISOString();await D.updateTable(s).set({deleted_at:y,updated_at:y}).where({id:a}).execute()}else await D.deleteFrom(s).where({id:a}).execute();return new Response(null,{status:204})}catch(a){if(a instanceof Q){let d={error:a.message};if(a.details!==void 0)d.details=a.details;return g(d,a.status||400)}return g({error:`Failed to delete ${e}`,detail:String(a)},500)}}),_.destroy);if(!z&&i.includes("destroy")&&!q("POST",`${l}/bulk-delete`))H(U.post(`${l}/bulk-delete`,async(u)=>{try{let d=(await Pe(u))?.ids;if(!Array.isArray(d)||d.length===0)return g({error:"An array of IDs is required"},422);if(d.length>100)return g({error:"Cannot delete more than 100 records at once"},422);let p=[],w=[];for(let b of d){let k=ye(b);if(k!=null)p.push(k);else w.push(b)}if(w.length>0)return g({error:"Invalid IDs in batch",invalid:w},422);let R=await Y(u),y=await ne(t,R,u);if(y.enforced&&!y.bypass){if(!R)return g({error:"Auth required"},401);if(y.value==null)return g({error:"Caller has no ownership identity"},403);let b=await D.selectFrom(s).select(["id",y.field]).execute(),k=new Set(b.filter((P)=>se(P[y.field],y.value)).map((P)=>String(P.id))),S=p.filter((P)=>!k.has(String(P)));if(S.length>0)return g({error:`Cannot delete ${e} you don't own`,ids:S},403)}if(await Ht(e)){let b=[];for(let k of p){let S=await D.selectFrom(s).where({id:k}).executeTakeFirst();if(!S)continue;if(await te(e,"delete",u,S))b.push(k)}if(b.length>0)return g({error:`Cannot delete ${e} this policy refuses`,ids:b},403)}let h=new Date().toISOString();for(let b of p)if(Te)await D.updateTable(s).set({deleted_at:h,updated_at:h}).where({id:b}).execute();else await D.deleteFrom(s).where({id:b}).execute();return g({message:`Successfully deleted ${p.length} ${o}`})}catch(a){if(a instanceof Q){let d={error:a.message};if(a.details!==void 0)d.details=a.details;return g(d,a.status||400)}return g({error:`Failed to bulk delete ${o}`,detail:String(a)},500)}}),_.destroy)}{let e=qe(wt,mt);if(e)B.warn(e);let t=ze(ht);if(t)B.warn(t)}var vn=U;export{vn 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.94",
5
+ "version": "0.75.96",
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.94",
67
- "@stacksjs/cli": "0.75.94",
68
- "@stacksjs/config": "0.75.94",
69
- "@stacksjs/database": "0.75.94",
70
- "@stacksjs/env": "0.75.94",
71
- "@stacksjs/error-handling": "0.75.94",
72
- "@stacksjs/events": "0.75.94",
73
- "@stacksjs/logging": "0.75.94",
74
- "@stacksjs/model-meta": "0.75.94",
75
- "@stacksjs/pagination": "0.75.94",
76
- "@stacksjs/path": "0.75.94",
77
- "@stacksjs/query-builder": "0.75.94",
78
- "@stacksjs/realtime": "0.75.94",
79
- "@stacksjs/router": "0.75.94",
80
- "@stacksjs/storage": "0.75.94",
81
- "@stacksjs/strings": "0.75.94",
66
+ "@stacksjs/cache": "0.75.96",
67
+ "@stacksjs/cli": "0.75.96",
68
+ "@stacksjs/config": "0.75.96",
69
+ "@stacksjs/database": "0.75.96",
70
+ "@stacksjs/env": "0.75.96",
71
+ "@stacksjs/error-handling": "0.75.96",
72
+ "@stacksjs/events": "0.75.96",
73
+ "@stacksjs/logging": "0.75.96",
74
+ "@stacksjs/model-meta": "0.75.96",
75
+ "@stacksjs/pagination": "0.75.96",
76
+ "@stacksjs/path": "0.75.96",
77
+ "@stacksjs/query-builder": "0.75.96",
78
+ "@stacksjs/realtime": "0.75.96",
79
+ "@stacksjs/router": "0.75.96",
80
+ "@stacksjs/storage": "0.75.96",
81
+ "@stacksjs/strings": "0.75.96",
82
82
  "@stacksjs/ts-validation": "^0.5.6",
83
- "@stacksjs/validation": "0.75.94",
83
+ "@stacksjs/validation": "0.75.96",
84
84
  "bun-query-builder": "^0.3.5"
85
85
  },
86
86
  "peerDependencies": {
87
- "@stacksjs/auth": "0.75.94",
88
- "@stacksjs/payments": "0.75.94",
89
- "@stacksjs/queue": "0.75.94",
90
- "@stacksjs/search-engine": "0.75.94",
87
+ "@stacksjs/auth": "0.75.96",
88
+ "@stacksjs/payments": "0.75.96",
89
+ "@stacksjs/queue": "0.75.96",
90
+ "@stacksjs/search-engine": "0.75.96",
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.94",
111
+ "@stacksjs/types": "0.75.96",
112
112
  "better-dx": "^0.2.24",
113
113
  "stripe": "23.0.0"
114
114
  }