@stacksjs/orm 0.70.357 → 0.70.362
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +15 -15
- package/dist/model-registry.d.ts +7 -0
- package/dist/routes.d.ts +2 -0
- package/dist/routes.js +2 -0
- package/package.json +4 -4
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare function modelFiles(root: string): string[];
|
|
2
|
+
export declare function loadModelRegistry(options: ModelRegistryOptions): Promise<Record<string, any>>;
|
|
3
|
+
export declare interface ModelRegistryOptions {
|
|
4
|
+
userRoot: string
|
|
5
|
+
defaultsRoot: string
|
|
6
|
+
onImportError?: (file: string, error: unknown) => void
|
|
7
|
+
}
|
package/dist/routes.d.ts
ADDED
package/dist/routes.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
var m$=Object.create;var{getPrototypeOf:p$,defineProperty:H$,getOwnPropertyNames:i$}=Object;var u$=Object.prototype.hasOwnProperty;function n$($){return this[$]}var l$,t$,VZ=($,Z,J)=>{var z=$!=null&&typeof $==="object";if(z){var G=Z?l$??=new WeakMap:t$??=new WeakMap,K=G.get($);if(K)return K}J=$!=null?m$(p$($)):{};let Q=Z||!$||!$.__esModule?H$(J,"default",{value:$,enumerable:!0}):J;for(let B of i$($))if(!u$.call(Q,B))H$(Q,B,{get:n$.bind($,B),enumerable:!0});if(z)G.set($,Q);return Q};var BZ=($,Z)=>()=>(Z||$((Z={exports:{}}).exports,Z),Z.exports);var U$=import.meta.require;import{route as b}from"@stacksjs/router";import{env as p}from"@stacksjs/env";import{projectPath as c$,storagePath as KZ}from"@stacksjs/path";import{createQueryBuilder as WZ,defaultConfig as C$,setConfig as P$}from"@stacksjs/query-builder";import{HttpError as q}from"@stacksjs/error-handling";import{log as z$}from"@stacksjs/logging";function o$($){let Z=$;return Z?.code==="SQLITE_CONSTRAINT_UNIQUE"||Z?.code==="SQLITE_CONSTRAINT"||Z?.code==="23505"||Z?.errno===1062||/unique|duplicate/i.test(Z?.message??"")}function W$($,Z,J){let z=$;if($ instanceof Error&&typeof z.status==="number"&&Number.isInteger(z.status)&&z.status>=400&&z.status<600){let G={error:$.message};if(z.details!==void 0)G.details=z.details;return{status:z.status,body:G}}if(o$($))return{status:409,body:{error:`${Z} already exists`}};return{status:500,body:{error:`Failed to ${J} ${Z}`,detail:String($)}}}function A($){return $.replace(/([a-z\d])([A-Z])/g,"$1_$2").replace(/([A-Z])([A-Z][a-z])/g,"$1_$2").toLowerCase()}function Q$($){let Z={};for(let[J,z]of Object.entries($))Z[A(J)]=z;return Z}function N$($){if(!$)return[];let Z=Object.entries($.attributes??{}).filter(([,J])=>J?.fillable===!0).map(([J])=>J);for(let J of $.belongsTo??[]){if(typeof J!=="string"||!J.trim())continue;let z=A(J.trim()).split("_").filter(Boolean);if(z.length===0)continue;let G=`${z[0]}${z.slice(1).map((K)=>`${K[0]?.toUpperCase()}${K.slice(1)}`).join("")}Id`;Z.push(G)}return[...new Set(Z)]}function L$($,Z){if(!$||Z.length===0)return{};let J={};for(let z of Z){if(z in $){J[z]=$[z];continue}let G=A(z);if(G!==z&&G in $)J[z]=$[G]}return J}function s$($,Z){if($?.name!=="date"||Z instanceof Date||typeof Z!=="string")return Z;let J=/^(\d{4})-(\d{2})-(\d{2})$/.exec(Z);if(!J)return Z;let z=Number(J[1]),G=Number(J[2]),K=Number(J[3]),Q=new Date(Date.UTC(z,G-1,K));if(Q.getUTCFullYear()!==z||Q.getUTCMonth()!==G-1||Q.getUTCDate()!==K)return Z;return Q}function X$($,Z){if(!Z.length)return $;let J={...$};for(let z of Z)delete J[z],delete J[A(z)];return J}function l($,Z){if(!$||Z.length===0)return $;let J={...$};for(let z of Z)delete J[z],delete J[A(z)];return J}var d$=["id","uuid","created_at","updated_at","deleted_at"];function I$($,Z){let J=new Map;for(let z of[...Object.keys($??{}),...d$]){let G=A(z);if(!/^\w+$/.test(G))continue;J.set(z,G),J.set(G,G)}for(let z of Z)J.delete(z),J.delete(A(z));return J}function A$($,Z,J){if(!Z)return $;let z=String(Z).split(",").map((K)=>K.trim()).filter(Boolean),G=$;for(let K of z){let Q=K.startsWith("-"),B=Q?K.slice(1):K;if(!/^\w+$/.test(B))continue;let U=J.get(B);if(!U)continue;G=G.orderBy(U,Q?"desc":"asc")}return G}var a$={string:{get:($)=>$!=null?String($):null,set:($)=>$!=null?String($):null},number:{get:($)=>$!=null?Number($):null,set:($)=>$!=null?Number($):null},integer:{get:($)=>$!=null?Math.trunc(Number($)):null,set:($)=>$!=null?Math.trunc(Number($)):null},float:{get:($)=>$!=null?Number.parseFloat(String($)):null,set:($)=>$!=null?Number.parseFloat(String($)):null},boolean:{get:($)=>$===1||$==="1"||$===!0||$==="true",set:($)=>$===!0||$===1||$==="1"||$==="true"?1:0},json:{get:($)=>$==null?null:typeof $==="string"?r$($):$,set:($)=>$==null?null:typeof $==="string"?$:JSON.stringify($)},datetime:{get:($)=>$?new Date($):null,set:($)=>$ instanceof Date?$.toISOString():$},date:{get:($)=>$?new Date($):null,set:($)=>$ instanceof Date?$.toISOString().split("T")[0]:$},array:{get:($)=>$==null?[]:Array.isArray($)?$:typeof $==="string"?e$($):[],set:($)=>$==null?null:Array.isArray($)?JSON.stringify($):$}};function r$($){try{return JSON.parse($)}catch{return $}}function e$($){try{return JSON.parse($)}catch{return[]}}function Y$($,Z,J){if(!$||typeof $!=="object"||!Z||Object.keys(Z).length===0)return $;let z={...$};for(let[G,K]of Object.entries(Z)){let Q=typeof K==="string"?a$[K]:K;if(!Q||typeof Q[J]!=="function")continue;if(Object.prototype.hasOwnProperty.call(z,G))z[G]=Q[J](z[G]);let B=A(G);if(B!==G&&Object.prototype.hasOwnProperty.call(z,B))z[B]=Q[J](z[B])}return z}function V$($,Z,J){let z=Z?.attributes??{},G={};for(let[K,Q]of Object.entries(z)){let B=Q?.validation?.rule;if(!B||typeof B.validate!=="function")continue;let U=Object.prototype.hasOwnProperty.call($,K);if(!U&&J==="updating")continue;let Y=Q!==null&&typeof Q==="object"&&Object.prototype.hasOwnProperty.call(Q,"default"),R=U?$[K]:Y?Q.default:void 0,f=s$(B,R),C=B.validate(f);if(!C?.valid&&Array.isArray(C?.errors)&&C.errors.length>0)G[K]=C.errors.map((v)=>Q?.validation?.message?.[v?.code]??v?.message??"invalid")}return Object.keys(G).length===0?{valid:!0}:{valid:!1,errors:G}}function B$($){return $.replace(/\{[^}]*\}/g,"{}").replace(/:[^/]+/g,"{}")}function K$($){if(Array.isArray($))return $.filter((Z)=>typeof Z==="string"&&Z.length>0);return typeof $==="string"&&$?[$]:[]}function E$($){let Z=typeof $==="object"&&$!==null&&"middleware"in $,J=$?.middleware;if(!Z)return{read:["auth"],write:["auth"],declared:!1};if(J&&typeof J==="object"&&!Array.isArray(J)){let G=J;return{read:"read"in G?K$(G.read):["auth"],write:"write"in G?K$(G.write):["auth"],declared:!0}}let z=K$(J);return{read:z,write:z,declared:!0}}var O$=15,$Z=100;function M$($){let Z=Number.parseInt($.get("page")||String(1),10),J=Number.isFinite(Z)?Math.max(1,Z):1,z=Number.parseInt($.get("per_page")||String(O$),10),G=Math.min(Number.isFinite(z)?Math.max(1,z):O$,$Z);return{page:J,perPage:G,offset:(J-1)*G}}function e($,Z){let J=new URL($.toString());return J.searchParams.set("page",String(Z)),`${J.pathname}${J.search}`}function $$($,Z,J,z,G,K){let Q=(Z-1)*J,B=z===0,U={page:Z,per_page:J,from:B?null:Q+1,to:B?null:Q+z,has_more_pages:G,prev_page_url:Z>1?e($,Z-1):null,next_page_url:G?e($,Z+1):null};if(K!==void 0&&!Number.isNaN(K)){let Y=Math.max(1,Math.ceil(K/J));U.total=K,U.last_page=Y,U.first_page_url=e($,1),U.last_page_url=e($,Y)}return U}function T$($,Z,J,z,G,K){let{page:Q,...B}=$$($,Z,J,z,G,K);return{current_page:Q,...B}}import{readdirSync as ZZ}from"fs";import{basename as JZ,extname as S$,join as zZ}from"path";function GZ($){let Z=[],J=(z)=>{let G;try{G=ZZ(z,{withFileTypes:!0})}catch{return}for(let K of G){let Q=zZ(z,K.name);if(K.isDirectory()){J(Q);continue}if(![".ts",".js"].includes(S$(K.name)))continue;if(K.name.startsWith(".")||K.name.startsWith("index"))continue;Z.push(Q)}};return J($),Z.sort()}async function j$($,Z,J){for(let z of GZ($))try{let G=S$(z),K=await import(`${z}?t=${Date.now()}`),Q=K.default??K,B=Q.name??JZ(z,G);Z[B]={...Q,name:B}}catch(G){J?.(z,G)}}async function F$($){let Z={};return await j$($.defaultsRoot,Z,$.onImportError),await j$($.userRoot,Z,$.onImportError),Z}var QZ=c$("config/qb.ts");try{let $=(await import(QZ)).default;P$($??C$)}catch{z$.debug("[orm] No config/qb.ts override found \u2014 deriving config from DB_CONNECTION");let $=p.DB_CONNECTION||"sqlite";P$({...C$,dialect:$,database:$==="sqlite"?{database:p.DB_DATABASE_PATH||"database/stacks.sqlite"}:{database:p.DB_DATABASE||"stacks",host:p.DB_HOST||"127.0.0.1",port:p.DB_PORT||($==="postgres"?5432:3306),username:p.DB_USERNAME||($==="postgres"?"postgres":"root"),password:p.DB_PASSWORD||""}})}var x$=await F$({defaultsRoot:KZ("framework/defaults/app/Models"),userRoot:c$("app/Models"),onImportError:($,Z)=>z$.warn(`[orm] Could not load model ${$}: ${Z.message}`)}),F=WZ();function i($,Z){let J=B$(Z);return b.routes.some((z)=>z.method===$&&B$(String(z.path??""))===J)}function b$($){if(!$.attributes)return[];return Object.entries($.attributes).filter(([Z,J])=>J.hidden===!0).map(([Z])=>Z)}function k$($){if($.endsWith("y")&&!/[aeiou]y$/i.test($))return`${$.slice(0,-1)}ies`;if(/(?:s|x|z|ch|sh)$/i.test($))return`${$}es`;return`${$}s`}async function R$($,Z,J,z){if(!$.length)return $;let G=J.split(",").map((Y)=>Y.trim()).filter(Boolean);if(!G.length)return $;let K=Array.isArray(Z.belongsTo)?Z.belongsTo:[],Q=Array.isArray(Z.hasMany)?Z.hasMany:[],B=Array.isArray(Z.hasOne)?Z.hasOne:[],U=new Map;for(let Y of K)U.set(A(Y),{kind:"belongsTo",modelName:Y});for(let Y of B)U.set(A(Y),{kind:"hasOne",modelName:Y});for(let Y of Q)U.set(k$(A(Y)),{kind:"hasMany",modelName:Y});for(let Y of G){let R=U.get(Y);if(!R)continue;let f=z[R.modelName];if(!f)continue;let C=f.table||k$(A(R.modelName)),v=b$(f),G$=(w)=>l(a(w,f),v);if(R.kind==="belongsTo"||R.kind==="hasOne"){let w=`${A(R.modelName)}_id`,y=[...new Set($.map((E)=>E[w]).filter((E)=>E!=null))];if(!y.length){for(let E of $)E[Y]=null;continue}let u=await F.selectFrom(C).whereIn("id",y).get(),k=new Map;for(let E of u??[])k.set(String(E.id),G$(E));for(let E of $)E[Y]=k.get(String(E[w]))??null}else{let w=String(Z.name??""),y=`${A(w)}_id`,u=[...new Set($.map((X)=>X.id).filter((X)=>X!=null))];if(!u.length){for(let X of $)X[Y]=[];continue}let k=await F.selectFrom(C).whereIn(y,u).get(),E=new Map;for(let X of k??[]){let W=String(X[y]),L=E.get(W)??[];L.push(G$(X)),E.set(W,L)}for(let X of $)X[Y]=E.get(String(X.id))??[]}}return $}async function f$($,Z){let J=Z?.set;if(!J||typeof J!=="object")return $;let z={...$};for(let[G,K]of Object.entries(J)){if(typeof K!=="function"||!(G in z))continue;try{z[G]=await K(z)}catch{}}return z}function y$($,Z){return Y$($,Z?.casts,"set")}function a($,Z){return Y$($,Z?.casts,"get")}function V($,Z=200){return new Response(JSON.stringify($),{status:Z,headers:{"Content-Type":"application/json"}})}var Z$=1048576;async function D$($){if(Number($.headers?.get?.("content-length")??0)>Z$)throw new q(413,`Request body exceeds ${Z$}-byte limit`);if($.jsonBody&&typeof $.jsonBody==="object")return $.jsonBody;if($.formBody&&typeof $.formBody==="object")return $.formBody;try{let J=await $.clone().text();if(J.length>Z$)throw new q(413,`Request body exceeds ${Z$}-byte limit`);if(!J)return{};let z=JSON.parse(J);return z&&typeof z==="object"&&!Array.isArray(z)?z:{}}catch(J){if(J instanceof q)throw J;throw new q(400,`Invalid JSON body: ${J.message}`)}}function J$($){if($==null)return null;if(typeof $==="number")return Number.isFinite($)&&$>0?$:null;if(typeof $==="string"){let Z=$.trim();if(!Z)return null;if(/^\d+$/.test(Z)){let J=Number(Z);return Number.isFinite(J)&&J>0?J:null}return Z}return null}function h$($){let Z=$.bearerToken;if(typeof Z==="function"){let z=Z.call($);if(z)return z}let J=$.headers?.get?.("authorization")||$.headers?.get?.("Authorization")||"";if(typeof J==="string"&&J.startsWith("Bearer "))return J.substring(7);return null}async function t($){let Z=$._authenticatedUser;if(Z)return Z;let J=h$($);if(!J)return null;try{let{Auth:z}=await import("@stacksjs/auth"),G=await z.getUserFromToken(J);if(G)$._authenticatedUser=G;return G||null}catch{return null}}function s($,Z){if($==null||Z==null)return!1;if(Array.isArray(Z))return Z.some((J)=>String(J)===String($));return String($)===String(Z)}function LZ($){let Z=$?.attributes||{},J=(z)=>Object.prototype.hasOwnProperty.call(Z,z);return J("teamId")||J("team_id")?"team_id":null}function XZ($){let Z=h$($),J=$.headers?.get?.("cookie")||"";return{bearerToken:()=>Z,cookies:{get:(z)=>{for(let G of J.split(";")){let K=G.indexOf("=");if(K===-1)continue;if(G.slice(0,K).trim()===z)return decodeURIComponent(G.slice(K+1).trim())}return null}}}}function q$($){if($?.ownership)return $.ownership;let Z=LZ($);if(!Z)return null;return{field:Z,resolve:async(J,z)=>{let{resolveAuthenticatedTeamId:G}=await import("@stacksjs/auth");return G(XZ(z))}}}async function d($,Z,J){let z=q$($);if(!z||!z.field||typeof z.resolve!=="function")return{enforced:!1,value:null,field:"",bypass:!1};let G=typeof z.bypass==="function"?!!z.bypass(Z,J):!1,K=null;try{K=await z.resolve(Z,J)}catch{K=null}return{enforced:!0,value:K,field:String(z.field),bypass:G}}async function g$($,Z,J,z){let G=$?.authedFill?.[Z];if(!G)return{};if(typeof G==="function")try{let K=await G(J,z);return K&&typeof K==="object"?K:{}}catch{return{}}if(typeof G==="object"){let K={};for(let[Q,B]of Object.entries(G))try{K[Q]=typeof B==="function"?await B(J,z):B}catch{}return K}return{}}for(let[$,Z]of Object.entries(x$)){let J=Z.traits?.useApi;if(!J)continue;let z=typeof J==="object"?J:{},G=z.uri||Z.table||$.toLowerCase()+"s",K=z.routes||["index","show","store","update","destroy"],Q=Z.table||G,B=N$(Z),U=b$(Z),Y=`/api/${G}`,R=I$(Z.attributes,U),{read:f,write:C,declared:v}=E$(J);if(["store","update","destroy"].some((X)=>K.includes(X))&&v&&C.length===0)z$.warn(`[orm] ${$}: registering UNAUTHENTICATED mutating routes at ${Y} (explicit \`middleware: []\` opt-out)`);if(["index","show"].some((X)=>K.includes(X))&&v&&f.length===0)z$.debug(`[orm] ${$}: registering public read routes at ${Y} (declared \`middleware.read: []\`)`);let y=!!q$(Z),u=y&&!f.includes("auth")?["auth",...f]:f,k=(X,W=u)=>{let L=X;for(let T of W)if(L&&typeof L.middleware==="function")L=L.middleware(T);return L};if(K.includes("index")&&!i("GET",Y))k(b.get(Y,async(X)=>{try{let W=new URL(X.url),{page:L,perPage:T,offset:H}=M$(W.searchParams),D=W.searchParams.get("sort"),x=F.selectFrom(Q);x=A$(x,D,R);let P=new Set(["page","per_page","sort","fields","search","include","limit","offset","with_count","withTrashed","onlyTrashed"]);for(let[j,S]of W.searchParams.entries()){if(P.has(j)||!S)continue;if(!/^[a-z_][a-z0-9_]*$/i.test(j))continue;let m=R.get(j);if(m)x=x.where(m,"=",S)}let O=W.searchParams.get("search");if(O&&B.length>0){let j=B.slice(0,5);x=x.where((S)=>{for(let m of j)S=S.orWhere(A(m),"like",`%${O}%`);return S})}let N=W.searchParams.get("fields");if(N){let j=N.split(",").map((S)=>S.trim()).filter((S)=>/^[a-z_][a-z0-9_]*$/i.test(S)).map((S)=>A(S));if(j.length>0)x=x.select(j)}let I=!!Z.traits?.useSoftDeletes,M=W.searchParams.get("withTrashed")==="true",h=W.searchParams.get("onlyTrashed")==="true";if(I&&!M)x=h?x.whereNotNull("deleted_at"):x.whereNull("deleted_at");let _=y?await d(Z,await t(X),X):{enforced:!1,value:null,field:"",bypass:!1};if(_.enforced&&!_.bypass){if(_.value==null||Array.isArray(_.value)&&_.value.length===0){let j=T$(W,L,T,0,!1,void 0);return new Response(JSON.stringify({data:[],...j,meta:$$(W,L,T,0,!1,void 0)}),{status:200,headers:{"Content-Type":"application/json","Cache-Control":"private, no-store",Vary:"Authorization"}})}x=Array.isArray(_.value)?x.where(_.field,"in",_.value):x.where(_.field,"=",_.value)}let g=await x.limit(T+1).offset(H).get()||[],c=g.length>T,o=(c?g.slice(0,T):g).map((j)=>l(a(j,Z),U)),_$=W.searchParams.get("include");if(_$)o=await R$(o,Z,_$,x$);let v$=W.searchParams.get("with_count")==="true",n;if(v$)try{let j=F.selectFrom(Q);if(_.enforced&&!_.bypass&&_.value!=null)j=Array.isArray(_.value)?j.where(_.field,"in",_.value):j.where(_.field,"=",_.value);let S=await j.count(),m=typeof S==="number"?S:Number(S?.count??S);if(Number.isFinite(m))n=m}catch{}let r={"Content-Type":"application/json"};if(n!==void 0&&!Number.isNaN(n))r["X-Total-Count"]=String(n);r["Cache-Control"]=_.enforced&&!_.bypass?"private, no-store":"public, max-age=15, must-revalidate",r.Vary="Authorization";let w$=T$(W,L,T,o.length,c,n);return new Response(JSON.stringify({data:o,...w$,meta:$$(W,L,T,o.length,c,n)}),{status:200,headers:r})}catch(W){if(W instanceof q){let L={error:W.message};if(W.details!==void 0)L.details=W.details;return V(L,W.status||400)}return V({error:`Failed to fetch ${G}`,detail:String(W)},500)}}));if(K.includes("show")&&!i("GET",`${Y}/{id}`))k(b.get(`${Y}/{id}`,async(X)=>{try{let W=J$(X.params?.id);if(W==null)return V({error:"Invalid ID parameter"},400);let L=await F.selectFrom(Q).where({id:W}).executeTakeFirst();if(!L)return V({error:`${$} not found`},404);let T=new URL(X.url);if(Z.traits?.useSoftDeletes&&L.deleted_at&&T.searchParams.get("withTrashed")!=="true")return V({error:`${$} not found`},404);let H=y?await d(Z,await t(X),X):{enforced:!1,value:null,field:"",bypass:!1};if(H.enforced&&!H.bypass){if(H.value==null||!s(L[H.field],H.value))return V({error:`${$} not found`},404)}let D=l(a(L,Z),U),x=T.searchParams.get("include");if(x){let[M]=await R$([D],Z,x,x$);D=M}let P=D?.updated_at||D?.created_at,O=P?`W/"${D.id}-${String(P)}"`:void 0,N=X.headers?.get?.("if-none-match");if(O&&N&&N===O)return new Response(null,{status:304,headers:{ETag:O}});let I={"Content-Type":"application/json"};if(O)I.ETag=O;return I["Cache-Control"]=H.enforced&&!H.bypass?"private, no-store":"public, max-age=30, must-revalidate",I.Vary="Authorization",new Response(JSON.stringify({data:D}),{status:200,headers:I})}catch(W){if(W instanceof q){let L={error:W.message};if(W.details!==void 0)L.details=W.details;return V(L,W.status||400)}return V({error:`Failed to fetch ${$}`,detail:String(W)},500)}}));if(K.includes("store")&&!i("POST",Y))k(b.post(Y,async(X)=>{try{let W=await D$(X),L=X$(W,U),T=L$(L,B),H=await t(X);if(H){let I=await g$(Z,"creating",H,X);for(let[M,h]of Object.entries(I))if(h!==void 0&&h!==null&&T[M]===void 0)T[M]=h}if(Object.keys(T).length===0)return V({error:"No fillable fields provided"},422);let D=V$(T,Z,"creating");if(!D.valid)return V({success:!1,message:"Validation failed",errors:D.errors},422);if(Z.traits?.useTimestamps!==!1){let I=new Date().toISOString();T.created_at=I,T.updated_at=I}let x=await f$(T,Z),P=Q$(y$(x,Z)),O=await F.insertInto(Q).values(P).execute(),N=P;try{let I=O?.lastInsertRowid??O?.insertId??O;if(I){let M=await F.selectFrom(Q).where({id:I}).executeTakeFirst();if(M)N=M}}catch{}return V({data:l(a(N,Z),U)},201)}catch(W){let{status:L,body:T}=W$(W,$,"create");return V(T,L)}}),C);if(K.includes("update")){let X=async(W)=>{try{let L=J$(W.params?.id);if(L==null)return V({error:"Invalid ID parameter"},400);let T=await D$(W),H=X$(T,U),D=L$(H,B),x=await t(W);if(x){let _=await g$(Z,"updating",x,W);for(let[g,c]of Object.entries(_))if(c!==void 0&&c!==null&&D[g]===void 0)D[g]=c}if(Object.keys(D).length===0)return V({error:"No fillable fields provided"},422);let P=V$(D,Z,"updating");if(!P.valid)return V({success:!1,message:"Validation failed",errors:P.errors},422);let O=await F.selectFrom(Q).where({id:L}).executeTakeFirst();if(!O)return V({error:`${$} not found`},404);let N=await d(Z,x,W);if(N.enforced&&!N.bypass){if(!x)return V({error:"Auth required"},401);let _=O[N.field];if(!s(_,N.value))return V({error:`Not your ${$}`},403);let g=Object.keys(D).find((c)=>A(c)===A(N.field));if(g!==void 0&&!s(D[g],N.value))return V({error:`Cannot reassign ${$} ownership`},403)}if(Z.traits?.useTimestamps!==!1)D.updated_at=new Date().toISOString();let I=await f$(D,Z),M=Q$(y$(I,Z));await F.updateTable(Q).set(M).where({id:L}).execute();let h={...O,...M};try{let _=await F.selectFrom(Q).where({id:L}).executeTakeFirst();if(_)h=_}catch{}return V({data:l(a(h,Z),U)})}catch(L){let{status:T,body:H}=W$(L,$,"update");return V(H,T)}};if(!i("PUT",`${Y}/{id}`))k(b.put(`${Y}/{id}`,X),C);if(!i("PATCH",`${Y}/{id}`))k(b.patch(`${Y}/{id}`,X),C)}let E=!!Z.traits?.useSoftDeletes;if(K.includes("destroy")&&!i("DELETE",`${Y}/{id}`))k(b.delete(`${Y}/{id}`,async(X)=>{try{let W=J$(X.params?.id);if(W==null)return V({error:"Invalid ID parameter"},400);let L=await F.selectFrom(Q).where({id:W}).executeTakeFirst();if(!L)return V({error:`${$} not found`},404);let T=await t(X),H=await d(Z,T,X);if(H.enforced&&!H.bypass){if(!T)return V({error:"Auth required"},401);let D=L[H.field];if(!s(D,H.value))return V({error:`Not your ${$}`},403)}if(E){let D=new Date().toISOString();await F.updateTable(Q).set({deleted_at:D,updated_at:D}).where({id:W}).execute()}else await F.deleteFrom(Q).where({id:W}).execute();return new Response(null,{status:204})}catch(W){if(W instanceof q){let L={error:W.message};if(W.details!==void 0)L.details=W.details;return V(L,W.status||400)}return V({error:`Failed to delete ${$}`,detail:String(W)},500)}}),C);if(K.includes("destroy")&&!i("POST",`${Y}/bulk-delete`))k(b.post(`${Y}/bulk-delete`,async(X)=>{try{let L=(await D$(X))?.ids;if(!Array.isArray(L)||L.length===0)return V({error:"An array of IDs is required"},422);if(L.length>100)return V({error:"Cannot delete more than 100 records at once"},422);let T=[],H=[];for(let O of L){let N=J$(O);if(N!=null)T.push(N);else H.push(O)}if(H.length>0)return V({error:"Invalid IDs in batch",invalid:H},422);let D=await t(X),x=await d(Z,D,X);if(x.enforced&&!x.bypass){if(!D)return V({error:"Auth required"},401);if(x.value==null)return V({error:"Caller has no ownership identity"},403);let O=await F.selectFrom(Q).select(["id",x.field]).execute(),N=new Set(O.filter((M)=>s(M[x.field],x.value)).map((M)=>String(M.id))),I=T.filter((M)=>!N.has(String(M)));if(I.length>0)return V({error:`Cannot delete ${$} you don't own`,ids:I},403)}let P=new Date().toISOString();for(let O of T)if(E)await F.updateTable(Q).set({deleted_at:P,updated_at:P}).where({id:O}).execute();else await F.deleteFrom(Q).where({id:O}).execute();return V({message:`Successfully deleted ${T.length} ${G}`})}catch(W){if(W instanceof q){let L={error:W.message};if(W.details!==void 0)L.details=W.details;return V(L,W.status||400)}return V({error:`Failed to bulk delete ${G}`,detail:String(W)},500)}}),C)}var CZ=b;export{CZ 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.70.
|
|
5
|
+
"version": "0.70.362",
|
|
6
6
|
"description": "The Stacks ORM integration",
|
|
7
7
|
"author": "Chris Breuer",
|
|
8
8
|
"contributors": [
|
|
@@ -66,9 +66,9 @@
|
|
|
66
66
|
"bun-query-builder": "^0.2.25"
|
|
67
67
|
},
|
|
68
68
|
"devDependencies": {
|
|
69
|
-
"@stacksjs/config": "0.70.
|
|
69
|
+
"@stacksjs/config": "0.70.362",
|
|
70
70
|
"better-dx": "^0.2.17",
|
|
71
|
-
"@stacksjs/query-builder": "0.70.
|
|
72
|
-
"@stacksjs/types": "0.70.
|
|
71
|
+
"@stacksjs/query-builder": "0.70.362",
|
|
72
|
+
"@stacksjs/types": "0.70.362"
|
|
73
73
|
}
|
|
74
74
|
}
|