@elsikora/nestjs-crud-automator 3.0.2 → 4.0.0-dev.2

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 (762) hide show
  1. package/README.md +113 -11
  2. package/dist/cjs/class/api/authorization/guard.class.d.ts +1 -0
  3. package/dist/cjs/class/api/authorization/guard.class.js +39 -3
  4. package/dist/cjs/class/api/authorization/guard.class.js.map +1 -1
  5. package/dist/cjs/class/api/authorization/iam/engine.class.d.ts +3 -2
  6. package/dist/cjs/class/api/authorization/iam/engine.class.js.map +1 -1
  7. package/dist/cjs/class/api/authorization/iam/query-planner.class.d.ts +3 -2
  8. package/dist/cjs/class/api/authorization/iam/query-planner.class.js.map +1 -1
  9. package/dist/cjs/class/api/authorization/policy/base.class.js +1 -0
  10. package/dist/cjs/class/api/authorization/policy/base.class.js.map +1 -1
  11. package/dist/cjs/class/api/authorization/policy/executor.class.d.ts +2 -1
  12. package/dist/cjs/class/api/authorization/policy/executor.class.js.map +1 -1
  13. package/dist/cjs/class/api/authorization/policy/registry.class.d.ts +3 -2
  14. package/dist/cjs/class/api/authorization/policy/registry.class.js.map +1 -1
  15. package/dist/cjs/class/api/authorization/runtime.class.d.ts +3 -2
  16. package/dist/cjs/class/api/authorization/runtime.class.js +2 -1
  17. package/dist/cjs/class/api/authorization/runtime.class.js.map +1 -1
  18. package/dist/cjs/class/api/authorization/simulator.class.d.ts +3 -3
  19. package/dist/cjs/class/api/authorization/simulator.class.js.map +1 -1
  20. package/dist/cjs/class/api/controller/generated/function-capability.class.d.ts +12 -0
  21. package/dist/cjs/class/api/controller/generated/function-capability.class.js +47 -0
  22. package/dist/cjs/class/api/controller/generated/function-capability.class.js.map +1 -0
  23. package/dist/cjs/class/api/controller/generated/get-many-contract.class.d.ts +25 -0
  24. package/dist/cjs/class/api/controller/generated/get-many-contract.class.js +250 -0
  25. package/dist/cjs/class/api/controller/generated/get-many-contract.class.js.map +1 -0
  26. package/dist/cjs/class/api/controller/generated/index.d.ts +3 -0
  27. package/dist/cjs/class/api/controller/generated/read-scope-storage.class.d.ts +19 -0
  28. package/dist/cjs/class/api/controller/generated/read-scope-storage.class.js +120 -0
  29. package/dist/cjs/class/api/controller/generated/read-scope-storage.class.js.map +1 -0
  30. package/dist/cjs/class/api/controller/generated/relation-cache-contract.class.d.ts +11 -0
  31. package/dist/cjs/class/api/controller/generated/relation-cache-contract.class.js +70 -0
  32. package/dist/cjs/class/api/controller/generated/relation-cache-contract.class.js.map +1 -0
  33. package/dist/cjs/class/api/controller/generated/scope-where-contract.class.d.ts +14 -0
  34. package/dist/cjs/class/api/controller/generated/scope-where-contract.class.js +68 -0
  35. package/dist/cjs/class/api/controller/generated/scope-where-contract.class.js.map +1 -0
  36. package/dist/cjs/class/api/controller/generated/security-snapshot.class.d.ts +14 -0
  37. package/dist/cjs/class/api/controller/generated/security-snapshot.class.js +165 -0
  38. package/dist/cjs/class/api/controller/generated/security-snapshot.class.js.map +1 -0
  39. package/dist/cjs/class/api/controller/generated/write-hydration-contract.class.d.ts +9 -0
  40. package/dist/cjs/class/api/controller/generated/write-hydration-contract.class.js +69 -0
  41. package/dist/cjs/class/api/controller/generated/write-hydration-contract.class.js.map +1 -0
  42. package/dist/cjs/class/api/controller/get-list/cursor/data-source-contract.class.d.ts +32 -0
  43. package/dist/cjs/class/api/controller/get-list/cursor/data-source-contract.class.js +424 -0
  44. package/dist/cjs/class/api/controller/get-list/cursor/data-source-contract.class.js.map +1 -0
  45. package/dist/cjs/class/api/controller/get-list/cursor/index.d.ts +2 -0
  46. package/dist/cjs/class/api/controller/get-list/cursor/runtime.class.d.ts +28 -0
  47. package/dist/cjs/class/api/controller/get-list/cursor/runtime.class.js +371 -0
  48. package/dist/cjs/class/api/controller/get-list/cursor/runtime.class.js.map +1 -0
  49. package/dist/cjs/class/api/controller/get-list/query/plan-compiler.class.d.ts +20 -0
  50. package/dist/cjs/class/api/controller/get-list/query/plan-compiler.class.js +479 -41
  51. package/dist/cjs/class/api/controller/get-list/query/plan-compiler.class.js.map +1 -1
  52. package/dist/cjs/class/api/controller/get-list/query/runtime.class.d.ts +2 -0
  53. package/dist/cjs/class/api/controller/get-list/query/runtime.class.js +45 -2
  54. package/dist/cjs/class/api/controller/get-list/query/runtime.class.js.map +1 -1
  55. package/dist/cjs/class/api/controller/identity-plan-compiler.class.d.ts +14 -0
  56. package/dist/cjs/class/api/controller/identity-plan-compiler.class.js +150 -0
  57. package/dist/cjs/class/api/controller/identity-plan-compiler.class.js.map +1 -0
  58. package/dist/cjs/class/api/controller/index.d.ts +1 -0
  59. package/dist/cjs/class/api/controller/read-plan-compiler.class.d.ts +17 -0
  60. package/dist/cjs/class/api/controller/read-plan-compiler.class.js +240 -0
  61. package/dist/cjs/class/api/controller/read-plan-compiler.class.js.map +1 -0
  62. package/dist/cjs/class/api/function/context-storage.class.js +1 -0
  63. package/dist/cjs/class/api/function/context-storage.class.js.map +1 -1
  64. package/dist/cjs/class/api/function/custom-runtime.class.js +1 -0
  65. package/dist/cjs/class/api/function/custom-runtime.class.js.map +1 -1
  66. package/dist/cjs/class/api/function/step-runtime.class.js +1 -0
  67. package/dist/cjs/class/api/function/step-runtime.class.js.map +1 -1
  68. package/dist/cjs/class/api/function/transaction/exception/commit-unknown-outcome.class.js +1 -0
  69. package/dist/cjs/class/api/function/transaction/exception/commit-unknown-outcome.class.js.map +1 -1
  70. package/dist/cjs/class/api/function/transaction/exception/post-commit.class.js +1 -0
  71. package/dist/cjs/class/api/function/transaction/exception/post-commit.class.js.map +1 -1
  72. package/dist/cjs/class/api/function/transaction/exception/rollback.class.js +1 -0
  73. package/dist/cjs/class/api/function/transaction/exception/rollback.class.js.map +1 -1
  74. package/dist/cjs/class/api/function/transaction/lifecycle.class.js +1 -0
  75. package/dist/cjs/class/api/function/transaction/lifecycle.class.js.map +1 -1
  76. package/dist/cjs/class/api/function/transaction/registry.class.js +1 -0
  77. package/dist/cjs/class/api/function/transaction/registry.class.js.map +1 -1
  78. package/dist/cjs/class/api/function/transaction/runtime.class.js +1 -0
  79. package/dist/cjs/class/api/function/transaction/runtime.class.js.map +1 -1
  80. package/dist/cjs/class/api/function/transaction/scope.class.js +1 -0
  81. package/dist/cjs/class/api/function/transaction/scope.class.js.map +1 -1
  82. package/dist/cjs/class/api/route-runtime.class.d.ts +2 -0
  83. package/dist/cjs/class/api/route-runtime.class.js +202 -60
  84. package/dist/cjs/class/api/route-runtime.class.js.map +1 -1
  85. package/dist/cjs/class/api/subscriber/executor.class.js +1 -0
  86. package/dist/cjs/class/api/subscriber/executor.class.js.map +1 -1
  87. package/dist/cjs/class/api/subscriber/registry.class.d.ts +3 -3
  88. package/dist/cjs/class/api/subscriber/registry.class.js +3 -1
  89. package/dist/cjs/class/api/subscriber/registry.class.js.map +1 -1
  90. package/dist/cjs/class/api/subscriber/route-base.class.d.ts +2 -2
  91. package/dist/cjs/class/api/subscriber/route-base.class.js.map +1 -1
  92. package/dist/cjs/class/utility/dto/exception/details/foreign-key-violation.class.js +1 -0
  93. package/dist/cjs/class/utility/dto/exception/details/foreign-key-violation.class.js.map +1 -1
  94. package/dist/cjs/class/utility/dto/exception/details/unique-violation.class.js +1 -0
  95. package/dist/cjs/class/utility/dto/exception/details/unique-violation.class.js.map +1 -1
  96. package/dist/cjs/class/utility/dto/property/factory/number.class.js +1 -0
  97. package/dist/cjs/class/utility/dto/property/factory/number.class.js.map +1 -1
  98. package/dist/cjs/class/utility/dto/property/factory/relation.class.js +1 -0
  99. package/dist/cjs/class/utility/dto/property/factory/relation.class.js.map +1 -1
  100. package/dist/cjs/class/utility/dto/strategy/body.class.js +1 -0
  101. package/dist/cjs/class/utility/dto/strategy/body.class.js.map +1 -1
  102. package/dist/cjs/class/utility/dto/strategy/query.class.js +1 -0
  103. package/dist/cjs/class/utility/dto/strategy/query.class.js.map +1 -1
  104. package/dist/cjs/class/utility/dto/strategy/request.class.js +1 -0
  105. package/dist/cjs/class/utility/dto/strategy/request.class.js.map +1 -1
  106. package/dist/cjs/class/utility/dto/strategy/response.class.js +1 -0
  107. package/dist/cjs/class/utility/dto/strategy/response.class.js.map +1 -1
  108. package/dist/cjs/constant/api-controller-cursor.constant.d.ts +1 -0
  109. package/dist/cjs/constant/api-controller-cursor.constant.js +6 -0
  110. package/dist/cjs/constant/api-controller-cursor.constant.js.map +1 -0
  111. package/dist/cjs/constant/filter/operator-registry.constant.js +1 -0
  112. package/dist/cjs/constant/filter/operator-registry.constant.js.map +1 -1
  113. package/dist/cjs/constant/safe-object-property-names.constant.d.ts +1 -0
  114. package/dist/cjs/constant/safe-object-property-names.constant.js +6 -0
  115. package/dist/cjs/constant/safe-object-property-names.constant.js.map +1 -0
  116. package/dist/cjs/constant/utility/api/get-default-string-format-properties/customizer-map.constant.js +1 -0
  117. package/dist/cjs/constant/utility/api/get-default-string-format-properties/customizer-map.constant.js.map +1 -1
  118. package/dist/cjs/constant/utility/dto/constant.js +1 -0
  119. package/dist/cjs/constant/utility/dto/constant.js.map +1 -1
  120. package/dist/cjs/decorator/api/controller/decorator.js.map +1 -1
  121. package/dist/cjs/decorator/api/function/create.decorator.js +1 -0
  122. package/dist/cjs/decorator/api/function/create.decorator.js.map +1 -1
  123. package/dist/cjs/decorator/api/function/custom.decorator.js +1 -0
  124. package/dist/cjs/decorator/api/function/custom.decorator.js.map +1 -1
  125. package/dist/cjs/decorator/api/function/decorator.js +5 -0
  126. package/dist/cjs/decorator/api/function/decorator.js.map +1 -1
  127. package/dist/cjs/decorator/api/function/delete.decorator.js +19 -7
  128. package/dist/cjs/decorator/api/function/delete.decorator.js.map +1 -1
  129. package/dist/cjs/decorator/api/function/get/decorator.js +53 -19
  130. package/dist/cjs/decorator/api/function/get/decorator.js.map +1 -1
  131. package/dist/cjs/decorator/api/function/get/list.decorator.js +41 -27
  132. package/dist/cjs/decorator/api/function/get/list.decorator.js.map +1 -1
  133. package/dist/cjs/decorator/api/function/get/many.decorator.js +70 -19
  134. package/dist/cjs/decorator/api/function/get/many.decorator.js.map +1 -1
  135. package/dist/cjs/decorator/api/function/step.decorator.js +1 -0
  136. package/dist/cjs/decorator/api/function/step.decorator.js.map +1 -1
  137. package/dist/cjs/decorator/api/function/update.decorator.js +20 -1
  138. package/dist/cjs/decorator/api/function/update.decorator.js.map +1 -1
  139. package/dist/cjs/decorator/api/method.decorator.js +1 -0
  140. package/dist/cjs/decorator/api/method.decorator.js.map +1 -1
  141. package/dist/cjs/decorator/api/property/boolean.decorator.js +1 -0
  142. package/dist/cjs/decorator/api/property/boolean.decorator.js.map +1 -1
  143. package/dist/cjs/decorator/api/property/date.decorator.js +1 -0
  144. package/dist/cjs/decorator/api/property/date.decorator.js.map +1 -1
  145. package/dist/cjs/decorator/api/property/number.decorator.js +1 -0
  146. package/dist/cjs/decorator/api/property/number.decorator.js.map +1 -1
  147. package/dist/cjs/decorator/api/property/string.decorator.js +1 -0
  148. package/dist/cjs/decorator/api/property/string.decorator.js.map +1 -1
  149. package/dist/cjs/decorator/api/property/uuid.decorator.js +1 -0
  150. package/dist/cjs/decorator/api/property/uuid.decorator.js.map +1 -1
  151. package/dist/cjs/decorator/api/route-custom.decorator.js +1 -0
  152. package/dist/cjs/decorator/api/route-custom.decorator.js.map +1 -1
  153. package/dist/cjs/decorator/api/service/decorator.js +16 -0
  154. package/dist/cjs/decorator/api/service/decorator.js.map +1 -1
  155. package/dist/cjs/enum/decorator/api/controller/get-list/query/index.d.ts +1 -0
  156. package/dist/cjs/enum/decorator/api/controller/get-list/query/pagination-mode.enum.d.ts +4 -0
  157. package/dist/cjs/enum/decorator/api/controller/get-list/query/pagination-mode.enum.js +8 -0
  158. package/dist/cjs/enum/decorator/api/controller/get-list/query/pagination-mode.enum.js.map +1 -0
  159. package/dist/cjs/factory/api-controller.factory.d.ts +4 -4
  160. package/dist/cjs/factory/api-controller.factory.js +37 -11
  161. package/dist/cjs/factory/api-controller.factory.js.map +1 -1
  162. package/dist/cjs/index.js +15 -8
  163. package/dist/cjs/index.js.map +1 -1
  164. package/dist/cjs/interface/api/request-validator.interface.d.ts +3 -2
  165. package/dist/cjs/interface/class/api/authorization/policy/build-options.interface.d.ts +3 -2
  166. package/dist/cjs/interface/class/api/authorization/policy/registry.interface.d.ts +3 -2
  167. package/dist/cjs/interface/class/api/authorization/policy/subscriber/context/data.interface.d.ts +2 -1
  168. package/dist/cjs/interface/class/api/authorization/policy/subscriber/context/interface.d.ts +3 -2
  169. package/dist/cjs/interface/class/api/authorization/policy/subscriber/interface.d.ts +9 -8
  170. package/dist/cjs/interface/class/api/authorization/policy/subscriber/registration.interface.d.ts +3 -2
  171. package/dist/cjs/interface/class/api/authorization/request-metadata.interface.d.ts +3 -2
  172. package/dist/cjs/interface/class/api/controller/generated/get-many-session.interface.d.ts +11 -0
  173. package/dist/cjs/interface/class/api/controller/generated/index.d.ts +2 -0
  174. package/dist/cjs/interface/class/api/controller/generated/read-scope-entry.interface.d.ts +10 -0
  175. package/dist/cjs/interface/class/api/controller/get-list/query/plan/order/entry.interface.d.ts +5 -0
  176. package/dist/cjs/interface/class/api/controller/get-list/query/plan/order/index.d.ts +1 -0
  177. package/dist/cjs/interface/class/api/controller/get-list/query/plan/order/interface.d.ts +3 -0
  178. package/dist/cjs/interface/class/api/controller/get-list/query/plan/pagination.interface.d.ts +4 -0
  179. package/dist/cjs/interface/class/api/controller/get-list/query/runtime-result.interface.d.ts +2 -0
  180. package/dist/cjs/interface/class/api/controller/identity-plan.interface.d.ts +7 -0
  181. package/dist/cjs/interface/class/api/controller/index.d.ts +1 -0
  182. package/dist/cjs/interface/class/api/controller/read/index.d.ts +1 -0
  183. package/dist/cjs/interface/class/api/controller/read/plan/index.d.ts +2 -0
  184. package/dist/cjs/interface/class/api/controller/read/plan/interface.d.ts +7 -0
  185. package/dist/cjs/interface/class/api/controller/read/plan/parameter.interface.d.ts +4 -0
  186. package/dist/cjs/interface/class/api/route/runtime/generated/targets.interface.d.ts +2 -1
  187. package/dist/cjs/interface/class/api/subscriber/route/execution/context/data/extended.interface.d.ts +3 -2
  188. package/dist/cjs/interface/class/api/subscriber/route.interface.d.ts +7 -7
  189. package/dist/cjs/interface/decorator/api/controller/properties/route/base/index.d.ts +1 -0
  190. package/dist/cjs/interface/decorator/api/controller/properties/route/base/read/index.d.ts +3 -0
  191. package/dist/cjs/interface/decorator/api/controller/properties/route/base/read/interface.d.ts +4 -0
  192. package/dist/cjs/interface/decorator/api/controller/properties/route/base/read/scope-parameter.interface.d.ts +5 -0
  193. package/dist/cjs/interface/decorator/api/controller/properties/route/base/read/scope.interface.d.ts +4 -0
  194. package/dist/cjs/interface/decorator/api/controller/properties/route/base/request/index.d.ts +1 -0
  195. package/dist/cjs/interface/decorator/api/controller/properties/route/base/request/interface.d.ts +2 -2
  196. package/dist/cjs/interface/decorator/api/controller/properties/route/base/request/query/index.d.ts +1 -0
  197. package/dist/cjs/interface/decorator/api/controller/properties/route/base/request/query/interface.d.ts +4 -1
  198. package/dist/cjs/interface/decorator/api/controller/properties/route/base/request/query/order/entry.interface.d.ts +6 -0
  199. package/dist/cjs/interface/decorator/api/controller/properties/route/base/request/query/order/index.d.ts +1 -0
  200. package/dist/cjs/interface/decorator/api/controller/properties/route/base/request/query/order/interface.d.ts +3 -0
  201. package/dist/cjs/interface/decorator/api/controller/properties/route/base/request/query/pagination.interface.d.ts +4 -0
  202. package/dist/cjs/interface/decorator/api/controller/properties/route/base/request/read-parameters-target.interface.d.ts +5 -0
  203. package/dist/cjs/interface/decorator/api/controller/properties/route/base/request/target.interface.d.ts +3 -2
  204. package/dist/cjs/interface/decorator/api/controller/properties/route/identity.interface.d.ts +3 -0
  205. package/dist/cjs/interface/decorator/api/controller/properties/route/index.d.ts +1 -0
  206. package/dist/cjs/interface/decorator/api/get-list/cursor-response-result.interface.d.ts +5 -0
  207. package/dist/cjs/interface/decorator/api/get-list/index.d.ts +2 -0
  208. package/dist/cjs/interface/decorator/api/index.d.ts +1 -1
  209. package/dist/cjs/module/api/authorization.module.js +2 -1
  210. package/dist/cjs/module/api/authorization.module.js.map +1 -1
  211. package/dist/cjs/package.json +1 -0
  212. package/dist/cjs/type/api-request-transformer.type.d.ts +4 -2
  213. package/dist/cjs/type/class/api/authorization/policy/before/get/list-result.type.d.ts +2 -1
  214. package/dist/cjs/type/class/api/authorization/policy/context/before/get/list-context.type.d.ts +4 -3
  215. package/dist/cjs/type/class/api/authorization/policy/context/with-request-metadata.type.d.ts +4 -3
  216. package/dist/cjs/type/class/api/authorization/policy/hook/execution-result.type.d.ts +5 -0
  217. package/dist/cjs/type/class/api/authorization/policy/hook/result.type.d.ts +3 -2
  218. package/dist/cjs/type/class/api/authorization/policy/hook/type.d.ts +2 -1
  219. package/dist/cjs/type/class/api/authorization/rule/transform-payload.type.d.ts +2 -2
  220. package/dist/cjs/type/class/api/controller/generated/function.type.d.ts +1 -0
  221. package/dist/cjs/type/class/api/controller/generated/index.d.ts +2 -0
  222. package/dist/cjs/type/class/api/controller/generated/scope-function-type.type.d.ts +2 -0
  223. package/dist/cjs/type/class/api/controller/get-list/compiled/index.d.ts +3 -0
  224. package/dist/cjs/type/class/api/controller/get-list/compiled/order-field.type.d.ts +16 -0
  225. package/dist/cjs/type/class/api/controller/get-list/compiled/order.type.d.ts +6 -0
  226. package/dist/cjs/type/class/api/controller/get-list/compiled/plan.type.d.ts +8 -0
  227. package/dist/cjs/type/class/api/controller/get-list/cursor/execution-options.type.d.ts +18 -0
  228. package/dist/cjs/type/class/api/controller/get-list/cursor/index.d.ts +2 -0
  229. package/dist/cjs/type/class/api/controller/get-list/cursor/query-runtime-result.type.d.ts +8 -0
  230. package/dist/cjs/type/class/api/controller/get-list/index.d.ts +2 -0
  231. package/dist/cjs/type/class/api/controller/index.d.ts +1 -0
  232. package/dist/cjs/type/class/api/subscriber/route/after/get/list-context.type.d.ts +3 -2
  233. package/dist/cjs/type/class/api/subscriber/route/before/get/list-context.type.d.ts +5 -6
  234. package/dist/cjs/type/decorator/api/controller/get-list/index.d.ts +1 -0
  235. package/dist/cjs/type/decorator/api/controller/get-list/query/dto-contract.type.d.ts +1 -0
  236. package/dist/cjs/type/decorator/api/controller/get-list/query/request-target.type.d.ts +7 -0
  237. package/dist/cjs/type/decorator/api/controller/get-list/query/type.d.ts +22 -2
  238. package/dist/cjs/type/decorator/api/controller/get-list/response.type.d.ts +3 -0
  239. package/dist/cjs/type/decorator/api/controller/index.d.ts +1 -0
  240. package/dist/cjs/type/decorator/api/controller/properties/route/contract.type.d.ts +5 -0
  241. package/dist/cjs/type/decorator/api/controller/properties/route/identity/index.d.ts +2 -0
  242. package/dist/cjs/type/decorator/api/controller/properties/route/identity/with.type.d.ts +11 -0
  243. package/dist/cjs/type/decorator/api/controller/properties/route/identity/without.type.d.ts +3 -0
  244. package/dist/cjs/type/decorator/api/controller/properties/route/read/dto.type.d.ts +10 -0
  245. package/dist/cjs/type/decorator/api/controller/properties/route/read/index.d.ts +3 -0
  246. package/dist/cjs/type/decorator/api/controller/properties/route/read/with.type.d.ts +11 -0
  247. package/dist/cjs/type/decorator/api/controller/properties/route/read/without.type.d.ts +3 -0
  248. package/dist/cjs/type/decorator/api/controller/properties/route/without-parameters-dto.type.d.ts +4 -0
  249. package/dist/cjs/type/decorator/api/controller/properties-route.type.d.ts +3 -3
  250. package/dist/cjs/type/decorator/api/controller/read/direct-scalar-field.type.d.ts +2 -0
  251. package/dist/cjs/type/decorator/api/controller/read/index.d.ts +2 -0
  252. package/dist/cjs/type/decorator/api/controller/read/parameter-transformer/index.d.ts +1 -0
  253. package/dist/cjs/type/decorator/api/controller/read/parameter-transformer/type.d.ts +3 -0
  254. package/dist/cjs/type/decorator/api/controller/read/parameter-transformer/with-string-key.type.d.ts +5 -0
  255. package/dist/cjs/type/decorator/api/property/describe/properties/base/properties.type.d.ts +1 -1
  256. package/dist/cjs/type/factory/api/controller/method/map.type.d.ts +4 -5
  257. package/dist/cjs/type/factory/api/controller/target-methods.type.d.ts +3 -3
  258. package/dist/cjs/type/utility/api/controller/transform-data/is-validation-properties.type.d.ts +3 -2
  259. package/dist/cjs/type/utility/api/controller/transform-data/object-to-transform.type.d.ts +4 -3
  260. package/dist/cjs/type/utility/api/controller/transform-data/runtime-transformer.type.d.ts +3 -0
  261. package/dist/cjs/type/utility/api/controller/transform-data/targets.type.d.ts +17 -0
  262. package/dist/cjs/type/utility/dto/generate/allowed-combination.type.d.ts +1 -1
  263. package/dist/cjs/utility/api/controller/apply/decorators.utility.d.ts +18 -2
  264. package/dist/cjs/utility/api/controller/apply/decorators.utility.js +24 -2
  265. package/dist/cjs/utility/api/controller/apply/decorators.utility.js.map +1 -1
  266. package/dist/cjs/utility/api/controller/apply/metadata.utility.d.ts +18 -0
  267. package/dist/cjs/utility/api/controller/apply/metadata.utility.js +23 -3
  268. package/dist/cjs/utility/api/controller/apply/metadata.utility.js.map +1 -1
  269. package/dist/cjs/utility/api/controller/build-route-documentation.utility.js +1 -0
  270. package/dist/cjs/utility/api/controller/build-route-documentation.utility.js.map +1 -1
  271. package/dist/cjs/utility/api/controller/get/dto.utility.d.ts +17 -0
  272. package/dist/cjs/utility/api/controller/get/dto.utility.js +90 -11
  273. package/dist/cjs/utility/api/controller/get/dto.utility.js.map +1 -1
  274. package/dist/cjs/utility/api/controller/get-list/query/get-pagination-mode.utility.d.ts +8 -0
  275. package/dist/cjs/utility/api/controller/get-list/query/get-pagination-mode.utility.js +43 -0
  276. package/dist/cjs/utility/api/controller/get-list/query/get-pagination-mode.utility.js.map +1 -0
  277. package/dist/cjs/utility/api/controller/get-list/query/open-api/decorators.utility.js +1 -0
  278. package/dist/cjs/utility/api/controller/get-list/query/open-api/decorators.utility.js.map +1 -1
  279. package/dist/cjs/utility/api/controller/get-list/query/open-api/value-schema.utility.js +1 -0
  280. package/dist/cjs/utility/api/controller/get-list/query/open-api/value-schema.utility.js.map +1 -1
  281. package/dist/cjs/utility/api/controller/get-list/query/resolve-cursor-order-fields.utility.d.ts +7 -0
  282. package/dist/cjs/utility/api/controller/get-list/query/resolve-cursor-order-fields.utility.js +26 -0
  283. package/dist/cjs/utility/api/controller/get-list/query/resolve-cursor-order-fields.utility.js.map +1 -0
  284. package/dist/cjs/utility/api/controller/get-list/transform/filter.utility.js +1 -0
  285. package/dist/cjs/utility/api/controller/get-list/transform/filter.utility.js.map +1 -1
  286. package/dist/cjs/utility/api/controller/handle-request-relations.utility.d.ts +2 -1
  287. package/dist/cjs/utility/api/controller/handle-request-relations.utility.js +1 -0
  288. package/dist/cjs/utility/api/controller/handle-request-relations.utility.js.map +1 -1
  289. package/dist/cjs/utility/api/controller/identity/assert-plan.utility.d.ts +8 -0
  290. package/dist/cjs/utility/api/controller/identity/assert-plan.utility.js +18 -0
  291. package/dist/cjs/utility/api/controller/identity/assert-plan.utility.js.map +1 -0
  292. package/dist/cjs/utility/api/controller/identity/index.d.ts +2 -0
  293. package/dist/cjs/utility/api/controller/identity/plan/get.utility.d.ts +7 -0
  294. package/dist/cjs/utility/api/controller/identity/plan/get.utility.js +15 -0
  295. package/dist/cjs/utility/api/controller/identity/plan/get.utility.js.map +1 -0
  296. package/dist/cjs/utility/api/controller/identity/plan/index.d.ts +2 -0
  297. package/dist/cjs/utility/api/controller/identity/plan/metadata-key.constant.d.ts +1 -0
  298. package/dist/cjs/utility/api/controller/identity/plan/metadata-key.constant.js +6 -0
  299. package/dist/cjs/utility/api/controller/identity/plan/metadata-key.constant.js.map +1 -0
  300. package/dist/cjs/utility/api/controller/identity/plan/set.utility.d.ts +8 -0
  301. package/dist/cjs/utility/api/controller/identity/plan/set.utility.js +16 -0
  302. package/dist/cjs/utility/api/controller/identity/plan/set.utility.js.map +1 -0
  303. package/dist/cjs/utility/api/controller/read/assert-plan.utility.d.ts +8 -0
  304. package/dist/cjs/utility/api/controller/read/assert-plan.utility.js +18 -0
  305. package/dist/cjs/utility/api/controller/read/assert-plan.utility.js.map +1 -0
  306. package/dist/cjs/utility/api/controller/read/index.d.ts +3 -0
  307. package/dist/cjs/utility/api/controller/read/plan/get.utility.d.ts +8 -0
  308. package/dist/cjs/utility/api/controller/read/plan/get.utility.js +16 -0
  309. package/dist/cjs/utility/api/controller/read/plan/get.utility.js.map +1 -0
  310. package/dist/cjs/utility/api/controller/read/plan/index.d.ts +2 -0
  311. package/dist/cjs/utility/api/controller/read/plan/metadata-key.constant.d.ts +1 -0
  312. package/dist/cjs/utility/api/controller/read/plan/metadata-key.constant.js +6 -0
  313. package/dist/cjs/utility/api/controller/read/plan/metadata-key.constant.js.map +1 -0
  314. package/dist/cjs/utility/api/controller/read/plan/set.utility.d.ts +9 -0
  315. package/dist/cjs/utility/api/controller/read/plan/set.utility.js +17 -0
  316. package/dist/cjs/utility/api/controller/read/plan/set.utility.js.map +1 -0
  317. package/dist/cjs/utility/api/controller/read/scope.utility.d.ts +12 -0
  318. package/dist/cjs/utility/api/controller/read/scope.utility.js +38 -0
  319. package/dist/cjs/utility/api/controller/read/scope.utility.js.map +1 -0
  320. package/dist/cjs/utility/api/controller/transform-data.utility.js +13 -11
  321. package/dist/cjs/utility/api/controller/transform-data.utility.js.map +1 -1
  322. package/dist/cjs/utility/api/controller/validate-request.utility.d.ts +2 -1
  323. package/dist/cjs/utility/api/controller/validate-request.utility.js.map +1 -1
  324. package/dist/cjs/utility/api/controller/write/dto-swagger.utility.d.ts +17 -0
  325. package/dist/cjs/utility/api/controller/write/dto-swagger.utility.js +23 -4
  326. package/dist/cjs/utility/api/controller/write/dto-swagger.utility.js.map +1 -1
  327. package/dist/cjs/utility/api/function-transaction.utility.js +1 -0
  328. package/dist/cjs/utility/api/function-transaction.utility.js.map +1 -1
  329. package/dist/cjs/utility/api/route/apply-dto-metadata.utility.js +1 -0
  330. package/dist/cjs/utility/api/route/apply-dto-metadata.utility.js.map +1 -1
  331. package/dist/cjs/utility/api/route/response/project-relation.utility.js +1 -0
  332. package/dist/cjs/utility/api/route/response/project-relation.utility.js.map +1 -1
  333. package/dist/cjs/utility/authorization/scope-merge-where.utility.js +247 -130
  334. package/dist/cjs/utility/authorization/scope-merge-where.utility.js.map +1 -1
  335. package/dist/cjs/utility/dto/build-decorator.utility.js +1 -0
  336. package/dist/cjs/utility/dto/build-decorator.utility.js.map +1 -1
  337. package/dist/cjs/utility/dto/generate/core.utility.js +19 -7
  338. package/dist/cjs/utility/dto/generate/core.utility.js.map +1 -1
  339. package/dist/cjs/utility/dto/generate/dynamic.utility.js +1 -0
  340. package/dist/cjs/utility/dto/generate/dynamic.utility.js.map +1 -1
  341. package/dist/cjs/utility/dto/generate/exception.utility.js +1 -0
  342. package/dist/cjs/utility/dto/generate/exception.utility.js.map +1 -1
  343. package/dist/cjs/utility/dto/generate/filter-decorator.utility.js +1 -0
  344. package/dist/cjs/utility/dto/generate/filter-decorator.utility.js.map +1 -1
  345. package/dist/cjs/utility/dto/generate/get-list/cursor-response.utility.d.ts +10 -0
  346. package/dist/cjs/utility/dto/generate/get-list/cursor-response.utility.js +100 -0
  347. package/dist/cjs/utility/dto/generate/get-list/cursor-response.utility.js.map +1 -0
  348. package/dist/cjs/utility/dto/generate/get-list/index.d.ts +3 -0
  349. package/dist/cjs/utility/dto/generate/{get-list-query-properties.utility.d.ts → get-list/query-properties.utility.d.ts} +4 -4
  350. package/dist/cjs/utility/dto/generate/{get-list-query-properties.utility.js → get-list/query-properties.utility.js} +35 -34
  351. package/dist/cjs/utility/dto/generate/get-list/query-properties.utility.js.map +1 -0
  352. package/dist/cjs/utility/dto/generate/{get-list-response.utility.d.ts → get-list/response.utility.d.ts} +1 -1
  353. package/dist/cjs/utility/dto/generate/{get-list-response.utility.js → get-list/response.utility.js} +33 -32
  354. package/dist/cjs/utility/dto/generate/get-list/response.utility.js.map +1 -0
  355. package/dist/cjs/utility/dto/generate/identity-read-parameters.utility.d.ts +17 -0
  356. package/dist/cjs/utility/dto/generate/identity-read-parameters.utility.js +113 -0
  357. package/dist/cjs/utility/dto/generate/identity-read-parameters.utility.js.map +1 -0
  358. package/dist/cjs/utility/dto/generate/index.d.ts +1 -1
  359. package/dist/cjs/utility/dto/generate/read-parameters.utility.d.ts +17 -0
  360. package/dist/cjs/utility/dto/generate/read-parameters.utility.js +111 -0
  361. package/dist/cjs/utility/dto/generate/read-parameters.utility.js.map +1 -0
  362. package/dist/cjs/utility/dto/get/get-list-query-base-class.utility.d.ts +3 -2
  363. package/dist/cjs/utility/dto/get/get-list-query-base-class.utility.js +48 -15
  364. package/dist/cjs/utility/dto/get/get-list-query-base-class.utility.js.map +1 -1
  365. package/dist/cjs/utility/dto/handle-date-property.utility.js +1 -0
  366. package/dist/cjs/utility/dto/handle-date-property.utility.js.map +1 -1
  367. package/dist/cjs/utility/dto/is/property/infrastructure-timestamp.utility.js +1 -0
  368. package/dist/cjs/utility/dto/is/property/infrastructure-timestamp.utility.js.map +1 -1
  369. package/dist/cjs/utility/dto/is/property/should-be-marked.utility.js +1 -0
  370. package/dist/cjs/utility/dto/is/property/should-be-marked.utility.js.map +1 -1
  371. package/dist/cjs/utility/dto/is/should-be-generated.utility.js +1 -0
  372. package/dist/cjs/utility/dto/is/should-be-generated.utility.js.map +1 -1
  373. package/dist/cjs/utility/object-find-property-descriptor.utility.d.ts +7 -0
  374. package/dist/cjs/utility/object-find-property-descriptor.utility.js +22 -0
  375. package/dist/cjs/utility/object-find-property-descriptor.utility.js.map +1 -0
  376. package/dist/cjs/validator/at-most-one-of-listed-properties.validator.d.ts +5 -0
  377. package/dist/cjs/validator/at-most-one-of-listed-properties.validator.js +21 -0
  378. package/dist/cjs/validator/at-most-one-of-listed-properties.validator.js.map +1 -0
  379. package/dist/esm/class/api/authorization/guard.class.d.ts +1 -0
  380. package/dist/esm/class/api/authorization/guard.class.js +39 -3
  381. package/dist/esm/class/api/authorization/guard.class.js.map +1 -1
  382. package/dist/esm/class/api/authorization/iam/engine.class.d.ts +3 -2
  383. package/dist/esm/class/api/authorization/iam/engine.class.js.map +1 -1
  384. package/dist/esm/class/api/authorization/iam/query-planner.class.d.ts +3 -2
  385. package/dist/esm/class/api/authorization/iam/query-planner.class.js.map +1 -1
  386. package/dist/esm/class/api/authorization/policy/base.class.js +1 -0
  387. package/dist/esm/class/api/authorization/policy/base.class.js.map +1 -1
  388. package/dist/esm/class/api/authorization/policy/executor.class.d.ts +2 -1
  389. package/dist/esm/class/api/authorization/policy/executor.class.js.map +1 -1
  390. package/dist/esm/class/api/authorization/policy/registry.class.d.ts +3 -2
  391. package/dist/esm/class/api/authorization/policy/registry.class.js.map +1 -1
  392. package/dist/esm/class/api/authorization/runtime.class.d.ts +3 -2
  393. package/dist/esm/class/api/authorization/runtime.class.js +2 -1
  394. package/dist/esm/class/api/authorization/runtime.class.js.map +1 -1
  395. package/dist/esm/class/api/authorization/simulator.class.d.ts +3 -3
  396. package/dist/esm/class/api/authorization/simulator.class.js.map +1 -1
  397. package/dist/esm/class/api/controller/generated/function-capability.class.d.ts +12 -0
  398. package/dist/esm/class/api/controller/generated/function-capability.class.js +45 -0
  399. package/dist/esm/class/api/controller/generated/function-capability.class.js.map +1 -0
  400. package/dist/esm/class/api/controller/generated/get-many-contract.class.d.ts +25 -0
  401. package/dist/esm/class/api/controller/generated/get-many-contract.class.js +248 -0
  402. package/dist/esm/class/api/controller/generated/get-many-contract.class.js.map +1 -0
  403. package/dist/esm/class/api/controller/generated/index.d.ts +3 -0
  404. package/dist/esm/class/api/controller/generated/read-scope-storage.class.d.ts +19 -0
  405. package/dist/esm/class/api/controller/generated/read-scope-storage.class.js +118 -0
  406. package/dist/esm/class/api/controller/generated/read-scope-storage.class.js.map +1 -0
  407. package/dist/esm/class/api/controller/generated/relation-cache-contract.class.d.ts +11 -0
  408. package/dist/esm/class/api/controller/generated/relation-cache-contract.class.js +68 -0
  409. package/dist/esm/class/api/controller/generated/relation-cache-contract.class.js.map +1 -0
  410. package/dist/esm/class/api/controller/generated/scope-where-contract.class.d.ts +14 -0
  411. package/dist/esm/class/api/controller/generated/scope-where-contract.class.js +66 -0
  412. package/dist/esm/class/api/controller/generated/scope-where-contract.class.js.map +1 -0
  413. package/dist/esm/class/api/controller/generated/security-snapshot.class.d.ts +14 -0
  414. package/dist/esm/class/api/controller/generated/security-snapshot.class.js +163 -0
  415. package/dist/esm/class/api/controller/generated/security-snapshot.class.js.map +1 -0
  416. package/dist/esm/class/api/controller/generated/write-hydration-contract.class.d.ts +9 -0
  417. package/dist/esm/class/api/controller/generated/write-hydration-contract.class.js +67 -0
  418. package/dist/esm/class/api/controller/generated/write-hydration-contract.class.js.map +1 -0
  419. package/dist/esm/class/api/controller/get-list/cursor/data-source-contract.class.d.ts +32 -0
  420. package/dist/esm/class/api/controller/get-list/cursor/data-source-contract.class.js +422 -0
  421. package/dist/esm/class/api/controller/get-list/cursor/data-source-contract.class.js.map +1 -0
  422. package/dist/esm/class/api/controller/get-list/cursor/index.d.ts +2 -0
  423. package/dist/esm/class/api/controller/get-list/cursor/runtime.class.d.ts +28 -0
  424. package/dist/esm/class/api/controller/get-list/cursor/runtime.class.js +369 -0
  425. package/dist/esm/class/api/controller/get-list/cursor/runtime.class.js.map +1 -0
  426. package/dist/esm/class/api/controller/get-list/query/plan-compiler.class.d.ts +20 -0
  427. package/dist/esm/class/api/controller/get-list/query/plan-compiler.class.js +479 -41
  428. package/dist/esm/class/api/controller/get-list/query/plan-compiler.class.js.map +1 -1
  429. package/dist/esm/class/api/controller/get-list/query/runtime.class.d.ts +2 -0
  430. package/dist/esm/class/api/controller/get-list/query/runtime.class.js +45 -2
  431. package/dist/esm/class/api/controller/get-list/query/runtime.class.js.map +1 -1
  432. package/dist/esm/class/api/controller/identity-plan-compiler.class.d.ts +14 -0
  433. package/dist/esm/class/api/controller/identity-plan-compiler.class.js +148 -0
  434. package/dist/esm/class/api/controller/identity-plan-compiler.class.js.map +1 -0
  435. package/dist/esm/class/api/controller/index.d.ts +1 -0
  436. package/dist/esm/class/api/controller/read-plan-compiler.class.d.ts +17 -0
  437. package/dist/esm/class/api/controller/read-plan-compiler.class.js +238 -0
  438. package/dist/esm/class/api/controller/read-plan-compiler.class.js.map +1 -0
  439. package/dist/esm/class/api/function/context-storage.class.js +1 -0
  440. package/dist/esm/class/api/function/context-storage.class.js.map +1 -1
  441. package/dist/esm/class/api/function/custom-runtime.class.js +1 -0
  442. package/dist/esm/class/api/function/custom-runtime.class.js.map +1 -1
  443. package/dist/esm/class/api/function/step-runtime.class.js +1 -0
  444. package/dist/esm/class/api/function/step-runtime.class.js.map +1 -1
  445. package/dist/esm/class/api/function/transaction/exception/commit-unknown-outcome.class.js +1 -0
  446. package/dist/esm/class/api/function/transaction/exception/commit-unknown-outcome.class.js.map +1 -1
  447. package/dist/esm/class/api/function/transaction/exception/post-commit.class.js +1 -0
  448. package/dist/esm/class/api/function/transaction/exception/post-commit.class.js.map +1 -1
  449. package/dist/esm/class/api/function/transaction/exception/rollback.class.js +1 -0
  450. package/dist/esm/class/api/function/transaction/exception/rollback.class.js.map +1 -1
  451. package/dist/esm/class/api/function/transaction/lifecycle.class.js +1 -0
  452. package/dist/esm/class/api/function/transaction/lifecycle.class.js.map +1 -1
  453. package/dist/esm/class/api/function/transaction/registry.class.js +1 -0
  454. package/dist/esm/class/api/function/transaction/registry.class.js.map +1 -1
  455. package/dist/esm/class/api/function/transaction/runtime.class.js +1 -0
  456. package/dist/esm/class/api/function/transaction/runtime.class.js.map +1 -1
  457. package/dist/esm/class/api/function/transaction/scope.class.js +1 -0
  458. package/dist/esm/class/api/function/transaction/scope.class.js.map +1 -1
  459. package/dist/esm/class/api/route-runtime.class.d.ts +2 -0
  460. package/dist/esm/class/api/route-runtime.class.js +201 -59
  461. package/dist/esm/class/api/route-runtime.class.js.map +1 -1
  462. package/dist/esm/class/api/subscriber/executor.class.js +1 -0
  463. package/dist/esm/class/api/subscriber/executor.class.js.map +1 -1
  464. package/dist/esm/class/api/subscriber/registry.class.d.ts +3 -3
  465. package/dist/esm/class/api/subscriber/registry.class.js +3 -1
  466. package/dist/esm/class/api/subscriber/registry.class.js.map +1 -1
  467. package/dist/esm/class/api/subscriber/route-base.class.d.ts +2 -2
  468. package/dist/esm/class/api/subscriber/route-base.class.js.map +1 -1
  469. package/dist/esm/class/utility/dto/exception/details/foreign-key-violation.class.js +1 -0
  470. package/dist/esm/class/utility/dto/exception/details/foreign-key-violation.class.js.map +1 -1
  471. package/dist/esm/class/utility/dto/exception/details/unique-violation.class.js +1 -0
  472. package/dist/esm/class/utility/dto/exception/details/unique-violation.class.js.map +1 -1
  473. package/dist/esm/class/utility/dto/property/factory/number.class.js +1 -0
  474. package/dist/esm/class/utility/dto/property/factory/number.class.js.map +1 -1
  475. package/dist/esm/class/utility/dto/property/factory/relation.class.js +1 -0
  476. package/dist/esm/class/utility/dto/property/factory/relation.class.js.map +1 -1
  477. package/dist/esm/class/utility/dto/strategy/body.class.js +1 -0
  478. package/dist/esm/class/utility/dto/strategy/body.class.js.map +1 -1
  479. package/dist/esm/class/utility/dto/strategy/query.class.js +1 -0
  480. package/dist/esm/class/utility/dto/strategy/query.class.js.map +1 -1
  481. package/dist/esm/class/utility/dto/strategy/request.class.js +1 -0
  482. package/dist/esm/class/utility/dto/strategy/request.class.js.map +1 -1
  483. package/dist/esm/class/utility/dto/strategy/response.class.js +1 -0
  484. package/dist/esm/class/utility/dto/strategy/response.class.js.map +1 -1
  485. package/dist/esm/constant/api-controller-cursor.constant.d.ts +1 -0
  486. package/dist/esm/constant/api-controller-cursor.constant.js +4 -0
  487. package/dist/esm/constant/api-controller-cursor.constant.js.map +1 -0
  488. package/dist/esm/constant/filter/operator-registry.constant.js +1 -0
  489. package/dist/esm/constant/filter/operator-registry.constant.js.map +1 -1
  490. package/dist/esm/constant/safe-object-property-names.constant.d.ts +1 -0
  491. package/dist/esm/constant/safe-object-property-names.constant.js +4 -0
  492. package/dist/esm/constant/safe-object-property-names.constant.js.map +1 -0
  493. package/dist/esm/constant/utility/api/get-default-string-format-properties/customizer-map.constant.js +1 -0
  494. package/dist/esm/constant/utility/api/get-default-string-format-properties/customizer-map.constant.js.map +1 -1
  495. package/dist/esm/constant/utility/dto/constant.js +1 -0
  496. package/dist/esm/constant/utility/dto/constant.js.map +1 -1
  497. package/dist/esm/decorator/api/controller/decorator.js.map +1 -1
  498. package/dist/esm/decorator/api/function/create.decorator.js +1 -0
  499. package/dist/esm/decorator/api/function/create.decorator.js.map +1 -1
  500. package/dist/esm/decorator/api/function/custom.decorator.js +1 -0
  501. package/dist/esm/decorator/api/function/custom.decorator.js.map +1 -1
  502. package/dist/esm/decorator/api/function/decorator.js +5 -0
  503. package/dist/esm/decorator/api/function/decorator.js.map +1 -1
  504. package/dist/esm/decorator/api/function/delete.decorator.js +19 -7
  505. package/dist/esm/decorator/api/function/delete.decorator.js.map +1 -1
  506. package/dist/esm/decorator/api/function/get/decorator.js +53 -19
  507. package/dist/esm/decorator/api/function/get/decorator.js.map +1 -1
  508. package/dist/esm/decorator/api/function/get/list.decorator.js +41 -27
  509. package/dist/esm/decorator/api/function/get/list.decorator.js.map +1 -1
  510. package/dist/esm/decorator/api/function/get/many.decorator.js +70 -19
  511. package/dist/esm/decorator/api/function/get/many.decorator.js.map +1 -1
  512. package/dist/esm/decorator/api/function/step.decorator.js +1 -0
  513. package/dist/esm/decorator/api/function/step.decorator.js.map +1 -1
  514. package/dist/esm/decorator/api/function/update.decorator.js +20 -1
  515. package/dist/esm/decorator/api/function/update.decorator.js.map +1 -1
  516. package/dist/esm/decorator/api/method.decorator.js +1 -0
  517. package/dist/esm/decorator/api/method.decorator.js.map +1 -1
  518. package/dist/esm/decorator/api/property/boolean.decorator.js +1 -0
  519. package/dist/esm/decorator/api/property/boolean.decorator.js.map +1 -1
  520. package/dist/esm/decorator/api/property/date.decorator.js +1 -0
  521. package/dist/esm/decorator/api/property/date.decorator.js.map +1 -1
  522. package/dist/esm/decorator/api/property/number.decorator.js +1 -0
  523. package/dist/esm/decorator/api/property/number.decorator.js.map +1 -1
  524. package/dist/esm/decorator/api/property/string.decorator.js +1 -0
  525. package/dist/esm/decorator/api/property/string.decorator.js.map +1 -1
  526. package/dist/esm/decorator/api/property/uuid.decorator.js +1 -0
  527. package/dist/esm/decorator/api/property/uuid.decorator.js.map +1 -1
  528. package/dist/esm/decorator/api/route-custom.decorator.js +1 -0
  529. package/dist/esm/decorator/api/route-custom.decorator.js.map +1 -1
  530. package/dist/esm/decorator/api/service/decorator.js +16 -0
  531. package/dist/esm/decorator/api/service/decorator.js.map +1 -1
  532. package/dist/esm/enum/decorator/api/controller/get-list/query/index.d.ts +1 -0
  533. package/dist/esm/enum/decorator/api/controller/get-list/query/pagination-mode.enum.d.ts +4 -0
  534. package/dist/esm/enum/decorator/api/controller/get-list/query/pagination-mode.enum.js +8 -0
  535. package/dist/esm/enum/decorator/api/controller/get-list/query/pagination-mode.enum.js.map +1 -0
  536. package/dist/esm/factory/api-controller.factory.d.ts +4 -4
  537. package/dist/esm/factory/api-controller.factory.js +36 -10
  538. package/dist/esm/factory/api-controller.factory.js.map +1 -1
  539. package/dist/esm/index.js +7 -4
  540. package/dist/esm/index.js.map +1 -1
  541. package/dist/esm/interface/api/request-validator.interface.d.ts +3 -2
  542. package/dist/esm/interface/class/api/authorization/policy/build-options.interface.d.ts +3 -2
  543. package/dist/esm/interface/class/api/authorization/policy/registry.interface.d.ts +3 -2
  544. package/dist/esm/interface/class/api/authorization/policy/subscriber/context/data.interface.d.ts +2 -1
  545. package/dist/esm/interface/class/api/authorization/policy/subscriber/context/interface.d.ts +3 -2
  546. package/dist/esm/interface/class/api/authorization/policy/subscriber/interface.d.ts +9 -8
  547. package/dist/esm/interface/class/api/authorization/policy/subscriber/registration.interface.d.ts +3 -2
  548. package/dist/esm/interface/class/api/authorization/request-metadata.interface.d.ts +3 -2
  549. package/dist/esm/interface/class/api/controller/generated/get-many-session.interface.d.ts +11 -0
  550. package/dist/esm/interface/class/api/controller/generated/index.d.ts +2 -0
  551. package/dist/esm/interface/class/api/controller/generated/read-scope-entry.interface.d.ts +10 -0
  552. package/dist/esm/interface/class/api/controller/get-list/query/plan/order/entry.interface.d.ts +5 -0
  553. package/dist/esm/interface/class/api/controller/get-list/query/plan/order/index.d.ts +1 -0
  554. package/dist/esm/interface/class/api/controller/get-list/query/plan/order/interface.d.ts +3 -0
  555. package/dist/esm/interface/class/api/controller/get-list/query/plan/pagination.interface.d.ts +4 -0
  556. package/dist/esm/interface/class/api/controller/get-list/query/runtime-result.interface.d.ts +2 -0
  557. package/dist/esm/interface/class/api/controller/identity-plan.interface.d.ts +7 -0
  558. package/dist/esm/interface/class/api/controller/index.d.ts +1 -0
  559. package/dist/esm/interface/class/api/controller/read/index.d.ts +1 -0
  560. package/dist/esm/interface/class/api/controller/read/plan/index.d.ts +2 -0
  561. package/dist/esm/interface/class/api/controller/read/plan/interface.d.ts +7 -0
  562. package/dist/esm/interface/class/api/controller/read/plan/parameter.interface.d.ts +4 -0
  563. package/dist/esm/interface/class/api/route/runtime/generated/targets.interface.d.ts +2 -1
  564. package/dist/esm/interface/class/api/subscriber/route/execution/context/data/extended.interface.d.ts +3 -2
  565. package/dist/esm/interface/class/api/subscriber/route.interface.d.ts +7 -7
  566. package/dist/esm/interface/decorator/api/controller/properties/route/base/index.d.ts +1 -0
  567. package/dist/esm/interface/decorator/api/controller/properties/route/base/read/index.d.ts +3 -0
  568. package/dist/esm/interface/decorator/api/controller/properties/route/base/read/interface.d.ts +4 -0
  569. package/dist/esm/interface/decorator/api/controller/properties/route/base/read/scope-parameter.interface.d.ts +5 -0
  570. package/dist/esm/interface/decorator/api/controller/properties/route/base/read/scope.interface.d.ts +4 -0
  571. package/dist/esm/interface/decorator/api/controller/properties/route/base/request/index.d.ts +1 -0
  572. package/dist/esm/interface/decorator/api/controller/properties/route/base/request/interface.d.ts +2 -2
  573. package/dist/esm/interface/decorator/api/controller/properties/route/base/request/query/index.d.ts +1 -0
  574. package/dist/esm/interface/decorator/api/controller/properties/route/base/request/query/interface.d.ts +4 -1
  575. package/dist/esm/interface/decorator/api/controller/properties/route/base/request/query/order/entry.interface.d.ts +6 -0
  576. package/dist/esm/interface/decorator/api/controller/properties/route/base/request/query/order/index.d.ts +1 -0
  577. package/dist/esm/interface/decorator/api/controller/properties/route/base/request/query/order/interface.d.ts +3 -0
  578. package/dist/esm/interface/decorator/api/controller/properties/route/base/request/query/pagination.interface.d.ts +4 -0
  579. package/dist/esm/interface/decorator/api/controller/properties/route/base/request/read-parameters-target.interface.d.ts +5 -0
  580. package/dist/esm/interface/decorator/api/controller/properties/route/base/request/target.interface.d.ts +3 -2
  581. package/dist/esm/interface/decorator/api/controller/properties/route/identity.interface.d.ts +3 -0
  582. package/dist/esm/interface/decorator/api/controller/properties/route/index.d.ts +1 -0
  583. package/dist/esm/interface/decorator/api/get-list/cursor-response-result.interface.d.ts +5 -0
  584. package/dist/esm/interface/decorator/api/get-list/index.d.ts +2 -0
  585. package/dist/esm/interface/decorator/api/index.d.ts +1 -1
  586. package/dist/esm/module/api/authorization.module.js +2 -1
  587. package/dist/esm/module/api/authorization.module.js.map +1 -1
  588. package/dist/esm/package.json +1 -0
  589. package/dist/esm/type/api-request-transformer.type.d.ts +4 -2
  590. package/dist/esm/type/class/api/authorization/policy/before/get/list-result.type.d.ts +2 -1
  591. package/dist/esm/type/class/api/authorization/policy/context/before/get/list-context.type.d.ts +4 -3
  592. package/dist/esm/type/class/api/authorization/policy/context/with-request-metadata.type.d.ts +4 -3
  593. package/dist/esm/type/class/api/authorization/policy/hook/execution-result.type.d.ts +5 -0
  594. package/dist/esm/type/class/api/authorization/policy/hook/result.type.d.ts +3 -2
  595. package/dist/esm/type/class/api/authorization/policy/hook/type.d.ts +2 -1
  596. package/dist/esm/type/class/api/authorization/rule/transform-payload.type.d.ts +2 -2
  597. package/dist/esm/type/class/api/controller/generated/function.type.d.ts +1 -0
  598. package/dist/esm/type/class/api/controller/generated/index.d.ts +2 -0
  599. package/dist/esm/type/class/api/controller/generated/scope-function-type.type.d.ts +2 -0
  600. package/dist/esm/type/class/api/controller/get-list/compiled/index.d.ts +3 -0
  601. package/dist/esm/type/class/api/controller/get-list/compiled/order-field.type.d.ts +16 -0
  602. package/dist/esm/type/class/api/controller/get-list/compiled/order.type.d.ts +6 -0
  603. package/dist/esm/type/class/api/controller/get-list/compiled/plan.type.d.ts +8 -0
  604. package/dist/esm/type/class/api/controller/get-list/cursor/execution-options.type.d.ts +18 -0
  605. package/dist/esm/type/class/api/controller/get-list/cursor/index.d.ts +2 -0
  606. package/dist/esm/type/class/api/controller/get-list/cursor/query-runtime-result.type.d.ts +8 -0
  607. package/dist/esm/type/class/api/controller/get-list/index.d.ts +2 -0
  608. package/dist/esm/type/class/api/controller/index.d.ts +1 -0
  609. package/dist/esm/type/class/api/subscriber/route/after/get/list-context.type.d.ts +3 -2
  610. package/dist/esm/type/class/api/subscriber/route/before/get/list-context.type.d.ts +5 -6
  611. package/dist/esm/type/decorator/api/controller/get-list/index.d.ts +1 -0
  612. package/dist/esm/type/decorator/api/controller/get-list/query/dto-contract.type.d.ts +1 -0
  613. package/dist/esm/type/decorator/api/controller/get-list/query/request-target.type.d.ts +7 -0
  614. package/dist/esm/type/decorator/api/controller/get-list/query/type.d.ts +22 -2
  615. package/dist/esm/type/decorator/api/controller/get-list/response.type.d.ts +3 -0
  616. package/dist/esm/type/decorator/api/controller/index.d.ts +1 -0
  617. package/dist/esm/type/decorator/api/controller/properties/route/contract.type.d.ts +5 -0
  618. package/dist/esm/type/decorator/api/controller/properties/route/identity/index.d.ts +2 -0
  619. package/dist/esm/type/decorator/api/controller/properties/route/identity/with.type.d.ts +11 -0
  620. package/dist/esm/type/decorator/api/controller/properties/route/identity/without.type.d.ts +3 -0
  621. package/dist/esm/type/decorator/api/controller/properties/route/read/dto.type.d.ts +10 -0
  622. package/dist/esm/type/decorator/api/controller/properties/route/read/index.d.ts +3 -0
  623. package/dist/esm/type/decorator/api/controller/properties/route/read/with.type.d.ts +11 -0
  624. package/dist/esm/type/decorator/api/controller/properties/route/read/without.type.d.ts +3 -0
  625. package/dist/esm/type/decorator/api/controller/properties/route/without-parameters-dto.type.d.ts +4 -0
  626. package/dist/esm/type/decorator/api/controller/properties-route.type.d.ts +3 -3
  627. package/dist/esm/type/decorator/api/controller/read/direct-scalar-field.type.d.ts +2 -0
  628. package/dist/esm/type/decorator/api/controller/read/index.d.ts +2 -0
  629. package/dist/esm/type/decorator/api/controller/read/parameter-transformer/index.d.ts +1 -0
  630. package/dist/esm/type/decorator/api/controller/read/parameter-transformer/type.d.ts +3 -0
  631. package/dist/esm/type/decorator/api/controller/read/parameter-transformer/with-string-key.type.d.ts +5 -0
  632. package/dist/esm/type/decorator/api/property/describe/properties/base/properties.type.d.ts +1 -1
  633. package/dist/esm/type/factory/api/controller/method/map.type.d.ts +4 -5
  634. package/dist/esm/type/factory/api/controller/target-methods.type.d.ts +3 -3
  635. package/dist/esm/type/utility/api/controller/transform-data/is-validation-properties.type.d.ts +3 -2
  636. package/dist/esm/type/utility/api/controller/transform-data/object-to-transform.type.d.ts +4 -3
  637. package/dist/esm/type/utility/api/controller/transform-data/runtime-transformer.type.d.ts +3 -0
  638. package/dist/esm/type/utility/api/controller/transform-data/targets.type.d.ts +17 -0
  639. package/dist/esm/type/utility/dto/generate/allowed-combination.type.d.ts +1 -1
  640. package/dist/esm/utility/api/controller/apply/decorators.utility.d.ts +18 -2
  641. package/dist/esm/utility/api/controller/apply/decorators.utility.js +25 -4
  642. package/dist/esm/utility/api/controller/apply/decorators.utility.js.map +1 -1
  643. package/dist/esm/utility/api/controller/apply/metadata.utility.d.ts +18 -0
  644. package/dist/esm/utility/api/controller/apply/metadata.utility.js +24 -5
  645. package/dist/esm/utility/api/controller/apply/metadata.utility.js.map +1 -1
  646. package/dist/esm/utility/api/controller/build-route-documentation.utility.js +1 -0
  647. package/dist/esm/utility/api/controller/build-route-documentation.utility.js.map +1 -1
  648. package/dist/esm/utility/api/controller/get/dto.utility.d.ts +17 -0
  649. package/dist/esm/utility/api/controller/get/dto.utility.js +90 -12
  650. package/dist/esm/utility/api/controller/get/dto.utility.js.map +1 -1
  651. package/dist/esm/utility/api/controller/get-list/query/get-pagination-mode.utility.d.ts +8 -0
  652. package/dist/esm/utility/api/controller/get-list/query/get-pagination-mode.utility.js +41 -0
  653. package/dist/esm/utility/api/controller/get-list/query/get-pagination-mode.utility.js.map +1 -0
  654. package/dist/esm/utility/api/controller/get-list/query/open-api/decorators.utility.js +1 -0
  655. package/dist/esm/utility/api/controller/get-list/query/open-api/decorators.utility.js.map +1 -1
  656. package/dist/esm/utility/api/controller/get-list/query/open-api/value-schema.utility.js +1 -0
  657. package/dist/esm/utility/api/controller/get-list/query/open-api/value-schema.utility.js.map +1 -1
  658. package/dist/esm/utility/api/controller/get-list/query/resolve-cursor-order-fields.utility.d.ts +7 -0
  659. package/dist/esm/utility/api/controller/get-list/query/resolve-cursor-order-fields.utility.js +24 -0
  660. package/dist/esm/utility/api/controller/get-list/query/resolve-cursor-order-fields.utility.js.map +1 -0
  661. package/dist/esm/utility/api/controller/get-list/transform/filter.utility.js +1 -0
  662. package/dist/esm/utility/api/controller/get-list/transform/filter.utility.js.map +1 -1
  663. package/dist/esm/utility/api/controller/handle-request-relations.utility.d.ts +2 -1
  664. package/dist/esm/utility/api/controller/handle-request-relations.utility.js +1 -0
  665. package/dist/esm/utility/api/controller/handle-request-relations.utility.js.map +1 -1
  666. package/dist/esm/utility/api/controller/identity/assert-plan.utility.d.ts +8 -0
  667. package/dist/esm/utility/api/controller/identity/assert-plan.utility.js +16 -0
  668. package/dist/esm/utility/api/controller/identity/assert-plan.utility.js.map +1 -0
  669. package/dist/esm/utility/api/controller/identity/index.d.ts +2 -0
  670. package/dist/esm/utility/api/controller/identity/plan/get.utility.d.ts +7 -0
  671. package/dist/esm/utility/api/controller/identity/plan/get.utility.js +13 -0
  672. package/dist/esm/utility/api/controller/identity/plan/get.utility.js.map +1 -0
  673. package/dist/esm/utility/api/controller/identity/plan/index.d.ts +2 -0
  674. package/dist/esm/utility/api/controller/identity/plan/metadata-key.constant.d.ts +1 -0
  675. package/dist/esm/utility/api/controller/identity/plan/metadata-key.constant.js +4 -0
  676. package/dist/esm/utility/api/controller/identity/plan/metadata-key.constant.js.map +1 -0
  677. package/dist/esm/utility/api/controller/identity/plan/set.utility.d.ts +8 -0
  678. package/dist/esm/utility/api/controller/identity/plan/set.utility.js +14 -0
  679. package/dist/esm/utility/api/controller/identity/plan/set.utility.js.map +1 -0
  680. package/dist/esm/utility/api/controller/read/assert-plan.utility.d.ts +8 -0
  681. package/dist/esm/utility/api/controller/read/assert-plan.utility.js +16 -0
  682. package/dist/esm/utility/api/controller/read/assert-plan.utility.js.map +1 -0
  683. package/dist/esm/utility/api/controller/read/index.d.ts +3 -0
  684. package/dist/esm/utility/api/controller/read/plan/get.utility.d.ts +8 -0
  685. package/dist/esm/utility/api/controller/read/plan/get.utility.js +14 -0
  686. package/dist/esm/utility/api/controller/read/plan/get.utility.js.map +1 -0
  687. package/dist/esm/utility/api/controller/read/plan/index.d.ts +2 -0
  688. package/dist/esm/utility/api/controller/read/plan/metadata-key.constant.d.ts +1 -0
  689. package/dist/esm/utility/api/controller/read/plan/metadata-key.constant.js +4 -0
  690. package/dist/esm/utility/api/controller/read/plan/metadata-key.constant.js.map +1 -0
  691. package/dist/esm/utility/api/controller/read/plan/set.utility.d.ts +9 -0
  692. package/dist/esm/utility/api/controller/read/plan/set.utility.js +15 -0
  693. package/dist/esm/utility/api/controller/read/plan/set.utility.js.map +1 -0
  694. package/dist/esm/utility/api/controller/read/scope.utility.d.ts +12 -0
  695. package/dist/esm/utility/api/controller/read/scope.utility.js +36 -0
  696. package/dist/esm/utility/api/controller/read/scope.utility.js.map +1 -0
  697. package/dist/esm/utility/api/controller/transform-data.utility.js +13 -11
  698. package/dist/esm/utility/api/controller/transform-data.utility.js.map +1 -1
  699. package/dist/esm/utility/api/controller/validate-request.utility.d.ts +2 -1
  700. package/dist/esm/utility/api/controller/validate-request.utility.js.map +1 -1
  701. package/dist/esm/utility/api/controller/write/dto-swagger.utility.d.ts +17 -0
  702. package/dist/esm/utility/api/controller/write/dto-swagger.utility.js +24 -6
  703. package/dist/esm/utility/api/controller/write/dto-swagger.utility.js.map +1 -1
  704. package/dist/esm/utility/api/function-transaction.utility.js +1 -0
  705. package/dist/esm/utility/api/function-transaction.utility.js.map +1 -1
  706. package/dist/esm/utility/api/route/apply-dto-metadata.utility.js +1 -0
  707. package/dist/esm/utility/api/route/apply-dto-metadata.utility.js.map +1 -1
  708. package/dist/esm/utility/api/route/response/project-relation.utility.js +1 -0
  709. package/dist/esm/utility/api/route/response/project-relation.utility.js.map +1 -1
  710. package/dist/esm/utility/authorization/scope-merge-where.utility.js +248 -131
  711. package/dist/esm/utility/authorization/scope-merge-where.utility.js.map +1 -1
  712. package/dist/esm/utility/dto/build-decorator.utility.js +1 -0
  713. package/dist/esm/utility/dto/build-decorator.utility.js.map +1 -1
  714. package/dist/esm/utility/dto/generate/core.utility.js +18 -6
  715. package/dist/esm/utility/dto/generate/core.utility.js.map +1 -1
  716. package/dist/esm/utility/dto/generate/dynamic.utility.js +1 -0
  717. package/dist/esm/utility/dto/generate/dynamic.utility.js.map +1 -1
  718. package/dist/esm/utility/dto/generate/exception.utility.js +1 -0
  719. package/dist/esm/utility/dto/generate/exception.utility.js.map +1 -1
  720. package/dist/esm/utility/dto/generate/filter-decorator.utility.js +1 -0
  721. package/dist/esm/utility/dto/generate/filter-decorator.utility.js.map +1 -1
  722. package/dist/esm/utility/dto/generate/get-list/cursor-response.utility.d.ts +10 -0
  723. package/dist/esm/utility/dto/generate/get-list/cursor-response.utility.js +98 -0
  724. package/dist/esm/utility/dto/generate/get-list/cursor-response.utility.js.map +1 -0
  725. package/dist/esm/utility/dto/generate/get-list/index.d.ts +3 -0
  726. package/dist/esm/utility/dto/generate/{get-list-query-properties.utility.d.ts → get-list/query-properties.utility.d.ts} +4 -4
  727. package/dist/esm/utility/dto/generate/{get-list-query-properties.utility.js → get-list/query-properties.utility.js} +35 -34
  728. package/dist/esm/utility/dto/generate/get-list/query-properties.utility.js.map +1 -0
  729. package/dist/esm/utility/dto/generate/{get-list-response.utility.d.ts → get-list/response.utility.d.ts} +1 -1
  730. package/dist/esm/utility/dto/generate/{get-list-response.utility.js → get-list/response.utility.js} +33 -32
  731. package/dist/esm/utility/dto/generate/get-list/response.utility.js.map +1 -0
  732. package/dist/esm/utility/dto/generate/identity-read-parameters.utility.d.ts +17 -0
  733. package/dist/esm/utility/dto/generate/identity-read-parameters.utility.js +111 -0
  734. package/dist/esm/utility/dto/generate/identity-read-parameters.utility.js.map +1 -0
  735. package/dist/esm/utility/dto/generate/index.d.ts +1 -1
  736. package/dist/esm/utility/dto/generate/read-parameters.utility.d.ts +17 -0
  737. package/dist/esm/utility/dto/generate/read-parameters.utility.js +109 -0
  738. package/dist/esm/utility/dto/generate/read-parameters.utility.js.map +1 -0
  739. package/dist/esm/utility/dto/get/get-list-query-base-class.utility.d.ts +3 -2
  740. package/dist/esm/utility/dto/get/get-list-query-base-class.utility.js +48 -15
  741. package/dist/esm/utility/dto/get/get-list-query-base-class.utility.js.map +1 -1
  742. package/dist/esm/utility/dto/handle-date-property.utility.js +1 -0
  743. package/dist/esm/utility/dto/handle-date-property.utility.js.map +1 -1
  744. package/dist/esm/utility/dto/is/property/infrastructure-timestamp.utility.js +1 -0
  745. package/dist/esm/utility/dto/is/property/infrastructure-timestamp.utility.js.map +1 -1
  746. package/dist/esm/utility/dto/is/property/should-be-marked.utility.js +1 -0
  747. package/dist/esm/utility/dto/is/property/should-be-marked.utility.js.map +1 -1
  748. package/dist/esm/utility/dto/is/should-be-generated.utility.js +1 -0
  749. package/dist/esm/utility/dto/is/should-be-generated.utility.js.map +1 -1
  750. package/dist/esm/utility/object-find-property-descriptor.utility.d.ts +7 -0
  751. package/dist/esm/utility/object-find-property-descriptor.utility.js +20 -0
  752. package/dist/esm/utility/object-find-property-descriptor.utility.js.map +1 -0
  753. package/dist/esm/validator/at-most-one-of-listed-properties.validator.d.ts +5 -0
  754. package/dist/esm/validator/at-most-one-of-listed-properties.validator.js +21 -0
  755. package/dist/esm/validator/at-most-one-of-listed-properties.validator.js.map +1 -0
  756. package/package.json +2 -1
  757. package/dist/cjs/utility/dto/generate/get-list-query-properties.utility.js.map +0 -1
  758. package/dist/cjs/utility/dto/generate/get-list-response.utility.js.map +0 -1
  759. package/dist/esm/utility/dto/generate/get-list-query-properties.utility.js.map +0 -1
  760. package/dist/esm/utility/dto/generate/get-list-response.utility.js.map +0 -1
  761. /package/dist/cjs/interface/decorator/api/{get-list-response-result.interface.d.ts → get-list/response-result.interface.d.ts} +0 -0
  762. /package/dist/esm/interface/decorator/api/{get-list-response-result.interface.d.ts → get-list/response-result.interface.d.ts} +0 -0
