crud-query-parser 0.1.0 → 1.0.0

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.
Files changed (64) hide show
  1. package/README.md +138 -35
  2. package/dist/adapters/array/index.d.mts +90 -0
  3. package/dist/adapters/array/index.d.ts +90 -0
  4. package/dist/adapters/array/index.js +2 -0
  5. package/dist/adapters/array/index.js.map +1 -0
  6. package/dist/adapters/array/index.mjs +2 -0
  7. package/dist/adapters/array/index.mjs.map +1 -0
  8. package/dist/adapters/dynamodb/index.d.mts +239 -0
  9. package/dist/adapters/dynamodb/index.d.ts +239 -0
  10. package/dist/adapters/dynamodb/index.js +2 -0
  11. package/dist/adapters/dynamodb/index.js.map +1 -0
  12. package/dist/adapters/dynamodb/index.mjs +2 -0
  13. package/dist/adapters/dynamodb/index.mjs.map +1 -0
  14. package/dist/adapters/mongodb/index.d.mts +163 -0
  15. package/dist/adapters/mongodb/index.d.ts +163 -0
  16. package/dist/adapters/mongodb/index.js +2 -0
  17. package/dist/adapters/mongodb/index.js.map +1 -0
  18. package/dist/adapters/mongodb/index.mjs +2 -0
  19. package/dist/adapters/mongodb/index.mjs.map +1 -0
  20. package/dist/adapters/typeorm/index.d.mts +4 -4
  21. package/dist/adapters/typeorm/index.d.ts +4 -4
  22. package/dist/adapters/typeorm/index.js +1 -1
  23. package/dist/adapters/typeorm/index.js.map +1 -1
  24. package/dist/adapters/typeorm/index.mjs +1 -1
  25. package/dist/adapters/typeorm/index.mjs.map +1 -1
  26. package/dist/{crud-request-x16CuDRF.d.mts → crud-request-DLo0ZuzD.d.mts} +41 -1
  27. package/dist/{crud-request-x16CuDRF.d.ts → crud-request-DLo0ZuzD.d.ts} +41 -1
  28. package/dist/{crud-request-where.builder-BwWLx0Bh.d.mts → crud-request-where.builder-CBx-JZhl.d.mts} +1 -1
  29. package/dist/{crud-request-where.builder-B5241Aht.d.ts → crud-request-where.builder-CqbP5LT9.d.ts} +1 -1
  30. package/dist/filters/index.d.mts +1 -1
  31. package/dist/filters/index.d.ts +1 -1
  32. package/dist/filters/index.js +1 -1
  33. package/dist/filters/index.js.map +1 -1
  34. package/dist/filters/index.mjs +1 -1
  35. package/dist/filters/index.mjs.map +1 -1
  36. package/dist/helpers/express/index.d.mts +30 -0
  37. package/dist/helpers/express/index.d.ts +30 -0
  38. package/dist/helpers/express/index.js +2 -0
  39. package/dist/helpers/express/index.js.map +1 -0
  40. package/dist/helpers/express/index.mjs +2 -0
  41. package/dist/helpers/express/index.mjs.map +1 -0
  42. package/dist/helpers/nestjs/index.d.mts +4 -3
  43. package/dist/helpers/nestjs/index.d.ts +4 -3
  44. package/dist/helpers/nestjs/index.js +1 -1
  45. package/dist/helpers/nestjs/index.js.map +1 -1
  46. package/dist/helpers/nestjs/index.mjs +1 -1
  47. package/dist/helpers/nestjs/index.mjs.map +1 -1
  48. package/dist/index.d.mts +12 -4
  49. package/dist/index.d.ts +12 -4
  50. package/dist/index.js +1 -1
  51. package/dist/index.js.map +1 -1
  52. package/dist/index.mjs +1 -1
  53. package/dist/index.mjs.map +1 -1
  54. package/dist/parsers/crud/index.d.mts +44 -5
  55. package/dist/parsers/crud/index.d.ts +44 -5
  56. package/dist/parsers/crud/index.js +1 -1
  57. package/dist/parsers/crud/index.js.map +1 -1
  58. package/dist/parsers/crud/index.mjs +1 -1
  59. package/dist/parsers/crud/index.mjs.map +1 -1
  60. package/dist/{query-adapter-CEcyFcWr.d.ts → query-adapter-CZhPC1aq.d.ts} +3 -3
  61. package/dist/{query-adapter-CeTK3yxp.d.mts → query-adapter-sgeUb8CV.d.mts} +3 -3
  62. package/dist/{request-parser-BxVulcsX.d.ts → request-parser-Cr3cxMRw.d.ts} +4 -4
  63. package/dist/{request-parser-BMkszvGr.d.mts → request-parser-DzuXbRsB.d.mts} +4 -4
  64. package/package.json +83 -5
