@mrxsys/mrx-core 2.3.4 → 2.3.5-canary-20250516-ec25fa6
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/CHANGELOG.md +17 -0
- package/dist/elysia/index.js +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,4 +1,21 @@
|
|
|
1
1
|
|
|
2
|
+
## v2.3.5-canary-20250516-ec25fa6
|
|
3
|
+
|
|
4
|
+
[compare changes](https://github.com/MRX-Systems/MRX-Core/compare/v2.3.4-canary-20250515-0a404bc...v2.3.5-canary-20250516-ec25fa6)
|
|
5
|
+
|
|
6
|
+
### 🧹 Refactors
|
|
7
|
+
|
|
8
|
+
- **🧹:** [update error handling content-type header] ([e17ed9f1](https://github.com/MRX-Systems/MRX-Core/commit/e17ed9f1))
|
|
9
|
+
|
|
10
|
+
### 🦉 Chore
|
|
11
|
+
|
|
12
|
+
- **🦉:** V2.3.4 ([d29a8952](https://github.com/MRX-Systems/MRX-Core/commit/d29a8952))
|
|
13
|
+
|
|
14
|
+
### ❤️ Contributors
|
|
15
|
+
|
|
16
|
+
- Ruby <necrelox@proton.me>
|
|
17
|
+
- Github-actions <maxime.meriaux@mrxsys.com>
|
|
18
|
+
|
|
2
19
|
## v2.3.4
|
|
3
20
|
|
|
4
21
|
[compare changes](https://github.com/MRX-Systems/MRX-Core/compare/v2.3.4-canary-20250515-0a404bc...v2.3.4)
|
package/dist/elysia/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
import{A as L,B as c,C as o,D as v,E as n,F as g,G as P,q as y,r as q,s as m,t as x,v as C,w as D,y as j}from"../chunk-kn1300vm.js";import{V as bG}from"../chunk-wggj590m.js";import"../chunk-t411e41y.js";import"../chunk-7map0v4a.js";import{_ as A}from"../chunk-6sa6shm6.js";import"../chunk-dppgkz92.js";import"../chunk-yeyzc9n2.js";import{da as B,ea as d}from"../chunk-nntk6mwx.js";import{fa as pG,ga as dG}from"../chunk-xcz2fxzt.js";import{ha as vG}from"../chunk-rr6e20n5.js";import{filterByKeyExclusion as YY}from"@basalt-lab/basalt-helper/data";var f={};vG(f,{TypeGuardUnknownTypeError:()=>i,IsVoid:()=>SG,IsUnsafe:()=>OG,IsUnknown:()=>fG,IsUnionLiteral:()=>GY,IsUnion:()=>h,IsUndefined:()=>xG,IsUint8Array:()=>NG,IsTuple:()=>wG,IsTransform:()=>KG,IsThis:()=>EG,IsTemplateLiteral:()=>RG,IsSymbol:()=>kG,IsString:()=>PG,IsSchema:()=>J,IsRegExp:()=>qG,IsRef:()=>CG,IsRecursive:()=>eG,IsRecord:()=>TG,IsReadonly:()=>uG,IsProperties:()=>N,IsPromise:()=>BG,IsOptional:()=>tG,IsObject:()=>LG,IsNumber:()=>AG,IsNull:()=>DG,IsNot:()=>MG,IsNever:()=>jG,IsMappedResult:()=>JG,IsMappedKey:()=>QG,IsLiteralValue:()=>WG,IsLiteralString:()=>FG,IsLiteralNumber:()=>UG,IsLiteralBoolean:()=>aG,IsLiteral:()=>E,IsKindOf:()=>$,IsKind:()=>yG,IsIterator:()=>_G,IsIntersect:()=>HG,IsInteger:()=>XG,IsImport:()=>lG,IsFunction:()=>$G,IsDate:()=>VG,IsConstructor:()=>zG,IsComputed:()=>ZG,IsBoolean:()=>YG,IsBigInt:()=>GG,IsAsyncIterator:()=>e,IsArray:()=>a,IsArgument:()=>l,IsAny:()=>t});class i extends c{}var iG=["Argument","Any","Array","AsyncIterator","BigInt","Boolean","Computed","Constructor","Date","Enum","Function","Integer","Intersect","Iterator","Literal","MappedKey","MappedResult","Not","Null","Number","Object","Promise","Record","Ref","RegExp","String","Symbol","TemplateLiteral","This","Tuple","Undefined","Union","Uint8Array","Unknown","Void"];function r(G){try{return new RegExp(G),!0}catch{return!1}}function I(G){if(!j(G))return!1;for(let Y=0;Y<G.length;Y++){let Z=G.charCodeAt(Y);if(Z>=7&&Z<=13||Z===27||Z===127)return!1}return!0}function s(G){return b(G)||J(G)}function R(G){return L(G)||m(G)}function F(G){return L(G)||C(G)}function b(G){return L(G)||x(G)}function _(G){return L(G)||j(G)}function rG(G){return L(G)||j(G)&&I(G)&&r(G)}function sG(G){return L(G)||j(G)&&I(G)}function u(G){return L(G)||J(G)}function uG(G){return D(G)&&G[v]==="Readonly"}function tG(G){return D(G)&&G[n]==="Optional"}function t(G){return $(G,"Any")&&_(G.$id)}function l(G){return $(G,"Argument")&&C(G.index)}function a(G){return $(G,"Array")&&G.type==="array"&&_(G.$id)&&J(G.items)&&F(G.minItems)&&F(G.maxItems)&&b(G.uniqueItems)&&u(G.contains)&&F(G.minContains)&&F(G.maxContains)}function e(G){return $(G,"AsyncIterator")&&G.type==="AsyncIterator"&&_(G.$id)&&J(G.items)}function GG(G){return $(G,"BigInt")&&G.type==="bigint"&&_(G.$id)&&R(G.exclusiveMaximum)&&R(G.exclusiveMinimum)&&R(G.maximum)&&R(G.minimum)&&R(G.multipleOf)}function YG(G){return $(G,"Boolean")&&G.type==="boolean"&&_(G.$id)}function ZG(G){return $(G,"Computed")&&j(G.target)&&q(G.parameters)&&G.parameters.every((Y)=>J(Y))}function zG(G){return $(G,"Constructor")&&G.type==="Constructor"&&_(G.$id)&&q(G.parameters)&&G.parameters.every((Y)=>J(Y))&&J(G.returns)}function VG(G){return $(G,"Date")&&G.type==="Date"&&_(G.$id)&&F(G.exclusiveMaximumTimestamp)&&F(G.exclusiveMinimumTimestamp)&&F(G.maximumTimestamp)&&F(G.minimumTimestamp)&&F(G.multipleOfTimestamp)}function $G(G){return $(G,"Function")&&G.type==="Function"&&_(G.$id)&&q(G.parameters)&&G.parameters.every((Y)=>J(Y))&&J(G.returns)}function lG(G){return $(G,"Import")&&y(G,"$defs")&&D(G.$defs)&&N(G.$defs)&&y(G,"$ref")&&j(G.$ref)&&G.$ref in G.$defs}function XG(G){return $(G,"Integer")&&G.type==="integer"&&_(G.$id)&&F(G.exclusiveMaximum)&&F(G.exclusiveMinimum)&&F(G.maximum)&&F(G.minimum)&&F(G.multipleOf)}function N(G){return D(G)&&Object.entries(G).every(([Y,Z])=>I(Y)&&J(Z))}function HG(G){return $(G,"Intersect")&&(j(G.type)&&G.type!=="object"?!1:!0)&&q(G.allOf)&&G.allOf.every((Y)=>J(Y)&&!KG(Y))&&_(G.type)&&(b(G.unevaluatedProperties)||u(G.unevaluatedProperties))&&_(G.$id)}function _G(G){return $(G,"Iterator")&&G.type==="Iterator"&&_(G.$id)&&J(G.items)}function $(G,Y){return D(G)&&P in G&&G[P]===Y}function FG(G){return E(G)&&j(G.const)}function UG(G){return E(G)&&C(G.const)}function aG(G){return E(G)&&x(G.const)}function E(G){return $(G,"Literal")&&_(G.$id)&&WG(G.const)}function WG(G){return x(G)||C(G)||j(G)}function QG(G){return $(G,"MappedKey")&&q(G.keys)&&G.keys.every((Y)=>C(Y)||j(Y))}function JG(G){return $(G,"MappedResult")&&N(G.properties)}function jG(G){return $(G,"Never")&&D(G.not)&&Object.getOwnPropertyNames(G.not).length===0}function MG(G){return $(G,"Not")&&J(G.not)}function DG(G){return $(G,"Null")&&G.type==="null"&&_(G.$id)}function AG(G){return $(G,"Number")&&G.type==="number"&&_(G.$id)&&F(G.exclusiveMaximum)&&F(G.exclusiveMinimum)&&F(G.maximum)&&F(G.minimum)&&F(G.multipleOf)}function LG(G){return $(G,"Object")&&G.type==="object"&&_(G.$id)&&N(G.properties)&&s(G.additionalProperties)&&F(G.minProperties)&&F(G.maxProperties)}function BG(G){return $(G,"Promise")&&G.type==="Promise"&&_(G.$id)&&J(G.item)}function TG(G){return $(G,"Record")&&G.type==="object"&&_(G.$id)&&s(G.additionalProperties)&&D(G.patternProperties)&&((Y)=>{let Z=Object.getOwnPropertyNames(Y.patternProperties);return Z.length===1&&r(Z[0])&&D(Y.patternProperties)&&J(Y.patternProperties[Z[0]])})(G)}function eG(G){return D(G)&&g in G&&G[g]==="Recursive"}function CG(G){return $(G,"Ref")&&_(G.$id)&&j(G.$ref)}function qG(G){return $(G,"RegExp")&&_(G.$id)&&j(G.source)&&j(G.flags)&&F(G.maxLength)&&F(G.minLength)}function PG(G){return $(G,"String")&&G.type==="string"&&_(G.$id)&&F(G.minLength)&&F(G.maxLength)&&rG(G.pattern)&&sG(G.format)}function kG(G){return $(G,"Symbol")&&G.type==="symbol"&&_(G.$id)}function RG(G){return $(G,"TemplateLiteral")&&G.type==="string"&&j(G.pattern)&&G.pattern[0]==="^"&&G.pattern[G.pattern.length-1]==="$"}function EG(G){return $(G,"This")&&_(G.$id)&&j(G.$ref)}function KG(G){return D(G)&&o in G}function wG(G){return $(G,"Tuple")&&G.type==="array"&&_(G.$id)&&C(G.minItems)&&C(G.maxItems)&&G.minItems===G.maxItems&&(L(G.items)&&L(G.additionalItems)&&G.minItems===0||q(G.items)&&G.items.every((Y)=>J(Y)))}function xG(G){return $(G,"Undefined")&&G.type==="undefined"&&_(G.$id)}function GY(G){return h(G)&&G.anyOf.every((Y)=>FG(Y)||UG(Y))}function h(G){return $(G,"Union")&&_(G.$id)&&D(G)&&q(G.anyOf)&&G.anyOf.every((Y)=>J(Y))}function NG(G){return $(G,"Uint8Array")&&G.type==="Uint8Array"&&_(G.$id)&&F(G.minByteLength)&&F(G.maxByteLength)}function fG(G){return $(G,"Unknown")&&_(G.$id)}function OG(G){return $(G,"Unsafe")}function SG(G){return $(G,"Void")&&G.type==="void"&&_(G.$id)}function yG(G){return D(G)&&P in G&&j(G[P])&&!iG.includes(G[P])}function J(G){return D(G)&&(t(G)||l(G)||a(G)||YG(G)||GG(G)||e(G)||ZG(G)||zG(G)||VG(G)||$G(G)||XG(G)||HG(G)||_G(G)||E(G)||QG(G)||JG(G)||jG(G)||MG(G)||DG(G)||AG(G)||LG(G)||BG(G)||TG(G)||CG(G)||qG(G)||PG(G)||kG(G)||RG(G)||EG(G)||wG(G)||xG(G)||h(G)||NG(G)||fG(G)||OG(G)||SG(G)||yG(G))}import{Elysia as ZY,t as X}from"elysia";var zY=(G)=>X.Object({$eq:G,$neq:G,...!f.IsBoolean(G)?{$lt:G,$lte:G,$gt:G,$gte:G,$in:X.Array(G),$nin:X.Array(G),$between:X.Tuple([G,G]),$nbetween:X.Tuple([G,G]),$like:X.String(),$nlike:X.String()}:{},$isNull:X.Boolean()}),VY=(G)=>{let{properties:Y}=G,Z={};for(let[z,V]of Object.entries(Y)){let H=zY(V);Z[z]=X.Array(X.Union([X.Partial(H),V]))}return Z},$Y=(G)=>X.Array(X.Union([X.Partial(X.Object({selectedFields:X.Union([X.Array(X.KeyOf(G)),X.KeyOf(G)]),value:X.String()})),X.String()])),XY=(G)=>X.Array(X.KeyOf(G)),K=(G)=>X.Composite([X.Object({$q:X.Optional($Y(G)),$selectedFields:X.Optional(XY(G))}),X.Partial(X.Object(VY(G)))]),HY=(G)=>X.Composite([K(G),X.Partial(X.Object({$limit:X.Number(),$offset:X.Number()}))]),gG=(G,Y,Z=[])=>new ZY({name:`advancedSearchPlugin-${G}`,seed:Y}).model({[`advancedSearch${G}Query`]:K(Y),[`advancedSearch${G}QueryWithPagination`]:HY(Y)}).macro({hasAdvancedSearch:{resolve:({query:z})=>{let V=z,H={advancedSearch:[],selectedFields:V.$selectedFields||["*"],pagination:{limit:V.$limit||100,offset:V.$offset||0}};if(z.$q){let M=Array.isArray(z.$q)?z.$q:[z.$q];H.advancedSearch.push(...M.map((W)=>({$q:W})))}V=YY(V,["$selectedFields","$q","$limit","$offset",...Z],!0);for(let[M,W]of Object.entries(V))(Array.isArray(W)?W:[W]).forEach((k,T)=>{if(!H.advancedSearch[T])H.advancedSearch[T]={};H.advancedSearch[T][M]=k});return H}}}).as("scoped");import{SingletonManager as FY}from"@basalt-lab/basalt-helper/util";import{Elysia as p,t as Q}from"elysia";import{SingletonManager as O}from"@basalt-lab/basalt-helper/util";import{Elysia as _Y,t as IG}from"elysia";var hG=(G)=>new _Y({name:"dynamicDatabaseSelectorPlugin"}).model({databaseUsingHeader:IG.Object({[G.headerKey||"database-using"]:IG.String()})}).macro({hasDynamicDatabaseSelector:{async resolve({headers:Y}){let Z=Y[G.headerKey||"database-using"];if(!Z)throw new A({key:B.dynamicDatabaseKeyNotFound,message:"Dynamic Database key not found in the request headers.",httpStatusCode:400});if(!O.has(`database:${Z}`))O.register(`database:${Z}`,bG,{...G.baseDatabaseConfig,databaseName:Z}),await O.get(`database:${Z}`).connect();return{dynamicDB:O.get(`database:${Z}`)}}}}).as("scoped");var UY=(G)=>{let{properties:Y}=G,Z={};for(let z in Y)Z[z]=Q.Union([Y[z],Q.Undefined(),Q.Null(),Q.Literal("")]);return Q.Object({message:Q.String(),content:Q.Array(Q.Partial(Q.Object(Z)))})},WY=(G,Y)=>{let{properties:Z}=G,z={};for(let V in Z)z[V]=Y?.includes(V)?Z[V]:Q.Optional(Z[V]);return Q.Object(z)},QY=(G,Y)=>{let{baseSchema:Z,tableName:z,insertPropertiesSchemaRequired:V}=Y,H=new p().model({[`crud${z}Response200`]:UY(Z)}),M={insert:()=>H.model({[`crud${z}InsertBody`]:WY(Z,V)}),update:()=>H.model({[`crud${z}UpdateBody`]:Q.Partial(Z)}),count:()=>H.model({[`crud${z}CountResponse200`]:Q.Object({message:Q.String(),content:Q.Number()})})};if(G.forEach((U)=>{if(U in M)M[U]?.()}),["findOne","deleteOne","updateOne"].some((U)=>G.includes(U)))H.model({[`crud${z}IdParam`]:Q.Object({id:Q.Union([Q.String(),Q.Number()])})});return H},JY=(G=[],Y=[])=>{let Z=["insert","find","findOne","update","updateOne","delete","deleteOne","count"],z=G.length>0?G:Z;return Y.length>0?z.filter((V)=>!Y.includes(V)):z},jY=(G)=>{let Y=new p;if(typeof G==="string")Y.resolve(()=>({dynamicDB:FY.get(`database:${G}`)}));else Y.use(hG({baseDatabaseConfig:G.baseDatabaseConfig,headerKey:G.headerKey||"database-using"}));return Y.as("scoped")},MY={insertHandler:async(G,Y)=>{let z=G.dynamicDB.getRepository(Y),{body:V}=G,H=await z.insert(V);return{message:`Inserted record for ${Y}`,content:H}},findHandler:async(G,Y)=>{let V=await G.dynamicDB.getRepository(Y).find({advancedSearch:G.advancedSearch,selectedFields:G.selectedFields,limit:G.pagination.limit,offset:G.pagination.offset});return{message:`Found ${V.length} records for ${Y}`,content:V}},findOneHandler:async(G,Y)=>{let Z=G.dynamicDB,z=Z.getRepository(Y),H=Z.getTable(Y).primaryKey,{id:M}=G.params,W=await z.findOne({advancedSearch:{[H[0]]:M}});return{message:`Found record for ${Y}`,content:W}},countHandler:async(G,Y)=>{let V=await G.dynamicDB.getRepository(Y).count({advancedSearch:G.advancedSearch});return{message:`${V} records found for ${Y}`,content:V}},updateHandler:async(G,Y)=>{let z=G.dynamicDB.getRepository(Y);if(!G.advancedSearch||G.advancedSearch.length===0||!G.advancedSearch[0])throw new A({key:B.needAdvancedSearch,message:"You need to provide advanced search to update records. It's dangerous to update all records.",httpStatusCode:400});let V=await z.update(G.body,{advancedSearch:G.advancedSearch,selectedFields:G.selectedField});return{message:`Updated ${V.length} records for ${Y}`,content:V}},updateOneHandler:async(G,Y)=>{let Z=G.dynamicDB,z=Z.getRepository(Y),H=Z.getTable(Y).primaryKey,{id:M}=G.params,W=await z.update(G.body,{advancedSearch:{[H[0]]:M}});return{message:`Updated record for ${Y}`,content:W}},deleteHandler:async(G,Y)=>{let z=G.dynamicDB.getRepository(Y);if(!G.advancedSearch||G.advancedSearch.length===0||!G.advancedSearch[0])throw new A({key:B.needAdvancedSearch,message:"You need to provide advanced search to delete records. It's dangerous to delete all records.",httpStatusCode:400});let V=await z.delete({advancedSearch:G.advancedSearch,selectedFields:G.selectedFields});return{message:`Deleted ${V.length} records for ${Y}`,content:V}},deleteOneHandler:async(G,Y)=>{let Z=G.dynamicDB,z=Z.getRepository(Y),H=Z.getTable(Y).primaryKey,{id:M}=G.params,W=await z.delete({advancedSearch:{[H[0]]:M}});return{message:`Deleted record for ${Y}`,content:W}}},DY=(G,Y,Z,z)=>(V)=>{let H={insert:"post",find:"get",findOne:"get",count:"get",update:"patch",updateOne:"patch",delete:"delete",deleteOne:"delete"},M={insert:"/",find:"/",findOne:"/:id",count:"/count",update:"/",updateOne:"/:id",delete:"/",deleteOne:"/:id"};if(G.includes("find")||G.includes("count")||G.includes("update")||G.includes("delete"))V.use(gG(Y,Z));for(let U of G){let k=H[U],T=M[U];if(k&&T){let w=MY[`${U}Handler`],cG={...U==="findOne"||U==="deleteOne"||U==="updateOne"?{params:`crud${Y}IdParam`}:{},...U==="count"||U==="update"||U==="delete"?{query:K(Z)}:U==="find"?{query:K(Z)}:{},...U==="insert"||U==="update"||U==="updateOne"?{body:`crud${Y}${U==="insert"?"Insert":"Update"}Body`}:{},response:`crud${Y}${U==="count"?"Count":""}Response200`,hasAdvancedSearch:!0,hasDynamicDatabaseSelector:z};V[k](T,(oG)=>w(oG,Y),cG)}}return V},rY=(G)=>{let Y=JY(G.includedRoutes,G.excludedRoutes),Z=new p({name:`crudPlugin[${G.tableName}]`,tags:[G.tableName]}).use(QY(Y,G)).use(G.permissionConfig.permissionsPlugin);return Z.use(jY(G.database)).use(DY(Y,G.tableName,G.baseSchema,typeof G.database!=="string")),Z};import{BasaltError as AY}from"@basalt-lab/basalt-helper/error";import{BasaltError as LY}from"@basalt-lab/basalt-logger/error";import{Elysia as BY}from"elysia";var eY=new BY({name:"errorPlugin"}).error({CoreError:A,BasaltHelperError:AY,BasaltLoggerError:LY}).onError(({code:G,error:Y,set:Z})=>{switch(G){case"CoreError":case"BasaltHelperError":case"BasaltLoggerError":return Z.status=Y.httpStatusCode,{key:Y.key,message:Y.message,cause:Y.cause};case"VALIDATION":return Z.status=400,{key:"core.error.validation",message:"Validation error",cause:{on:Y.type,found:Y.value,errors:Y.all}};case"NOT_FOUND":return Z.status=404,{key:"core.error.not_found",message:"Not found"};case"INTERNAL_SERVER_ERROR":case"UNKNOWN":default:return Z.status=500,{key:"core.error.internal_server_error",message:"Internal server error"}}}).as("global");import{Elysia as TY}from"elysia";import{SignJWT as CY,jwtVerify as qY}from"jose";var $Z=(G)=>{if(!G.secret)throw new A({key:B.jwtSecretNotFound,message:"Secret key is required for JWT signing and verification."});let Y=new TextEncoder().encode(G.secret),Z=G.name??"jwt";return new TY({name:"jwtPlugin",seed:G}).decorate(Z,{sign(z,V=G.exp??"15m"){let H={iss:"core",aud:"core client",jti:Bun.randomUUIDv7(),...G.payload,...z};try{return new CY(H).setProtectedHeader({alg:"HS256",b64:!0}).setIssuer(H.iss??"core").setAudience(H.aud??"client").setExpirationTime(V).sign(Y)}catch{throw new A({key:B.jwtSignError,message:"Error signing JWT."})}},async verify(z){if(!z)return!1;try{return(await qY(z,Y)).payload}catch{return!1}}}).as("scoped")};import{Elysia as PY}from"elysia";import{existsSync as kY}from"fs";import{platform as RY}from"os";var mG=(G)=>{let Y=RY()==="win32",Z=Y?"\\":"/";if(Y&&/^[A-Z]:\\$/i.test(G)||!Y&&G==="/")return"";let z=G+Z+"package.json";if(kY(z))return z;let V=G.split(Z);if(V.length<=1)return"";let H=V.slice(0,-1).join(Z);if(H==="")return"";return mG(H)},S=await import(mG(Bun.main)),QZ=new PY({name:"microservicePlugin",prefix:"/microservice",detail:{tags:["Microservice"],security:[]}}).model({infoResponse200:pG,pingResponse200:dG}).get("/ping",()=>({message:"pong"}),{detail:{summary:"Ping",description:"Ping the microservice to check if it is alive"},response:"pingResponse200"}).get("/info",()=>({message:"Microservice Information",content:{name:S.default.name,version:S.default.version,description:S.default.description,author:S.default.author}}),{detail:{summary:"Info",description:"Get information about the microservice"},response:"infoResponse200"}).as("scoped");import{Elysia as EY}from"elysia";var LZ=({redis:G,limit:Y,window:Z,message:z})=>new EY({name:"rateLimitPlugin",seed:{redis:G,limit:Y,window:Z,message:z}}).onRequest(async({set:V,request:H})=>{let W=`ratelimit:${H.headers.get("x-forwarded-for")||H.headers.get("x-real-ip")||"127.0.0.1"}`,U=await G.client.get(W);if((U?parseInt(U):0)===0)await G.client.setex(W,Z,"1");else await G.client.incr(W);let T=await G.client.get(W),w=T?parseInt(T):0;if(w>Y)throw V.status=d.tooManyRequests,new A({key:B.rateLimitExceeded,message:z||"Rate limit exceeded",httpStatusCode:d.tooManyRequests,cause:{limit:Y,window:Z,remaining:0,reset:await G.client.ttl(W)}});V.headers={"X-RateLimit-Limit":Y.toString(),"X-RateLimit-Remaining":Math.max(0,Y-w).toString(),"X-RateLimit-Reset":(await G.client.ttl(W)).toString()}}).as("scoped");export{LZ as rateLimitPlugin,QZ as microservicePlugin,$Z as jwtPlugin,eY as errorPlugin,hG as dynamicDatabaseSelectorPlugin,rY as crudPlugin,UY as createResponse200Schema,WY as createInsertBodySchema,HY as createBaseSearchSchemaWithPagination,K as createBaseSearchSchema,gG as advancedSearchPlugin};export{K as f,HY as g,gG as h,hG as i,UY as j,WY as k,rY as l,eY as m,$Z as n,QZ as o,LZ as p};
|
|
2
|
+
import{A as L,B as c,C as o,D as v,E as n,F as g,G as P,q as y,r as q,s as m,t as x,v as C,w as D,y as j}from"../chunk-kn1300vm.js";import{V as bG}from"../chunk-wggj590m.js";import"../chunk-t411e41y.js";import"../chunk-7map0v4a.js";import{_ as A}from"../chunk-6sa6shm6.js";import"../chunk-dppgkz92.js";import"../chunk-yeyzc9n2.js";import{da as B,ea as d}from"../chunk-nntk6mwx.js";import{fa as pG,ga as dG}from"../chunk-xcz2fxzt.js";import{ha as vG}from"../chunk-rr6e20n5.js";import{filterByKeyExclusion as YY}from"@basalt-lab/basalt-helper/data";var f={};vG(f,{TypeGuardUnknownTypeError:()=>i,IsVoid:()=>SG,IsUnsafe:()=>OG,IsUnknown:()=>fG,IsUnionLiteral:()=>GY,IsUnion:()=>h,IsUndefined:()=>xG,IsUint8Array:()=>NG,IsTuple:()=>wG,IsTransform:()=>KG,IsThis:()=>EG,IsTemplateLiteral:()=>RG,IsSymbol:()=>kG,IsString:()=>PG,IsSchema:()=>J,IsRegExp:()=>qG,IsRef:()=>CG,IsRecursive:()=>eG,IsRecord:()=>TG,IsReadonly:()=>uG,IsProperties:()=>N,IsPromise:()=>BG,IsOptional:()=>tG,IsObject:()=>LG,IsNumber:()=>AG,IsNull:()=>DG,IsNot:()=>MG,IsNever:()=>jG,IsMappedResult:()=>JG,IsMappedKey:()=>QG,IsLiteralValue:()=>WG,IsLiteralString:()=>FG,IsLiteralNumber:()=>UG,IsLiteralBoolean:()=>aG,IsLiteral:()=>E,IsKindOf:()=>$,IsKind:()=>yG,IsIterator:()=>_G,IsIntersect:()=>HG,IsInteger:()=>XG,IsImport:()=>lG,IsFunction:()=>$G,IsDate:()=>VG,IsConstructor:()=>zG,IsComputed:()=>ZG,IsBoolean:()=>YG,IsBigInt:()=>GG,IsAsyncIterator:()=>e,IsArray:()=>a,IsArgument:()=>l,IsAny:()=>t});class i extends c{}var iG=["Argument","Any","Array","AsyncIterator","BigInt","Boolean","Computed","Constructor","Date","Enum","Function","Integer","Intersect","Iterator","Literal","MappedKey","MappedResult","Not","Null","Number","Object","Promise","Record","Ref","RegExp","String","Symbol","TemplateLiteral","This","Tuple","Undefined","Union","Uint8Array","Unknown","Void"];function r(G){try{return new RegExp(G),!0}catch{return!1}}function I(G){if(!j(G))return!1;for(let Y=0;Y<G.length;Y++){let Z=G.charCodeAt(Y);if(Z>=7&&Z<=13||Z===27||Z===127)return!1}return!0}function s(G){return b(G)||J(G)}function R(G){return L(G)||m(G)}function F(G){return L(G)||C(G)}function b(G){return L(G)||x(G)}function _(G){return L(G)||j(G)}function rG(G){return L(G)||j(G)&&I(G)&&r(G)}function sG(G){return L(G)||j(G)&&I(G)}function u(G){return L(G)||J(G)}function uG(G){return D(G)&&G[v]==="Readonly"}function tG(G){return D(G)&&G[n]==="Optional"}function t(G){return $(G,"Any")&&_(G.$id)}function l(G){return $(G,"Argument")&&C(G.index)}function a(G){return $(G,"Array")&&G.type==="array"&&_(G.$id)&&J(G.items)&&F(G.minItems)&&F(G.maxItems)&&b(G.uniqueItems)&&u(G.contains)&&F(G.minContains)&&F(G.maxContains)}function e(G){return $(G,"AsyncIterator")&&G.type==="AsyncIterator"&&_(G.$id)&&J(G.items)}function GG(G){return $(G,"BigInt")&&G.type==="bigint"&&_(G.$id)&&R(G.exclusiveMaximum)&&R(G.exclusiveMinimum)&&R(G.maximum)&&R(G.minimum)&&R(G.multipleOf)}function YG(G){return $(G,"Boolean")&&G.type==="boolean"&&_(G.$id)}function ZG(G){return $(G,"Computed")&&j(G.target)&&q(G.parameters)&&G.parameters.every((Y)=>J(Y))}function zG(G){return $(G,"Constructor")&&G.type==="Constructor"&&_(G.$id)&&q(G.parameters)&&G.parameters.every((Y)=>J(Y))&&J(G.returns)}function VG(G){return $(G,"Date")&&G.type==="Date"&&_(G.$id)&&F(G.exclusiveMaximumTimestamp)&&F(G.exclusiveMinimumTimestamp)&&F(G.maximumTimestamp)&&F(G.minimumTimestamp)&&F(G.multipleOfTimestamp)}function $G(G){return $(G,"Function")&&G.type==="Function"&&_(G.$id)&&q(G.parameters)&&G.parameters.every((Y)=>J(Y))&&J(G.returns)}function lG(G){return $(G,"Import")&&y(G,"$defs")&&D(G.$defs)&&N(G.$defs)&&y(G,"$ref")&&j(G.$ref)&&G.$ref in G.$defs}function XG(G){return $(G,"Integer")&&G.type==="integer"&&_(G.$id)&&F(G.exclusiveMaximum)&&F(G.exclusiveMinimum)&&F(G.maximum)&&F(G.minimum)&&F(G.multipleOf)}function N(G){return D(G)&&Object.entries(G).every(([Y,Z])=>I(Y)&&J(Z))}function HG(G){return $(G,"Intersect")&&(j(G.type)&&G.type!=="object"?!1:!0)&&q(G.allOf)&&G.allOf.every((Y)=>J(Y)&&!KG(Y))&&_(G.type)&&(b(G.unevaluatedProperties)||u(G.unevaluatedProperties))&&_(G.$id)}function _G(G){return $(G,"Iterator")&&G.type==="Iterator"&&_(G.$id)&&J(G.items)}function $(G,Y){return D(G)&&P in G&&G[P]===Y}function FG(G){return E(G)&&j(G.const)}function UG(G){return E(G)&&C(G.const)}function aG(G){return E(G)&&x(G.const)}function E(G){return $(G,"Literal")&&_(G.$id)&&WG(G.const)}function WG(G){return x(G)||C(G)||j(G)}function QG(G){return $(G,"MappedKey")&&q(G.keys)&&G.keys.every((Y)=>C(Y)||j(Y))}function JG(G){return $(G,"MappedResult")&&N(G.properties)}function jG(G){return $(G,"Never")&&D(G.not)&&Object.getOwnPropertyNames(G.not).length===0}function MG(G){return $(G,"Not")&&J(G.not)}function DG(G){return $(G,"Null")&&G.type==="null"&&_(G.$id)}function AG(G){return $(G,"Number")&&G.type==="number"&&_(G.$id)&&F(G.exclusiveMaximum)&&F(G.exclusiveMinimum)&&F(G.maximum)&&F(G.minimum)&&F(G.multipleOf)}function LG(G){return $(G,"Object")&&G.type==="object"&&_(G.$id)&&N(G.properties)&&s(G.additionalProperties)&&F(G.minProperties)&&F(G.maxProperties)}function BG(G){return $(G,"Promise")&&G.type==="Promise"&&_(G.$id)&&J(G.item)}function TG(G){return $(G,"Record")&&G.type==="object"&&_(G.$id)&&s(G.additionalProperties)&&D(G.patternProperties)&&((Y)=>{let Z=Object.getOwnPropertyNames(Y.patternProperties);return Z.length===1&&r(Z[0])&&D(Y.patternProperties)&&J(Y.patternProperties[Z[0]])})(G)}function eG(G){return D(G)&&g in G&&G[g]==="Recursive"}function CG(G){return $(G,"Ref")&&_(G.$id)&&j(G.$ref)}function qG(G){return $(G,"RegExp")&&_(G.$id)&&j(G.source)&&j(G.flags)&&F(G.maxLength)&&F(G.minLength)}function PG(G){return $(G,"String")&&G.type==="string"&&_(G.$id)&&F(G.minLength)&&F(G.maxLength)&&rG(G.pattern)&&sG(G.format)}function kG(G){return $(G,"Symbol")&&G.type==="symbol"&&_(G.$id)}function RG(G){return $(G,"TemplateLiteral")&&G.type==="string"&&j(G.pattern)&&G.pattern[0]==="^"&&G.pattern[G.pattern.length-1]==="$"}function EG(G){return $(G,"This")&&_(G.$id)&&j(G.$ref)}function KG(G){return D(G)&&o in G}function wG(G){return $(G,"Tuple")&&G.type==="array"&&_(G.$id)&&C(G.minItems)&&C(G.maxItems)&&G.minItems===G.maxItems&&(L(G.items)&&L(G.additionalItems)&&G.minItems===0||q(G.items)&&G.items.every((Y)=>J(Y)))}function xG(G){return $(G,"Undefined")&&G.type==="undefined"&&_(G.$id)}function GY(G){return h(G)&&G.anyOf.every((Y)=>FG(Y)||UG(Y))}function h(G){return $(G,"Union")&&_(G.$id)&&D(G)&&q(G.anyOf)&&G.anyOf.every((Y)=>J(Y))}function NG(G){return $(G,"Uint8Array")&&G.type==="Uint8Array"&&_(G.$id)&&F(G.minByteLength)&&F(G.maxByteLength)}function fG(G){return $(G,"Unknown")&&_(G.$id)}function OG(G){return $(G,"Unsafe")}function SG(G){return $(G,"Void")&&G.type==="void"&&_(G.$id)}function yG(G){return D(G)&&P in G&&j(G[P])&&!iG.includes(G[P])}function J(G){return D(G)&&(t(G)||l(G)||a(G)||YG(G)||GG(G)||e(G)||ZG(G)||zG(G)||VG(G)||$G(G)||XG(G)||HG(G)||_G(G)||E(G)||QG(G)||JG(G)||jG(G)||MG(G)||DG(G)||AG(G)||LG(G)||BG(G)||TG(G)||CG(G)||qG(G)||PG(G)||kG(G)||RG(G)||EG(G)||wG(G)||xG(G)||h(G)||NG(G)||fG(G)||OG(G)||SG(G)||yG(G))}import{Elysia as ZY,t as X}from"elysia";var zY=(G)=>X.Object({$eq:G,$neq:G,...!f.IsBoolean(G)?{$lt:G,$lte:G,$gt:G,$gte:G,$in:X.Array(G),$nin:X.Array(G),$between:X.Tuple([G,G]),$nbetween:X.Tuple([G,G]),$like:X.String(),$nlike:X.String()}:{},$isNull:X.Boolean()}),VY=(G)=>{let{properties:Y}=G,Z={};for(let[z,V]of Object.entries(Y)){let H=zY(V);Z[z]=X.Array(X.Union([X.Partial(H),V]))}return Z},$Y=(G)=>X.Array(X.Union([X.Partial(X.Object({selectedFields:X.Union([X.Array(X.KeyOf(G)),X.KeyOf(G)]),value:X.String()})),X.String()])),XY=(G)=>X.Array(X.KeyOf(G)),K=(G)=>X.Composite([X.Object({$q:X.Optional($Y(G)),$selectedFields:X.Optional(XY(G))}),X.Partial(X.Object(VY(G)))]),HY=(G)=>X.Composite([K(G),X.Partial(X.Object({$limit:X.Number(),$offset:X.Number()}))]),gG=(G,Y,Z=[])=>new ZY({name:`advancedSearchPlugin-${G}`,seed:Y}).model({[`advancedSearch${G}Query`]:K(Y),[`advancedSearch${G}QueryWithPagination`]:HY(Y)}).macro({hasAdvancedSearch:{resolve:({query:z})=>{let V=z,H={advancedSearch:[],selectedFields:V.$selectedFields||["*"],pagination:{limit:V.$limit||100,offset:V.$offset||0}};if(z.$q){let M=Array.isArray(z.$q)?z.$q:[z.$q];H.advancedSearch.push(...M.map((W)=>({$q:W})))}V=YY(V,["$selectedFields","$q","$limit","$offset",...Z],!0);for(let[M,W]of Object.entries(V))(Array.isArray(W)?W:[W]).forEach((k,T)=>{if(!H.advancedSearch[T])H.advancedSearch[T]={};H.advancedSearch[T][M]=k});return H}}}).as("scoped");import{SingletonManager as FY}from"@basalt-lab/basalt-helper/util";import{Elysia as p,t as Q}from"elysia";import{SingletonManager as O}from"@basalt-lab/basalt-helper/util";import{Elysia as _Y,t as IG}from"elysia";var hG=(G)=>new _Y({name:"dynamicDatabaseSelectorPlugin"}).model({databaseUsingHeader:IG.Object({[G.headerKey||"database-using"]:IG.String()})}).macro({hasDynamicDatabaseSelector:{async resolve({headers:Y}){let Z=Y[G.headerKey||"database-using"];if(!Z)throw new A({key:B.dynamicDatabaseKeyNotFound,message:"Dynamic Database key not found in the request headers.",httpStatusCode:400});if(!O.has(`database:${Z}`))O.register(`database:${Z}`,bG,{...G.baseDatabaseConfig,databaseName:Z}),await O.get(`database:${Z}`).connect();return{dynamicDB:O.get(`database:${Z}`)}}}}).as("scoped");var UY=(G)=>{let{properties:Y}=G,Z={};for(let z in Y)Z[z]=Q.Union([Y[z],Q.Undefined(),Q.Null(),Q.Literal("")]);return Q.Object({message:Q.String(),content:Q.Array(Q.Partial(Q.Object(Z)))})},WY=(G,Y)=>{let{properties:Z}=G,z={};for(let V in Z)z[V]=Y?.includes(V)?Z[V]:Q.Optional(Z[V]);return Q.Object(z)},QY=(G,Y)=>{let{baseSchema:Z,tableName:z,insertPropertiesSchemaRequired:V}=Y,H=new p().model({[`crud${z}Response200`]:UY(Z)}),M={insert:()=>H.model({[`crud${z}InsertBody`]:WY(Z,V)}),update:()=>H.model({[`crud${z}UpdateBody`]:Q.Partial(Z)}),count:()=>H.model({[`crud${z}CountResponse200`]:Q.Object({message:Q.String(),content:Q.Number()})})};if(G.forEach((U)=>{if(U in M)M[U]?.()}),["findOne","deleteOne","updateOne"].some((U)=>G.includes(U)))H.model({[`crud${z}IdParam`]:Q.Object({id:Q.Union([Q.String(),Q.Number()])})});return H},JY=(G=[],Y=[])=>{let Z=["insert","find","findOne","update","updateOne","delete","deleteOne","count"],z=G.length>0?G:Z;return Y.length>0?z.filter((V)=>!Y.includes(V)):z},jY=(G)=>{let Y=new p;if(typeof G==="string")Y.resolve(()=>({dynamicDB:FY.get(`database:${G}`)}));else Y.use(hG({baseDatabaseConfig:G.baseDatabaseConfig,headerKey:G.headerKey||"database-using"}));return Y.as("scoped")},MY={insertHandler:async(G,Y)=>{let z=G.dynamicDB.getRepository(Y),{body:V}=G,H=await z.insert(V);return{message:`Inserted record for ${Y}`,content:H}},findHandler:async(G,Y)=>{let V=await G.dynamicDB.getRepository(Y).find({advancedSearch:G.advancedSearch,selectedFields:G.selectedFields,limit:G.pagination.limit,offset:G.pagination.offset});return{message:`Found ${V.length} records for ${Y}`,content:V}},findOneHandler:async(G,Y)=>{let Z=G.dynamicDB,z=Z.getRepository(Y),H=Z.getTable(Y).primaryKey,{id:M}=G.params,W=await z.findOne({advancedSearch:{[H[0]]:M}});return{message:`Found record for ${Y}`,content:W}},countHandler:async(G,Y)=>{let V=await G.dynamicDB.getRepository(Y).count({advancedSearch:G.advancedSearch});return{message:`${V} records found for ${Y}`,content:V}},updateHandler:async(G,Y)=>{let z=G.dynamicDB.getRepository(Y);if(!G.advancedSearch||G.advancedSearch.length===0||!G.advancedSearch[0])throw new A({key:B.needAdvancedSearch,message:"You need to provide advanced search to update records. It's dangerous to update all records.",httpStatusCode:400});let V=await z.update(G.body,{advancedSearch:G.advancedSearch,selectedFields:G.selectedField});return{message:`Updated ${V.length} records for ${Y}`,content:V}},updateOneHandler:async(G,Y)=>{let Z=G.dynamicDB,z=Z.getRepository(Y),H=Z.getTable(Y).primaryKey,{id:M}=G.params,W=await z.update(G.body,{advancedSearch:{[H[0]]:M}});return{message:`Updated record for ${Y}`,content:W}},deleteHandler:async(G,Y)=>{let z=G.dynamicDB.getRepository(Y);if(!G.advancedSearch||G.advancedSearch.length===0||!G.advancedSearch[0])throw new A({key:B.needAdvancedSearch,message:"You need to provide advanced search to delete records. It's dangerous to delete all records.",httpStatusCode:400});let V=await z.delete({advancedSearch:G.advancedSearch,selectedFields:G.selectedFields});return{message:`Deleted ${V.length} records for ${Y}`,content:V}},deleteOneHandler:async(G,Y)=>{let Z=G.dynamicDB,z=Z.getRepository(Y),H=Z.getTable(Y).primaryKey,{id:M}=G.params,W=await z.delete({advancedSearch:{[H[0]]:M}});return{message:`Deleted record for ${Y}`,content:W}}},DY=(G,Y,Z,z)=>(V)=>{let H={insert:"post",find:"get",findOne:"get",count:"get",update:"patch",updateOne:"patch",delete:"delete",deleteOne:"delete"},M={insert:"/",find:"/",findOne:"/:id",count:"/count",update:"/",updateOne:"/:id",delete:"/",deleteOne:"/:id"};if(G.includes("find")||G.includes("count")||G.includes("update")||G.includes("delete"))V.use(gG(Y,Z));for(let U of G){let k=H[U],T=M[U];if(k&&T){let w=MY[`${U}Handler`],cG={...U==="findOne"||U==="deleteOne"||U==="updateOne"?{params:`crud${Y}IdParam`}:{},...U==="count"||U==="update"||U==="delete"?{query:K(Z)}:U==="find"?{query:K(Z)}:{},...U==="insert"||U==="update"||U==="updateOne"?{body:`crud${Y}${U==="insert"?"Insert":"Update"}Body`}:{},response:`crud${Y}${U==="count"?"Count":""}Response200`,hasAdvancedSearch:!0,hasDynamicDatabaseSelector:z};V[k](T,(oG)=>w(oG,Y),cG)}}return V},rY=(G)=>{let Y=JY(G.includedRoutes,G.excludedRoutes),Z=new p({name:`crudPlugin[${G.tableName}]`,tags:[G.tableName]}).use(QY(Y,G)).use(G.permissionConfig.permissionsPlugin);return Z.use(jY(G.database)).use(DY(Y,G.tableName,G.baseSchema,typeof G.database!=="string")),Z};import{BasaltError as AY}from"@basalt-lab/basalt-helper/error";import{BasaltError as LY}from"@basalt-lab/basalt-logger/error";import{Elysia as BY}from"elysia";var eY=new BY({name:"errorPlugin"}).error({CoreError:A,BasaltHelperError:AY,BasaltLoggerError:LY}).onError(({code:G,error:Y,set:Z})=>{switch(Z.headers["content-type"]="application/json; charset=utf-8",G){case"CoreError":case"BasaltHelperError":case"BasaltLoggerError":return Z.status=Y.httpStatusCode,{key:Y.key,message:Y.message,cause:Y.cause};case"VALIDATION":return Z.status=400,{key:"core.error.validation",message:"Validation error",cause:{on:Y.type,found:Y.value,errors:Y.all}};case"NOT_FOUND":return Z.status=404,{key:"core.error.not_found",message:"Not found"};case"INTERNAL_SERVER_ERROR":case"UNKNOWN":default:return Z.status=500,{key:"core.error.internal_server_error",message:"Internal server error"}}}).as("global");import{Elysia as TY}from"elysia";import{SignJWT as CY,jwtVerify as qY}from"jose";var $Z=(G)=>{if(!G.secret)throw new A({key:B.jwtSecretNotFound,message:"Secret key is required for JWT signing and verification."});let Y=new TextEncoder().encode(G.secret),Z=G.name??"jwt";return new TY({name:"jwtPlugin",seed:G}).decorate(Z,{sign(z,V=G.exp??"15m"){let H={iss:"core",aud:"core client",jti:Bun.randomUUIDv7(),...G.payload,...z};try{return new CY(H).setProtectedHeader({alg:"HS256",b64:!0}).setIssuer(H.iss??"core").setAudience(H.aud??"client").setExpirationTime(V).sign(Y)}catch{throw new A({key:B.jwtSignError,message:"Error signing JWT."})}},async verify(z){if(!z)return!1;try{return(await qY(z,Y)).payload}catch{return!1}}}).as("scoped")};import{Elysia as PY}from"elysia";import{existsSync as kY}from"fs";import{platform as RY}from"os";var mG=(G)=>{let Y=RY()==="win32",Z=Y?"\\":"/";if(Y&&/^[A-Z]:\\$/i.test(G)||!Y&&G==="/")return"";let z=G+Z+"package.json";if(kY(z))return z;let V=G.split(Z);if(V.length<=1)return"";let H=V.slice(0,-1).join(Z);if(H==="")return"";return mG(H)},S=await import(mG(Bun.main)),QZ=new PY({name:"microservicePlugin",prefix:"/microservice",detail:{tags:["Microservice"],security:[]}}).model({infoResponse200:pG,pingResponse200:dG}).get("/ping",()=>({message:"pong"}),{detail:{summary:"Ping",description:"Ping the microservice to check if it is alive"},response:"pingResponse200"}).get("/info",()=>({message:"Microservice Information",content:{name:S.default.name,version:S.default.version,description:S.default.description,author:S.default.author}}),{detail:{summary:"Info",description:"Get information about the microservice"},response:"infoResponse200"}).as("scoped");import{Elysia as EY}from"elysia";var LZ=({redis:G,limit:Y,window:Z,message:z})=>new EY({name:"rateLimitPlugin",seed:{redis:G,limit:Y,window:Z,message:z}}).onRequest(async({set:V,request:H})=>{let W=`ratelimit:${H.headers.get("x-forwarded-for")||H.headers.get("x-real-ip")||"127.0.0.1"}`,U=await G.client.get(W);if((U?parseInt(U):0)===0)await G.client.setex(W,Z,"1");else await G.client.incr(W);let T=await G.client.get(W),w=T?parseInt(T):0;if(w>Y)throw V.status=d.tooManyRequests,new A({key:B.rateLimitExceeded,message:z||"Rate limit exceeded",httpStatusCode:d.tooManyRequests,cause:{limit:Y,window:Z,remaining:0,reset:await G.client.ttl(W)}});V.headers={"X-RateLimit-Limit":Y.toString(),"X-RateLimit-Remaining":Math.max(0,Y-w).toString(),"X-RateLimit-Reset":(await G.client.ttl(W)).toString()}}).as("scoped");export{LZ as rateLimitPlugin,QZ as microservicePlugin,$Z as jwtPlugin,eY as errorPlugin,hG as dynamicDatabaseSelectorPlugin,rY as crudPlugin,UY as createResponse200Schema,WY as createInsertBodySchema,HY as createBaseSearchSchemaWithPagination,K as createBaseSearchSchema,gG as advancedSearchPlugin};export{K as f,HY as g,gG as h,hG as i,UY as j,WY as k,rY as l,eY as m,$Z as n,QZ as o,LZ as p};
|