@@ -1,11 +1,14 @@
1
1
  import { createHash } from 'node:crypto';
2
+ import { API_CONTROLLER_CURSOR_TOKEN_MAX_LENGTH } from '../../../../../constant/api-controller-cursor.constant.js';
2
3
  import '../../../../../constant/decorator/api/function.constant.js';
3
4
  import { PROPERTY_DESCRIBE_DECORATOR_API_CONSTANT } from '../../../../../constant/decorator/api/property-describe.constant.js';
4
5
  import { FILTER_OPERATOR_REGISTRY_CONSTANT } from '../../../../../constant/filter/operator-registry.constant.js';
6
+ import { UNSAFE_OBJECT_PROPERTY_NAMES_CONSTANT } from '../../../../../constant/safe-object-property-names.constant.js';
5
7
  import { DTO_GENERATE_CONSTANT } from '../../../../../constant/utility/dto/generate.constant.js';
6
8
  import '../../../../../enum/decorator/api/action.enum.js';
7
9
  import '../../../../../enum/decorator/api/authentication-type.enum.js';
8
10
  import { EApiControllerGetListQueryFilterMissingBehavior } from '../../../../../enum/decorator/api/controller/get-list/query/filter/missing-behavior.enum.js';
11
+ import { EApiControllerGetListQueryPaginationMode } from '../../../../../enum/decorator/api/controller/get-list/query/pagination-mode.enum.js';
9
12
  import { EApiControllerGetListQueryUnlistedFields } from '../../../../../enum/decorator/api/controller/get-list/query/unlisted-fields.enum.js';