@@ -1,2 +1,2 @@
1
- "use strict";var l=Object.defineProperty;var c=Object.getOwnPropertyDescriptor;var _=Object.getOwnPropertyNames;var N=Object.prototype.hasOwnProperty;var o=(n,e)=>l(n,"name",{value:e,configurable:!0});var R=(n,e)=>{for(var i in e)l(n,i,{get:e[i],enumerable:!0})},T=(n,e,i,t)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of _(e))!N.call(n,r)&&r!==i&&l(n,r,{get:()=>e[r],enumerable:!(t=c(e,r))||t.enumerable});return n};var E=n=>T(l({},"__esModule",{value:!0}),n);var L={};R(L,{ensureCondition:()=>d,ensureEqCondition:()=>m,ensureLimit:()=>a,filterProperties:()=>x,filterRelations:()=>C});module.exports=E(L);function d(n,e){return n.where.and?{...n,where:{and:[...n.where.and,e]}}:{...n,where:{and:[e,n.where]}}}o(d,"ensureCondition");function m(n,e,i=[]){for(let t of Object.keys(e)){if(typeof e[t]=="object"&&!Array.isArray(e[t])){n=m(n,e[t],[...i,t]);continue}n=d(n,{field:[...i,t],operator:"eq",value:e[t]})}return n}o(m,"ensureEqCondition");function a(n,e,i){return{...n,limit:Math.min(Math.max(n.limit??e,1),i)}}o(a,"ensureLimit");function x(n,e){let i=n.select;i.length===0?i=e.map(f=>({field:f.split(".")})):i=n.select.filter(f=>e.includes(f.field.join(".")));let t=u(n.where,e),r=n.order.filter(f=>e.includes(f.field.join("."))),s=n.relations.filter(f=>e.includes(f.field.join(".")));return{...n,select:i,where:t,order:r,relations:s}}o(x,"filterProperties");function u(n,e){return n.or?{or:n.or.map(i=>u(i,e))}:n.and?{and:n.and.map(i=>u(i,e))}:n.field&&!e.includes(n.field.join("."))?{and:[]}:n}o(u,"filterPropertyAccessWhere");function C(n,e){let i=n.relations.filter(t=>e.includes(t.field.join(".")));return{...n,relations:i}}o(C,"filterRelations");0&&(module.exports={ensureCondition,ensureEqCondition,ensureLimit,filterProperties,filterRelations});
1
+ "use strict";var l=Object.defineProperty;var c=Object.getOwnPropertyDescriptor;var _=Object.getOwnPropertyNames;var N=Object.prototype.hasOwnProperty;var o=(n,e)=>l(n,"name",{value:e,configurable:!0});var R=(n,e)=>{for(var i in e)l(n,i,{get:e[i],enumerable:!0})},T=(n,e,i,t)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of _(e))!N.call(n,r)&&r!==i&&l(n,r,{get:()=>e[r],enumerable:!(t=c(e,r))||t.enumerable});return n};var E=n=>T(l({},"__esModule",{value:!0}),n);var L={};R(L,{ensureCondition:()=>d,ensureEqCondition:()=>m,ensureLimit:()=>a,filterProperties:()=>x,filterRelations:()=>C});module.exports=E(L);function d(n,e){return n.where.and?{...n,where:{and:[e,...n.where.and]}}:{...n,where:{and:[e,n.where]}}}o(d,"ensureCondition");function m(n,e,i=[]){for(let t of Object.keys(e)){if(typeof e[t]=="object"&&!Array.isArray(e[t])){n=m(n,e[t],[...i,t]);continue}n=d(n,{field:[...i,t],operator:"eq",value:e[t]})}return n}o(m,"ensureEqCondition");function a(n,e,i){return{...n,limit:Math.min(Math.max(n.limit??e,1),i)}}o(a,"ensureLimit");function x(n,e){let i=n.select;i.length===0?i=e.map(f=>({field:f.split(".")})):i=n.select.filter(f=>e.includes(f.field.join(".")));let t=u(n.where,e)??{and:[]},r=n.order.filter(f=>e.includes(f.field.join("."))),s=n.relations.filter(f=>e.includes(f.field.join(".")));return{...n,select:i,where:t,order:r,relations:s}}o(x,"filterProperties");function u(n,e){if(n.or)return{or:n.or.map(i=>u(i,e)).filter(i=>!!i)};if(n.and)return{and:n.and.map(i=>u(i,e)).filter(i=>!!i)};if(!(n.field&&!e.includes(n.field.join("."))))return n}o(u,"filterPropertyAccessWhere");function C(n,e){let i=n.relations.filter(t=>e.includes(t.field.join(".")));return{...n,relations:i}}o(C,"filterRelations");0&&(module.exports={ensureCondition,ensureEqCondition,ensureLimit,filterProperties,filterRelations});
2
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/filters/index.ts","../../src/filters/conditions/ensureCondition.ts","../../src/filters/conditions/ensureEqCondition.ts","../../src/filters/limit/ensureLimit.ts","../../src/filters/property/filterProperties.ts","../../src/filters/property/filterRelations.ts"],"sourcesContent":["\r\nexport * from './conditions/ensureCondition';\r\nexport * from './conditions/ensureEqCondition';\r\nexport * from './limit/ensureLimit';\r\nexport * from './property/filterProperties';\r\nexport * from './property/filterRelations';\r\n","import { CrudRequest } from '../../models/crud-request';\r\nimport { CrudRequestWhere } from '../../models/crud-request-where';\r\n\r\n/**\r\n * Ensures a condition is always applied to the query\r\n *\r\n * @param request The parsed request\r\n * @param condition The condition that needs to be applied\r\n */\r\nexport function ensureCondition(request: CrudRequest, condition: CrudRequestWhere): CrudRequest {\r\n // If there is already an \"AND\" condition, we'll just append to that\r\n if (request.where.and) {\r\n return {\r\n ...request,\r\n where: {\r\n and: [\r\n ...request.where.and,\r\n condition,\r\n ]\r\n }\r\n }\r\n }\r\n\r\n return {\r\n ...request,\r\n where: {\r\n and: [\r\n condition,\r\n request.where,\r\n ],\r\n },\r\n };\r\n}\r\n","import { CrudRequest } from '../../models/crud-request';\r\nimport { ensureCondition } from './ensureCondition';\r\nimport { CrudRequestWhereOperator } from '../../models/crud-request-where';\r\n\r\n/**\r\n * Ensures a condition is always applied to the query\r\n *\r\n * @param request The parsed request\r\n * @param entity The property that need to be applied\r\n * @param basePath The field path prefix\r\n */\r\nexport function ensureEqCondition<T extends Record<string, any>>(request: CrudRequest, entity: Partial<T>, basePath: string[] = []): CrudRequest {\r\n for (const key of Object.keys(entity)) {\r\n if (typeof entity[key] === 'object' && !Array.isArray(entity[key])) {\r\n request = ensureEqCondition(request, entity[key], [...basePath, key]);\r\n continue;\r\n }\r\n\r\n request = ensureCondition(request, {\r\n field: [...basePath, key],\r\n operator: CrudRequestWhereOperator.EQ,\r\n value: entity[key],\r\n });\r\n }\r\n\r\n return request;\r\n}\r\n","import { CrudRequest } from '../../models/crud-request';\r\n\r\n/**\r\n * Ensures that the limit will be set following a maximum rule\r\n *\r\n * @param request The parsed request\r\n * @param defaultLimit The default limit number\r\n * @param maxLimit The maximum allowed limit number\r\n */\r\nexport function ensureLimit(request: CrudRequest, defaultLimit: number, maxLimit: number): CrudRequest {\r\n return {\r\n ...request,\r\n limit: Math.min(Math.max(request.limit ?? defaultLimit, 1), maxLimit),\r\n };\r\n}\r\n","import { CrudRequest } from '../../models/crud-request';\r\nimport { CrudRequestWhere } from '../../models/crud-request-where';\r\n\r\n/**\r\n * Filters access to an allowlist of properties and relations.\r\n * No selecting, filtering, sorting and joining can be done on a property that is not listed.\r\n *\r\n * @param request The parsed request\r\n * @param allowedProperties The list of properties (in case of a field path, separated by dot) that will be allowed\r\n */\r\nexport function filterProperties(\r\n request: CrudRequest,\r\n allowedProperties: string[],\r\n): CrudRequest {\r\n let select = request.select;\r\n\r\n if (select.length === 0) {\r\n select = allowedProperties.map(prop => ({ field: prop.split('.') }));\r\n } else {\r\n select = request.select.filter(item => allowedProperties.includes(item.field.join('.')));\r\n }\r\n\r\n const where = filterPropertyAccessWhere(request.where, allowedProperties);\r\n\r\n const order = request.order.filter(item => allowedProperties.includes(item.field.join('.')));\r\n\r\n // TODO allow relations by the first part of field paths\r\n const relations = request.relations.filter(item => allowedProperties.includes(item.field.join('.')));\r\n\r\n return {\r\n ...request,\r\n select,\r\n where,\r\n order,\r\n relations,\r\n };\r\n}\r\n\r\nfunction filterPropertyAccessWhere(\r\n where: CrudRequestWhere,\r\n allowedProperties: string[],\r\n): CrudRequestWhere {\r\n if (where.or) {\r\n return {\r\n or: where.or.map(w => filterPropertyAccessWhere(w, allowedProperties)),\r\n };\r\n }\r\n\r\n if (where.and) {\r\n return {\r\n and: where.and.map(w => filterPropertyAccessWhere(w, allowedProperties)),\r\n };\r\n }\r\n\r\n if (where.field) {\r\n // We'll return an empty AND where if the field is not allowed\r\n if (!allowedProperties.includes(where.field.join('.')))\r\n return { and: [] };\r\n }\r\n\r\n return where;\r\n}\r\n\r\n","import { CrudRequest } from '../../models/crud-request';\r\n\r\n/**\r\n * Filters access to an allowlist of relations.\r\n *\r\n * @param request The parsed request\r\n * @param allowedRelations The list of relations (in case of a field path, separated by dot) that will be allowed\r\n */\r\nexport function filterRelations(\r\n request: CrudRequest,\r\n allowedRelations: string[],\r\n): CrudRequest {\r\n const relations = request.relations.filter(item => allowedRelations.includes(item.field.join('.')));\r\n\r\n return {\r\n ...request,\r\n relations,\r\n };\r\n}\r\n"],"mappings":"4dAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,qBAAAE,EAAA,sBAAAC,EAAA,gBAAAC,EAAA,qBAAAC,EAAA,oBAAAC,IAAA,eAAAC,EAAAP,GCSO,SAASQ,EAAgBC,EAAsBC,EAA0C,CAE9F,OAAID,EAAQ,MAAM,IACT,CACL,GAAGA,EACH,MAAO,CACL,IAAK,CACH,GAAGA,EAAQ,MAAM,IACjBC,CACF,CACF,CACF,EAGK,CACL,GAAGD,EACH,MAAO,CACL,IAAK,CACHC,EACAD,EAAQ,KACV,CACF,CACF,CACF,CAvBgBE,EAAAH,EAAA,mBCET,SAASI,EAAiDC,EAAsBC,EAAoBC,EAAqB,CAAC,EAAgB,CAC/I,QAAWC,KAAO,OAAO,KAAKF,CAAM,EAAG,CACrC,GAAI,OAAOA,EAAOE,CAAG,GAAM,UAAY,CAAC,MAAM,QAAQF,EAAOE,CAAG,CAAC,EAAG,CAClEH,EAAUD,EAAkBC,EAASC,EAAOE,CAAG,EAAG,CAAC,GAAGD,EAAUC,CAAG,CAAC,EACpE,QACF,CAEAH,EAAUI,EAAgBJ,EAAS,CACjC,MAAO,CAAC,GAAGE,EAAUC,CAAG,EACxB,cACA,MAAOF,EAAOE,CAAG,CACnB,CAAC,CACH,CAEA,OAAOH,CACT,CAfgBK,EAAAN,EAAA,qBCFT,SAASO,EAAYC,EAAsBC,EAAsBC,EAA+B,CACrG,MAAO,CACL,GAAGF,EACH,MAAO,KAAK,IAAI,KAAK,IAAIA,EAAQ,OAASC,EAAc,CAAC,EAAGC,CAAQ,CACtE,CACF,CALgBC,EAAAJ,EAAA,eCCT,SAASK,EACdC,EACAC,EACa,CACb,IAAIC,EAASF,EAAQ,OAEjBE,EAAO,SAAW,EACpBA,EAASD,EAAkB,IAAIE,IAAS,CAAE,MAAOA,EAAK,MAAM,GAAG,CAAE,EAAE,EAEnED,EAASF,EAAQ,OAAO,OAAOI,GAAQH,EAAkB,SAASG,EAAK,MAAM,KAAK,GAAG,CAAC,CAAC,EAGzF,IAAMC,EAAQC,EAA0BN,EAAQ,MAAOC,CAAiB,EAElEM,EAAQP,EAAQ,MAAM,OAAOI,GAAQH,EAAkB,SAASG,EAAK,MAAM,KAAK,GAAG,CAAC,CAAC,EAGrFI,EAAYR,EAAQ,UAAU,OAAOI,GAAQH,EAAkB,SAASG,EAAK,MAAM,KAAK,GAAG,CAAC,CAAC,EAEnG,MAAO,CACL,GAAGJ,EACH,OAAAE,EACA,MAAAG,EACA,MAAAE,EACA,UAAAC,CACF,CACF,CA1BgBC,EAAAV,EAAA,oBA4BhB,SAASO,EACPD,EACAJ,EACkB,CAClB,OAAII,EAAM,GACD,CACL,GAAIA,EAAM,GAAG,IAAIK,GAAKJ,EAA0BI,EAAGT,CAAiB,CAAC,CACvE,EAGEI,EAAM,IACD,CACL,IAAKA,EAAM,IAAI,IAAIK,GAAKJ,EAA0BI,EAAGT,CAAiB,CAAC,CACzE,EAGEI,EAAM,OAEJ,CAACJ,EAAkB,SAASI,EAAM,MAAM,KAAK,GAAG,CAAC,EAC5C,CAAE,IAAK,CAAC,CAAE,EAGdA,CACT,CAvBSI,EAAAH,EAAA,6BC9BF,SAASK,EACdC,EACAC,EACa,CACb,IAAMC,EAAYF,EAAQ,UAAU,OAAOG,GAAQF,EAAiB,SAASE,EAAK,MAAM,KAAK,GAAG,CAAC,CAAC,EAElG,MAAO,CACL,GAAGH,EACH,UAAAE,CACF,CACF,CAVgBE,EAAAL,EAAA","names":["filters_exports","__export","ensureCondition","ensureEqCondition","ensureLimit","filterProperties","filterRelations","__toCommonJS","ensureCondition","request","condition","__name","ensureEqCondition","request","entity","basePath","key","ensureCondition","__name","ensureLimit","request","defaultLimit","maxLimit","__name","filterProperties","request","allowedProperties","select","prop","item","where","filterPropertyAccessWhere","order","relations","__name","w","filterRelations","request","allowedRelations","relations","item","__name"]}
1
+ {"version":3,"sources":["../../src/filters/index.ts","../../src/filters/conditions/ensureCondition.ts","../../src/filters/conditions/ensureEqCondition.ts","../../src/filters/limit/ensureLimit.ts","../../src/filters/property/filterProperties.ts","../../src/filters/property/filterRelations.ts"],"sourcesContent":["\r\nexport * from './conditions/ensureCondition';\r\nexport * from './conditions/ensureEqCondition';\r\nexport * from './limit/ensureLimit';\r\nexport * from './property/filterProperties';\r\nexport * from './property/filterRelations';\r\n","import { CrudRequest } from '../../models/crud-request';\r\nimport { CrudRequestWhere } from '../../models/crud-request-where';\r\n\r\n/**\r\n * Ensures a condition is always applied to the query\r\n *\r\n * @param request The parsed request\r\n * @param condition The condition that needs to be applied\r\n */\r\nexport function ensureCondition(request: CrudRequest, condition: CrudRequestWhere): CrudRequest {\r\n // If there is already an \"AND\" condition, we'll just append to that\r\n if (request.where.and) {\r\n return {\r\n ...request,\r\n where: {\r\n and: [\r\n condition,\r\n ...request.where.and,\r\n ]\r\n }\r\n }\r\n }\r\n\r\n return {\r\n ...request,\r\n where: {\r\n and: [\r\n condition,\r\n request.where,\r\n ],\r\n },\r\n };\r\n}\r\n","import { CrudRequest } from '../../models/crud-request';\r\nimport { ensureCondition } from './ensureCondition';\r\nimport { CrudRequestWhereOperator } from '../../models/crud-request-where';\r\n\r\n/**\r\n * Ensures a condition is always applied to the query\r\n *\r\n * @param request The parsed request\r\n * @param entity The property that need to be applied\r\n * @param basePath The field path prefix\r\n */\r\nexport function ensureEqCondition<T extends Record<string, any>>(request: CrudRequest, entity: Partial<T>, basePath: string[] = []): CrudRequest {\r\n for (const key of Object.keys(entity)) {\r\n if (typeof entity[key] === 'object' && !Array.isArray(entity[key])) {\r\n request = ensureEqCondition(request, entity[key], [...basePath, key]);\r\n continue;\r\n }\r\n\r\n request = ensureCondition(request, {\r\n field: [...basePath, key],\r\n operator: CrudRequestWhereOperator.EQ,\r\n value: entity[key],\r\n });\r\n }\r\n\r\n return request;\r\n}\r\n","import { CrudRequest } from '../../models/crud-request';\r\n\r\n/**\r\n * Ensures that the limit will be set following a maximum rule\r\n *\r\n * @param request The parsed request\r\n * @param defaultLimit The default limit number\r\n * @param maxLimit The maximum allowed limit number\r\n */\r\nexport function ensureLimit(request: CrudRequest, defaultLimit: number, maxLimit: number): CrudRequest {\r\n return {\r\n ...request,\r\n limit: Math.min(Math.max(request.limit ?? defaultLimit, 1), maxLimit),\r\n };\r\n}\r\n","import { CrudRequest } from '../../models/crud-request';\r\nimport { CrudRequestWhere } from '../../models/crud-request-where';\r\n\r\n/**\r\n * Filters access to an allowlist of properties and relations.\r\n * No selecting, filtering, sorting and joining can be done on a property that is not listed.\r\n *\r\n * @param request The parsed request\r\n * @param allowedProperties The list of properties (in case of a field path, separated by dot) that will be allowed\r\n */\r\nexport function filterProperties(\r\n request: CrudRequest,\r\n allowedProperties: string[],\r\n): CrudRequest {\r\n let select = request.select;\r\n\r\n if (select.length === 0) {\r\n select = allowedProperties.map(prop => ({ field: prop.split('.') }));\r\n } else {\r\n select = request.select.filter(item => allowedProperties.includes(item.field.join('.')));\r\n }\r\n\r\n const where = filterPropertyAccessWhere(request.where, allowedProperties) ?? { and: [] };\r\n\r\n const order = request.order.filter(item => allowedProperties.includes(item.field.join('.')));\r\n\r\n // TODO allow relations by the first part of field paths\r\n const relations = request.relations.filter(item => allowedProperties.includes(item.field.join('.')));\r\n\r\n return {\r\n ...request,\r\n select,\r\n where,\r\n order,\r\n relations,\r\n };\r\n}\r\n\r\nfunction filterPropertyAccessWhere(\r\n where: CrudRequestWhere,\r\n allowedProperties: string[],\r\n): CrudRequestWhere | undefined {\r\n if (where.or) {\r\n return {\r\n or: where.or\r\n .map(w => filterPropertyAccessWhere(w, allowedProperties))\r\n .filter(w => !!w),\r\n };\r\n }\r\n\r\n if (where.and) {\r\n return {\r\n and: where.and\r\n .map(w => filterPropertyAccessWhere(w, allowedProperties))\r\n .filter(w => !!w),\r\n };\r\n }\r\n\r\n if (where.field) {\r\n if (!allowedProperties.includes(where.field.join('.')))\r\n return undefined;\r\n }\r\n\r\n return where;\r\n}\r\n\r\n","import { CrudRequest } from '../../models/crud-request';\r\n\r\n/**\r\n * Filters access to an allowlist of relations.\r\n *\r\n * @param request The parsed request\r\n * @param allowedRelations The list of relations (in case of a field path, separated by dot) that will be allowed\r\n */\r\nexport function filterRelations(\r\n request: CrudRequest,\r\n allowedRelations: string[],\r\n): CrudRequest {\r\n const relations = request.relations.filter(item => allowedRelations.includes(item.field.join('.')));\r\n\r\n return {\r\n ...request,\r\n relations,\r\n };\r\n}\r\n"],"mappings":"4dAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,qBAAAE,EAAA,sBAAAC,EAAA,gBAAAC,EAAA,qBAAAC,EAAA,oBAAAC,IAAA,eAAAC,EAAAP,GCSO,SAASQ,EAAgBC,EAAsBC,EAA0C,CAE9F,OAAID,EAAQ,MAAM,IACT,CACL,GAAGA,EACH,MAAO,CACL,IAAK,CACHC,EACA,GAAGD,EAAQ,MAAM,GACnB,CACF,CACF,EAGK,CACL,GAAGA,EACH,MAAO,CACL,IAAK,CACHC,EACAD,EAAQ,KACV,CACF,CACF,CACF,CAvBgBE,EAAAH,EAAA,mBCET,SAASI,EAAiDC,EAAsBC,EAAoBC,EAAqB,CAAC,EAAgB,CAC/I,QAAWC,KAAO,OAAO,KAAKF,CAAM,EAAG,CACrC,GAAI,OAAOA,EAAOE,CAAG,GAAM,UAAY,CAAC,MAAM,QAAQF,EAAOE,CAAG,CAAC,EAAG,CAClEH,EAAUD,EAAkBC,EAASC,EAAOE,CAAG,EAAG,CAAC,GAAGD,EAAUC,CAAG,CAAC,EACpE,QACF,CAEAH,EAAUI,EAAgBJ,EAAS,CACjC,MAAO,CAAC,GAAGE,EAAUC,CAAG,EACxB,cACA,MAAOF,EAAOE,CAAG,CACnB,CAAC,CACH,CAEA,OAAOH,CACT,CAfgBK,EAAAN,EAAA,qBCFT,SAASO,EAAYC,EAAsBC,EAAsBC,EAA+B,CACrG,MAAO,CACL,GAAGF,EACH,MAAO,KAAK,IAAI,KAAK,IAAIA,EAAQ,OAASC,EAAc,CAAC,EAAGC,CAAQ,CACtE,CACF,CALgBC,EAAAJ,EAAA,eCCT,SAASK,EACdC,EACAC,EACa,CACb,IAAIC,EAASF,EAAQ,OAEjBE,EAAO,SAAW,EACpBA,EAASD,EAAkB,IAAIE,IAAS,CAAE,MAAOA,EAAK,MAAM,GAAG,CAAE,EAAE,EAEnED,EAASF,EAAQ,OAAO,OAAOI,GAAQH,EAAkB,SAASG,EAAK,MAAM,KAAK,GAAG,CAAC,CAAC,EAGzF,IAAMC,EAAQC,EAA0BN,EAAQ,MAAOC,CAAiB,GAAK,CAAE,IAAK,CAAC,CAAE,EAEjFM,EAAQP,EAAQ,MAAM,OAAOI,GAAQH,EAAkB,SAASG,EAAK,MAAM,KAAK,GAAG,CAAC,CAAC,EAGrFI,EAAYR,EAAQ,UAAU,OAAOI,GAAQH,EAAkB,SAASG,EAAK,MAAM,KAAK,GAAG,CAAC,CAAC,EAEnG,MAAO,CACL,GAAGJ,EACH,OAAAE,EACA,MAAAG,EACA,MAAAE,EACA,UAAAC,CACF,CACF,CA1BgBC,EAAAV,EAAA,oBA4BhB,SAASO,EACPD,EACAJ,EAC8B,CAC9B,GAAII,EAAM,GACR,MAAO,CACL,GAAIA,EAAM,GACP,IAAIK,GAAKJ,EAA0BI,EAAGT,CAAiB,CAAC,EACxD,OAAOS,GAAK,CAAC,CAACA,CAAC,CACpB,EAGF,GAAIL,EAAM,IACR,MAAO,CACL,IAAKA,EAAM,IACR,IAAIK,GAAKJ,EAA0BI,EAAGT,CAAiB,CAAC,EACxD,OAAOS,GAAK,CAAC,CAACA,CAAC,CACpB,EAGF,GAAI,EAAAL,EAAM,OACJ,CAACJ,EAAkB,SAASI,EAAM,MAAM,KAAK,GAAG,CAAC,GAIvD,OAAOA,CACT,CA1BSI,EAAAH,EAAA,6BC9BF,SAASK,EACdC,EACAC,EACa,CACb,IAAMC,EAAYF,EAAQ,UAAU,OAAOG,GAAQF,EAAiB,SAASE,EAAK,MAAM,KAAK,GAAG,CAAC,CAAC,EAElG,MAAO,CACL,GAAGH,EACH,UAAAE,CACF,CACF,CAVgBE,EAAAL,EAAA","names":["filters_exports","__export","ensureCondition","ensureEqCondition","ensureLimit","filterProperties","filterRelations","__toCommonJS","ensureCondition","request","condition","__name","ensureEqCondition","request","entity","basePath","key","ensureCondition","__name","ensureLimit","request","defaultLimit","maxLimit","__name","filterProperties","request","allowedProperties","select","prop","item","where","filterPropertyAccessWhere","order","relations","__name","w","filterRelations","request","allowedRelations","relations","item","__name"]}
@@ -1,2 +1,2 @@
1
- var m=Object.defineProperty;var t=(n,e)=>m(n,"name",{value:e,configurable:!0});function l(n,e){return n.where.and?{...n,where:{and:[...n.where.and,e]}}:{...n,where:{and:[e,n.where]}}}t(l,"ensureCondition");function s(n,e,i=[]){for(let o of Object.keys(e)){if(typeof e[o]=="object"&&!Array.isArray(e[o])){n=s(n,e[o],[...i,o]);continue}n=l(n,{field:[...i,o],operator:"eq",value:e[o]})}return n}t(s,"ensureEqCondition");function L(n,e,i){return{...n,limit:Math.min(Math.max(n.limit??e,1),i)}}t(L,"ensureLimit");function S(n,e){let i=n.select;i.length===0?i=e.map(r=>({field:r.split(".")})):i=n.select.filter(r=>e.includes(r.field.join(".")));let o=f(n.where,e),d=n.order.filter(r=>e.includes(r.field.join("."))),u=n.relations.filter(r=>e.includes(r.field.join(".")));return{...n,select:i,where:o,order:d,relations:u}}t(S,"filterProperties");function f(n,e){return n.or?{or:n.or.map(i=>f(i,e))}:n.and?{and:n.and.map(i=>f(i,e))}:n.field&&!e.includes(n.field.join("."))?{and:[]}:n}t(f,"filterPropertyAccessWhere");function v(n,e){let i=n.relations.filter(o=>e.includes(o.field.join(".")));return{...n,relations:i}}t(v,"filterRelations");export{l as ensureCondition,s as ensureEqCondition,L as ensureLimit,S as filterProperties,v as filterRelations};
1
+ var m=Object.defineProperty;var t=(n,e)=>m(n,"name",{value:e,configurable:!0});function l(n,e){return n.where.and?{...n,where:{and:[e,...n.where.and]}}:{...n,where:{and:[e,n.where]}}}t(l,"ensureCondition");function s(n,e,i=[]){for(let o of Object.keys(e)){if(typeof e[o]=="object"&&!Array.isArray(e[o])){n=s(n,e[o],[...i,o]);continue}n=l(n,{field:[...i,o],operator:"eq",value:e[o]})}return n}t(s,"ensureEqCondition");function L(n,e,i){return{...n,limit:Math.min(Math.max(n.limit??e,1),i)}}t(L,"ensureLimit");function S(n,e){let i=n.select;i.length===0?i=e.map(r=>({field:r.split(".")})):i=n.select.filter(r=>e.includes(r.field.join(".")));let o=f(n.where,e)??{and:[]},d=n.order.filter(r=>e.includes(r.field.join("."))),u=n.relations.filter(r=>e.includes(r.field.join(".")));return{...n,select:i,where:o,order:d,relations:u}}t(S,"filterProperties");function f(n,e){if(n.or)return{or:n.or.map(i=>f(i,e)).filter(i=>!!i)};if(n.and)return{and:n.and.map(i=>f(i,e)).filter(i=>!!i)};if(!(n.field&&!e.includes(n.field.join("."))))return n}t(f,"filterPropertyAccessWhere");function v(n,e){let i=n.relations.filter(o=>e.includes(o.field.join(".")));return{...n,relations:i}}t(v,"filterRelations");export{l as ensureCondition,s as ensureEqCondition,L as ensureLimit,S as filterProperties,v as filterRelations};
2
2
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/filters/conditions/ensureCondition.ts","../../src/filters/conditions/ensureEqCondition.ts","../../src/filters/limit/ensureLimit.ts","../../src/filters/property/filterProperties.ts","../../src/filters/property/filterRelations.ts"],"sourcesContent":["import { CrudRequest } from '../../models/crud-request';\r\nimport { CrudRequestWhere } from '../../models/crud-request-where';\r\n\r\n/**\r\n * Ensures a condition is always applied to the query\r\n *\r\n * @param request The parsed request\r\n * @param condition The condition that needs to be applied\r\n */\r\nexport function ensureCondition(request: CrudRequest, condition: CrudRequestWhere): CrudRequest {\r\n // If there is already an \"AND\" condition, we'll just append to that\r\n if (request.where.and) {\r\n return {\r\n ...request,\r\n where: {\r\n and: [\r\n ...request.where.and,\r\n condition,\r\n ]\r\n }\r\n }\r\n }\r\n\r\n return {\r\n ...request,\r\n where: {\r\n and: [\r\n condition,\r\n request.where,\r\n ],\r\n },\r\n };\r\n}\r\n","import { CrudRequest } from '../../models/crud-request';\r\nimport { ensureCondition } from './ensureCondition';\r\nimport { CrudRequestWhereOperator } from '../../models/crud-request-where';\r\n\r\n/**\r\n * Ensures a condition is always applied to the query\r\n *\r\n * @param request The parsed request\r\n * @param entity The property that need to be applied\r\n * @param basePath The field path prefix\r\n */\r\nexport function ensureEqCondition<T extends Record<string, any>>(request: CrudRequest, entity: Partial<T>, basePath: string[] = []): CrudRequest {\r\n for (const key of Object.keys(entity)) {\r\n if (typeof entity[key] === 'object' && !Array.isArray(entity[key])) {\r\n request = ensureEqCondition(request, entity[key], [...basePath, key]);\r\n continue;\r\n }\r\n\r\n request = ensureCondition(request, {\r\n field: [...basePath, key],\r\n operator: CrudRequestWhereOperator.EQ,\r\n value: entity[key],\r\n });\r\n }\r\n\r\n return request;\r\n}\r\n","import { CrudRequest } from '../../models/crud-request';\r\n\r\n/**\r\n * Ensures that the limit will be set following a maximum rule\r\n *\r\n * @param request The parsed request\r\n * @param defaultLimit The default limit number\r\n * @param maxLimit The maximum allowed limit number\r\n */\r\nexport function ensureLimit(request: CrudRequest, defaultLimit: number, maxLimit: number): CrudRequest {\r\n return {\r\n ...request,\r\n limit: Math.min(Math.max(request.limit ?? defaultLimit, 1), maxLimit),\r\n };\r\n}\r\n","import { CrudRequest } from '../../models/crud-request';\r\nimport { CrudRequestWhere } from '../../models/crud-request-where';\r\n\r\n/**\r\n * Filters access to an allowlist of properties and relations.\r\n * No selecting, filtering, sorting and joining can be done on a property that is not listed.\r\n *\r\n * @param request The parsed request\r\n * @param allowedProperties The list of properties (in case of a field path, separated by dot) that will be allowed\r\n */\r\nexport function filterProperties(\r\n request: CrudRequest,\r\n allowedProperties: string[],\r\n): CrudRequest {\r\n let select = request.select;\r\n\r\n if (select.length === 0) {\r\n select = allowedProperties.map(prop => ({ field: prop.split('.') }));\r\n } else {\r\n select = request.select.filter(item => allowedProperties.includes(item.field.join('.')));\r\n }\r\n\r\n const where = filterPropertyAccessWhere(request.where, allowedProperties);\r\n\r\n const order = request.order.filter(item => allowedProperties.includes(item.field.join('.')));\r\n\r\n // TODO allow relations by the first part of field paths\r\n const relations = request.relations.filter(item => allowedProperties.includes(item.field.join('.')));\r\n\r\n return {\r\n ...request,\r\n select,\r\n where,\r\n order,\r\n relations,\r\n };\r\n}\r\n\r\nfunction filterPropertyAccessWhere(\r\n where: CrudRequestWhere,\r\n allowedProperties: string[],\r\n): CrudRequestWhere {\r\n if (where.or) {\r\n return {\r\n or: where.or.map(w => filterPropertyAccessWhere(w, allowedProperties)),\r\n };\r\n }\r\n\r\n if (where.and) {\r\n return {\r\n and: where.and.map(w => filterPropertyAccessWhere(w, allowedProperties)),\r\n };\r\n }\r\n\r\n if (where.field) {\r\n // We'll return an empty AND where if the field is not allowed\r\n if (!allowedProperties.includes(where.field.join('.')))\r\n return { and: [] };\r\n }\r\n\r\n return where;\r\n}\r\n\r\n","import { CrudRequest } from '../../models/crud-request';\r\n\r\n/**\r\n * Filters access to an allowlist of relations.\r\n *\r\n * @param request The parsed request\r\n * @param allowedRelations The list of relations (in case of a field path, separated by dot) that will be allowed\r\n */\r\nexport function filterRelations(\r\n request: CrudRequest,\r\n allowedRelations: string[],\r\n): CrudRequest {\r\n const relations = request.relations.filter(item => allowedRelations.includes(item.field.join('.')));\r\n\r\n return {\r\n ...request,\r\n relations,\r\n };\r\n}\r\n"],"mappings":"+EASO,SAASA,EAAgBC,EAAsBC,EAA0C,CAE9F,OAAID,EAAQ,MAAM,IACT,CACL,GAAGA,EACH,MAAO,CACL,IAAK,CACH,GAAGA,EAAQ,MAAM,IACjBC,CACF,CACF,CACF,EAGK,CACL,GAAGD,EACH,MAAO,CACL,IAAK,CACHC,EACAD,EAAQ,KACV,CACF,CACF,CACF,CAvBgBE,EAAAH,EAAA,mBCET,SAASI,EAAiDC,EAAsBC,EAAoBC,EAAqB,CAAC,EAAgB,CAC/I,QAAWC,KAAO,OAAO,KAAKF,CAAM,EAAG,CACrC,GAAI,OAAOA,EAAOE,CAAG,GAAM,UAAY,CAAC,MAAM,QAAQF,EAAOE,CAAG,CAAC,EAAG,CAClEH,EAAUD,EAAkBC,EAASC,EAAOE,CAAG,EAAG,CAAC,GAAGD,EAAUC,CAAG,CAAC,EACpE,QACF,CAEAH,EAAUI,EAAgBJ,EAAS,CACjC,MAAO,CAAC,GAAGE,EAAUC,CAAG,EACxB,cACA,MAAOF,EAAOE,CAAG,CACnB,CAAC,CACH,CAEA,OAAOH,CACT,CAfgBK,EAAAN,EAAA,qBCFT,SAASO,EAAYC,EAAsBC,EAAsBC,EAA+B,CACrG,MAAO,CACL,GAAGF,EACH,MAAO,KAAK,IAAI,KAAK,IAAIA,EAAQ,OAASC,EAAc,CAAC,EAAGC,CAAQ,CACtE,CACF,CALgBC,EAAAJ,EAAA,eCCT,SAASK,EACdC,EACAC,EACa,CACb,IAAIC,EAASF,EAAQ,OAEjBE,EAAO,SAAW,EACpBA,EAASD,EAAkB,IAAIE,IAAS,CAAE,MAAOA,EAAK,MAAM,GAAG,CAAE,EAAE,EAEnED,EAASF,EAAQ,OAAO,OAAOI,GAAQH,EAAkB,SAASG,EAAK,MAAM,KAAK,GAAG,CAAC,CAAC,EAGzF,IAAMC,EAAQC,EAA0BN,EAAQ,MAAOC,CAAiB,EAElEM,EAAQP,EAAQ,MAAM,OAAOI,GAAQH,EAAkB,SAASG,EAAK,MAAM,KAAK,GAAG,CAAC,CAAC,EAGrFI,EAAYR,EAAQ,UAAU,OAAOI,GAAQH,EAAkB,SAASG,EAAK,MAAM,KAAK,GAAG,CAAC,CAAC,EAEnG,MAAO,CACL,GAAGJ,EACH,OAAAE,EACA,MAAAG,EACA,MAAAE,EACA,UAAAC,CACF,CACF,CA1BgBC,EAAAV,EAAA,oBA4BhB,SAASO,EACPD,EACAJ,EACkB,CAClB,OAAII,EAAM,GACD,CACL,GAAIA,EAAM,GAAG,IAAIK,GAAKJ,EAA0BI,EAAGT,CAAiB,CAAC,CACvE,EAGEI,EAAM,IACD,CACL,IAAKA,EAAM,IAAI,IAAIK,GAAKJ,EAA0BI,EAAGT,CAAiB,CAAC,CACzE,EAGEI,EAAM,OAEJ,CAACJ,EAAkB,SAASI,EAAM,MAAM,KAAK,GAAG,CAAC,EAC5C,CAAE,IAAK,CAAC,CAAE,EAGdA,CACT,CAvBSI,EAAAH,EAAA,6BC9BF,SAASK,EACdC,EACAC,EACa,CACb,IAAMC,EAAYF,EAAQ,UAAU,OAAOG,GAAQF,EAAiB,SAASE,EAAK,MAAM,KAAK,GAAG,CAAC,CAAC,EAElG,MAAO,CACL,GAAGH,EACH,UAAAE,CACF,CACF,CAVgBE,EAAAL,EAAA","names":["ensureCondition","request","condition","__name","ensureEqCondition","request","entity","basePath","key","ensureCondition","__name","ensureLimit","request","defaultLimit","maxLimit","__name","filterProperties","request","allowedProperties","select","prop","item","where","filterPropertyAccessWhere","order","relations","__name","w","filterRelations","request","allowedRelations","relations","item","__name"]}
1
+ {"version":3,"sources":["../../src/filters/conditions/ensureCondition.ts","../../src/filters/conditions/ensureEqCondition.ts","../../src/filters/limit/ensureLimit.ts","../../src/filters/property/filterProperties.ts","../../src/filters/property/filterRelations.ts"],"sourcesContent":["import { CrudRequest } from '../../models/crud-request';\r\nimport { CrudRequestWhere } from '../../models/crud-request-where';\r\n\r\n/**\r\n * Ensures a condition is always applied to the query\r\n *\r\n * @param request The parsed request\r\n * @param condition The condition that needs to be applied\r\n */\r\nexport function ensureCondition(request: CrudRequest, condition: CrudRequestWhere): CrudRequest {\r\n // If there is already an \"AND\" condition, we'll just append to that\r\n if (request.where.and) {\r\n return {\r\n ...request,\r\n where: {\r\n and: [\r\n condition,\r\n ...request.where.and,\r\n ]\r\n }\r\n }\r\n }\r\n\r\n return {\r\n ...request,\r\n where: {\r\n and: [\r\n condition,\r\n request.where,\r\n ],\r\n },\r\n };\r\n}\r\n","import { CrudRequest } from '../../models/crud-request';\r\nimport { ensureCondition } from './ensureCondition';\r\nimport { CrudRequestWhereOperator } from '../../models/crud-request-where';\r\n\r\n/**\r\n * Ensures a condition is always applied to the query\r\n *\r\n * @param request The parsed request\r\n * @param entity The property that need to be applied\r\n * @param basePath The field path prefix\r\n */\r\nexport function ensureEqCondition<T extends Record<string, any>>(request: CrudRequest, entity: Partial<T>, basePath: string[] = []): CrudRequest {\r\n for (const key of Object.keys(entity)) {\r\n if (typeof entity[key] === 'object' && !Array.isArray(entity[key])) {\r\n request = ensureEqCondition(request, entity[key], [...basePath, key]);\r\n continue;\r\n }\r\n\r\n request = ensureCondition(request, {\r\n field: [...basePath, key],\r\n operator: CrudRequestWhereOperator.EQ,\r\n value: entity[key],\r\n });\r\n }\r\n\r\n return request;\r\n}\r\n","import { CrudRequest } from '../../models/crud-request';\r\n\r\n/**\r\n * Ensures that the limit will be set following a maximum rule\r\n *\r\n * @param request The parsed request\r\n * @param defaultLimit The default limit number\r\n * @param maxLimit The maximum allowed limit number\r\n */\r\nexport function ensureLimit(request: CrudRequest, defaultLimit: number, maxLimit: number): CrudRequest {\r\n return {\r\n ...request,\r\n limit: Math.min(Math.max(request.limit ?? defaultLimit, 1), maxLimit),\r\n };\r\n}\r\n","import { CrudRequest } from '../../models/crud-request';\r\nimport { CrudRequestWhere } from '../../models/crud-request-where';\r\n\r\n/**\r\n * Filters access to an allowlist of properties and relations.\r\n * No selecting, filtering, sorting and joining can be done on a property that is not listed.\r\n *\r\n * @param request The parsed request\r\n * @param allowedProperties The list of properties (in case of a field path, separated by dot) that will be allowed\r\n */\r\nexport function filterProperties(\r\n request: CrudRequest,\r\n allowedProperties: string[],\r\n): CrudRequest {\r\n let select = request.select;\r\n\r\n if (select.length === 0) {\r\n select = allowedProperties.map(prop => ({ field: prop.split('.') }));\r\n } else {\r\n select = request.select.filter(item => allowedProperties.includes(item.field.join('.')));\r\n }\r\n\r\n const where = filterPropertyAccessWhere(request.where, allowedProperties) ?? { and: [] };\r\n\r\n const order = request.order.filter(item => allowedProperties.includes(item.field.join('.')));\r\n\r\n // TODO allow relations by the first part of field paths\r\n const relations = request.relations.filter(item => allowedProperties.includes(item.field.join('.')));\r\n\r\n return {\r\n ...request,\r\n select,\r\n where,\r\n order,\r\n relations,\r\n };\r\n}\r\n\r\nfunction filterPropertyAccessWhere(\r\n where: CrudRequestWhere,\r\n allowedProperties: string[],\r\n): CrudRequestWhere | undefined {\r\n if (where.or) {\r\n return {\r\n or: where.or\r\n .map(w => filterPropertyAccessWhere(w, allowedProperties))\r\n .filter(w => !!w),\r\n };\r\n }\r\n\r\n if (where.and) {\r\n return {\r\n and: where.and\r\n .map(w => filterPropertyAccessWhere(w, allowedProperties))\r\n .filter(w => !!w),\r\n };\r\n }\r\n\r\n if (where.field) {\r\n if (!allowedProperties.includes(where.field.join('.')))\r\n return undefined;\r\n }\r\n\r\n return where;\r\n}\r\n\r\n","import { CrudRequest } from '../../models/crud-request';\r\n\r\n/**\r\n * Filters access to an allowlist of relations.\r\n *\r\n * @param request The parsed request\r\n * @param allowedRelations The list of relations (in case of a field path, separated by dot) that will be allowed\r\n */\r\nexport function filterRelations(\r\n request: CrudRequest,\r\n allowedRelations: string[],\r\n): CrudRequest {\r\n const relations = request.relations.filter(item => allowedRelations.includes(item.field.join('.')));\r\n\r\n return {\r\n ...request,\r\n relations,\r\n };\r\n}\r\n"],"mappings":"+EASO,SAASA,EAAgBC,EAAsBC,EAA0C,CAE9F,OAAID,EAAQ,MAAM,IACT,CACL,GAAGA,EACH,MAAO,CACL,IAAK,CACHC,EACA,GAAGD,EAAQ,MAAM,GACnB,CACF,CACF,EAGK,CACL,GAAGA,EACH,MAAO,CACL,IAAK,CACHC,EACAD,EAAQ,KACV,CACF,CACF,CACF,CAvBgBE,EAAAH,EAAA,mBCET,SAASI,EAAiDC,EAAsBC,EAAoBC,EAAqB,CAAC,EAAgB,CAC/I,QAAWC,KAAO,OAAO,KAAKF,CAAM,EAAG,CACrC,GAAI,OAAOA,EAAOE,CAAG,GAAM,UAAY,CAAC,MAAM,QAAQF,EAAOE,CAAG,CAAC,EAAG,CAClEH,EAAUD,EAAkBC,EAASC,EAAOE,CAAG,EAAG,CAAC,GAAGD,EAAUC,CAAG,CAAC,EACpE,QACF,CAEAH,EAAUI,EAAgBJ,EAAS,CACjC,MAAO,CAAC,GAAGE,EAAUC,CAAG,EACxB,cACA,MAAOF,EAAOE,CAAG,CACnB,CAAC,CACH,CAEA,OAAOH,CACT,CAfgBK,EAAAN,EAAA,qBCFT,SAASO,EAAYC,EAAsBC,EAAsBC,EAA+B,CACrG,MAAO,CACL,GAAGF,EACH,MAAO,KAAK,IAAI,KAAK,IAAIA,EAAQ,OAASC,EAAc,CAAC,EAAGC,CAAQ,CACtE,CACF,CALgBC,EAAAJ,EAAA,eCCT,SAASK,EACdC,EACAC,EACa,CACb,IAAIC,EAASF,EAAQ,OAEjBE,EAAO,SAAW,EACpBA,EAASD,EAAkB,IAAIE,IAAS,CAAE,MAAOA,EAAK,MAAM,GAAG,CAAE,EAAE,EAEnED,EAASF,EAAQ,OAAO,OAAOI,GAAQH,EAAkB,SAASG,EAAK,MAAM,KAAK,GAAG,CAAC,CAAC,EAGzF,IAAMC,EAAQC,EAA0BN,EAAQ,MAAOC,CAAiB,GAAK,CAAE,IAAK,CAAC,CAAE,EAEjFM,EAAQP,EAAQ,MAAM,OAAOI,GAAQH,EAAkB,SAASG,EAAK,MAAM,KAAK,GAAG,CAAC,CAAC,EAGrFI,EAAYR,EAAQ,UAAU,OAAOI,GAAQH,EAAkB,SAASG,EAAK,MAAM,KAAK,GAAG,CAAC,CAAC,EAEnG,MAAO,CACL,GAAGJ,EACH,OAAAE,EACA,MAAAG,EACA,MAAAE,EACA,UAAAC,CACF,CACF,CA1BgBC,EAAAV,EAAA,oBA4BhB,SAASO,EACPD,EACAJ,EAC8B,CAC9B,GAAII,EAAM,GACR,MAAO,CACL,GAAIA,EAAM,GACP,IAAIK,GAAKJ,EAA0BI,EAAGT,CAAiB,CAAC,EACxD,OAAOS,GAAK,CAAC,CAACA,CAAC,CACpB,EAGF,GAAIL,EAAM,IACR,MAAO,CACL,IAAKA,EAAM,IACR,IAAIK,GAAKJ,EAA0BI,EAAGT,CAAiB,CAAC,EACxD,OAAOS,GAAK,CAAC,CAACA,CAAC,CACpB,EAGF,GAAI,EAAAL,EAAM,OACJ,CAACJ,EAAkB,SAASI,EAAM,MAAM,KAAK,GAAG,CAAC,GAIvD,OAAOA,CACT,CA1BSI,EAAAH,EAAA,6BC9BF,SAASK,EACdC,EACAC,EACa,CACb,IAAMC,EAAYF,EAAQ,UAAU,OAAOG,GAAQF,EAAiB,SAASE,EAAK,MAAM,KAAK,GAAG,CAAC,CAAC,EAElG,MAAO,CACL,GAAGH,EACH,UAAAE,CACF,CACF,CAVgBE,EAAAL,EAAA","names":["ensureCondition","request","condition","__name","ensureEqCondition","request","entity","basePath","key","ensureCondition","__name","ensureLimit","request","defaultLimit","maxLimit","__name","filterProperties","request","allowedProperties","select","prop","item","where","filterPropertyAccessWhere","order","relations","__name","w","filterRelations","request","allowedRelations","relations","item","__name"]}
@@ -0,0 +1,30 @@
1
+ import { RequestHandler } from 'express';
2
+ import { a as RequestParser } from '../../request-parser-DzuXbRsB.mjs';
3
+ import { C as CrudRequest } from '../../crud-request-DLo0ZuzD.mjs';
4
+
5
+ interface Type<T> extends Function {
6
+ new (...args: any[]): T;
7
+ }
8
+
9
+ declare global {
10
+ namespace Express {
11
+ interface Request {
12
+ /**
13
+ * Gets the CrudRequest for this request.
14
+ * This will parse the request once and memoize it.
15
+ *
16
+ * @param ignoreMemoized Whether it should parse again and ignore the memoized value.
17
+ */
18
+ getCrudRequest: (ignoreMemoized?: boolean) => CrudRequest;
19
+ }
20
+ }
21
+ }
22
+ /**
23
+ * The crud middleware allows getting the CrudRequest through `req.getCrudRequest()`,
24
+ * which parses and memoizes the query parameters.
25
+ *
26
+ * @param instance The parser instance or class
27
+ */
28
+ declare function crud(instance: RequestParser | Type<RequestParser>): RequestHandler;
29
+
30
+ export { crud };
@@ -0,0 +1,30 @@
1
+ import { RequestHandler } from 'express';
2
+ import { a as RequestParser } from '../../request-parser-Cr3cxMRw.js';
3
+ import { C as CrudRequest } from '../../crud-request-DLo0ZuzD.js';
4
+
5
+ interface Type<T> extends Function {
6
+ new (...args: any[]): T;
7
+ }
8
+
9
+ declare global {
10
+ namespace Express {
11
+ interface Request {
12
+ /**
13
+ * Gets the CrudRequest for this request.
14
+ * This will parse the request once and memoize it.
15
+ *
16
+ * @param ignoreMemoized Whether it should parse again and ignore the memoized value.
17
+ */
18
+ getCrudRequest: (ignoreMemoized?: boolean) => CrudRequest;
19
+ }
20
+ }
21
+ }
22
+ /**
23
+ * The crud middleware allows getting the CrudRequest through `req.getCrudRequest()`,
24
+ * which parses and memoizes the query parameters.
25
+ *
26
+ * @param instance The parser instance or class
27
+ */
28
+ declare function crud(instance: RequestParser | Type<RequestParser>): RequestHandler;
29
+
30
+ export { crud };
@@ -0,0 +1,2 @@
1
+ "use strict";var u=Object.defineProperty;var l=Object.getOwnPropertyDescriptor;var m=Object.getOwnPropertyNames;var b=Object.prototype.hasOwnProperty;var o=(e,r)=>u(e,"name",{value:r,configurable:!0});var y=(e,r)=>{for(var n in r)u(e,n,{get:r[n],enumerable:!0})},c=(e,r,n,i)=>{if(r&&typeof r=="object"||typeof r=="function")for(let t of m(r))!b.call(e,t)&&t!==n&&u(e,t,{get:()=>r[t],enumerable:!(i=l(r,t))||i.enumerable});return e};var g=e=>c(u({},"__esModule",{value:!0}),e);var a={};y(a,{crud:()=>d});module.exports=g(a);function f(e){if(typeof e=="function")return new e;if(typeof e=="object")return e}o(f,"createInstance");function d(e){let r=f(e);if(!r)throw new Error("Invalid RequestParser instance passed");return(n,i,t)=>{let s;n.getCrudRequest=p=>((!s||p)&&(s=r.parse(n.query)),s),t()}}o(d,"crud");0&&(module.exports={crud});
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/helpers/express/index.ts","../../../src/utils/functions.ts","../../../src/helpers/express/middlewares.ts"],"sourcesContent":["\r\nexport * from './middlewares';\r\n","export function ensurePrimitive(fieldName: string, data: any): number | string | boolean | Date {\r\n if (typeof data === 'number' || typeof data === 'string' || typeof data === 'boolean' || data instanceof Date)\r\n return data;\r\n\r\n throw new Error(`${fieldName} must be a string, number or boolean`);\r\n}\r\n\r\nexport function ensurePrimitiveOrNull(fieldName: string, data: any): number | string | boolean | Date | undefined | null {\r\n if (data === null || data === undefined)\r\n return data;\r\n\r\n if (typeof data === 'number' || typeof data === 'string' || typeof data === 'boolean' || data instanceof Date)\r\n return data;\r\n\r\n throw new Error(`${fieldName} must be a string, number, boolean or null`);\r\n}\r\n\r\nexport function ensureString(fieldName: string, data: any): string {\r\n if (typeof data === 'string')\r\n return data;\r\n\r\n throw new Error(`${fieldName} must be a string`);\r\n}\r\n\r\nexport function ensureArray<T>(fieldName: string, data: T[] | any, minLength: number = 0): T[] {\r\n if (!Array.isArray(data) || data.length < minLength)\r\n throw new Error(`${fieldName} must be an array with at least ${minLength} items`);\r\n\r\n return data;\r\n}\r\n\r\nexport function ensureEmpty(fieldName: string, data: any) {\r\n if (isValid(data) && data !== true)\r\n throw new Error(`${fieldName} must be true, null or undefined`);\r\n}\r\n\r\nexport function isValid<T>(value: T | undefined | null): value is T {\r\n return value !== null && value !== undefined;\r\n}\r\n\r\nexport function getOffset(offset: number | undefined, limit?: number, page?: number): number {\r\n return offset ?? (limit && page ? limit * (page - 1) : 0);\r\n}\r\n\r\nexport interface Type<T> extends Function { new (... args: any[]): T; }\r\n\r\nexport function createInstance<T extends object>(clazzOrInstance: T | Type<T> | undefined): T | undefined {\r\n if (typeof clazzOrInstance === 'function')\r\n return new clazzOrInstance();\r\n\r\n if (typeof clazzOrInstance === 'object')\r\n return clazzOrInstance as T;\r\n\r\n return undefined;\r\n}\r\n\r\nexport function escapeRegex(str: string): string {\r\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\r\n}\r\n","import { Request, RequestHandler, Response } from 'express';\r\nimport { RequestParser } from '../../models/request-parser';\r\nimport { CrudRequest } from '../../models/crud-request';\r\nimport { createInstance, Type } from '../../utils/functions';\r\n\r\ndeclare global {\r\n namespace Express {\r\n interface Request {\r\n /**\r\n * Gets the CrudRequest for this request.\r\n * This will parse the request once and memoize it.\r\n *\r\n * @param ignoreMemoized Whether it should parse again and ignore the memoized value.\r\n */\r\n getCrudRequest: (ignoreMemoized?: boolean) => CrudRequest;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * The crud middleware allows getting the CrudRequest through `req.getCrudRequest()`,\r\n * which parses and memoizes the query parameters.\r\n *\r\n * @param instance The parser instance or class\r\n */\r\nexport function crud(instance: RequestParser | Type<RequestParser>): RequestHandler {\r\n const parser = createInstance(instance);\r\n\r\n if (!parser)\r\n throw new Error('Invalid RequestParser instance passed');\r\n\r\n return (req: Request, res: Response, done: (error?: Error) => void) => {\r\n let crudRequest: CrudRequest | undefined;\r\n\r\n req.getCrudRequest = (ignoreMemoized?: boolean) => {\r\n if (!crudRequest || ignoreMemoized)\r\n crudRequest = parser.parse(req.query);\r\n\r\n return crudRequest;\r\n };\r\n\r\n done();\r\n };\r\n}\r\n"],"mappings":"4dAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,UAAAE,IAAA,eAAAC,EAAAH,GC8CO,SAASI,EAAiCC,EAAyD,CACxG,GAAI,OAAOA,GAAoB,WAC7B,OAAO,IAAIA,EAEb,GAAI,OAAOA,GAAoB,SAC7B,OAAOA,CAGX,CARgBC,EAAAF,EAAA,kBCrBT,SAASG,EAAKC,EAA+D,CAClF,IAAMC,EAASC,EAAeF,CAAQ,EAEtC,GAAI,CAACC,EACH,MAAM,IAAI,MAAM,uCAAuC,EAEzD,MAAO,CAACE,EAAcC,EAAeC,IAAkC,CACrE,IAAIC,EAEJH,EAAI,eAAkBI,KAChB,CAACD,GAAeC,KAClBD,EAAcL,EAAO,MAAME,EAAI,KAAK,GAE/BG,GAGTD,EAAK,CACP,CACF,CAlBgBG,EAAAT,EAAA","names":["express_exports","__export","crud","__toCommonJS","createInstance","clazzOrInstance","__name","crud","instance","parser","createInstance","req","res","done","crudRequest","ignoreMemoized","__name"]}
@@ -0,0 +1,2 @@
1
+ var f=Object.defineProperty;var n=(e,r)=>f(e,"name",{value:r,configurable:!0});function o(e){if(typeof e=="function")return new e;if(typeof e=="object")return e}n(o,"createInstance");function g(e){let r=o(e);if(!r)throw new Error("Invalid RequestParser instance passed");return(u,p,i)=>{let t;u.getCrudRequest=s=>((!t||s)&&(t=r.parse(u.query)),t),i()}}n(g,"crud");export{g as crud};
2
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/utils/functions.ts","../../../src/helpers/express/middlewares.ts"],"sourcesContent":["export function ensurePrimitive(fieldName: string, data: any): number | string | boolean | Date {\r\n if (typeof data === 'number' || typeof data === 'string' || typeof data === 'boolean' || data instanceof Date)\r\n return data;\r\n\r\n throw new Error(`${fieldName} must be a string, number or boolean`);\r\n}\r\n\r\nexport function ensurePrimitiveOrNull(fieldName: string, data: any): number | string | boolean | Date | undefined | null {\r\n if (data === null || data === undefined)\r\n return data;\r\n\r\n if (typeof data === 'number' || typeof data === 'string' || typeof data === 'boolean' || data instanceof Date)\r\n return data;\r\n\r\n throw new Error(`${fieldName} must be a string, number, boolean or null`);\r\n}\r\n\r\nexport function ensureString(fieldName: string, data: any): string {\r\n if (typeof data === 'string')\r\n return data;\r\n\r\n throw new Error(`${fieldName} must be a string`);\r\n}\r\n\r\nexport function ensureArray<T>(fieldName: string, data: T[] | any, minLength: number = 0): T[] {\r\n if (!Array.isArray(data) || data.length < minLength)\r\n throw new Error(`${fieldName} must be an array with at least ${minLength} items`);\r\n\r\n return data;\r\n}\r\n\r\nexport function ensureEmpty(fieldName: string, data: any) {\r\n if (isValid(data) && data !== true)\r\n throw new Error(`${fieldName} must be true, null or undefined`);\r\n}\r\n\r\nexport function isValid<T>(value: T | undefined | null): value is T {\r\n return value !== null && value !== undefined;\r\n}\r\n\r\nexport function getOffset(offset: number | undefined, limit?: number, page?: number): number {\r\n return offset ?? (limit && page ? limit * (page - 1) : 0);\r\n}\r\n\r\nexport interface Type<T> extends Function { new (... args: any[]): T; }\r\n\r\nexport function createInstance<T extends object>(clazzOrInstance: T | Type<T> | undefined): T | undefined {\r\n if (typeof clazzOrInstance === 'function')\r\n return new clazzOrInstance();\r\n\r\n if (typeof clazzOrInstance === 'object')\r\n return clazzOrInstance as T;\r\n\r\n return undefined;\r\n}\r\n\r\nexport function escapeRegex(str: string): string {\r\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\r\n}\r\n","import { Request, RequestHandler, Response } from 'express';\r\nimport { RequestParser } from '../../models/request-parser';\r\nimport { CrudRequest } from '../../models/crud-request';\r\nimport { createInstance, Type } from '../../utils/functions';\r\n\r\ndeclare global {\r\n namespace Express {\r\n interface Request {\r\n /**\r\n * Gets the CrudRequest for this request.\r\n * This will parse the request once and memoize it.\r\n *\r\n * @param ignoreMemoized Whether it should parse again and ignore the memoized value.\r\n */\r\n getCrudRequest: (ignoreMemoized?: boolean) => CrudRequest;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * The crud middleware allows getting the CrudRequest through `req.getCrudRequest()`,\r\n * which parses and memoizes the query parameters.\r\n *\r\n * @param instance The parser instance or class\r\n */\r\nexport function crud(instance: RequestParser | Type<RequestParser>): RequestHandler {\r\n const parser = createInstance(instance);\r\n\r\n if (!parser)\r\n throw new Error('Invalid RequestParser instance passed');\r\n\r\n return (req: Request, res: Response, done: (error?: Error) => void) => {\r\n let crudRequest: CrudRequest | undefined;\r\n\r\n req.getCrudRequest = (ignoreMemoized?: boolean) => {\r\n if (!crudRequest || ignoreMemoized)\r\n crudRequest = parser.parse(req.query);\r\n\r\n return crudRequest;\r\n };\r\n\r\n done();\r\n };\r\n}\r\n"],"mappings":"+EA8CO,SAASA,EAAiCC,EAAyD,CACxG,GAAI,OAAOA,GAAoB,WAC7B,OAAO,IAAIA,EAEb,GAAI,OAAOA,GAAoB,SAC7B,OAAOA,CAGX,CARgBC,EAAAF,EAAA,kBCrBT,SAASG,EAAKC,EAA+D,CAClF,IAAMC,EAASC,EAAeF,CAAQ,EAEtC,GAAI,CAACC,EACH,MAAM,IAAI,MAAM,uCAAuC,EAEzD,MAAO,CAACE,EAAcC,EAAeC,IAAkC,CACrE,IAAIC,EAEJH,EAAI,eAAkBI,KAChB,CAACD,GAAeC,KAClBD,EAAcL,EAAO,MAAME,EAAI,KAAK,GAE/BG,GAGTD,EAAK,CACP,CACF,CAlBgBG,EAAAT,EAAA","names":["createInstance","clazzOrInstance","__name","crud","instance","parser","createInstance","req","res","done","crudRequest","ignoreMemoized","__name"]}
@@ -1,11 +1,12 @@
1
1
  import * as _nestjs_common from '@nestjs/common';
2
2
  import { Type } from '@nestjs/common';
3
- import { a as RequestParser } from '../../request-parser-BMkszvGr.mjs';
4
- import '../../crud-request-x16CuDRF.mjs';
3
+ import { a as RequestParser } from '../../request-parser-DzuXbRsB.mjs';
4
+ import '../../crud-request-DLo0ZuzD.mjs';
5
5
 
6
6
  declare const CRUD_QUERY_PARSER = "crud-query-parser";
7
+
7
8
  /**
8
- * Defines which parser will be used for parsing the request
9
+ * Defines which parser will be used for parsing the request. This also adds the OpenAPI query parameters.
9
10
  *
10
11
  * @param parserContract The parser that will be used
11
12
  */
@@ -1,11 +1,12 @@
1
1
  import * as _nestjs_common from '@nestjs/common';
2
2
  import { Type } from '@nestjs/common';
3
- import { a as RequestParser } from '../../request-parser-BxVulcsX.js';
4
- import '../../crud-request-x16CuDRF.js';
3
+ import { a as RequestParser } from '../../request-parser-Cr3cxMRw.js';
4
+ import '../../crud-request-DLo0ZuzD.js';
5
5
 
6
6
  declare const CRUD_QUERY_PARSER = "crud-query-parser";
7
+
7
8
  /**
8
- * Defines which parser will be used for parsing the request
9
+ * Defines which parser will be used for parsing the request. This also adds the OpenAPI query parameters.
9
10
  *
10
11
  * @param parserContract The parser that will be used
11
12
  */
@@ -1,2 +1,2 @@
1
- "use strict";var u=Object.defineProperty;var f=Object.getOwnPropertyDescriptor;var P=Object.getOwnPropertyNames;var m=Object.prototype.hasOwnProperty;var a=(e,r)=>u(e,"name",{value:r,configurable:!0});var q=(e,r)=>{for(var t in r)u(e,t,{get:r[t],enumerable:!0})},R=(e,r,t,o)=>{if(r&&typeof r=="object"||typeof r=="function")for(let n of P(r))!m.call(e,n)&&n!==t&&u(e,n,{get:()=>r[n],enumerable:!(o=f(r,n))||o.enumerable});return e};var x=e=>R(u({},"__esModule",{value:!0}),e);var T={};q(T,{CRUD_QUERY_PARSER:()=>i,Crud:()=>y,ParseCrudRequest:()=>C});module.exports=x(T);var s=require("@nestjs/common");var c=(()=>{try{return require("@nestjs/swagger").ApiQuery}catch{return r=>()=>{}}})();function p(e){if(typeof e=="function")return new e;if(typeof e=="object")return e}a(p,"createInstance");function d(e,r){let t=[e.getHandler(),e.getClass()];for(let o of t){let n=Reflect.getMetadata(r,o);if(n)return n}}a(d,"getMetadataFromContext");var i="crud-query-parser";function y(e){let r=p(e);if(!r)throw new Error("The request parser passed to @Crud() is invalid");let t=r.getOpenAPIParameters().map(o=>c(o));return(0,s.applyDecorators)((0,s.SetMetadata)(i,r),...t)}a(y,"Crud");var C=(0,s.createParamDecorator)((e,r)=>{let t=r.switchToHttp().getRequest(),o=e?p(e):d(r,i);return o?o.parse(t.query):(new s.Logger("ParseCrudRequest").warn("No crud request parser found. Please, define one with @Crud() or pass to @CrudRequest()"),{where:{and:[]},select:[],order:[],relations:[]})});0&&(module.exports={CRUD_QUERY_PARSER,Crud,ParseCrudRequest});
1
+ "use strict";var p=Object.defineProperty;var R=Object.getOwnPropertyDescriptor;var y=Object.getOwnPropertyNames;var l=Object.prototype.hasOwnProperty;var o=(e,r)=>p(e,"name",{value:r,configurable:!0});var g=(e,r)=>{for(var t in r)p(e,t,{get:r[t],enumerable:!0})},q=(e,r,t,n)=>{if(r&&typeof r=="object"||typeof r=="function")for(let u of y(r))!l.call(e,u)&&u!==t&&p(e,u,{get:()=>r[u],enumerable:!(n=R(r,u))||n.enumerable});return e};var x=e=>q(p({},"__esModule",{value:!0}),e);var C={};g(C,{CRUD_QUERY_PARSER:()=>i,Crud:()=>T,ParseCrudRequest:()=>P});module.exports=x(C);var s=require("@nestjs/common");function a(e){if(typeof e=="function")return new e;if(typeof e=="object")return e}o(a,"createInstance");var c=require("@nestjs/common");function f(e){return{select:[],relations:[],order:[],where:{and:[]},...e}}o(f,"createCrudRequest");var i="crud-query-parser",m=(()=>{try{return require("@nestjs/swagger").ApiQuery}catch{return r=>()=>{}}})();function b(e,r){let t=[e.getHandler(),e.getClass()];for(let n of t){let u=Reflect.getMetadata(r,n);if(u)return u}}o(b,"getMetadataFromContext");function d(e,r){let t=r.switchToHttp().getRequest(),n=e?a(e):b(r,i);return n?n.parse(t.query):(new c.Logger("ParseCrudRequest").warn("No crud request parser found. Please, define one with @Crud() or pass to @ParseCrudRequest()"),f())}o(d,"parseCrudRequest");function T(e){let r=a(e);if(!r)throw new Error("The request parser passed to @Crud() is invalid");let t=r.getOpenAPIParameters().map(n=>m(n));return(0,s.applyDecorators)((0,s.SetMetadata)(i,r),...t)}o(T,"Crud");var P=(0,s.createParamDecorator)(d);0&&(module.exports={CRUD_QUERY_PARSER,Crud,ParseCrudRequest});
2
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/helpers/nestjs/index.ts","../../../src/helpers/nestjs/decorators.ts","../../../src/helpers/nestjs/utils.ts"],"sourcesContent":["\r\nexport * from './decorators';\r\n","import { applyDecorators, createParamDecorator, ExecutionContext, Logger, SetMetadata, Type } from '@nestjs/common';\r\nimport { RequestParser } from '../../models/request-parser';\r\nimport { ApiQuery, createInstance, getMetadataFromContext } from './utils';\r\n\r\nexport const CRUD_QUERY_PARSER = 'crud-query-parser';\r\n\r\n/**\r\n * Defines which parser will be used for parsing the request\r\n *\r\n * @param parserContract The parser that will be used\r\n */\r\nexport function Crud(parserContract: RequestParser | Type<RequestParser>): MethodDecorator & ClassDecorator {\r\n const parser = createInstance(parserContract);\r\n\r\n if (!parser) {\r\n throw new Error('The request parser passed to @Crud() is invalid');\r\n }\r\n\r\n const openApi = parser.getOpenAPIParameters().map(param => ApiQuery(param));\r\n\r\n return applyDecorators(\r\n SetMetadata(CRUD_QUERY_PARSER, parser),\r\n ...openApi,\r\n );\r\n}\r\n\r\n/**\r\n * A parameter decorator that converts the query string into a `CrudRequest` object\r\n */\r\nexport const ParseCrudRequest = createParamDecorator<RequestParser | Type<RequestParser>>(\r\n (data: RequestParser | Type<RequestParser>, ctx: ExecutionContext) => {\r\n const request = ctx.switchToHttp().getRequest();\r\n const parser = data ? createInstance(data) : getMetadataFromContext<RequestParser>(ctx, CRUD_QUERY_PARSER);\r\n\r\n if (!parser) {\r\n new Logger('ParseCrudRequest').warn(`No crud request parser found. Please, define one with @Crud() or pass to @CrudRequest()`);\r\n\r\n return {\r\n where: { and: [] },\r\n select: [],\r\n order: [],\r\n relations: [],\r\n };\r\n }\r\n\r\n return parser.parse(request.query);\r\n },\r\n);\r\n\r\n","import { ExecutionContext, Type } from '@nestjs/common';\r\nimport { OpenAPIParameter } from '../../models/openapi-parameter';\r\nimport { RequestParser } from '../../models/request-parser';\r\n\r\nexport const ApiQuery = (() => {\r\n try {\r\n return require('@nestjs/swagger').ApiQuery;\r\n } catch (error) {\r\n return (options: OpenAPIParameter): MethodDecorator => {\r\n return () => {};\r\n };\r\n }\r\n})();\r\n\r\nexport function createInstance<T extends RequestParser>(data: T | Type<T> | undefined): T | undefined {\r\n if (typeof data === 'function')\r\n return new data();\r\n\r\n if (typeof data === 'object')\r\n return data as T;\r\n\r\n return undefined;\r\n}\r\n\r\nexport function getMetadataFromContext<T>(context: ExecutionContext, key: string): T | undefined {\r\n const targets = [\r\n context.getHandler(),\r\n context.getClass(),\r\n ];\r\n\r\n for (const target of targets) {\r\n const data = Reflect.getMetadata(key, target);\r\n\r\n if (data)\r\n return data;\r\n }\r\n\r\n return undefined;\r\n}\r\n"],"mappings":"4dAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,uBAAAE,EAAA,SAAAC,EAAA,qBAAAC,IAAA,eAAAC,EAAAL,GCAA,IAAAM,EAAmG,0BCI5F,IAAMC,GAAY,IAAM,CAC7B,GAAI,CACF,MAAO,SAAQ,iBAAiB,EAAE,QACpC,MAAgB,CACd,OAAQC,GACC,IAAM,CAAC,CAElB,CACF,GAAG,EAEI,SAASC,EAAwCC,EAA8C,CACpG,GAAI,OAAOA,GAAS,WAClB,OAAO,IAAIA,EAEb,GAAI,OAAOA,GAAS,SAClB,OAAOA,CAGX,CARgBC,EAAAF,EAAA,kBAUT,SAASG,EAA0BC,EAA2BC,EAA4B,CAC/F,IAAMC,EAAU,CACdF,EAAQ,WAAW,EACnBA,EAAQ,SAAS,CACnB,EAEA,QAAWG,KAAUD,EAAS,CAC5B,IAAML,EAAO,QAAQ,YAAYI,EAAKE,CAAM,EAE5C,GAAIN,EACF,OAAOA,CACX,CAGF,CAdgBC,EAAAC,EAAA,0BDpBT,IAAMK,EAAoB,oBAO1B,SAASC,EAAKC,EAAuF,CAC1G,IAAMC,EAASC,EAAeF,CAAc,EAE5C,GAAI,CAACC,EACH,MAAM,IAAI,MAAM,iDAAiD,EAGnE,IAAME,EAAUF,EAAO,qBAAqB,EAAE,IAAIG,GAASC,EAASD,CAAK,CAAC,EAE1E,SAAO,sBACL,eAAYN,EAAmBG,CAAM,EACrC,GAAGE,CACL,CACF,CAbgBG,EAAAP,EAAA,QAkBT,IAAMQ,KAAmB,wBAC9B,CAACC,EAA2CC,IAA0B,CACpE,IAAMC,EAAUD,EAAI,aAAa,EAAE,WAAW,EACxCR,EAASO,EAAON,EAAeM,CAAI,EAAIG,EAAsCF,EAAKX,CAAiB,EAEzG,OAAKG,EAWEA,EAAO,MAAMS,EAAQ,KAAK,GAV/B,IAAI,SAAO,kBAAkB,EAAE,KAAK,yFAAyF,EAEtH,CACL,MAAO,CAAE,IAAK,CAAC,CAAE,EACjB,OAAQ,CAAC,EACT,MAAO,CAAC,EACR,UAAW,CAAC,CACd,EAIJ,CACF","names":["nestjs_exports","__export","CRUD_QUERY_PARSER","Crud","ParseCrudRequest","__toCommonJS","import_common","ApiQuery","options","createInstance","data","__name","getMetadataFromContext","context","key","targets","target","CRUD_QUERY_PARSER","Crud","parserContract","parser","createInstance","openApi","param","ApiQuery","__name","ParseCrudRequest","data","ctx","request","getMetadataFromContext"]}
1
+ {"version":3,"sources":["../../../src/helpers/nestjs/index.ts","../../../src/helpers/nestjs/decorators.ts","../../../src/utils/functions.ts","../../../src/helpers/nestjs/utils.ts","../../../src/utils/objects.ts"],"sourcesContent":["\r\nexport * from './decorators';\r\n","import { applyDecorators, createParamDecorator, SetMetadata, Type } from '@nestjs/common';\r\nimport { RequestParser } from '../../models/request-parser';\r\nimport { createInstance } from '../../utils/functions';\r\nimport { ApiQuery, CRUD_QUERY_PARSER, parseCrudRequest } from './utils';\r\n\r\nexport { CRUD_QUERY_PARSER } from './utils';\r\n\r\n/**\r\n * Defines which parser will be used for parsing the request. This also adds the OpenAPI query parameters.\r\n *\r\n * @param parserContract The parser that will be used\r\n */\r\nexport function Crud(parserContract: RequestParser | Type<RequestParser>): MethodDecorator & ClassDecorator {\r\n const parser = createInstance(parserContract);\r\n\r\n if (!parser) {\r\n throw new Error('The request parser passed to @Crud() is invalid');\r\n }\r\n\r\n const openApi = parser.getOpenAPIParameters().map(param => ApiQuery(param));\r\n\r\n return applyDecorators(\r\n SetMetadata(CRUD_QUERY_PARSER, parser),\r\n ...openApi,\r\n );\r\n}\r\n\r\n/**\r\n * A parameter decorator that converts the query string into a `CrudRequest` object\r\n */\r\nexport const ParseCrudRequest = createParamDecorator<RequestParser | Type<RequestParser>>(parseCrudRequest);\r\n","export function ensurePrimitive(fieldName: string, data: any): number | string | boolean | Date {\r\n if (typeof data === 'number' || typeof data === 'string' || typeof data === 'boolean' || data instanceof Date)\r\n return data;\r\n\r\n throw new Error(`${fieldName} must be a string, number or boolean`);\r\n}\r\n\r\nexport function ensurePrimitiveOrNull(fieldName: string, data: any): number | string | boolean | Date | undefined | null {\r\n if (data === null || data === undefined)\r\n return data;\r\n\r\n if (typeof data === 'number' || typeof data === 'string' || typeof data === 'boolean' || data instanceof Date)\r\n return data;\r\n\r\n throw new Error(`${fieldName} must be a string, number, boolean or null`);\r\n}\r\n\r\nexport function ensureString(fieldName: string, data: any): string {\r\n if (typeof data === 'string')\r\n return data;\r\n\r\n throw new Error(`${fieldName} must be a string`);\r\n}\r\n\r\nexport function ensureArray<T>(fieldName: string, data: T[] | any, minLength: number = 0): T[] {\r\n if (!Array.isArray(data) || data.length < minLength)\r\n throw new Error(`${fieldName} must be an array with at least ${minLength} items`);\r\n\r\n return data;\r\n}\r\n\r\nexport function ensureEmpty(fieldName: string, data: any) {\r\n if (isValid(data) && data !== true)\r\n throw new Error(`${fieldName} must be true, null or undefined`);\r\n}\r\n\r\nexport function isValid<T>(value: T | undefined | null): value is T {\r\n return value !== null && value !== undefined;\r\n}\r\n\r\nexport function getOffset(offset: number | undefined, limit?: number, page?: number): number {\r\n return offset ?? (limit && page ? limit * (page - 1) : 0);\r\n}\r\n\r\nexport interface Type<T> extends Function { new (... args: any[]): T; }\r\n\r\nexport function createInstance<T extends object>(clazzOrInstance: T | Type<T> | undefined): T | undefined {\r\n if (typeof clazzOrInstance === 'function')\r\n return new clazzOrInstance();\r\n\r\n if (typeof clazzOrInstance === 'object')\r\n return clazzOrInstance as T;\r\n\r\n return undefined;\r\n}\r\n\r\nexport function escapeRegex(str: string): string {\r\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\r\n}\r\n","import { ExecutionContext, Logger, Type } from '@nestjs/common';\r\nimport { OpenAPIParameter } from '../../models/openapi-parameter';\r\nimport { RequestParser } from '../../models/request-parser';\r\nimport { CrudRequest } from '../../models/crud-request';\r\nimport { createInstance } from '../../utils/functions';\r\nimport { createCrudRequest } from '../../utils/objects';\r\n\r\nexport const CRUD_QUERY_PARSER = 'crud-query-parser';\r\n\r\nexport const ApiQuery = (() => {\r\n try {\r\n return require('@nestjs/swagger').ApiQuery; // TODO ES6 imports?\r\n } catch (error) {\r\n return (options: OpenAPIParameter): MethodDecorator => {\r\n return () => {};\r\n };\r\n }\r\n})();\r\n\r\nexport function getMetadataFromContext<T>(context: ExecutionContext, key: string): T | undefined {\r\n const targets = [\r\n context.getHandler(),\r\n context.getClass(),\r\n ];\r\n\r\n for (const target of targets) {\r\n const data = Reflect.getMetadata(key, target);\r\n\r\n if (data)\r\n return data;\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\nexport function parseCrudRequest(data: RequestParser | Type<RequestParser> | undefined, ctx: ExecutionContext): CrudRequest {\r\n const request = ctx.switchToHttp().getRequest();\r\n const parser = data ? createInstance(data) : getMetadataFromContext<RequestParser>(ctx, CRUD_QUERY_PARSER);\r\n\r\n if (!parser) {\r\n new Logger('ParseCrudRequest').warn(`No crud request parser found. Please, define one with @Crud() or pass to @ParseCrudRequest()`);\r\n\r\n return createCrudRequest();\r\n }\r\n\r\n return parser.parse(request.query);\r\n}\r\n","import { GetManyResult } from '../models/get-many-result';\r\nimport { CrudRequest } from '../models/crud-request';\r\n\r\n/**\r\n * Creates a CrudRequest object, filling required missing properties with empty values\r\n */\r\nexport function createCrudRequest(crudRequest?: Partial<CrudRequest>): CrudRequest {\r\n return {\r\n select: [],\r\n relations: [],\r\n order: [],\r\n where: { and: [] },\r\n ...crudRequest,\r\n };\r\n}\r\n\r\n/**\r\n * Creates a GetManyResult object\r\n *\r\n * @param data The entity list to be returned\r\n * @param total The total amount of entities in the database\r\n * @param offset The offset used for querying\r\n * @param limit The limit used for querying\r\n */\r\nexport function createGetManyResult<T>(data: T[], total: number, offset: number, limit?: number): GetManyResult<T> {\r\n const count = data.length;\r\n const actualLimit = limit ?? total;\r\n const page = actualLimit > 0 ? Math.floor(offset / actualLimit) + 1 : 1;\r\n const pageCount = actualLimit > 0 ? Math.ceil(total / actualLimit) : 0;\r\n\r\n return {\r\n data,\r\n count,\r\n total,\r\n page,\r\n pageCount,\r\n };\r\n}\r\n"],"mappings":"4dAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,uBAAAE,EAAA,SAAAC,EAAA,qBAAAC,IAAA,eAAAC,EAAAL,GCAA,IAAAM,EAAyE,0BC8ClE,SAASC,EAAiCC,EAAyD,CACxG,GAAI,OAAOA,GAAoB,WAC7B,OAAO,IAAIA,EAEb,GAAI,OAAOA,GAAoB,SAC7B,OAAOA,CAGX,CARgBC,EAAAF,EAAA,kBC9ChB,IAAAG,EAA+C,0BCMxC,SAASC,EAAkBC,EAAiD,CACjF,MAAO,CACL,OAAQ,CAAC,EACT,UAAW,CAAC,EACZ,MAAO,CAAC,EACR,MAAO,CAAE,IAAK,CAAC,CAAE,EACjB,GAAGA,CACL,CACF,CARgBC,EAAAF,EAAA,qBDCT,IAAMG,EAAoB,oBAEpBC,GAAY,IAAM,CAC7B,GAAI,CACF,MAAO,SAAQ,iBAAiB,EAAE,QACpC,MAAgB,CACd,OAAQC,GACC,IAAM,CAAC,CAElB,CACF,GAAG,EAEI,SAASC,EAA0BC,EAA2BC,EAA4B,CAC/F,IAAMC,EAAU,CACdF,EAAQ,WAAW,EACnBA,EAAQ,SAAS,CACnB,EAEA,QAAWG,KAAUD,EAAS,CAC5B,IAAME,EAAO,QAAQ,YAAYH,EAAKE,CAAM,EAE5C,GAAIC,EACF,OAAOA,CACX,CAGF,CAdgBC,EAAAN,EAAA,0BAgBT,SAASO,EAAiBF,EAAuDG,EAAoC,CAC1H,IAAMC,EAAUD,EAAI,aAAa,EAAE,WAAW,EACxCE,EAASL,EAAOM,EAAeN,CAAI,EAAIL,EAAsCQ,EAAKX,CAAiB,EAEzG,OAAKa,EAMEA,EAAO,MAAMD,EAAQ,KAAK,GAL/B,IAAI,SAAO,kBAAkB,EAAE,KAAK,8FAA8F,EAE3HG,EAAkB,EAI7B,CAXgBN,EAAAC,EAAA,oBFvBT,SAASM,EAAKC,EAAuF,CAC1G,IAAMC,EAASC,EAAeF,CAAc,EAE5C,GAAI,CAACC,EACH,MAAM,IAAI,MAAM,iDAAiD,EAGnE,IAAME,EAAUF,EAAO,qBAAqB,EAAE,IAAIG,GAASC,EAASD,CAAK,CAAC,EAE1E,SAAO,sBACL,eAAYE,EAAmBL,CAAM,EACrC,GAAGE,CACL,CACF,CAbgBI,EAAAR,EAAA,QAkBT,IAAMS,KAAmB,wBAA0DC,CAAgB","names":["nestjs_exports","__export","CRUD_QUERY_PARSER","Crud","ParseCrudRequest","__toCommonJS","import_common","createInstance","clazzOrInstance","__name","import_common","createCrudRequest","crudRequest","__name","CRUD_QUERY_PARSER","ApiQuery","options","getMetadataFromContext","context","key","targets","target","data","__name","parseCrudRequest","ctx","request","parser","createInstance","createCrudRequest","Crud","parserContract","parser","createInstance","openApi","param","ApiQuery","CRUD_QUERY_PARSER","__name","ParseCrudRequest","parseCrudRequest"]}
@@ -1,2 +1,2 @@
1
- var c=Object.defineProperty;var n=(e,r)=>c(e,"name",{value:r,configurable:!0}),d=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(r,t)=>(typeof require<"u"?require:r)[t]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});import{applyDecorators as f,createParamDecorator as P,Logger as m,SetMetadata as q}from"@nestjs/common";var u=(()=>{try{return d("@nestjs/swagger").ApiQuery}catch{return r=>()=>{}}})();function s(e){if(typeof e=="function")return new e;if(typeof e=="object")return e}n(s,"createInstance");function p(e,r){let t=[e.getHandler(),e.getClass()];for(let o of t){let a=Reflect.getMetadata(r,o);if(a)return a}}n(p,"getMetadataFromContext");var i="crud-query-parser";function h(e){let r=s(e);if(!r)throw new Error("The request parser passed to @Crud() is invalid");let t=r.getOpenAPIParameters().map(o=>u(o));return f(q(i,r),...t)}n(h,"Crud");var w=P((e,r)=>{let t=r.switchToHttp().getRequest(),o=e?s(e):p(r,i);return o?o.parse(t.query):(new m("ParseCrudRequest").warn("No crud request parser found. Please, define one with @Crud() or pass to @CrudRequest()"),{where:{and:[]},select:[],order:[],relations:[]})});export{i as CRUD_QUERY_PARSER,h as Crud,w as ParseCrudRequest};
1
+ var c=Object.defineProperty;var t=(e,r)=>c(e,"name",{value:r,configurable:!0}),m=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(r,n)=>(typeof require<"u"?require:r)[n]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});import{applyDecorators as y,createParamDecorator as l,SetMetadata as g}from"@nestjs/common";function u(e){if(typeof e=="function")return new e;if(typeof e=="object")return e}t(u,"createInstance");import{Logger as d}from"@nestjs/common";function p(e){return{select:[],relations:[],order:[],where:{and:[]},...e}}t(p,"createCrudRequest");var s="crud-query-parser",a=(()=>{try{return m("@nestjs/swagger").ApiQuery}catch{return r=>()=>{}}})();function R(e,r){let n=[e.getHandler(),e.getClass()];for(let o of n){let i=Reflect.getMetadata(r,o);if(i)return i}}t(R,"getMetadataFromContext");function f(e,r){let n=r.switchToHttp().getRequest(),o=e?u(e):R(r,s);return o?o.parse(n.query):(new d("ParseCrudRequest").warn("No crud request parser found. Please, define one with @Crud() or pass to @ParseCrudRequest()"),p())}t(f,"parseCrudRequest");function S(e){let r=u(e);if(!r)throw new Error("The request parser passed to @Crud() is invalid");let n=r.getOpenAPIParameters().map(o=>a(o));return y(g(s,r),...n)}t(S,"Crud");var v=l(f);export{s as CRUD_QUERY_PARSER,S as Crud,v as ParseCrudRequest};
2
2
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/helpers/nestjs/decorators.ts","../../../src/helpers/nestjs/utils.ts"],"sourcesContent":["import { applyDecorators, createParamDecorator, ExecutionContext, Logger, SetMetadata, Type } from '@nestjs/common';\r\nimport { RequestParser } from '../../models/request-parser';\r\nimport { ApiQuery, createInstance, getMetadataFromContext } from './utils';\r\n\r\nexport const CRUD_QUERY_PARSER = 'crud-query-parser';\r\n\r\n/**\r\n * Defines which parser will be used for parsing the request\r\n *\r\n * @param parserContract The parser that will be used\r\n */\r\nexport function Crud(parserContract: RequestParser | Type<RequestParser>): MethodDecorator & ClassDecorator {\r\n const parser = createInstance(parserContract);\r\n\r\n if (!parser) {\r\n throw new Error('The request parser passed to @Crud() is invalid');\r\n }\r\n\r\n const openApi = parser.getOpenAPIParameters().map(param => ApiQuery(param));\r\n\r\n return applyDecorators(\r\n SetMetadata(CRUD_QUERY_PARSER, parser),\r\n ...openApi,\r\n );\r\n}\r\n\r\n/**\r\n * A parameter decorator that converts the query string into a `CrudRequest` object\r\n */\r\nexport const ParseCrudRequest = createParamDecorator<RequestParser | Type<RequestParser>>(\r\n (data: RequestParser | Type<RequestParser>, ctx: ExecutionContext) => {\r\n const request = ctx.switchToHttp().getRequest();\r\n const parser = data ? createInstance(data) : getMetadataFromContext<RequestParser>(ctx, CRUD_QUERY_PARSER);\r\n\r\n if (!parser) {\r\n new Logger('ParseCrudRequest').warn(`No crud request parser found. Please, define one with @Crud() or pass to @CrudRequest()`);\r\n\r\n return {\r\n where: { and: [] },\r\n select: [],\r\n order: [],\r\n relations: [],\r\n };\r\n }\r\n\r\n return parser.parse(request.query);\r\n },\r\n);\r\n\r\n","import { ExecutionContext, Type } from '@nestjs/common';\r\nimport { OpenAPIParameter } from '../../models/openapi-parameter';\r\nimport { RequestParser } from '../../models/request-parser';\r\n\r\nexport const ApiQuery = (() => {\r\n try {\r\n return require('@nestjs/swagger').ApiQuery;\r\n } catch (error) {\r\n return (options: OpenAPIParameter): MethodDecorator => {\r\n return () => {};\r\n };\r\n }\r\n})();\r\n\r\nexport function createInstance<T extends RequestParser>(data: T | Type<T> | undefined): T | undefined {\r\n if (typeof data === 'function')\r\n return new data();\r\n\r\n if (typeof data === 'object')\r\n return data as T;\r\n\r\n return undefined;\r\n}\r\n\r\nexport function getMetadataFromContext<T>(context: ExecutionContext, key: string): T | undefined {\r\n const targets = [\r\n context.getHandler(),\r\n context.getClass(),\r\n ];\r\n\r\n for (const target of targets) {\r\n const data = Reflect.getMetadata(key, target);\r\n\r\n if (data)\r\n return data;\r\n }\r\n\r\n return undefined;\r\n}\r\n"],"mappings":"oUAAA,OAAS,mBAAAA,EAAiB,wBAAAC,EAAwC,UAAAC,EAAQ,eAAAC,MAAyB,iBCI5F,IAAMC,GAAY,IAAM,CAC7B,GAAI,CACF,MAAO,GAAQ,iBAAiB,EAAE,QACpC,MAAgB,CACd,OAAQC,GACC,IAAM,CAAC,CAElB,CACF,GAAG,EAEI,SAASC,EAAwCC,EAA8C,CACpG,GAAI,OAAOA,GAAS,WAClB,OAAO,IAAIA,EAEb,GAAI,OAAOA,GAAS,SAClB,OAAOA,CAGX,CARgBC,EAAAF,EAAA,kBAUT,SAASG,EAA0BC,EAA2BC,EAA4B,CAC/F,IAAMC,EAAU,CACdF,EAAQ,WAAW,EACnBA,EAAQ,SAAS,CACnB,EAEA,QAAWG,KAAUD,EAAS,CAC5B,IAAML,EAAO,QAAQ,YAAYI,EAAKE,CAAM,EAE5C,GAAIN,EACF,OAAOA,CACX,CAGF,CAdgBC,EAAAC,EAAA,0BDpBT,IAAMK,EAAoB,oBAO1B,SAASC,EAAKC,EAAuF,CAC1G,IAAMC,EAASC,EAAeF,CAAc,EAE5C,GAAI,CAACC,EACH,MAAM,IAAI,MAAM,iDAAiD,EAGnE,IAAME,EAAUF,EAAO,qBAAqB,EAAE,IAAIG,GAASC,EAASD,CAAK,CAAC,EAE1E,OAAOE,EACLC,EAAYT,EAAmBG,CAAM,EACrC,GAAGE,CACL,CACF,CAbgBK,EAAAT,EAAA,QAkBT,IAAMU,EAAmBC,EAC9B,CAACC,EAA2CC,IAA0B,CACpE,IAAMC,EAAUD,EAAI,aAAa,EAAE,WAAW,EACxCX,EAASU,EAAOT,EAAeS,CAAI,EAAIG,EAAsCF,EAAKd,CAAiB,EAEzG,OAAKG,EAWEA,EAAO,MAAMY,EAAQ,KAAK,GAV/B,IAAIE,EAAO,kBAAkB,EAAE,KAAK,yFAAyF,EAEtH,CACL,MAAO,CAAE,IAAK,CAAC,CAAE,EACjB,OAAQ,CAAC,EACT,MAAO,CAAC,EACR,UAAW,CAAC,CACd,EAIJ,CACF","names":["applyDecorators","createParamDecorator","Logger","SetMetadata","ApiQuery","options","createInstance","data","__name","getMetadataFromContext","context","key","targets","target","CRUD_QUERY_PARSER","Crud","parserContract","parser","createInstance","openApi","param","ApiQuery","applyDecorators","SetMetadata","__name","ParseCrudRequest","createParamDecorator","data","ctx","request","getMetadataFromContext","Logger"]}
1
+ {"version":3,"sources":["../../../src/helpers/nestjs/decorators.ts","../../../src/utils/functions.ts","../../../src/helpers/nestjs/utils.ts","../../../src/utils/objects.ts"],"sourcesContent":["import { applyDecorators, createParamDecorator, SetMetadata, Type } from '@nestjs/common';\r\nimport { RequestParser } from '../../models/request-parser';\r\nimport { createInstance } from '../../utils/functions';\r\nimport { ApiQuery, CRUD_QUERY_PARSER, parseCrudRequest } from './utils';\r\n\r\nexport { CRUD_QUERY_PARSER } from './utils';\r\n\r\n/**\r\n * Defines which parser will be used for parsing the request. This also adds the OpenAPI query parameters.\r\n *\r\n * @param parserContract The parser that will be used\r\n */\r\nexport function Crud(parserContract: RequestParser | Type<RequestParser>): MethodDecorator & ClassDecorator {\r\n const parser = createInstance(parserContract);\r\n\r\n if (!parser) {\r\n throw new Error('The request parser passed to @Crud() is invalid');\r\n }\r\n\r\n const openApi = parser.getOpenAPIParameters().map(param => ApiQuery(param));\r\n\r\n return applyDecorators(\r\n SetMetadata(CRUD_QUERY_PARSER, parser),\r\n ...openApi,\r\n );\r\n}\r\n\r\n/**\r\n * A parameter decorator that converts the query string into a `CrudRequest` object\r\n */\r\nexport const ParseCrudRequest = createParamDecorator<RequestParser | Type<RequestParser>>(parseCrudRequest);\r\n","export function ensurePrimitive(fieldName: string, data: any): number | string | boolean | Date {\r\n if (typeof data === 'number' || typeof data === 'string' || typeof data === 'boolean' || data instanceof Date)\r\n return data;\r\n\r\n throw new Error(`${fieldName} must be a string, number or boolean`);\r\n}\r\n\r\nexport function ensurePrimitiveOrNull(fieldName: string, data: any): number | string | boolean | Date | undefined | null {\r\n if (data === null || data === undefined)\r\n return data;\r\n\r\n if (typeof data === 'number' || typeof data === 'string' || typeof data === 'boolean' || data instanceof Date)\r\n return data;\r\n\r\n throw new Error(`${fieldName} must be a string, number, boolean or null`);\r\n}\r\n\r\nexport function ensureString(fieldName: string, data: any): string {\r\n if (typeof data === 'string')\r\n return data;\r\n\r\n throw new Error(`${fieldName} must be a string`);\r\n}\r\n\r\nexport function ensureArray<T>(fieldName: string, data: T[] | any, minLength: number = 0): T[] {\r\n if (!Array.isArray(data) || data.length < minLength)\r\n throw new Error(`${fieldName} must be an array with at least ${minLength} items`);\r\n\r\n return data;\r\n}\r\n\r\nexport function ensureEmpty(fieldName: string, data: any) {\r\n if (isValid(data) && data !== true)\r\n throw new Error(`${fieldName} must be true, null or undefined`);\r\n}\r\n\r\nexport function isValid<T>(value: T | undefined | null): value is T {\r\n return value !== null && value !== undefined;\r\n}\r\n\r\nexport function getOffset(offset: number | undefined, limit?: number, page?: number): number {\r\n return offset ?? (limit && page ? limit * (page - 1) : 0);\r\n}\r\n\r\nexport interface Type<T> extends Function { new (... args: any[]): T; }\r\n\r\nexport function createInstance<T extends object>(clazzOrInstance: T | Type<T> | undefined): T | undefined {\r\n if (typeof clazzOrInstance === 'function')\r\n return new clazzOrInstance();\r\n\r\n if (typeof clazzOrInstance === 'object')\r\n return clazzOrInstance as T;\r\n\r\n return undefined;\r\n}\r\n\r\nexport function escapeRegex(str: string): string {\r\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\r\n}\r\n","import { ExecutionContext, Logger, Type } from '@nestjs/common';\r\nimport { OpenAPIParameter } from '../../models/openapi-parameter';\r\nimport { RequestParser } from '../../models/request-parser';\r\nimport { CrudRequest } from '../../models/crud-request';\r\nimport { createInstance } from '../../utils/functions';\r\nimport { createCrudRequest } from '../../utils/objects';\r\n\r\nexport const CRUD_QUERY_PARSER = 'crud-query-parser';\r\n\r\nexport const ApiQuery = (() => {\r\n try {\r\n return require('@nestjs/swagger').ApiQuery; // TODO ES6 imports?\r\n } catch (error) {\r\n return (options: OpenAPIParameter): MethodDecorator => {\r\n return () => {};\r\n };\r\n }\r\n})();\r\n\r\nexport function getMetadataFromContext<T>(context: ExecutionContext, key: string): T | undefined {\r\n const targets = [\r\n context.getHandler(),\r\n context.getClass(),\r\n ];\r\n\r\n for (const target of targets) {\r\n const data = Reflect.getMetadata(key, target);\r\n\r\n if (data)\r\n return data;\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\nexport function parseCrudRequest(data: RequestParser | Type<RequestParser> | undefined, ctx: ExecutionContext): CrudRequest {\r\n const request = ctx.switchToHttp().getRequest();\r\n const parser = data ? createInstance(data) : getMetadataFromContext<RequestParser>(ctx, CRUD_QUERY_PARSER);\r\n\r\n if (!parser) {\r\n new Logger('ParseCrudRequest').warn(`No crud request parser found. Please, define one with @Crud() or pass to @ParseCrudRequest()`);\r\n\r\n return createCrudRequest();\r\n }\r\n\r\n return parser.parse(request.query);\r\n}\r\n","import { GetManyResult } from '../models/get-many-result';\r\nimport { CrudRequest } from '../models/crud-request';\r\n\r\n/**\r\n * Creates a CrudRequest object, filling required missing properties with empty values\r\n */\r\nexport function createCrudRequest(crudRequest?: Partial<CrudRequest>): CrudRequest {\r\n return {\r\n select: [],\r\n relations: [],\r\n order: [],\r\n where: { and: [] },\r\n ...crudRequest,\r\n };\r\n}\r\n\r\n/**\r\n * Creates a GetManyResult object\r\n *\r\n * @param data The entity list to be returned\r\n * @param total The total amount of entities in the database\r\n * @param offset The offset used for querying\r\n * @param limit The limit used for querying\r\n */\r\nexport function createGetManyResult<T>(data: T[], total: number, offset: number, limit?: number): GetManyResult<T> {\r\n const count = data.length;\r\n const actualLimit = limit ?? total;\r\n const page = actualLimit > 0 ? Math.floor(offset / actualLimit) + 1 : 1;\r\n const pageCount = actualLimit > 0 ? Math.ceil(total / actualLimit) : 0;\r\n\r\n return {\r\n data,\r\n count,\r\n total,\r\n page,\r\n pageCount,\r\n };\r\n}\r\n"],"mappings":"oUAAA,OAAS,mBAAAA,EAAiB,wBAAAC,EAAsB,eAAAC,MAAyB,iBC8ClE,SAASC,EAAiCC,EAAyD,CACxG,GAAI,OAAOA,GAAoB,WAC7B,OAAO,IAAIA,EAEb,GAAI,OAAOA,GAAoB,SAC7B,OAAOA,CAGX,CARgBC,EAAAF,EAAA,kBC9ChB,OAA2B,UAAAG,MAAoB,iBCMxC,SAASC,EAAkBC,EAAiD,CACjF,MAAO,CACL,OAAQ,CAAC,EACT,UAAW,CAAC,EACZ,MAAO,CAAC,EACR,MAAO,CAAE,IAAK,CAAC,CAAE,EACjB,GAAGA,CACL,CACF,CARgBC,EAAAF,EAAA,qBDCT,IAAMG,EAAoB,oBAEpBC,GAAY,IAAM,CAC7B,GAAI,CACF,MAAO,GAAQ,iBAAiB,EAAE,QACpC,MAAgB,CACd,OAAQC,GACC,IAAM,CAAC,CAElB,CACF,GAAG,EAEI,SAASC,EAA0BC,EAA2BC,EAA4B,CAC/F,IAAMC,EAAU,CACdF,EAAQ,WAAW,EACnBA,EAAQ,SAAS,CACnB,EAEA,QAAWG,KAAUD,EAAS,CAC5B,IAAME,EAAO,QAAQ,YAAYH,EAAKE,CAAM,EAE5C,GAAIC,EACF,OAAOA,CACX,CAGF,CAdgBC,EAAAN,EAAA,0BAgBT,SAASO,EAAiBF,EAAuDG,EAAoC,CAC1H,IAAMC,EAAUD,EAAI,aAAa,EAAE,WAAW,EACxCE,EAASL,EAAOM,EAAeN,CAAI,EAAIL,EAAsCQ,EAAKX,CAAiB,EAEzG,OAAKa,EAMEA,EAAO,MAAMD,EAAQ,KAAK,GAL/B,IAAIG,EAAO,kBAAkB,EAAE,KAAK,8FAA8F,EAE3HC,EAAkB,EAI7B,CAXgBP,EAAAC,EAAA,oBFvBT,SAASO,EAAKC,EAAuF,CAC1G,IAAMC,EAASC,EAAeF,CAAc,EAE5C,GAAI,CAACC,EACH,MAAM,IAAI,MAAM,iDAAiD,EAGnE,IAAME,EAAUF,EAAO,qBAAqB,EAAE,IAAIG,GAASC,EAASD,CAAK,CAAC,EAE1E,OAAOE,EACLC,EAAYC,EAAmBP,CAAM,EACrC,GAAGE,CACL,CACF,CAbgBM,EAAAV,EAAA,QAkBT,IAAMW,EAAmBC,EAA0DC,CAAgB","names":["applyDecorators","createParamDecorator","SetMetadata","createInstance","clazzOrInstance","__name","Logger","createCrudRequest","crudRequest","__name","CRUD_QUERY_PARSER","ApiQuery","options","getMetadataFromContext","context","key","targets","target","data","__name","parseCrudRequest","ctx","request","parser","createInstance","Logger","createCrudRequest","Crud","parserContract","parser","createInstance","openApi","param","ApiQuery","applyDecorators","SetMetadata","CRUD_QUERY_PARSER","__name","ParseCrudRequest","createParamDecorator","parseCrudRequest"]}
package/dist/index.d.mts CHANGED
@@ -1,4 +1,12 @@
1
- export { G as GetManyResult, Q as QueryAdapter } from './query-adapter-CeTK3yxp.mjs';
2
- export { R as RequestParamValue, a as RequestParser } from './request-parser-BMkszvGr.mjs';
3
- export { c as CrudRequest, C as CrudRequestFields, b as CrudRequestOrder, a as CrudRequestRelation, d as CrudRequestWhere, e as CrudRequestWhereAND, g as CrudRequestWhereField, f as CrudRequestWhereOR, i as CrudRequestWhereOperator, h as CrudRequestWhereValueType, F as FieldPath, P as ParsedRequestSelect } from './crud-request-x16CuDRF.mjs';
4
- export { C as CrudRequestWhereBuilder } from './crud-request-where.builder-BwWLx0Bh.mjs';
1
+ export { G as GetManyResult, Q as QueryAdapter } from './query-adapter-sgeUb8CV.mjs';
2
+ export { R as RequestParamValue, a as RequestParser } from './request-parser-DzuXbRsB.mjs';
3
+ import { C as CrudRequest } from './crud-request-DLo0ZuzD.mjs';
4
+ export { a as CrudRequestFields, c as CrudRequestOrder, b as CrudRequestRelation, d as CrudRequestWhere, e as CrudRequestWhereAND, g as CrudRequestWhereField, f as CrudRequestWhereOR, i as CrudRequestWhereOperator, h as CrudRequestWhereValueType, F as FieldPath, P as ParsedRequestSelect } from './crud-request-DLo0ZuzD.mjs';
5
+ export { C as CrudRequestWhereBuilder } from './crud-request-where.builder-CBx-JZhl.mjs';
6
+
7
+ /**
8
+ * Creates a CrudRequest object, filling required missing properties with empty values
9
+ */
10
+ declare function createCrudRequest(crudRequest?: Partial<CrudRequest>): CrudRequest;
11
+
12
+ export { CrudRequest, createCrudRequest };
package/dist/index.d.ts CHANGED
@@ -1,4 +1,12 @@
1
- export { G as GetManyResult, Q as QueryAdapter } from './query-adapter-CEcyFcWr.js';
2
- export { R as RequestParamValue, a as RequestParser } from './request-parser-BxVulcsX.js';
3
- export { c as CrudRequest, C as CrudRequestFields, b as CrudRequestOrder, a as CrudRequestRelation, d as CrudRequestWhere, e as CrudRequestWhereAND, g as CrudRequestWhereField, f as CrudRequestWhereOR, i as CrudRequestWhereOperator, h as CrudRequestWhereValueType, F as FieldPath, P as ParsedRequestSelect } from './crud-request-x16CuDRF.js';
4
- export { C as CrudRequestWhereBuilder } from './crud-request-where.builder-B5241Aht.js';
1
+ export { G as GetManyResult, Q as QueryAdapter } from './query-adapter-CZhPC1aq.js';
2
+ export { R as RequestParamValue, a as RequestParser } from './request-parser-Cr3cxMRw.js';
3
+ import { C as CrudRequest } from './crud-request-DLo0ZuzD.js';
4
+ export { a as CrudRequestFields, c as CrudRequestOrder, b as CrudRequestRelation, d as CrudRequestWhere, e as CrudRequestWhereAND, g as CrudRequestWhereField, f as CrudRequestWhereOR, i as CrudRequestWhereOperator, h as CrudRequestWhereValueType, F as FieldPath, P as ParsedRequestSelect } from './crud-request-DLo0ZuzD.js';
5
+ export { C as CrudRequestWhereBuilder } from './crud-request-where.builder-CqbP5LT9.js';
6
+
7
+ /**
8
+ * Creates a CrudRequest object, filling required missing properties with empty values
9
+ */
10
+ declare function createCrudRequest(crudRequest?: Partial<CrudRequest>): CrudRequest;
11
+
12
+ export { CrudRequest, createCrudRequest };
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";var l=Object.defineProperty;var d=Object.getOwnPropertyDescriptor;var R=Object.getOwnPropertyNames;var E=Object.prototype.hasOwnProperty;var o=(r,e)=>l(r,"name",{value:e,configurable:!0});var W=(r,e)=>{for(var n in e)l(r,n,{get:e[n],enumerable:!0})},V=(r,e,n,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let u of R(e))!E.call(r,u)&&u!==n&&l(r,u,{get:()=>e[u],enumerable:!(i=d(e,u))||i.enumerable});return r};var f=r=>V(l({},"__esModule",{value:!0}),r);var O={};W(O,{CrudRequestWhereBuilder:()=>a,CrudRequestWhereOperator:()=>T});module.exports=f(O);var T=(t=>(t.EQ="eq",t.NEQ="neq",t.GT="gt",t.GTE="gte",t.LT="lt",t.LTE="lte",t.STARTS="starts",t.ENDS="ends",t.CONTAINS="contains",t.NOT_CONTAINS="not_contains",t.IN="in",t.NOT_IN="not_in",t.BETWEEN="between",t.IS_NULL="is_null",t.NOT_NULL="not_null",t.EQ_LOWER="eq_lower",t.NEQ_LOWER="neq_lower",t.STARTS_LOWER="starts_lower",t.ENDS_LOWER="ends_lower",t.CONTAINS_LOWER="contains_lower",t.NOT_CONTAINS_LOWER="not_contains_lower",t.IN_LOWER="in_lower",t.NOT_IN_LOWER="not_in_lower",t))(T||{});function p(r,e){if(e!=null&&!(typeof e=="number"||typeof e=="string"||typeof e=="boolean")&&!(e instanceof Date))throw new Error(`${r} must be a string, number, boolean or null`)}o(p,"ensurePrimitive");function s(r,e,n=0){if(!Array.isArray(e)||e.length<n)throw new Error(`${r} must be an array with at least ${n} items`);return e}o(s,"ensureArray");function h(r,e){if(y(e)&&e!==!0)throw new Error(`${r} must be true, null or undefined`)}o(h,"ensureEmpty");function y(r){return r!=null}o(y,"isValid");var N={eq:"primitive",neq:"primitive",gt:"primitive",lt:"primitive",gte:"primitive",lte:"primitive",starts:"primitive",ends:"primitive",contains:"primitive",not_contains:"primitive",in:"array",not_in:"array",between:"array",is_null:"empty",not_null:"empty",eq_lower:"primitive",neq_lower:"primitive",starts_lower:"primitive",ends_lower:"primitive",contains_lower:"primitive",not_contains_lower:"primitive",in_lower:"primitive",not_in_lower:"primitive"};function I(r){let e=N[r.operator],n="The value of the operator "+r.operator;if(e==="primitive"){p(n,r.value);return}if(e==="array"){s(n,r.value).forEach(u=>p(n+" children",u));return}if(e==="empty"){h(n,r.value);return}}o(I,"validateWhereField");var a=class r{constructor(e={and:[]},n){this.where=e;this.parent=n}static{o(this,"CrudRequestWhereBuilder")}addAnd(){if(!this.where.or)return this;let e={and:[]},n=new r(e,this);return this.where.or.push(e),n}addOr(){if(!this.where.and)return this;let e={or:[]},n=new r(e,this);return this.where.and.push(e),n}addField(e,n,i){let u={field:e,operator:n,value:i};if(I(u),this.where.and)this.where.and.push(u);else if(this.where.or)this.where.or.push(u);else throw new Error("Invalid where");return this}build(){return this.parent?this.parent.build():this.where}};0&&(module.exports={CrudRequestWhereBuilder,CrudRequestWhereOperator});
1
+ "use strict";var l=Object.defineProperty;var R=Object.getOwnPropertyDescriptor;var d=Object.getOwnPropertyNames;var E=Object.prototype.hasOwnProperty;var o=(r,e)=>l(r,"name",{value:e,configurable:!0});var y=(r,e)=>{for(var n in e)l(r,n,{get:e[n],enumerable:!0})},W=(r,e,n,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let u of d(e))!E.call(r,u)&&u!==n&&l(r,u,{get:()=>e[u],enumerable:!(i=R(e,u))||i.enumerable});return r};var N=r=>W(l({},"__esModule",{value:!0}),r);var V={};y(V,{CrudRequestWhereBuilder:()=>T,CrudRequestWhereOperator:()=>s,createCrudRequest:()=>I});module.exports=N(V);var s=(t=>(t.EQ="eq",t.NEQ="neq",t.GT="gt",t.GTE="gte",t.LT="lt",t.LTE="lte",t.STARTS="starts",t.ENDS="ends",t.CONTAINS="contains",t.NOT_CONTAINS="not_contains",t.IN="in",t.NOT_IN="not_in",t.BETWEEN="between",t.IS_NULL="is_null",t.NOT_NULL="not_null",t.EQ_LOWER="eq_lower",t.NEQ_LOWER="neq_lower",t.STARTS_LOWER="starts_lower",t.ENDS_LOWER="ends_lower",t.CONTAINS_LOWER="contains_lower",t.NOT_CONTAINS_LOWER="not_contains_lower",t.IN_LOWER="in_lower",t.NOT_IN_LOWER="not_in_lower",t))(s||{});function p(r,e){if(e==null||typeof e=="number"||typeof e=="string"||typeof e=="boolean"||e instanceof Date)return e;throw new Error(`${r} must be a string, number, boolean or null`)}o(p,"ensurePrimitiveOrNull");function a(r,e,n=0){if(!Array.isArray(e)||e.length<n)throw new Error(`${r} must be an array with at least ${n} items`);return e}o(a,"ensureArray");function h(r,e){if(c(e)&&e!==!0)throw new Error(`${r} must be true, null or undefined`)}o(h,"ensureEmpty");function c(r){return r!=null}o(c,"isValid");var m={eq:"primitive",neq:"primitive",gt:"primitive",lt:"primitive",gte:"primitive",lte:"primitive",starts:"primitive",ends:"primitive",contains:"primitive",not_contains:"primitive",in:"array",not_in:"array",between:"array",is_null:"empty",not_null:"empty",eq_lower:"primitive",neq_lower:"primitive",starts_lower:"primitive",ends_lower:"primitive",contains_lower:"primitive",not_contains_lower:"primitive",in_lower:"primitive",not_in_lower:"primitive"};function f(r){let e=m[r.operator],n="The value of the operator "+r.operator;if(e==="primitive"){p(n,r.value);return}if(e==="array"){a(n,r.value).forEach(u=>p(n+" children",u));return}if(e==="empty"){h(n,r.value);return}}o(f,"validateWhereField");var T=class r{constructor(e={and:[]},n){this.where=e;this.parent=n}static{o(this,"CrudRequestWhereBuilder")}addAnd(){if(!this.where.or)return this;let e={and:[]},n=new r(e,this);return this.where.or.push(e),n}addOr(){if(!this.where.and)return this;let e={or:[]},n=new r(e,this);return this.where.and.push(e),n}addField(e,n,i){let u={field:e,operator:n,value:i};if(f(u),this.where.and)this.where.and.push(u);else if(this.where.or)this.where.or.push(u);else throw new Error("Invalid where");return this}build(){return this.parent?this.parent.build():this.where}};function I(r){return{select:[],relations:[],order:[],where:{and:[]},...r}}o(I,"createCrudRequest");0&&(module.exports={CrudRequestWhereBuilder,CrudRequestWhereOperator,createCrudRequest});
2
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/models/crud-request-where.ts","../src/utils/functions.ts","../src/utils/where.ts","../src/utils/crud-request-where.builder.ts"],"sourcesContent":["// Models\r\nexport * from './models/query-adapter';\r\nexport * from './models/request-parser';\r\n\r\nexport * from './models/get-many-result';\r\nexport * from './models/field-path';\r\nexport * from './models/crud-request';\r\nexport * from './models/crud-request-where';\r\n\r\n// Utilities\r\nexport * from './utils/crud-request-where.builder';\r\n\r\n","import { FieldPath } from './field-path';\r\n\r\nexport type CrudRequestWhere = CrudRequestWhereAND | CrudRequestWhereOR | CrudRequestWhereField;\r\n\r\nexport interface CrudRequestWhereAND {\r\n field?: never;\r\n or?: never;\r\n and: CrudRequestWhere[];\r\n}\r\n\r\nexport interface CrudRequestWhereOR {\r\n field?: never;\r\n or: CrudRequestWhere[];\r\n and?: never;\r\n}\r\n\r\nexport interface CrudRequestWhereField {\r\n\r\n /**\r\n * Field path\r\n *\r\n * For post.category.name, this would be [\"post\", \"category\", \"name\"]\r\n */\r\n field: FieldPath;\r\n\r\n /**\r\n * The operator of the comparison\r\n */\r\n operator: CrudRequestWhereOperator;\r\n\r\n /**\r\n * The value to compare\r\n */\r\n value: CrudRequestWhereValueType | CrudRequestWhereValueType[];\r\n\r\n or?: never;\r\n and?: never;\r\n}\r\n\r\nexport type CrudRequestWhereValueType = string | number | boolean | Date | null | undefined;\r\n\r\nexport enum CrudRequestWhereOperator {\r\n EQ = 'eq',\r\n NEQ = 'neq',\r\n GT = 'gt',\r\n GTE = 'gte',\r\n LT = 'lt',\r\n LTE = 'lte',\r\n STARTS = 'starts',\r\n ENDS = 'ends',\r\n CONTAINS = 'contains',\r\n NOT_CONTAINS = 'not_contains',\r\n IN = 'in',\r\n NOT_IN = 'not_in',\r\n BETWEEN = 'between',\r\n IS_NULL = 'is_null',\r\n NOT_NULL = 'not_null',\r\n EQ_LOWER = 'eq_lower',\r\n NEQ_LOWER = 'neq_lower',\r\n STARTS_LOWER = 'starts_lower',\r\n ENDS_LOWER = 'ends_lower',\r\n CONTAINS_LOWER = 'contains_lower',\r\n NOT_CONTAINS_LOWER = 'not_contains_lower',\r\n IN_LOWER = 'in_lower',\r\n NOT_IN_LOWER = 'not_in_lower',\r\n}\r\n","import { CrudRequestFields } from '../models/crud-request';\r\n\r\n/*export function setFieldByPath<T>(obj: ParsedRequestFields<T>, field: string, value: T): void {\r\n const parts = field.split('.');\r\n\r\n while (parts.length > 1) {\r\n const name = parts.shift();\r\n\r\n if (!Array.isArray(obj[name]))\r\n obj[name] = {};\r\n\r\n obj = obj[name] as ParsedRequestFields<T>;\r\n }\r\n\r\n obj[parts.shift()] = value;\r\n}*/\r\n\r\nexport function ensurePrimitive(fieldName: string, data: any) {\r\n if (data === null || data === undefined)\r\n return;\r\n\r\n if (typeof data === 'number' || typeof data === 'string' || typeof data === 'boolean')\r\n return;\r\n\r\n if (data instanceof Date)\r\n return;\r\n\r\n throw new Error(`${fieldName} must be a string, number, boolean or null`);\r\n}\r\n\r\nexport function ensureArray<T>(fieldName: string, data: T[] | any, minLength: number = 0): T[] {\r\n if (!Array.isArray(data) || data.length < minLength)\r\n throw new Error(`${fieldName} must be an array with at least ${minLength} items`);\r\n\r\n return data;\r\n}\r\n\r\nexport function ensureEmpty(fieldName: string, data: any) {\r\n if (isValid(data) && data !== true)\r\n throw new Error(`${fieldName} must be true, null or undefined`);\r\n}\r\n\r\nexport function isValid<T>(value: T | undefined | null): value is T {\r\n return value !== null && value !== undefined;\r\n}\r\n\r\nexport function getOffset(offset: number | undefined, limit?: number, page?: number): number {\r\n return offset ?? (limit && page ? limit * page : 0);\r\n}\r\n","import { CrudRequestWhereField, CrudRequestWhereOperator } from '../models/crud-request-where';\r\nimport { ensureArray, ensureEmpty, ensurePrimitive } from './functions';\r\n\r\nexport enum WhereOperatorValueType {\r\n PRIMITIVE = 'primitive',\r\n ARRAY = 'array',\r\n EMPTY = 'empty'\r\n}\r\n\r\nconst operatorValueTypes: Record<CrudRequestWhereOperator, WhereOperatorValueType> = {\r\n [CrudRequestWhereOperator.EQ]: WhereOperatorValueType.PRIMITIVE,\r\n [CrudRequestWhereOperator.NEQ]: WhereOperatorValueType.PRIMITIVE,\r\n [CrudRequestWhereOperator.GT]: WhereOperatorValueType.PRIMITIVE,\r\n [CrudRequestWhereOperator.LT]: WhereOperatorValueType.PRIMITIVE,\r\n [CrudRequestWhereOperator.GTE]: WhereOperatorValueType.PRIMITIVE,\r\n [CrudRequestWhereOperator.LTE]: WhereOperatorValueType.PRIMITIVE,\r\n [CrudRequestWhereOperator.STARTS]: WhereOperatorValueType.PRIMITIVE,\r\n [CrudRequestWhereOperator.ENDS]: WhereOperatorValueType.PRIMITIVE,\r\n [CrudRequestWhereOperator.CONTAINS]: WhereOperatorValueType.PRIMITIVE,\r\n [CrudRequestWhereOperator.NOT_CONTAINS]: WhereOperatorValueType.PRIMITIVE,\r\n [CrudRequestWhereOperator.IN]: WhereOperatorValueType.ARRAY,\r\n [CrudRequestWhereOperator.NOT_IN]: WhereOperatorValueType.ARRAY,\r\n [CrudRequestWhereOperator.BETWEEN]: WhereOperatorValueType.ARRAY,\r\n [CrudRequestWhereOperator.IS_NULL]: WhereOperatorValueType.EMPTY,\r\n [CrudRequestWhereOperator.NOT_NULL]: WhereOperatorValueType.EMPTY,\r\n [CrudRequestWhereOperator.EQ_LOWER]: WhereOperatorValueType.PRIMITIVE,\r\n [CrudRequestWhereOperator.NEQ_LOWER]: WhereOperatorValueType.PRIMITIVE,\r\n [CrudRequestWhereOperator.STARTS_LOWER]: WhereOperatorValueType.PRIMITIVE,\r\n [CrudRequestWhereOperator.ENDS_LOWER]: WhereOperatorValueType.PRIMITIVE,\r\n [CrudRequestWhereOperator.CONTAINS_LOWER]: WhereOperatorValueType.PRIMITIVE,\r\n [CrudRequestWhereOperator.NOT_CONTAINS_LOWER]: WhereOperatorValueType.PRIMITIVE,\r\n [CrudRequestWhereOperator.IN_LOWER]: WhereOperatorValueType.PRIMITIVE,\r\n [CrudRequestWhereOperator.NOT_IN_LOWER]: WhereOperatorValueType.PRIMITIVE,\r\n};\r\n\r\nexport function getWhereOperatorValueType(op: CrudRequestWhereOperator): WhereOperatorValueType {\r\n return operatorValueTypes[op];\r\n}\r\n\r\nexport function validateWhereField(where: CrudRequestWhereField): void {\r\n const type = operatorValueTypes[where.operator];\r\n const name = 'The value of the operator ' + where.operator;\r\n\r\n if (type === WhereOperatorValueType.PRIMITIVE) {\r\n ensurePrimitive(name, where.value);\r\n\r\n return;\r\n }\r\n\r\n if (type === WhereOperatorValueType.ARRAY) {\r\n const items = ensureArray(name, where.value);\r\n\r\n items.forEach(item => ensurePrimitive(name + ' children', item));\r\n\r\n return;\r\n }\r\n\r\n if (type === WhereOperatorValueType.EMPTY) {\r\n ensureEmpty(name, where.value);\r\n\r\n return;\r\n }\r\n}\r\n","import {\r\n CrudRequestWhere,\r\n CrudRequestWhereAND,\r\n CrudRequestWhereField,\r\n CrudRequestWhereOperator,\r\n CrudRequestWhereOR,\r\n CrudRequestWhereValueType\r\n} from '../models/crud-request-where';\r\nimport { validateWhereField } from './where';\r\n\r\n/**\r\n * A helper class that makes it easier to create a CrudRequestWhere\r\n */\r\nexport class CrudRequestWhereBuilder {\r\n\r\n constructor(\r\n private readonly where: CrudRequestWhereAND | CrudRequestWhereOR = { and: [] },\r\n private readonly parent?: CrudRequestWhereBuilder,\r\n ) { }\r\n\r\n /**\r\n * Adds an AND bracket\r\n */\r\n public addAnd(): CrudRequestWhereBuilder {\r\n if (!this.where.or) {\r\n return this;\r\n }\r\n\r\n const inside: CrudRequestWhereAND = { and: [] };\r\n const builder = new CrudRequestWhereBuilder(inside, this);\r\n\r\n this.where.or.push(inside);\r\n\r\n return builder;\r\n }\r\n\r\n /**\r\n * Adds an OR bracket\r\n */\r\n public addOr(): CrudRequestWhereBuilder {\r\n if (!this.where.and) {\r\n return this;\r\n }\r\n\r\n const inside: CrudRequestWhereOR = { or: [] };\r\n const builder = new CrudRequestWhereBuilder(inside, this);\r\n\r\n this.where.and.push(inside);\r\n\r\n return builder;\r\n }\r\n\r\n /**\r\n * Adds a field comparison\r\n *\r\n * @param field The field path\r\n * @param operator The comparison operator\r\n * @param value The value to compare\r\n */\r\n public addField(\r\n field: string[],\r\n operator: CrudRequestWhereOperator,\r\n value: CrudRequestWhereValueType | CrudRequestWhereValueType[],\r\n ): CrudRequestWhereBuilder {\r\n const whereField: CrudRequestWhereField = {\r\n field,\r\n operator,\r\n value,\r\n };\r\n\r\n validateWhereField(whereField);\r\n\r\n if (this.where.and) {\r\n this.where.and.push(whereField);\r\n } else if (this.where.or) {\r\n this.where.or.push(whereField);\r\n } else {\r\n throw new Error('Invalid where');\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Constructs the final where condition\r\n */\r\n public build(): CrudRequestWhere {\r\n if (this.parent) {\r\n return this.parent.build();\r\n }\r\n\r\n return this.where;\r\n }\r\n\r\n}\r\n"],"mappings":"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","names":["src_exports","__export","CrudRequestWhereBuilder","CrudRequestWhereOperator","__toCommonJS","CrudRequestWhereOperator","ensurePrimitive","fieldName","data","__name","ensureArray","minLength","ensureEmpty","isValid","value","operatorValueTypes","validateWhereField","where","type","operatorValueTypes","name","ensurePrimitive","ensureArray","item","ensureEmpty","__name","CrudRequestWhereBuilder","_CrudRequestWhereBuilder","where","parent","__name","inside","builder","field","operator","value","whereField","validateWhereField"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/models/crud-request-where.ts","../src/utils/functions.ts","../src/utils/where.ts","../src/utils/crud-request-where.builder.ts","../src/utils/objects.ts"],"sourcesContent":["// Models\r\nexport * from './models/query-adapter';\r\nexport * from './models/request-parser';\r\n\r\nexport * from './models/get-many-result';\r\nexport * from './models/field-path';\r\nexport * from './models/crud-request';\r\nexport * from './models/crud-request-where';\r\n\r\n// Utilities\r\nexport * from './utils/crud-request-where.builder';\r\nexport { createCrudRequest } from './utils/objects';\r\n\r\n","import { FieldPath } from './field-path';\r\n\r\nexport type CrudRequestWhere = CrudRequestWhereAND | CrudRequestWhereOR | CrudRequestWhereField;\r\n\r\nexport interface CrudRequestWhereAND {\r\n field?: never;\r\n or?: never;\r\n and: CrudRequestWhere[];\r\n}\r\n\r\nexport interface CrudRequestWhereOR {\r\n field?: never;\r\n or: CrudRequestWhere[];\r\n and?: never;\r\n}\r\n\r\nexport interface CrudRequestWhereField {\r\n\r\n /**\r\n * Field path\r\n *\r\n * For post.category.name, this would be [\"post\", \"category\", \"name\"]\r\n */\r\n field: FieldPath;\r\n\r\n /**\r\n * The operator of the comparison\r\n */\r\n operator: CrudRequestWhereOperator;\r\n\r\n /**\r\n * The value to compare\r\n */\r\n value: CrudRequestWhereValueType | CrudRequestWhereValueType[];\r\n\r\n or?: never;\r\n and?: never;\r\n}\r\n\r\nexport type CrudRequestWhereValueType = string | number | boolean | Date | null | undefined;\r\n\r\nexport enum CrudRequestWhereOperator {\r\n EQ = 'eq',\r\n NEQ = 'neq',\r\n GT = 'gt',\r\n GTE = 'gte',\r\n LT = 'lt',\r\n LTE = 'lte',\r\n STARTS = 'starts',\r\n ENDS = 'ends',\r\n CONTAINS = 'contains',\r\n NOT_CONTAINS = 'not_contains',\r\n IN = 'in',\r\n NOT_IN = 'not_in',\r\n BETWEEN = 'between',\r\n IS_NULL = 'is_null',\r\n NOT_NULL = 'not_null',\r\n EQ_LOWER = 'eq_lower',\r\n NEQ_LOWER = 'neq_lower',\r\n STARTS_LOWER = 'starts_lower',\r\n ENDS_LOWER = 'ends_lower',\r\n CONTAINS_LOWER = 'contains_lower',\r\n NOT_CONTAINS_LOWER = 'not_contains_lower',\r\n IN_LOWER = 'in_lower',\r\n NOT_IN_LOWER = 'not_in_lower',\r\n}\r\n","export function ensurePrimitive(fieldName: string, data: any): number | string | boolean | Date {\r\n if (typeof data === 'number' || typeof data === 'string' || typeof data === 'boolean' || data instanceof Date)\r\n return data;\r\n\r\n throw new Error(`${fieldName} must be a string, number or boolean`);\r\n}\r\n\r\nexport function ensurePrimitiveOrNull(fieldName: string, data: any): number | string | boolean | Date | undefined | null {\r\n if (data === null || data === undefined)\r\n return data;\r\n\r\n if (typeof data === 'number' || typeof data === 'string' || typeof data === 'boolean' || data instanceof Date)\r\n return data;\r\n\r\n throw new Error(`${fieldName} must be a string, number, boolean or null`);\r\n}\r\n\r\nexport function ensureString(fieldName: string, data: any): string {\r\n if (typeof data === 'string')\r\n return data;\r\n\r\n throw new Error(`${fieldName} must be a string`);\r\n}\r\n\r\nexport function ensureArray<T>(fieldName: string, data: T[] | any, minLength: number = 0): T[] {\r\n if (!Array.isArray(data) || data.length < minLength)\r\n throw new Error(`${fieldName} must be an array with at least ${minLength} items`);\r\n\r\n return data;\r\n}\r\n\r\nexport function ensureEmpty(fieldName: string, data: any) {\r\n if (isValid(data) && data !== true)\r\n throw new Error(`${fieldName} must be true, null or undefined`);\r\n}\r\n\r\nexport function isValid<T>(value: T | undefined | null): value is T {\r\n return value !== null && value !== undefined;\r\n}\r\n\r\nexport function getOffset(offset: number | undefined, limit?: number, page?: number): number {\r\n return offset ?? (limit && page ? limit * (page - 1) : 0);\r\n}\r\n\r\nexport interface Type<T> extends Function { new (... args: any[]): T; }\r\n\r\nexport function createInstance<T extends object>(clazzOrInstance: T | Type<T> | undefined): T | undefined {\r\n if (typeof clazzOrInstance === 'function')\r\n return new clazzOrInstance();\r\n\r\n if (typeof clazzOrInstance === 'object')\r\n return clazzOrInstance as T;\r\n\r\n return undefined;\r\n}\r\n\r\nexport function escapeRegex(str: string): string {\r\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\r\n}\r\n","import { CrudRequestWhereField, CrudRequestWhereOperator } from '../models/crud-request-where';\r\nimport { ensureArray, ensureEmpty, ensurePrimitiveOrNull } from './functions';\r\n\r\nexport enum WhereOperatorValueType {\r\n PRIMITIVE = 'primitive',\r\n ARRAY = 'array',\r\n EMPTY = 'empty'\r\n}\r\n\r\nconst operatorValueTypes: Record<CrudRequestWhereOperator, WhereOperatorValueType> = {\r\n [CrudRequestWhereOperator.EQ]: WhereOperatorValueType.PRIMITIVE,\r\n [CrudRequestWhereOperator.NEQ]: WhereOperatorValueType.PRIMITIVE,\r\n [CrudRequestWhereOperator.GT]: WhereOperatorValueType.PRIMITIVE,\r\n [CrudRequestWhereOperator.LT]: WhereOperatorValueType.PRIMITIVE,\r\n [CrudRequestWhereOperator.GTE]: WhereOperatorValueType.PRIMITIVE,\r\n [CrudRequestWhereOperator.LTE]: WhereOperatorValueType.PRIMITIVE,\r\n [CrudRequestWhereOperator.STARTS]: WhereOperatorValueType.PRIMITIVE,\r\n [CrudRequestWhereOperator.ENDS]: WhereOperatorValueType.PRIMITIVE,\r\n [CrudRequestWhereOperator.CONTAINS]: WhereOperatorValueType.PRIMITIVE,\r\n [CrudRequestWhereOperator.NOT_CONTAINS]: WhereOperatorValueType.PRIMITIVE,\r\n [CrudRequestWhereOperator.IN]: WhereOperatorValueType.ARRAY,\r\n [CrudRequestWhereOperator.NOT_IN]: WhereOperatorValueType.ARRAY,\r\n [CrudRequestWhereOperator.BETWEEN]: WhereOperatorValueType.ARRAY,\r\n [CrudRequestWhereOperator.IS_NULL]: WhereOperatorValueType.EMPTY,\r\n [CrudRequestWhereOperator.NOT_NULL]: WhereOperatorValueType.EMPTY,\r\n [CrudRequestWhereOperator.EQ_LOWER]: WhereOperatorValueType.PRIMITIVE,\r\n [CrudRequestWhereOperator.NEQ_LOWER]: WhereOperatorValueType.PRIMITIVE,\r\n [CrudRequestWhereOperator.STARTS_LOWER]: WhereOperatorValueType.PRIMITIVE,\r\n [CrudRequestWhereOperator.ENDS_LOWER]: WhereOperatorValueType.PRIMITIVE,\r\n [CrudRequestWhereOperator.CONTAINS_LOWER]: WhereOperatorValueType.PRIMITIVE,\r\n [CrudRequestWhereOperator.NOT_CONTAINS_LOWER]: WhereOperatorValueType.PRIMITIVE,\r\n [CrudRequestWhereOperator.IN_LOWER]: WhereOperatorValueType.PRIMITIVE,\r\n [CrudRequestWhereOperator.NOT_IN_LOWER]: WhereOperatorValueType.PRIMITIVE,\r\n};\r\n\r\nexport function validateWhereField(where: CrudRequestWhereField): void {\r\n const type = operatorValueTypes[where.operator];\r\n const name = 'The value of the operator ' + where.operator;\r\n\r\n if (type === WhereOperatorValueType.PRIMITIVE) {\r\n ensurePrimitiveOrNull(name, where.value);\r\n\r\n return;\r\n }\r\n\r\n if (type === WhereOperatorValueType.ARRAY) {\r\n const items = ensureArray(name, where.value);\r\n\r\n items.forEach(item => ensurePrimitiveOrNull(name + ' children', item));\r\n\r\n return;\r\n }\r\n\r\n if (type === WhereOperatorValueType.EMPTY) {\r\n ensureEmpty(name, where.value);\r\n\r\n return;\r\n }\r\n}\r\n","import {\r\n CrudRequestWhere,\r\n CrudRequestWhereAND,\r\n CrudRequestWhereField,\r\n CrudRequestWhereOperator,\r\n CrudRequestWhereOR,\r\n CrudRequestWhereValueType\r\n} from '../models/crud-request-where';\r\nimport { validateWhereField } from './where';\r\n\r\n/**\r\n * A helper class that makes it easier to create a CrudRequestWhere\r\n */\r\nexport class CrudRequestWhereBuilder {\r\n\r\n constructor(\r\n private readonly where: CrudRequestWhereAND | CrudRequestWhereOR = { and: [] },\r\n private readonly parent?: CrudRequestWhereBuilder,\r\n ) { }\r\n\r\n /**\r\n * Adds an AND bracket\r\n */\r\n public addAnd(): CrudRequestWhereBuilder {\r\n if (!this.where.or) {\r\n return this;\r\n }\r\n\r\n const inside: CrudRequestWhereAND = { and: [] };\r\n const builder = new CrudRequestWhereBuilder(inside, this);\r\n\r\n this.where.or.push(inside);\r\n\r\n return builder;\r\n }\r\n\r\n /**\r\n * Adds an OR bracket\r\n */\r\n public addOr(): CrudRequestWhereBuilder {\r\n if (!this.where.and) {\r\n return this;\r\n }\r\n\r\n const inside: CrudRequestWhereOR = { or: [] };\r\n const builder = new CrudRequestWhereBuilder(inside, this);\r\n\r\n this.where.and.push(inside);\r\n\r\n return builder;\r\n }\r\n\r\n /**\r\n * Adds a field comparison\r\n *\r\n * @param field The field path\r\n * @param operator The comparison operator\r\n * @param value The value to compare\r\n */\r\n public addField(\r\n field: string[],\r\n operator: CrudRequestWhereOperator,\r\n value: CrudRequestWhereValueType | CrudRequestWhereValueType[],\r\n ): CrudRequestWhereBuilder {\r\n const whereField: CrudRequestWhereField = {\r\n field,\r\n operator,\r\n value,\r\n };\r\n\r\n validateWhereField(whereField);\r\n\r\n if (this.where.and) {\r\n this.where.and.push(whereField);\r\n } else if (this.where.or) {\r\n this.where.or.push(whereField);\r\n } else {\r\n throw new Error('Invalid where');\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Constructs the final where condition\r\n */\r\n public build(): CrudRequestWhere {\r\n if (this.parent) {\r\n return this.parent.build();\r\n }\r\n\r\n return this.where;\r\n }\r\n\r\n}\r\n","import { GetManyResult } from '../models/get-many-result';\r\nimport { CrudRequest } from '../models/crud-request';\r\n\r\n/**\r\n * Creates a CrudRequest object, filling required missing properties with empty values\r\n */\r\nexport function createCrudRequest(crudRequest?: Partial<CrudRequest>): CrudRequest {\r\n return {\r\n select: [],\r\n relations: [],\r\n order: [],\r\n where: { and: [] },\r\n ...crudRequest,\r\n };\r\n}\r\n\r\n/**\r\n * Creates a GetManyResult object\r\n *\r\n * @param data The entity list to be returned\r\n * @param total The total amount of entities in the database\r\n * @param offset The offset used for querying\r\n * @param limit The limit used for querying\r\n */\r\nexport function createGetManyResult<T>(data: T[], total: number, offset: number, limit?: number): GetManyResult<T> {\r\n const count = data.length;\r\n const actualLimit = limit ?? total;\r\n const page = actualLimit > 0 ? Math.floor(offset / actualLimit) + 1 : 1;\r\n const pageCount = actualLimit > 0 ? Math.ceil(total / actualLimit) : 0;\r\n\r\n return {\r\n data,\r\n count,\r\n total,\r\n page,\r\n pageCount,\r\n };\r\n}\r\n"],"mappings":"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","names":["src_exports","__export","CrudRequestWhereBuilder","CrudRequestWhereOperator","createCrudRequest","__toCommonJS","CrudRequestWhereOperator","ensurePrimitiveOrNull","fieldName","data","__name","ensureArray","fieldName","data","minLength","__name","ensureEmpty","isValid","value","operatorValueTypes","validateWhereField","where","type","name","ensurePrimitiveOrNull","ensureArray","item","ensureEmpty","__name","CrudRequestWhereBuilder","_CrudRequestWhereBuilder","where","parent","__name","inside","builder","field","operator","value","whereField","validateWhereField","createCrudRequest","crudRequest","__name"]}
package/dist/index.mjs CHANGED
@@ -1,2 +1,2 @@
1
- var I=Object.defineProperty;var u=(t,e)=>I(t,"name",{value:e,configurable:!0});var T=(r=>(r.EQ="eq",r.NEQ="neq",r.GT="gt",r.GTE="gte",r.LT="lt",r.LTE="lte",r.STARTS="starts",r.ENDS="ends",r.CONTAINS="contains",r.NOT_CONTAINS="not_contains",r.IN="in",r.NOT_IN="not_in",r.BETWEEN="between",r.IS_NULL="is_null",r.NOT_NULL="not_null",r.EQ_LOWER="eq_lower",r.NEQ_LOWER="neq_lower",r.STARTS_LOWER="starts_lower",r.ENDS_LOWER="ends_lower",r.CONTAINS_LOWER="contains_lower",r.NOT_CONTAINS_LOWER="not_contains_lower",r.IN_LOWER="in_lower",r.NOT_IN_LOWER="not_in_lower",r))(T||{});function i(t,e){if(e!=null&&!(typeof e=="number"||typeof e=="string"||typeof e=="boolean")&&!(e instanceof Date))throw new Error(`${t} must be a string, number, boolean or null`)}u(i,"ensurePrimitive");function p(t,e,n=0){if(!Array.isArray(e)||e.length<n)throw new Error(`${t} must be an array with at least ${n} items`);return e}u(p,"ensureArray");function a(t,e){if(d(e)&&e!==!0)throw new Error(`${t} must be true, null or undefined`)}u(a,"ensureEmpty");function d(t){return t!=null}u(d,"isValid");var R={eq:"primitive",neq:"primitive",gt:"primitive",lt:"primitive",gte:"primitive",lte:"primitive",starts:"primitive",ends:"primitive",contains:"primitive",not_contains:"primitive",in:"array",not_in:"array",between:"array",is_null:"empty",not_null:"empty",eq_lower:"primitive",neq_lower:"primitive",starts_lower:"primitive",ends_lower:"primitive",contains_lower:"primitive",not_contains_lower:"primitive",in_lower:"primitive",not_in_lower:"primitive"};function s(t){let e=R[t.operator],n="The value of the operator "+t.operator;if(e==="primitive"){i(n,t.value);return}if(e==="array"){p(n,t.value).forEach(o=>i(n+" children",o));return}if(e==="empty"){a(n,t.value);return}}u(s,"validateWhereField");var h=class t{constructor(e={and:[]},n){this.where=e;this.parent=n}static{u(this,"CrudRequestWhereBuilder")}addAnd(){if(!this.where.or)return this;let e={and:[]},n=new t(e,this);return this.where.or.push(e),n}addOr(){if(!this.where.and)return this;let e={or:[]},n=new t(e,this);return this.where.and.push(e),n}addField(e,n,l){let o={field:e,operator:n,value:l};if(s(o),this.where.and)this.where.and.push(o);else if(this.where.or)this.where.or.push(o);else throw new Error("Invalid where");return this}build(){return this.parent?this.parent.build():this.where}};export{h as CrudRequestWhereBuilder,T as CrudRequestWhereOperator};
1
+ var f=Object.defineProperty;var u=(t,e)=>f(t,"name",{value:e,configurable:!0});var s=(r=>(r.EQ="eq",r.NEQ="neq",r.GT="gt",r.GTE="gte",r.LT="lt",r.LTE="lte",r.STARTS="starts",r.ENDS="ends",r.CONTAINS="contains",r.NOT_CONTAINS="not_contains",r.IN="in",r.NOT_IN="not_in",r.BETWEEN="between",r.IS_NULL="is_null",r.NOT_NULL="not_null",r.EQ_LOWER="eq_lower",r.NEQ_LOWER="neq_lower",r.STARTS_LOWER="starts_lower",r.ENDS_LOWER="ends_lower",r.CONTAINS_LOWER="contains_lower",r.NOT_CONTAINS_LOWER="not_contains_lower",r.IN_LOWER="in_lower",r.NOT_IN_LOWER="not_in_lower",r))(s||{});function i(t,e){if(e==null||typeof e=="number"||typeof e=="string"||typeof e=="boolean"||e instanceof Date)return e;throw new Error(`${t} must be a string, number, boolean or null`)}u(i,"ensurePrimitiveOrNull");function p(t,e,n=0){if(!Array.isArray(e)||e.length<n)throw new Error(`${t} must be an array with at least ${n} items`);return e}u(p,"ensureArray");function T(t,e){if(I(e)&&e!==!0)throw new Error(`${t} must be true, null or undefined`)}u(T,"ensureEmpty");function I(t){return t!=null}u(I,"isValid");var R={eq:"primitive",neq:"primitive",gt:"primitive",lt:"primitive",gte:"primitive",lte:"primitive",starts:"primitive",ends:"primitive",contains:"primitive",not_contains:"primitive",in:"array",not_in:"array",between:"array",is_null:"empty",not_null:"empty",eq_lower:"primitive",neq_lower:"primitive",starts_lower:"primitive",ends_lower:"primitive",contains_lower:"primitive",not_contains_lower:"primitive",in_lower:"primitive",not_in_lower:"primitive"};function a(t){let e=R[t.operator],n="The value of the operator "+t.operator;if(e==="primitive"){i(n,t.value);return}if(e==="array"){p(n,t.value).forEach(o=>i(n+" children",o));return}if(e==="empty"){T(n,t.value);return}}u(a,"validateWhereField");var h=class t{constructor(e={and:[]},n){this.where=e;this.parent=n}static{u(this,"CrudRequestWhereBuilder")}addAnd(){if(!this.where.or)return this;let e={and:[]},n=new t(e,this);return this.where.or.push(e),n}addOr(){if(!this.where.and)return this;let e={or:[]},n=new t(e,this);return this.where.and.push(e),n}addField(e,n,l){let o={field:e,operator:n,value:l};if(a(o),this.where.and)this.where.and.push(o);else if(this.where.or)this.where.or.push(o);else throw new Error("Invalid where");return this}build(){return this.parent?this.parent.build():this.where}};function d(t){return{select:[],relations:[],order:[],where:{and:[]},...t}}u(d,"createCrudRequest");export{h as CrudRequestWhereBuilder,s as CrudRequestWhereOperator,d as createCrudRequest};
2
2
  //# sourceMappingURL=index.mjs.map