10
13
  import '../../../../../enum/decorator/api/controller/relation-reference-shape.enum.js';
11
14
  import { EApiControllerRequestTarget } from '../../../../../enum/decorator/api/controller/request/target.enum.js';
@@ -27,64 +30,133 @@ import '../../../../../enum/decorator/api/property/date/identifier.enum.js';
27
30
  import '../../../../../enum/decorator/api/property/date/type.enum.js';
28
31
  import { EApiPropertyDescribeType } from '../../../../../enum/decorator/api/property/desribe-type.enum.js';
29
32
  import { EApiPropertyNumberType } from '../../../../../enum/decorator/api/property/number-type.enum.js';
30
- import '../../../../../enum/decorator/api/property/string-type.enum.js';
33
+ import { EApiPropertyStringType } from '../../../../../enum/decorator/api/property/string-type.enum.js';
31
34
  import '../../../../../enum/decorator/api/route/subscriber-authorization-expectation.enum.js';
32
35
  import { EApiRouteType } from '../../../../../enum/decorator/api/route/type.enum.js';
33
36
  import { EFilterOperand } from '../../../../../enum/filter/operand.enum.js';
34
37
  import { EFilterOperation } from '../../../../../enum/filter/operation.enum.js';
35
- import '../../../../../enum/filter/order-direction.enum.js';
38
+ import { EFilterOrderDirection } from '../../../../../enum/filter/order-direction.enum.js';
39
+ import { EManualDtoPropertyMetadataDecorator } from '../../../../../enum/utility/manual-dto-property-metadata-decorator.enum.js';
36
40
  import { ApiControllerGetListQueryEnumValues } from '../../../../../utility/api/controller/get-list/query/enum-values.utility.js';
41
+ import { ApiControllerGetListQueryResolveCursorOrderFields } from '../../../../../utility/api/controller/get-list/query/resolve-cursor-order-fields.utility.js';
37
42
  import { FilterOrderByFromEntity } from '../../../../../utility/api/filter-order-by-from-entity.utility.js';
43
+ import { DtoGetDecoratorConfig } from '../../../../../utility/dto/get/decorator-config.utility.js';
38
44
  import { DtoIsPropertyShouldBeMarked } from '../../../../../utility/dto/is/property/should-be-marked.utility.js';
45
+ import { GetManualDtoPropertyMetadata } from '../../../../../utility/dto/manual/property-metadata/get.utility.js';
39
46
  import { ErrorException } from '../../../../../utility/error/exception.utility.js';
40
47
  import { GenerateEntityInformation } from '../../../../../utility/generate-entity-information.utility.js';
41
48
  import { getMetadataArgsStorage } from 'typeorm';
42
49
 
50
+ const CURSOR_RESPONSE_PROPERTY_COUNT = 3;
51
+ const CURSOR_MAXIMUM_ARRAY_INDEX_PROPERTY = 4_294_967_294;
52
+ const CURSOR_BIGINT_COLUMN_TYPES = new Set(["bigint", "int8"]);
53
+ const CURSOR_BOOLEAN_COLUMN_TYPES = new Set(["bool", "boolean", "boolean-constructor"]);
54
+ const CURSOR_ENUM_INTEGER_COLUMN_TYPES = new Set(["int", "int2", "int4", "integer", "smallint"]);
55
+ const CURSOR_INTEGER_COLUMN_TYPES = new Set([...CURSOR_ENUM_INTEGER_COLUMN_TYPES, "number-constructor"]);
56
+ const CURSOR_NON_PERSISTED_COLUMN_MODES = new Set(["array", "treeChildrenCount", "virtual", "virtual-property"]);
57
+ const CURSOR_UUID_COLUMN_TYPES = new Set(["uuid"]);
43
58
  class ApiControllerGetListQueryPlanCompiler {
44
59
  static compile(controller, entity, entityMetadata, routeConfig) {
45
60
  const queryTarget = routeConfig.request?.[EApiControllerRequestTarget.QUERY];
46
- if (!queryTarget?.filter && !queryTarget?.order) {
61
+ if (!queryTarget?.filter && !queryTarget?.order && !queryTarget?.pagination) {
47
62
  return undefined;
48
63
  }
49
64
  if (routeConfig.dto?.[EApiDtoType.QUERY]) {
50
65
  throw ErrorException("Generated GET_LIST query configuration cannot be combined with a manual QUERY DTO");
51
66
  }
52
67
  const currentGuard = routeConfig.security?.authentication?.guard;
53
- const filterBaseline = this.buildFilterBaseline(entityMetadata, currentGuard);
54
- const orderBaseline = this.buildOrderBaseline(entity, entityMetadata);
55
- const filter = queryTarget.filter ? this.compileFilter(queryTarget.filter, filterBaseline) : Object.freeze({ fields: filterBaseline, isLegacy: true });
56
- const order = queryTarget.order ? this.compileOrder(queryTarget.order, orderBaseline) : Object.freeze({ fields: orderBaseline, isLegacy: true });
68
+ const pagination = this.compilePagination(queryTarget.pagination);
69
+ const isCursor = pagination.mode === EApiControllerGetListQueryPaginationMode.CURSOR;
70
+ const filterBaseline = this.buildFilterBaseline(entity, entityMetadata, currentGuard, isCursor);
71
+ const serverOrderBaseline = this.buildServerOrderBaseline(entity, entityMetadata, isCursor);
72
+ const orderBaseline = this.buildOrderBaseline(entity, entityMetadata, serverOrderBaseline, isCursor);
73
+ const filter = queryTarget.filter ? this.compileFilter(queryTarget.filter, filterBaseline, isCursor) : Object.freeze({ fields: filterBaseline, isLegacy: !isCursor, ...(isCursor ? { unlistedFields: EApiControllerGetListQueryUnlistedFields.INHERIT } : {}) });
74
+ const order = queryTarget.order ? this.compileOrder(queryTarget.order, orderBaseline, serverOrderBaseline, isCursor) : Object.freeze({ fields: orderBaseline, isLegacy: true, serverFields: serverOrderBaseline });
75
+ const cursorFields = isCursor ? ApiControllerGetListQueryResolveCursorOrderFields(order) : Object.freeze([]);
76
+ if (isCursor) {
77
+ this.validateCursorPlan(entity, entityMetadata, order, cursorFields, routeConfig);
78
+ }
79
+ const normalizedOrder = {
80
+ fields: Object.values(order.fields).map((field) => ({
81
+ isEnabled: field.isEnabled,
82
+ ...(isCursor ? { metadata: this.createCursorOrderFieldFingerprint(field) } : {}),
83
+ path: field.path,
84
+ })),
85
+ isLegacy: order.isLegacy,
86
+ unlistedFields: order.unlistedFields,
87
+ };
88
+ if (queryTarget.order?.defaultOrder !== undefined) {
89
+ normalizedOrder.defaultOrder = order.defaultOrder;
90
+ }
91
+ if (queryTarget.order?.tieBreakers !== undefined) {
92
+ normalizedOrder.tieBreakers = order.tieBreakers;
93
+ }
94
+ if (isCursor) {
95
+ normalizedOrder.effectiveFields = cursorFields.map((path) => {
96
+ const field = order.serverFields[path];
97
+ if (!field) {
98
+ throw ErrorException(`CURSOR GET_LIST order field "${path}" is unavailable`);
99
+ }
100
+ return {
101
+ metadata: this.createCursorOrderFieldFingerprint(field),
102
+ path,
103
+ storage: {
104
+ hasTransformer: field.hasTransformer,
105
+ isArray: field.isColumnArray,
106
+ isSelected: field.isSelected,
107
+ isUnsigned: field.isUnsigned,
108
+ mode: field.columnMode,
109
+ precision: field.precision,
110
+ scale: field.scale,
111
+ type: field.columnType,
112
+ },
113
+ };
114
+ });
115
+ }
57
116
  const normalizedPlan = {
58
117
  filter: {
59
118
  fields: Object.values(filter.fields).map((field) => ({
60
119
  allowedOperations: field.allowedOperations,
61
120
  defaultCondition: field.defaultCondition,
62
121
  isEnabled: field.isEnabled,
122
+ ...(isCursor ? { metadata: this.createFieldFingerprint(field) } : {}),
63
123
  missingBehavior: field.missingBehavior,
64
124
  path: field.path,
65
125
  })),
66
126
  isLegacy: filter.isLegacy,
67
127
  unlistedFields: filter.unlistedFields,
68
128
  },
69
- order: {
70
- fields: Object.values(order.fields).map((field) => ({
71
- isEnabled: field.isEnabled,
72
- path: field.path,
73
- })),
74
- isLegacy: order.isLegacy,
75
- unlistedFields: order.unlistedFields,
76
- },
129
+ order: normalizedOrder,
77
130
  };
131
+ if (isCursor) {
132
+ normalizedPlan.pagination = pagination;
133
+ }
78
134
  const signature = createHash("sha256").update(JSON.stringify(normalizedPlan)).digest("hex");
79
- return Object.freeze({
80
- controllerName: controller.name || "AnonymousController",
135
+ const controllerName = controller.name || "AnonymousController";
136
+ const schemaName = `${controllerName}${entityMetadata.name ?? "UnknownResource"}GetListQuery${signature}DTO`;
137
+ if (!isCursor) {
138
+ const pageFields = Object.freeze(Object.fromEntries(Object.entries(order.fields).map(([path, field]) => [path, Object.freeze({ isEnabled: field.isEnabled, path: field.path })])));
139
+ const pageOrderProperties = {};
140
+ for (const [key, value] of Object.entries(order)) {
141
+ if (key === "serverFields") {
142
+ continue;
143
+ }
144
+ pageOrderProperties[key] = key === "fields" ? pageFields : value;
145
+ }
146
+ const pageOrder = Object.freeze(pageOrderProperties);
147
+ return Object.freeze({ controllerName, filter, order: pageOrder, schemaName, signature });
148
+ }
149
+ const plan = Object.freeze({
150
+ controllerName,
81
151
  filter,
82
152
  order,
83
- schemaName: `${controller.name || "AnonymousController"}${entityMetadata.name ?? "UnknownResource"}GetListQuery${signature}DTO`,
153
+ pagination: pagination,
154
+ schemaName,
84
155
  signature,
85
156
  });
157
+ return plan;
86
158
  }
87
- static buildFilterBaseline(entityMetadata, currentGuard) {
159
+ static buildFilterBaseline(entity, entityMetadata, currentGuard, isCursor) {
88
160
  const fields = {};
89
161
  for (const column of entityMetadata.columns) {
90
162
  const metadata = this.getPropertyMetadata(column);
@@ -96,7 +168,7 @@ class ApiControllerGetListQueryPlanCompiler {
96
168
  if (!DtoIsPropertyShouldBeMarked(EApiRouteType.GET_LIST, EApiDtoType.QUERY, path, metadata, column.isPrimary, currentGuard)) {
97
169
  continue;
98
170
  }
99
- fields[path] = this.createFilterField(path, metadata, this.isColumnNullable(entityMetadata.name, path, metadata));
171
+ fields[path] = this.createFilterField(path, metadata, this.isColumnNullable(entity, entityMetadata.name, path, metadata, isCursor));
100
172
  continue;
101
173
  }
102
174
  if (!column.relation?.target || !this.isToOneRelation(column) || !DtoIsPropertyShouldBeMarked(EApiRouteType.GET_LIST, EApiDtoType.QUERY, path, metadata, column.isPrimary, currentGuard)) {
@@ -119,22 +191,46 @@ class ApiControllerGetListQueryPlanCompiler {
119
191
  continue;
120
192
  }
121
193
  const nestedPath = `${path}.${nestedName}`;
122
- fields[nestedPath] = this.createFilterField(nestedPath, nestedMetadata, this.isColumnNullable(relationMetadata.name, nestedName, nestedMetadata));
194
+ fields[nestedPath] = this.createFilterField(nestedPath, nestedMetadata, this.isColumnNullable(column.relation.target, relationMetadata.name, nestedName, nestedMetadata, isCursor));
123
195
  }
124
196
  }
125
- return Object.freeze(this.sortRecord(fields));
197
+ return Object.freeze(this.sortRecord(fields, isCursor));
126
198
  }
127
- static buildOrderBaseline(entity, entityMetadata) {
199
+ static buildOrderBaseline(entity, entityMetadata, serverBaseline, isCursor) {
128
200
  const fields = {};
129
201
  const orderFields = FilterOrderByFromEntity(entity, entityMetadata, EApiRouteType.GET_LIST, EApiDtoType.QUERY);
130
202
  for (const path of Object.values(orderFields)
131
203
  .map(String)
132
- .toSorted((left, right) => left.localeCompare(right))) {
133
- fields[path] = Object.freeze({ isEnabled: true, path });
204
+ .toSorted((left, right) => this.compareStrings(left, right, isCursor))) {
205
+ const field = serverBaseline[path];
206
+ if (field) {
207
+ fields[path] = field;
208
+ }
134
209
  }
135
210
  return Object.freeze(fields);
136
211
  }
137
- static compileAllowedOperations(rawOperations, field) {
212
+ static buildServerOrderBaseline(entity, entityMetadata, isCursor) {
213
+ const fields = {};
214
+ for (const column of entityMetadata.columns) {
215
+ const metadata = this.getPropertyMetadata(column);
216
+ if (!column.relation && metadata && metadata.type !== EApiPropertyDescribeType.OBJECT && metadata.type !== EApiPropertyDescribeType.RELATION) {
217
+ const path = String(column.name);
218
+ const columnMetadata = this.findColumnMetadata(entity, entityMetadata.name, path);
219
+ fields[path] = this.createOrderField(path, metadata, this.isColumnNullable(entity, entityMetadata.name, path, metadata, isCursor), columnMetadata);
220
+ }
221
+ }
222
+ return Object.freeze(this.sortRecord(fields, isCursor));
223
+ }
224
+ static compareStrings(left, right, isCursor) {
225
+ if (!isCursor) {
226
+ return left.localeCompare(right);
227
+ }
228
+ if (left < right) {
229
+ return -1;
230
+ }
231
+ return left > right ? 1 : 0;
232
+ }
233
+ static compileAllowedOperations(rawOperations, field, isCursor) {
138
234
  if (!Array.isArray(rawOperations) || rawOperations.length === 0) {
139
235
  throw ErrorException(`Enabled GET_LIST filter field "${field.path}" requires non-empty allowedOperations`);
140
236
  }
@@ -152,7 +248,7 @@ class ApiControllerGetListQueryPlanCompiler {
152
248
  operations.push(operation);
153
249
  }
154
250
  }
155
- return Object.freeze(operations.toSorted((left, right) => left.localeCompare(right)));
251
+ return Object.freeze(operations.toSorted((left, right) => this.compareStrings(left, right, isCursor)));
156
252
  }
157
253
  static compileDefaultCondition(rawCondition, field, allowedOperations) {
158
254
  const condition = this.requireRecord(rawCondition, `GET_LIST filter defaultCondition for "${field.path}"`);
@@ -181,13 +277,13 @@ class ApiControllerGetListQueryPlanCompiler {
181
277
  }
182
278
  return Object.freeze({ operation, values: Object.freeze([...conditionValues]) });
183
279
  }
184
- static compileFilter(config, baseline) {
280
+ static compileFilter(config, baseline, isCursor) {
185
281
  const rawConfig = this.requireRecord(config, "GET_LIST filter");
186
282
  this.requireExactKeys(rawConfig, ["fields", "unlistedFields"], "GET_LIST filter");
187
283
  this.validateUnlistedFields(config.unlistedFields, "filter");
188
284
  const configuredFields = this.requireRecord(config.fields, "GET_LIST filter fields");
189
285
  const fields = config.unlistedFields === EApiControllerGetListQueryUnlistedFields.INHERIT ? { ...baseline } : {};
190
- for (const [path, rawField] of Object.entries(configuredFields).toSorted(([left], [right]) => left.localeCompare(right))) {
286
+ for (const [path, rawField] of Object.entries(configuredFields).toSorted(([left], [right]) => this.compareStrings(left, right, isCursor))) {
191
287
  const baselineField = baseline[path];
192
288
  if (!baselineField) {
193
289
  throw ErrorException(`GET_LIST filter field "${path}" is not an enabled direct scalar or one-hop to-one scalar path`);
@@ -203,7 +299,7 @@ class ApiControllerGetListQueryPlanCompiler {
203
299
  throw ErrorException(`GET_LIST filter field "${path}" must declare isEnabled`);
204
300
  }
205
301
  this.requireAllowedKeys(field, ["allowedOperations", "defaultCondition", "isEnabled", "missingBehavior"], `GET_LIST filter field "${path}"`);
206
- const allowedOperations = this.compileAllowedOperations(field.allowedOperations, baselineField);
302
+ const allowedOperations = this.compileAllowedOperations(field.allowedOperations, baselineField, isCursor);
207
303
  const missingBehavior = field.missingBehavior ?? EApiControllerGetListQueryFilterMissingBehavior.OMIT;
208
304
  if (!Object.values(EApiControllerGetListQueryFilterMissingBehavior).includes(missingBehavior)) {
209
305
  throw ErrorException(`GET_LIST filter field "${path}" has an invalid missingBehavior`);
@@ -224,18 +320,18 @@ class ApiControllerGetListQueryPlanCompiler {
224
320
  });
225
321
  }
226
322
  return Object.freeze({
227
- fields: Object.freeze(this.sortRecord(fields)),
323
+ fields: Object.freeze(this.sortRecord(fields, isCursor)),
228
324
  isLegacy: false,
229
325
  unlistedFields: config.unlistedFields,
230
326
  });
231
327
  }
232
- static compileOrder(config, baseline) {
328
+ static compileOrder(config, baseline, serverBaseline, isCursor) {
233
329
  const rawConfig = this.requireRecord(config, "GET_LIST order");
234
- this.requireExactKeys(rawConfig, ["fields", "unlistedFields"], "GET_LIST order");
330
+ this.requireAllowedKeys(rawConfig, ["defaultOrder", "fields", "tieBreakers", "unlistedFields"], "GET_LIST order");
235
331
  this.validateUnlistedFields(config.unlistedFields, "order");
236
332
  const configuredFields = this.requireRecord(config.fields, "GET_LIST order fields");
237
333
  const fields = config.unlistedFields === EApiControllerGetListQueryUnlistedFields.INHERIT ? { ...baseline } : {};
238
- for (const [path, rawField] of Object.entries(configuredFields).toSorted(([left], [right]) => left.localeCompare(right))) {
334
+ for (const [path, rawField] of Object.entries(configuredFields).toSorted(([left], [right]) => this.compareStrings(left, right, isCursor))) {
239
335
  const baselineField = baseline[path];
240
336
  if (!baselineField) {
241
337
  throw ErrorException(`GET_LIST order field "${path}" is not an enabled direct scalar path`);
@@ -247,41 +343,236 @@ class ApiControllerGetListQueryPlanCompiler {
247
343
  }
248
344
  fields[path] = Object.freeze({ ...baselineField, isEnabled: field.isEnabled });
249
345
  }
346
+ const defaultOrder = this.compileOrderEntries(config.defaultOrder, serverBaseline, "defaultOrder");
347
+ const tieBreakers = this.compileOrderEntries(config.tieBreakers, serverBaseline, "tieBreakers");
348
+ for (const defaultEntry of defaultOrder) {
349
+ const tieBreaker = tieBreakers.find((entry) => entry.field === defaultEntry.field);
350
+ if (tieBreaker && tieBreaker.direction !== defaultEntry.direction) {
351
+ throw ErrorException(`GET_LIST order field "${defaultEntry.field}" has conflicting directions across defaultOrder and tieBreakers`);
352
+ }
353
+ }
250
354
  return Object.freeze({
251
- fields: Object.freeze(this.sortRecord(fields)),
355
+ ...(config.defaultOrder === undefined ? {} : { defaultOrder }),
356
+ fields: Object.freeze(this.sortRecord(fields, isCursor)),
252
357
  isLegacy: false,
358
+ serverFields: serverBaseline,
359
+ ...(config.tieBreakers === undefined ? {} : { tieBreakers }),
253
360
  unlistedFields: config.unlistedFields,
254
361
  });
255
362
  }
363
+ static compileOrderEntries(rawEntries, baseline, context) {
364
+ if (rawEntries === undefined) {
365
+ return Object.freeze([]);
366
+ }
367
+ if (!Array.isArray(rawEntries)) {
368
+ throw ErrorException(`GET_LIST order ${context} must be an array`);
369
+ }
370
+ const entries = [];
371
+ const seenFields = new Set();
372
+ for (const [index, rawEntry] of rawEntries.entries()) {
373
+ const entry = this.requireRecord(rawEntry, `GET_LIST order ${context}[${index}]`);
374
+ this.requireExactKeys(entry, ["direction", "field"], `GET_LIST order ${context}[${index}]`);
375
+ const field = entry.field;
376
+ const direction = entry.direction;
377
+ if (typeof field !== "string" || !baseline[field]) {
378
+ throw ErrorException(`GET_LIST order ${context}[${index}] must target a described direct scalar entity field`);
379
+ }
380
+ if (direction !== EFilterOrderDirection.ASC && direction !== EFilterOrderDirection.DESC) {
381
+ throw ErrorException(`GET_LIST order ${context}[${index}] has an invalid direction`);
382
+ }
383
+ if (seenFields.has(field)) {
384
+ throw ErrorException(`GET_LIST order ${context} contains duplicate field "${field}"`);
385
+ }
386
+ seenFields.add(field);
387
+ entries.push(Object.freeze({ direction, field }));
388
+ }
389
+ return Object.freeze(entries);
390
+ }
391
+ static compilePagination(config) {
392
+ if (config === undefined) {
393
+ return Object.freeze({ mode: EApiControllerGetListQueryPaginationMode.PAGE });
394
+ }
395
+ const rawConfig = this.requireRecord(config, "GET_LIST pagination");
396
+ this.requireExactKeys(rawConfig, ["mode"], "GET_LIST pagination");
397
+ if (!Object.values(EApiControllerGetListQueryPaginationMode).includes(config.mode)) {
398
+ throw ErrorException("GET_LIST pagination mode must be PAGE or CURSOR");
399
+ }
400
+ return Object.freeze({ mode: config.mode });
401
+ }
402
+ static createCursorOrderFieldFingerprint(field) {
403
+ const fingerprint = { type: field.type };
404
+ if ("format" in field.metadata) {
405
+ fingerprint.format = field.metadata.format;
406
+ }
407
+ if ("enum" in field.metadata) {
408
+ const values = ApiControllerGetListQueryEnumValues(field.metadata.enum);
409
+ let enumKind = "mixed";
410
+ if (values.every((value) => typeof value === "number")) {
411
+ enumKind = "number";
412
+ }
413
+ else if (values.every((value) => typeof value === "string")) {
414
+ enumKind = "string";
415
+ }
416
+ fingerprint.enumKind = enumKind;
417
+ }
418
+ return fingerprint;
419
+ }
420
+ static createFieldFingerprint(field) {
421
+ const metadata = field.metadata;
422
+ const fingerprint = {
423
+ isNullable: field.isNullable,
424
+ type: field.type,
425
+ };
426
+ for (const key of ["format", "identifier", "isArray", "maximum", "maxLength", "minimum", "minLength", "multipleOf", "pattern"]) {
427
+ if (key in metadata) {
428
+ fingerprint[key] = metadata[key];
429
+ }
430
+ }
431
+ if ("enum" in field.metadata) {
432
+ fingerprint.enum = ApiControllerGetListQueryEnumValues(field.metadata.enum);
433
+ }
434
+ return fingerprint;
435
+ }
256
436
  static createFilterField(path, metadata, isNullable) {
257
437
  const allowedOperations = Object.freeze(Object.values(EFilterOperation).filter((operation) => {
258
438
  const descriptor = FILTER_OPERATOR_REGISTRY_CONSTANT.OPERATORS[operation];
259
439
  return descriptor.kinds.includes(metadata.type) && (descriptor.operand !== EFilterOperand.NONE || isNullable);
260
440
  }));
261
- const planMetadata = "enum" in metadata ? { ...metadata, enum: Object.freeze({ ...metadata.enum }) } : { ...metadata };
441
+ const planMetadata = this.createPlanMetadata(metadata);
262
442
  return Object.freeze({
263
443
  allowedOperations,
264
444
  isEnabled: true,
265
445
  isNullable,
266
- metadata: Object.freeze(planMetadata),
446
+ metadata: planMetadata,
267
447
  missingBehavior: EApiControllerGetListQueryFilterMissingBehavior.OMIT,
268
448
  path,
269
449
  type: metadata.type,
270
450
  });
271
451
  }
452
+ static createOrderField(path, metadata, isNullable, columnMetadata) {
453
+ return Object.freeze({
454
+ columnMode: columnMetadata?.mode ?? "unknown",
455
+ columnType: this.normalizeColumnType(columnMetadata),
456
+ hasTransformer: columnMetadata?.options.transformer !== undefined,
457
+ isColumnArray: columnMetadata?.options.array === true,
458
+ isEnabled: true,
459
+ isNullable,
460
+ isSelected: columnMetadata?.options.select !== false,
461
+ isUnsigned: columnMetadata?.options.unsigned === true,
462
+ metadata: this.createPlanMetadata(metadata),
463
+ path,
464
+ ...(columnMetadata?.options.precision === undefined ? {} : { precision: columnMetadata.options.precision }),
465
+ ...(columnMetadata?.options.scale === undefined ? {} : { scale: columnMetadata.options.scale }),
466
+ type: metadata.type,
467
+ });
468
+ }
469
+ static createPlanMetadata(metadata) {
470
+ const planMetadata = "enum" in metadata ? { ...metadata, enum: Object.freeze({ ...metadata.enum }) } : { ...metadata };
471
+ return Object.freeze(planMetadata);
472
+ }
473
+ static findColumnMetadata(entity, entityName, propertyName) {
474
+ const targets = [];
475
+ if (typeof entity === "function") {
476
+ let current = entity;
477
+ while (typeof current === "function" && current !== Object) {
478
+ targets.push(current, current.name);
479
+ current = Object.getPrototypeOf(current);
480
+ }
481
+ }
482
+ else if (typeof entity.name === "string") {
483
+ targets.push(entity.name);
484
+ }
485
+ if (entityName && !targets.includes(entityName)) {
486
+ targets.push(entityName);
487
+ }
488
+ for (const expectedTarget of targets) {
489
+ const column = getMetadataArgsStorage().columns.find(({ propertyName: currentPropertyName, target }) => currentPropertyName === propertyName && (target === expectedTarget || (typeof expectedTarget === "string" && typeof target !== "string" && target.name === expectedTarget)));
490
+ if (column) {
491
+ return column;
492
+ }
493
+ }
494
+ return undefined;
495
+ }
272
496
  static getPropertyMetadata(column) {
273
497
  return column.metadata?.[PROPERTY_DESCRIBE_DECORATOR_API_CONSTANT.METADATA_KEY];
274
498
  }
275
- static isColumnNullable(entityName, propertyName, metadata) {
276
- const column = getMetadataArgsStorage().columns.find(({ propertyName: currentPropertyName, target }) => currentPropertyName === propertyName && (typeof target === "string" ? target === entityName : target.name === entityName));
499
+ static hasAfterLoadListener(entity) {
500
+ if (typeof entity !== "function") {
501
+ return false;
502
+ }
503
+ const targets = new Set();
504
+ let current = entity;
505
+ while (typeof current === "function" && current !== Object) {
506
+ targets.add(current);
507
+ current = Object.getPrototypeOf(current);
508
+ }
509
+ return getMetadataArgsStorage().entityListeners.some((listener) => listener.type === "after-load" && targets.has(listener.target));
510
+ }
511
+ static hasPropertyAccessor(entity, propertyName) {
512
+ if (typeof entity === "function") {
513
+ try {
514
+ const instance = Reflect.construct(entity, []);
515
+ const ownDescriptor = Object.getOwnPropertyDescriptor(instance, propertyName);
516
+ if (ownDescriptor && !("value" in ownDescriptor)) {
517
+ return true;
518
+ }
519
+ }
520
+ catch {
521
+ return true;
522
+ }
523
+ }
524
+ let current = typeof entity === "function" ? Reflect.get(entity, "prototype") : undefined;
525
+ while (current && typeof current === "object" && current !== Object.prototype) {
526
+ const descriptor = Object.getOwnPropertyDescriptor(current, propertyName);
527
+ if (descriptor && !("value" in descriptor)) {
528
+ return true;
529
+ }
530
+ current = Object.getPrototypeOf(current);
531
+ }
532
+ return false;
533
+ }
534
+ static isColumnNullable(entity, entityName, propertyName, metadata, isCursor) {
535
+ const column = isCursor ? this.findColumnMetadata(entity, entityName, propertyName) : getMetadataArgsStorage().columns.find(({ propertyName: currentPropertyName, target }) => currentPropertyName === propertyName && (typeof target === "string" ? target === entityName : target.name === entityName));
277
536
  return column?.options.nullable === true || metadata.isNullable === true;
278
537
  }
538
+ static isCursorEnvelopeStringMetadata(metadata) {
539
+ if (metadata.decorator !== EManualDtoPropertyMetadataDecorator.STRING || !this.isManualRawResponseProperty(metadata, false, true)) {
540
+ return false;
541
+ }
542
+ return metadata.properties.format === EApiPropertyStringType.STRING && metadata.properties.minLength === 1 && metadata.properties.maxLength === API_CONTROLLER_CURSOR_TOKEN_MAX_LENGTH && metadata.properties.pattern === "/^[A-Za-z0-9_-]+$/";
543
+ }
279
544
  static isGloballyDisabled(metadata) {
280
545
  return metadata.properties?.[EApiRouteType.GET_LIST]?.[EApiDtoType.QUERY]?.isEnabled === false;
281
546
  }
547
+ static isManualRawResponseProperty(metadata, isArray, isNullable) {
548
+ const properties = metadata.properties;
549
+ const hasExpectedArrayShape = isArray ? properties.isArray === true : properties.isArray !== true;
550
+ const hasExpectedNullability = isNullable ? properties.isNullable === true : properties.isNullable !== true;
551
+ return hasExpectedArrayShape && hasExpectedNullability && properties.isRequired === true && properties.isResponse === true && properties.isExpose !== false;
552
+ }
282
553
  static isToOneRelation(column) {
283
554
  return column.type === "many-to-one" || column.type === "one-to-one";
284
555
  }
556
+ static isUnsafeCursorFieldName(fieldName) {
557
+ const numericName = Number(fieldName);
558
+ return UNSAFE_OBJECT_PROPERTY_NAMES_CONSTANT.has(fieldName) || (Number.isInteger(numericName) && numericName >= 0 && numericName <= CURSOR_MAXIMUM_ARRAY_INDEX_PROPERTY && String(numericName) === fieldName);
559
+ }
560
+ static normalizeColumnType(column) {
561
+ const columnType = column?.options.type;
562
+ if (columnType === Boolean) {
563
+ return "boolean-constructor";
564
+ }
565
+ if (columnType === Date) {
566
+ return "date-constructor";
567
+ }
568
+ if (columnType === Number) {
569
+ return "number-constructor";
570
+ }
571
+ if (columnType === String) {
572
+ return "string-constructor";
573
+ }
574
+ return typeof columnType === "string" ? columnType.trim().toLowerCase() : "unknown";
575
+ }
285
576
  static requireAllowedKeys(value, allowedKeys, context) {
286
577
  const invalidKey = Object.keys(value).find((key) => !allowedKeys.includes(key));
287
578
  if (invalidKey) {
@@ -301,8 +592,155 @@ class ApiControllerGetListQueryPlanCompiler {
301
592
  }
302
593
  return value;
303
594
  }
304
- static sortRecord(record) {
305
- return Object.fromEntries(Object.entries(record).toSorted(([left], [right]) => left.localeCompare(right)));
595
+ static sortRecord(record, isCursor) {
596
+ return Object.fromEntries(Object.entries(record).toSorted(([left], [right]) => this.compareStrings(left, right, isCursor)));
597
+ }
598
+ static validateCursorCustomResponseDto(routeConfig, fields, order) {
599
+ const responseDto = routeConfig.dto?.[EApiDtoType.RESPONSE];
600
+ if (!responseDto) {
601
+ return;
602
+ }
603
+ let itemType;
604
+ if (typeof responseDto === "function") {
605
+ const wrapperMetadata = GetManualDtoPropertyMetadata(Reflect.get(responseDto, "prototype"));
606
+ const itemsMetadata = wrapperMetadata.get("items");
607
+ const nextCursorMetadata = wrapperMetadata.get("nextCursor");
608
+ const previousCursorMetadata = wrapperMetadata.get("previousCursor");
609
+ if (wrapperMetadata.size !== CURSOR_RESPONSE_PROPERTY_COUNT ||
610
+ itemsMetadata?.decorator !== EManualDtoPropertyMetadataDecorator.OBJECT ||
611
+ nextCursorMetadata?.decorator !== EManualDtoPropertyMetadataDecorator.STRING ||
612
+ previousCursorMetadata?.decorator !== EManualDtoPropertyMetadataDecorator.STRING ||
613
+ !this.isManualRawResponseProperty(itemsMetadata, true, false) ||
614
+ Array.isArray(itemsMetadata.properties.type) ||
615
+ typeof itemsMetadata.properties.type !== "function" ||
616
+ itemsMetadata.properties.type === Object ||
617
+ !this.isCursorEnvelopeStringMetadata(nextCursorMetadata) ||
618
+ !this.isCursorEnvelopeStringMetadata(previousCursorMetadata) ||
619
+ this.hasPropertyAccessor(responseDto, "items") ||
620
+ this.hasPropertyAccessor(responseDto, "nextCursor") ||
621
+ this.hasPropertyAccessor(responseDto, "previousCursor")) {
622
+ throw ErrorException("CURSOR GET_LIST custom response DTO must prove the flat raw cursor envelope through Automator property metadata");
623
+ }
624
+ itemType = itemsMetadata.properties.type;
625
+ }
626
+ else if (typeof responseDto === "object" && "itemType" in responseDto && typeof responseDto.itemType === "function") {
627
+ itemType = responseDto.itemType;
628
+ }
629
+ if (!itemType) {
630
+ throw ErrorException("CURSOR GET_LIST custom response DTO must expose a statically provable item type");
631
+ }
632
+ this.validateCursorItemDto(itemType, fields, order);
633
+ }
634
+ static validateCursorItemDto(itemType, fields, order) {
635
+ const itemMetadata = GetManualDtoPropertyMetadata(Reflect.get(itemType, "prototype"));
636
+ for (const fieldName of fields) {
637
+ const field = order.serverFields[fieldName];
638
+ const metadata = itemMetadata.get(fieldName);
639
+ const expectedDecorator = field && field.type !== EApiPropertyDescribeType.OBJECT && field.type !== EApiPropertyDescribeType.RELATION ? field.type : undefined;
640
+ const expectedFormat = field && "format" in field.metadata ? field.metadata.format : undefined;
641
+ const actualFormat = metadata && "format" in metadata.properties ? metadata.properties.format : undefined;
642
+ if (!field || !metadata || metadata.decorator !== expectedDecorator || !this.isManualRawResponseProperty(metadata, false, false) || actualFormat !== expectedFormat || this.hasPropertyAccessor(itemType, fieldName)) {
643
+ throw ErrorException(`CURSOR GET_LIST custom item DTO must raw-expose protected field "${fieldName}" through compatible Automator property metadata`);
644
+ }
645
+ }
646
+ }
647
+ static validateCursorPlan(entity, entityMetadata, order, cursorFields, routeConfig) {
648
+ const primaryColumns = entityMetadata.columns.filter((column) => column.isPrimary);
649
+ if (primaryColumns.length !== 1) {
650
+ throw ErrorException("CURSOR GET_LIST requires exactly one primary column");
651
+ }
652
+ if (order.isLegacy) {
653
+ throw ErrorException("CURSOR GET_LIST requires explicit order configuration");
654
+ }
655
+ if (this.hasAfterLoadListener(entity)) {
656
+ throw ErrorException("CURSOR GET_LIST entity cannot declare TypeORM after-load listeners");
657
+ }
658
+ const primaryField = String(primaryColumns[0]?.name);
659
+ const tieBreakers = order.tieBreakers ?? [];
660
+ const finalTieBreaker = tieBreakers.at(-1);
661
+ if (finalTieBreaker?.field !== primaryField) {
662
+ throw ErrorException(`CURSOR GET_LIST requires the sole primary field "${primaryField}" as the final explicit tie-breaker`);
663
+ }
664
+ if ((order.defaultOrder ?? []).some((entry) => entry.field === primaryField) || tieBreakers.slice(0, -1).some((entry) => entry.field === primaryField) || order.fields[primaryField]?.isEnabled === true) {
665
+ throw ErrorException(`CURSOR GET_LIST primary field "${primaryField}" may appear only as the final tie-breaker`);
666
+ }
667
+ const potentialFields = new Set(cursorFields);
668
+ for (const fieldName of potentialFields) {
669
+ const field = order.serverFields[fieldName];
670
+ if (this.isUnsafeCursorFieldName(fieldName)) {
671
+ throw ErrorException(`CURSOR GET_LIST order field "${fieldName}" is not a safe stable object property name`);
672
+ }
673
+ if (!field || field.isNullable || ("isArray" in field.metadata && field.metadata.isArray === true)) {
674
+ throw ErrorException(`CURSOR GET_LIST order field "${fieldName}" must be a described non-null direct scalar field`);
675
+ }
676
+ this.validateCursorStorageField(field);
677
+ if (this.hasPropertyAccessor(entity, fieldName)) {
678
+ throw ErrorException(`CURSOR GET_LIST order field "${fieldName}" must be a raw data property, not an accessor`);
679
+ }
680
+ this.validateCursorResponseExposure(entityMetadata, fieldName);
681
+ }
682
+ this.validateCursorCustomResponseDto(routeConfig, potentialFields, order);
683
+ }
684
+ static validateCursorResponseExposure(entityMetadata, fieldName) {
685
+ const column = entityMetadata.columns.find((candidate) => String(candidate.name) === fieldName);
686
+ const metadata = column ? this.getPropertyMetadata(column) : undefined;
687
+ if (!column || !metadata) {
688
+ throw ErrorException(`CURSOR GET_LIST order field "${fieldName}" must be raw-exposed in the generated response`);
689
+ }
690
+ const effectiveResponse = DtoGetDecoratorConfig(EApiRouteType.GET_LIST, metadata, EApiDtoType.RESPONSE);
691
+ if (effectiveResponse.guard || !DtoIsPropertyShouldBeMarked(EApiRouteType.GET_LIST, EApiDtoType.RESPONSE, fieldName, metadata, column.isPrimary) || effectiveResponse.isEnabled === false || effectiveResponse.isResponse !== true || effectiveResponse.isExpose !== true) {
692
+ throw ErrorException(`CURSOR GET_LIST order field "${fieldName}" must be unconditionally raw-exposed in the generated response`);
693
+ }
694
+ }
695
+ static validateCursorStorageField(field) {
696
+ if (field.columnType === "unknown" || CURSOR_NON_PERSISTED_COLUMN_MODES.has(field.columnMode) || field.hasTransformer || field.isColumnArray || !field.isSelected) {
697
+ throw ErrorException(`CURSOR GET_LIST order field "${field.path}" must be a selected persisted column without a transformer`);
698
+ }
699
+ if (field.isUnsigned) {
700
+ throw ErrorException(`CURSOR GET_LIST order field "${field.path}" cannot use unsigned storage in PostgreSQL v1`);
701
+ }
702
+ if (field.type === EApiPropertyDescribeType.BOOLEAN) {
703
+ if (!CURSOR_BOOLEAN_COLUMN_TYPES.has(field.columnType)) {
704
+ throw ErrorException(`CURSOR GET_LIST boolean order field "${field.path}" requires PostgreSQL boolean storage`);
705
+ }
706
+ return;
707
+ }
708
+ if (field.type === EApiPropertyDescribeType.NUMBER) {
709
+ if (!("format" in field.metadata) || field.metadata.format !== EApiPropertyNumberType.INTEGER) {
710
+ throw ErrorException(`CURSOR GET_LIST numeric order field "${field.path}" supports only INTEGER metadata in PostgreSQL v1`);
711
+ }
712
+ if (!CURSOR_INTEGER_COLUMN_TYPES.has(field.columnType)) {
713
+ throw ErrorException(`CURSOR GET_LIST integer order field "${field.path}" requires signed PostgreSQL int2/int4 storage`);
714
+ }
715
+ return;
716
+ }
717
+ if (field.type === EApiPropertyDescribeType.STRING) {
718
+ const format = "format" in field.metadata ? field.metadata.format : undefined;
719
+ if (format !== EApiPropertyStringType.BIGINT_STRING) {
720
+ throw ErrorException(`CURSOR GET_LIST string order field "${field.path}" supports only BIGINT_STRING metadata in PostgreSQL v1`);
721
+ }
722
+ if (!CURSOR_BIGINT_COLUMN_TYPES.has(field.columnType)) {
723
+ throw ErrorException(`CURSOR GET_LIST bigint-string order field "${field.path}" requires signed PostgreSQL int8 storage`);
724
+ }
725
+ return;
726
+ }
727
+ if (field.type === EApiPropertyDescribeType.ENUM) {
728
+ const enumValues = ApiControllerGetListQueryEnumValues("enum" in field.metadata ? field.metadata.enum : {});
729
+ if (enumValues.length === 0 || !enumValues.every((value) => typeof value === "number" && Number.isSafeInteger(value))) {
730
+ throw ErrorException(`CURSOR GET_LIST enum order field "${field.path}" requires safe numeric values in PostgreSQL v1`);
731
+ }
732
+ if (!CURSOR_ENUM_INTEGER_COLUMN_TYPES.has(field.columnType)) {
733
+ throw ErrorException(`CURSOR GET_LIST enum order field "${field.path}" requires signed PostgreSQL int2/int4 storage`);
734
+ }
735
+ return;
736
+ }
737
+ if (field.type === EApiPropertyDescribeType.UUID) {
738
+ if (!CURSOR_UUID_COLUMN_TYPES.has(field.columnType)) {
739
+ throw ErrorException(`CURSOR GET_LIST UUID order field "${field.path}" requires native PostgreSQL UUID storage`);
740
+ }
741
+ return;
742
+ }
743
+ throw ErrorException(`CURSOR GET_LIST order field "${field.path}" is not supported by PostgreSQL CURSOR v1`);
306
744
  }
307
745
  static validateStaticValue(value, field) {
308
746
  let isValid;