@venizia/ignis-kernel 0.2.0-1 → 0.2.0-10

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 (217) hide show
  1. package/dist/cjs/base/auth/authenticate/common/constants.d.ts +28 -1
  2. package/dist/cjs/base/auth/authenticate/common/constants.d.ts.map +1 -1
  3. package/dist/cjs/base/auth/authenticate/common/constants.js +29 -2
  4. package/dist/cjs/base/auth/authenticate/common/constants.js.map +1 -1
  5. package/dist/cjs/base/auth/authenticate/common/errors.d.ts +40 -1
  6. package/dist/cjs/base/auth/authenticate/common/errors.d.ts.map +1 -1
  7. package/dist/cjs/base/auth/authenticate/common/errors.js +41 -1
  8. package/dist/cjs/base/auth/authenticate/common/errors.js.map +1 -1
  9. package/dist/cjs/base/auth/authenticate/common/keys.d.ts +2 -0
  10. package/dist/cjs/base/auth/authenticate/common/keys.d.ts.map +1 -1
  11. package/dist/cjs/base/auth/authenticate/common/keys.js +2 -0
  12. package/dist/cjs/base/auth/authenticate/common/keys.js.map +1 -1
  13. package/dist/cjs/base/auth/authenticate/common/types.d.ts +147 -1
  14. package/dist/cjs/base/auth/authenticate/common/types.d.ts.map +1 -1
  15. package/dist/cjs/base/auth/authenticate/strategies/strategy-registry.d.ts +37 -0
  16. package/dist/cjs/base/auth/authenticate/strategies/strategy-registry.d.ts.map +1 -1
  17. package/dist/cjs/base/auth/authenticate/strategies/strategy-registry.js +54 -0
  18. package/dist/cjs/base/auth/authenticate/strategies/strategy-registry.js.map +1 -1
  19. package/dist/cjs/base/auth/authorize/builders/policy.builder.d.ts +28 -33
  20. package/dist/cjs/base/auth/authorize/builders/policy.builder.d.ts.map +1 -1
  21. package/dist/cjs/base/auth/authorize/builders/policy.builder.js.map +1 -1
  22. package/dist/cjs/base/auth/authorize/common/constants.d.ts +25 -1
  23. package/dist/cjs/base/auth/authorize/common/constants.d.ts.map +1 -1
  24. package/dist/cjs/base/auth/authorize/common/constants.js +12 -18
  25. package/dist/cjs/base/auth/authorize/common/constants.js.map +1 -1
  26. package/dist/cjs/base/auth/authorize/common/errors.d.ts +9 -0
  27. package/dist/cjs/base/auth/authorize/common/errors.d.ts.map +1 -1
  28. package/dist/cjs/base/auth/authorize/common/errors.js +9 -0
  29. package/dist/cjs/base/auth/authorize/common/errors.js.map +1 -1
  30. package/dist/cjs/base/auth/authorize/common/types.d.ts +1 -1
  31. package/dist/cjs/base/auth/authorize/common/types.d.ts.map +1 -1
  32. package/dist/cjs/base/auth/authorize/enforcers/enforcer-registry.d.ts +17 -0
  33. package/dist/cjs/base/auth/authorize/enforcers/enforcer-registry.d.ts.map +1 -1
  34. package/dist/cjs/base/auth/authorize/enforcers/enforcer-registry.js +39 -3
  35. package/dist/cjs/base/auth/authorize/enforcers/enforcer-registry.js.map +1 -1
  36. package/dist/cjs/base/auth/authorize/providers/authorization.provider.d.ts.map +1 -1
  37. package/dist/cjs/base/auth/authorize/providers/authorization.provider.js +33 -10
  38. package/dist/cjs/base/auth/authorize/providers/authorization.provider.js.map +1 -1
  39. package/dist/cjs/base/auth/base/abstract-auth-registry.d.ts +10 -0
  40. package/dist/cjs/base/auth/base/abstract-auth-registry.d.ts.map +1 -1
  41. package/dist/cjs/base/auth/base/abstract-auth-registry.js +12 -0
  42. package/dist/cjs/base/auth/base/abstract-auth-registry.js.map +1 -1
  43. package/dist/cjs/base/auth/context-variables.d.ts +7 -1
  44. package/dist/cjs/base/auth/context-variables.d.ts.map +1 -1
  45. package/dist/cjs/base/controllers/factory/controller.d.ts +1 -1
  46. package/dist/cjs/base/controllers/factory/controller.d.ts.map +1 -1
  47. package/dist/cjs/base/controllers/factory/definition.d.ts +1 -1
  48. package/dist/cjs/base/controllers/factory/definition.d.ts.map +1 -1
  49. package/dist/cjs/base/controllers/factory/definition.js +3 -5
  50. package/dist/cjs/base/controllers/factory/definition.js.map +1 -1
  51. package/dist/cjs/base/controllers/rest/abstract.d.ts.map +1 -1
  52. package/dist/cjs/base/controllers/rest/abstract.js +10 -0
  53. package/dist/cjs/base/controllers/rest/abstract.js.map +1 -1
  54. package/dist/cjs/base/events/common/constants.d.ts +5 -0
  55. package/dist/cjs/base/events/common/constants.d.ts.map +1 -0
  56. package/dist/cjs/base/events/common/constants.js +9 -0
  57. package/dist/cjs/base/events/common/constants.js.map +1 -0
  58. package/dist/cjs/base/events/common/index.d.ts +3 -0
  59. package/dist/cjs/base/events/common/index.d.ts.map +1 -0
  60. package/dist/cjs/base/events/common/index.js +19 -0
  61. package/dist/cjs/base/events/common/index.js.map +1 -0
  62. package/dist/cjs/base/events/common/types.d.ts +26 -0
  63. package/dist/cjs/base/events/common/types.d.ts.map +1 -0
  64. package/dist/cjs/base/events/common/types.js +3 -0
  65. package/dist/cjs/base/events/common/types.js.map +1 -0
  66. package/dist/cjs/base/events/event-bus.d.ts +41 -0
  67. package/dist/cjs/base/events/event-bus.d.ts.map +1 -0
  68. package/dist/cjs/base/events/event-bus.js +100 -0
  69. package/dist/cjs/base/events/event-bus.js.map +1 -0
  70. package/dist/cjs/base/events/index.d.ts +3 -0
  71. package/dist/cjs/base/events/index.d.ts.map +1 -0
  72. package/dist/cjs/base/events/index.js +19 -0
  73. package/dist/cjs/base/events/index.js.map +1 -0
  74. package/dist/cjs/base/index.d.ts +1 -0
  75. package/dist/cjs/base/index.d.ts.map +1 -1
  76. package/dist/cjs/base/index.js +1 -5
  77. package/dist/cjs/base/index.js.map +1 -1
  78. package/dist/cjs/base/metadata/persistents.js +1 -1
  79. package/dist/cjs/base/metadata/persistents.js.map +1 -1
  80. package/dist/cjs/base/middlewares/not-found/not-found.middleware.d.ts.map +1 -1
  81. package/dist/cjs/base/middlewares/not-found/not-found.middleware.js +4 -1
  82. package/dist/cjs/base/middlewares/not-found/not-found.middleware.js.map +1 -1
  83. package/dist/cjs/base/repositories/common/constants.d.ts +26 -0
  84. package/dist/cjs/base/repositories/common/constants.d.ts.map +1 -1
  85. package/dist/cjs/base/repositories/common/constants.js +29 -1
  86. package/dist/cjs/base/repositories/common/constants.js.map +1 -1
  87. package/dist/cjs/base/repositories/core/abstract.d.ts +29 -0
  88. package/dist/cjs/base/repositories/core/abstract.d.ts.map +1 -1
  89. package/dist/cjs/base/repositories/core/abstract.js +71 -1
  90. package/dist/cjs/base/repositories/core/abstract.js.map +1 -1
  91. package/dist/cjs/base/repositories/index.d.ts +1 -0
  92. package/dist/cjs/base/repositories/index.d.ts.map +1 -1
  93. package/dist/cjs/base/repositories/index.js +1 -0
  94. package/dist/cjs/base/repositories/index.js.map +1 -1
  95. package/dist/cjs/base/repositories/query-schemas/index.d.ts +26 -3
  96. package/dist/cjs/base/repositories/query-schemas/index.d.ts.map +1 -1
  97. package/dist/cjs/base/repositories/query-schemas/index.js +26 -3
  98. package/dist/cjs/base/repositories/query-schemas/index.js.map +1 -1
  99. package/dist/cjs/base/repositories/sqls/index.d.ts +2 -0
  100. package/dist/cjs/base/repositories/sqls/index.d.ts.map +1 -0
  101. package/dist/cjs/base/repositories/sqls/index.js +18 -0
  102. package/dist/cjs/base/repositories/sqls/index.js.map +1 -0
  103. package/dist/cjs/base/repositories/sqls/recursive-tree.d.ts +56 -0
  104. package/dist/cjs/base/repositories/sqls/recursive-tree.d.ts.map +1 -0
  105. package/dist/cjs/base/repositories/sqls/recursive-tree.js +148 -0
  106. package/dist/cjs/base/repositories/sqls/recursive-tree.js.map +1 -0
  107. package/dist/cjs/helpers/inversion/common/types.d.ts +34 -4
  108. package/dist/cjs/helpers/inversion/common/types.d.ts.map +1 -1
  109. package/dist/esm/base/auth/authenticate/common/constants.d.ts +28 -1
  110. package/dist/esm/base/auth/authenticate/common/constants.d.ts.map +1 -1
  111. package/dist/esm/base/auth/authenticate/common/constants.js +27 -1
  112. package/dist/esm/base/auth/authenticate/common/constants.js.map +1 -1
  113. package/dist/esm/base/auth/authenticate/common/errors.d.ts +40 -1
  114. package/dist/esm/base/auth/authenticate/common/errors.d.ts.map +1 -1
  115. package/dist/esm/base/auth/authenticate/common/errors.js +41 -1
  116. package/dist/esm/base/auth/authenticate/common/errors.js.map +1 -1
  117. package/dist/esm/base/auth/authenticate/common/keys.d.ts +2 -0
  118. package/dist/esm/base/auth/authenticate/common/keys.d.ts.map +1 -1
  119. package/dist/esm/base/auth/authenticate/common/keys.js +2 -0
  120. package/dist/esm/base/auth/authenticate/common/keys.js.map +1 -1
  121. package/dist/esm/base/auth/authenticate/common/types.d.ts +147 -1
  122. package/dist/esm/base/auth/authenticate/common/types.d.ts.map +1 -1
  123. package/dist/esm/base/auth/authenticate/strategies/strategy-registry.d.ts +37 -0
  124. package/dist/esm/base/auth/authenticate/strategies/strategy-registry.d.ts.map +1 -1
  125. package/dist/esm/base/auth/authenticate/strategies/strategy-registry.js +54 -0
  126. package/dist/esm/base/auth/authenticate/strategies/strategy-registry.js.map +1 -1
  127. package/dist/esm/base/auth/authorize/builders/policy.builder.d.ts +28 -33
  128. package/dist/esm/base/auth/authorize/builders/policy.builder.d.ts.map +1 -1
  129. package/dist/esm/base/auth/authorize/builders/policy.builder.js.map +1 -1
  130. package/dist/esm/base/auth/authorize/common/constants.d.ts +25 -1
  131. package/dist/esm/base/auth/authorize/common/constants.d.ts.map +1 -1
  132. package/dist/esm/base/auth/authorize/common/constants.js +12 -18
  133. package/dist/esm/base/auth/authorize/common/constants.js.map +1 -1
  134. package/dist/esm/base/auth/authorize/common/errors.d.ts +9 -0
  135. package/dist/esm/base/auth/authorize/common/errors.d.ts.map +1 -1
  136. package/dist/esm/base/auth/authorize/common/errors.js +9 -0
  137. package/dist/esm/base/auth/authorize/common/errors.js.map +1 -1
  138. package/dist/esm/base/auth/authorize/common/types.d.ts +1 -1
  139. package/dist/esm/base/auth/authorize/common/types.d.ts.map +1 -1
  140. package/dist/esm/base/auth/authorize/enforcers/enforcer-registry.d.ts +17 -0
  141. package/dist/esm/base/auth/authorize/enforcers/enforcer-registry.d.ts.map +1 -1
  142. package/dist/esm/base/auth/authorize/enforcers/enforcer-registry.js +39 -3
  143. package/dist/esm/base/auth/authorize/enforcers/enforcer-registry.js.map +1 -1
  144. package/dist/esm/base/auth/authorize/providers/authorization.provider.d.ts.map +1 -1
  145. package/dist/esm/base/auth/authorize/providers/authorization.provider.js +33 -10
  146. package/dist/esm/base/auth/authorize/providers/authorization.provider.js.map +1 -1
  147. package/dist/esm/base/auth/base/abstract-auth-registry.d.ts +10 -0
  148. package/dist/esm/base/auth/base/abstract-auth-registry.d.ts.map +1 -1
  149. package/dist/esm/base/auth/base/abstract-auth-registry.js +12 -0
  150. package/dist/esm/base/auth/base/abstract-auth-registry.js.map +1 -1
  151. package/dist/esm/base/auth/context-variables.d.ts +7 -1
  152. package/dist/esm/base/auth/context-variables.d.ts.map +1 -1
  153. package/dist/esm/base/controllers/factory/controller.d.ts +1 -1
  154. package/dist/esm/base/controllers/factory/controller.d.ts.map +1 -1
  155. package/dist/esm/base/controllers/factory/definition.d.ts +1 -1
  156. package/dist/esm/base/controllers/factory/definition.d.ts.map +1 -1
  157. package/dist/esm/base/controllers/factory/definition.js +4 -6
  158. package/dist/esm/base/controllers/factory/definition.js.map +1 -1
  159. package/dist/esm/base/controllers/rest/abstract.d.ts.map +1 -1
  160. package/dist/esm/base/controllers/rest/abstract.js +10 -0
  161. package/dist/esm/base/controllers/rest/abstract.js.map +1 -1
  162. package/dist/esm/base/events/common/constants.d.ts +5 -0
  163. package/dist/esm/base/events/common/constants.d.ts.map +1 -0
  164. package/dist/esm/base/events/common/constants.js +5 -0
  165. package/dist/esm/base/events/common/constants.js.map +1 -0
  166. package/dist/esm/base/events/common/index.d.ts +3 -0
  167. package/dist/esm/base/events/common/index.d.ts.map +1 -0
  168. package/dist/esm/base/events/common/index.js +3 -0
  169. package/dist/esm/base/events/common/index.js.map +1 -0
  170. package/dist/esm/base/events/common/types.d.ts +26 -0
  171. package/dist/esm/base/events/common/types.d.ts.map +1 -0
  172. package/dist/esm/base/events/common/types.js +2 -0
  173. package/dist/esm/base/events/common/types.js.map +1 -0
  174. package/dist/esm/base/events/event-bus.d.ts +41 -0
  175. package/dist/esm/base/events/event-bus.d.ts.map +1 -0
  176. package/dist/esm/base/events/event-bus.js +93 -0
  177. package/dist/esm/base/events/event-bus.js.map +1 -0
  178. package/dist/esm/base/events/index.d.ts +3 -0
  179. package/dist/esm/base/events/index.d.ts.map +1 -0
  180. package/dist/esm/base/events/index.js +3 -0
  181. package/dist/esm/base/events/index.js.map +1 -0
  182. package/dist/esm/base/index.d.ts +1 -0
  183. package/dist/esm/base/index.d.ts.map +1 -1
  184. package/dist/esm/base/index.js +1 -5
  185. package/dist/esm/base/index.js.map +1 -1
  186. package/dist/esm/base/metadata/persistents.js +1 -1
  187. package/dist/esm/base/metadata/persistents.js.map +1 -1
  188. package/dist/esm/base/middlewares/not-found/not-found.middleware.d.ts.map +1 -1
  189. package/dist/esm/base/middlewares/not-found/not-found.middleware.js +4 -1
  190. package/dist/esm/base/middlewares/not-found/not-found.middleware.js.map +1 -1
  191. package/dist/esm/base/repositories/common/constants.d.ts +26 -0
  192. package/dist/esm/base/repositories/common/constants.d.ts.map +1 -1
  193. package/dist/esm/base/repositories/common/constants.js +26 -0
  194. package/dist/esm/base/repositories/common/constants.js.map +1 -1
  195. package/dist/esm/base/repositories/core/abstract.d.ts +29 -0
  196. package/dist/esm/base/repositories/core/abstract.d.ts.map +1 -1
  197. package/dist/esm/base/repositories/core/abstract.js +73 -3
  198. package/dist/esm/base/repositories/core/abstract.js.map +1 -1
  199. package/dist/esm/base/repositories/index.d.ts +1 -0
  200. package/dist/esm/base/repositories/index.d.ts.map +1 -1
  201. package/dist/esm/base/repositories/index.js +1 -0
  202. package/dist/esm/base/repositories/index.js.map +1 -1
  203. package/dist/esm/base/repositories/query-schemas/index.d.ts +26 -3
  204. package/dist/esm/base/repositories/query-schemas/index.d.ts.map +1 -1
  205. package/dist/esm/base/repositories/query-schemas/index.js +25 -2
  206. package/dist/esm/base/repositories/query-schemas/index.js.map +1 -1
  207. package/dist/esm/base/repositories/sqls/index.d.ts +2 -0
  208. package/dist/esm/base/repositories/sqls/index.d.ts.map +1 -0
  209. package/dist/esm/base/repositories/sqls/index.js +2 -0
  210. package/dist/esm/base/repositories/sqls/index.js.map +1 -0
  211. package/dist/esm/base/repositories/sqls/recursive-tree.d.ts +56 -0
  212. package/dist/esm/base/repositories/sqls/recursive-tree.d.ts.map +1 -0
  213. package/dist/esm/base/repositories/sqls/recursive-tree.js +143 -0
  214. package/dist/esm/base/repositories/sqls/recursive-tree.js.map +1 -0
  215. package/dist/esm/helpers/inversion/common/types.d.ts +34 -4
  216. package/dist/esm/helpers/inversion/common/types.d.ts.map +1 -1
  217. package/package.json +5 -5
@@ -1,8 +1,8 @@
1
1
  import { MetadataRegistry } from '../../../helpers/inversion/index.js';
2
2
  import { BaseHelper, getError } from '@venizia/ignis-helpers/core';
3
3
  import { resolveValue } from '@venizia/ignis-helpers/common';
4
- import { executeWithRetryUntil, RetryBackoffStrategies, RetryJitterModes, } from '@venizia/ignis-helpers/core';
5
- import { RepositoryErrorCodes, RepositoryOperationScopes } from '../common/index.js';
4
+ import { RetryBackoffStrategies, RetryHelper, RetryJitterModes } from '@venizia/ignis-helpers/core';
5
+ import { DEFAULT_MAX_LIMIT, RepositoryErrorCodes, RepositoryOperationScopes } from '../common/index.js';
6
6
  /**
7
7
  * Engine-neutral repository plumbing - lazy dataSource/entity resolution, class-keyed `@model`
8
8
  * settings, operation scope. `TOptions` defaults to `IExtraOptions` so connectors can narrow it
@@ -81,6 +81,76 @@ export class AbstractRepository extends BaseHelper {
81
81
  get maxLimit() {
82
82
  return this.modelSettings?.maxLimit;
83
83
  }
84
+ /**
85
+ * Both bounds, in one place, for every tier.
86
+ *
87
+ * The upper bound is the point: `@model({ settings: { maxLimit } })` is public and validated at
88
+ * decoration time, but the relational tier read it nowhere, so `maxLimit: 2` still issued
89
+ * `LIMIT 50000000`.
90
+ *
91
+ * The lower bound matters just as much and is easy to miss: a NEGATIVE limit is not a smaller
92
+ * page. Drizzle renders the LIMIT clause only when the value is `>= 0`, so a negative one removes
93
+ * the clause and returns the whole table. The wire schema now rejects it too, but a server-side
94
+ * caller reaches this method without passing through the schema at all.
95
+ */
96
+ assertLimitWithinCeiling(opts) {
97
+ const { limit, scope = 'find' } = opts;
98
+ if (limit === undefined) {
99
+ return;
100
+ }
101
+ // The shape check first, because it needs no metadata at all.
102
+ if (!Number.isInteger(limit) || limit < 0) {
103
+ throw getError({
104
+ message: `[${this.constructor.name}][${scope}] Invalid 'limit' | Expected a non-negative integer | Got: ${limit}`,
105
+ });
106
+ }
107
+ // `maxLimit` reaches `modelSettings`, which resolves the entity - and THAT throws for a
108
+ // repository with no `@repository` model binding. Such a repository is a misconfiguration this
109
+ // method has no business reporting, and the caller path that used to reach `getDefaultLimit()`
110
+ // never touched it either, because `??` short-circuits when a limit is given. So the ceiling is
111
+ // consulted only when the binding that makes it resolvable is actually present.
112
+ const hasModelBinding = Boolean(MetadataRegistry.getInstance().getRepositoryBinding({ name: this.constructor.name })?.model);
113
+ const ceiling = (hasModelBinding ? this.maxLimit : undefined) ?? DEFAULT_MAX_LIMIT;
114
+ if (limit > ceiling) {
115
+ throw getError({
116
+ message: `[${this.constructor.name}][${scope}] Requested page exceeds this model's limit | requested: ${limit} | maximum: ${ceiling} | raise it with @model settings.maxLimit if larger pages are genuinely needed`,
117
+ });
118
+ }
119
+ }
120
+ /**
121
+ * The whole filter, relations included. Checking only the top-level `limit` left the identical
122
+ * defect reachable one level down: a relation scope's negative limit drops Drizzle's LIMIT clause
123
+ * for that relation and loads the entire related table.
124
+ *
125
+ * A relation's limit gets the SHAPE check only, not a ceiling. The ceiling belongs to the
126
+ * relation's own model, which this repository cannot resolve - claiming otherwise would enforce
127
+ * the parent's `maxLimit` on a different entity.
128
+ */
129
+ assertFilterLimits(opts) {
130
+ const { filter, scope = 'find' } = opts;
131
+ if (!filter) {
132
+ return;
133
+ }
134
+ this.assertLimitWithinCeiling({ limit: filter.limit, scope });
135
+ const walk = (inclusions, path) => {
136
+ for (const inclusion of inclusions ?? []) {
137
+ const relationScope = inclusion.scope;
138
+ if (!relationScope) {
139
+ continue;
140
+ }
141
+ const relationPath = `${path}.${inclusion.relation}`;
142
+ const relationLimit = relationScope.limit;
143
+ if (relationLimit !== undefined &&
144
+ (!Number.isInteger(relationLimit) || relationLimit < 0)) {
145
+ throw getError({
146
+ message: `[${this.constructor.name}][${scope}] Invalid 'limit' on relation scope | relation: ${relationPath} | Expected a non-negative integer | Got: ${relationLimit}`,
147
+ });
148
+ }
149
+ walk(relationScope.include, relationPath);
150
+ }
151
+ };
152
+ walk(filter.include, scope);
153
+ }
84
154
  /** Resolves the entity instance from @repository metadata on first access. */
85
155
  resolveEntity() {
86
156
  const registry = MetadataRegistry.getInstance();
@@ -116,7 +186,7 @@ export class AbstractRepository extends BaseHelper {
116
186
  return execution();
117
187
  }
118
188
  const { maxAttempts, maxTotalMs, signal, backoff, until } = options.retry;
119
- return executeWithRetryUntil({
189
+ return RetryHelper.executeWithRetryUntil({
120
190
  operation: [this.constructor.name, operation].join('.'),
121
191
  execution,
122
192
  until: until ?? defaultUntil,
@@ -1 +1 @@
1
- {"version":3,"file":"abstract.js","sourceRoot":"","sources":["../../../../../src/base/repositories/core/abstract.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"abstract.js","sourceRoot":"","sources":["../../../../../src/base/repositories/core/abstract.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEvD,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAC7D,OAAO,EAAE,sBAAsB,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAYpG,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,yBAAyB,EAAE,MAAM,WAAW,CAAC;AAG/F;;;;GAIG;AACH,MAAM,OAAgB,kBAKpB,SAAQ,UAAU;IAiBlB,YACE,UAA+B,EAC/B,IAIC;QAED,MAAM,SAAS,GACb,IAAI,EAAE,KAAK;YACX,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAE/F,KAAK,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QAlB9B;;;WAGG;QACK,mBAAc,GAAsC,IAAI,CAAC;QAgB/D,IAAI,CAAC,eAAe,GAAG,IAAI,EAAE,cAAc,IAAI,yBAAyB,CAAC,SAAS,CAAC;QAEnF,IAAI,UAAU,EAAE,CAAC;YACf,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;QAChC,CAAC;QAED,IAAI,IAAI,EAAE,WAAW,EAAE,CAAC;YACtB,IAAI,CAAC,OAAO,GAAG,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QACxC,CAAC;IACH,CAAC;IAED,IAAI,UAAU;QACZ,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,MAAM,QAAQ,CAAC;gBACb,OAAO,EAAE,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,kIAAkI;aACrK,CAAC,CAAC;QACL,CAAC;QAED,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED,IAAI,UAAU,CAAC,KAAyB;QACtC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;IAC3B,CAAC;IAED,qEAAqE;IACrE,IAAI,MAAM;QACR,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,aAAa,EAAE,CAAC;QACtC,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,IAAI,MAAM,CAAC,KAAqB;QAC9B,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;IACvB,CAAC;IAED,IAAI,cAAc;QAChB,OAAO,IAAI,CAAC,eAAe,CAAC;IAC9B,CAAC;IAED,aAAa,CAAC,IAAwC;QACpD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC;IACrC,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED;;;OAGG;IACH,IAAc,aAAa;QACzB,IAAI,IAAI,CAAC,cAAc,KAAK,IAAI,EAAE,CAAC;YACjC,OAAO,IAAI,CAAC,cAAc,CAAC;QAC7B,CAAC;QAED,IAAI,CAAC,cAAc,GAAG,gBAAgB,CAAC,WAAW,EAAE,CAAC,gBAAgB,CAAC;YACpE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW;SAChC,CAAC,EAAE,QAAQ,CAAC;QAEb,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAED,IAAc,YAAY;QACxB,OAAO,IAAI,CAAC,aAAa,EAAE,gBAAgB,IAAI,EAAE,CAAC;IACpD,CAAC;IAED,0GAA0G;IAC1G,IAAc,YAAY;QACxB,OAAO,IAAI,CAAC,aAAa,EAAE,aAAa,EAAE,KAAK,CAAC;IAClD,CAAC;IAED,IAAc,YAAY;QACxB,OAAO,IAAI,CAAC,aAAa,EAAE,YAAY,CAAC;IAC1C,CAAC;IAED,2HAA2H;IAC3H,IAAc,QAAQ;QACpB,OAAO,IAAI,CAAC,aAAa,EAAE,QAAQ,CAAC;IACtC,CAAC;IAED;;;;;;;;;;;OAWG;IACO,wBAAwB,CAAC,IAAwC;QACzE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,MAAM,EAAE,GAAG,IAAI,CAAC;QAEvC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,OAAO;QACT,CAAC;QAED,8DAA8D;QAC9D,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YAC1C,MAAM,QAAQ,CAAC;gBACb,OAAO,EAAE,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,KAAK,KAAK,8DAA8D,KAAK,EAAE;aAClH,CAAC,CAAC;QACL,CAAC;QAED,wFAAwF;QACxF,+FAA+F;QAC/F,+FAA+F;QAC/F,gGAAgG;QAChG,gFAAgF;QAChF,MAAM,eAAe,GAAG,OAAO,CAC7B,gBAAgB,CAAC,WAAW,EAAE,CAAC,oBAAoB,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,CAC5F,CAAC;QACF,MAAM,OAAO,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,iBAAiB,CAAC;QAEnF,IAAI,KAAK,GAAG,OAAO,EAAE,CAAC;YACpB,MAAM,QAAQ,CAAC;gBACb,OAAO,EAAE,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,KAAK,KAAK,4DAA4D,KAAK,eAAe,OAAO,gFAAgF;aACpN,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED;;;;;;;;OAQG;IACO,kBAAkB,CAAC,IAA0C;QACrE,MAAM,EAAE,MAAM,EAAE,KAAK,GAAG,MAAM,EAAE,GAAG,IAAI,CAAC;QAExC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO;QACT,CAAC;QAED,IAAI,CAAC,wBAAwB,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QAE9D,MAAM,IAAI,GAAG,CAAC,UAAoC,EAAE,IAAY,EAAQ,EAAE;YACxE,KAAK,MAAM,SAAS,IAAI,UAAU,IAAI,EAAE,EAAE,CAAC;gBACzC,MAAM,aAAa,GAAG,SAAS,CAAC,KAAK,CAAC;gBACtC,IAAI,CAAC,aAAa,EAAE,CAAC;oBACnB,SAAS;gBACX,CAAC;gBAED,MAAM,YAAY,GAAG,GAAG,IAAI,IAAI,SAAS,CAAC,QAAQ,EAAE,CAAC;gBACrD,MAAM,aAAa,GAAG,aAAa,CAAC,KAAK,CAAC;gBAE1C,IACE,aAAa,KAAK,SAAS;oBAC3B,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,aAAa,CAAC,IAAI,aAAa,GAAG,CAAC,CAAC,EACvD,CAAC;oBACD,MAAM,QAAQ,CAAC;wBACb,OAAO,EAAE,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,KAAK,KAAK,mDAAmD,YAAY,6CAA6C,aAAa,EAAE;qBACxK,CAAC,CAAC;gBACL,CAAC;gBAED,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC,CAAC;QAEF,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAC9B,CAAC;IAED,8EAA8E;IACpE,aAAa;QACrB,MAAM,QAAQ,GAAG,gBAAgB,CAAC,WAAW,EAAE,CAAC;QAChD,MAAM,OAAO,GAAG,QAAQ,CAAC,oBAAoB,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;QAE/E,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;YACpB,MAAM,QAAQ,CAAC;gBACb,OAAO,EAAE,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,iHAAiH;aACpJ,CAAC,CAAC;QACL,CAAC;QAED,4FAA4F;QAC5F,oFAAoF;QACpF,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC,KAAK,CAA2B,CAAC;QACnE,OAAO,IAAI,IAAI,EAAE,CAAC;IACpB,CAAC;IAED,kEAAkE;IACxD,aAAa,CAAC,IAA4B;QAClD,MAAM,QAAQ,CAAC;YACb,WAAW,EAAE,oBAAoB,CAAC,qBAAqB;YACvD,OAAO,EAAE,IAAI,IAAI,CAAC,UAAU,kDAAkD,IAAI,CAAC,cAAc,EAAE;SACpG,CAAC,CAAC;IACL,CAAC;IAED;;;OAGG;IACO,oBAAoB,CAAU,IAKvC;QACC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC;QAE7D,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACnB,OAAO,SAAS,EAAE,CAAC;QACrB,CAAC;QAED,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;YACxB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC;YAC1E,OAAO,SAAS,EAAE,CAAC;QACrB,CAAC;QAED,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC;QAE1E,OAAO,WAAW,CAAC,qBAAqB,CAAU;YAChD,SAAS,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;YACvD,SAAS;YACT,KAAK,EAAE,KAAK,IAAI,YAAY;YAC5B,WAAW;YACX,UAAU;YACV,MAAM;YACN,OAAO,EAAE,OAAO,IAAI;gBAClB,QAAQ,EAAE,sBAAsB,CAAC,WAAW;gBAC5C,cAAc,EAAE,EAAE;gBAClB,UAAU,EAAE,GAAG;gBACf,MAAM,EAAE,gBAAgB,CAAC,KAAK;aAC/B;YACD,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB,CAAC,CAAC;IACL,CAAC;IAED;;;;;OAKG;IACK,aAAa,CACnB,OAAqB;QAErB,MAAM,IAAI,GAAG,EAAE,GAAG,OAAO,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC,KAAK,CAAC;QAClB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,8HAA8H;IACpH,SAAS,CAAkB,IAGpC;QACC,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAEjD,OAAO,IAAI,CAAC,oBAAoB,CAAW;YACzC,SAAS,EAAE,MAAM;YACjB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,YAAY,EAAE,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC;YACzC,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAI,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;SAChE,CAAC,CAAC;IACL,CAAC;IAED,4KAA4K;IAClK,cAAc,CAAkB,IAGzC;QACC,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAEjD,OAAO,IAAI,CAAC,oBAAoB,CAAoB;YAClD,SAAS,EAAE,MAAM;YACjB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,YAAY,EAAE,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC;YAC9C,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAI,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;SAChE,CAAC,CAAC;IACL,CAAC;IAED,kHAAkH;IACxG,YAAY,CAAkB,IAGvC;QACC,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAEjD,OAAO,IAAI,CAAC,oBAAoB,CAAe;YAC7C,SAAS,EAAE,SAAS;YACpB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,YAAY,EAAE,MAAM,CAAC,EAAE,CAAC,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,SAAS;YAC/D,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAI,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;SACnE,CAAC,CAAC;IACL,CAAC;IAkFD,QAAQ,CAAkB,IAIzB;QACC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;QAEtC,IAAI,OAAO,EAAE,YAAY,KAAK,KAAK,EAAE,CAAC;YACpC,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,GAAG,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;QACvF,CAAC;QAED,OAAO,IAAI,CAAC,SAAS,CAAI,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;IACrD,CAAC;IA+BD,QAAQ,CAAkB,IAGzB;QACC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;QAEhC,IAAI,OAAO,EAAE,YAAY,KAAK,KAAK,EAAE,CAAC;YACpC,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,GAAG,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;QACjF,CAAC;QAED,OAAO,IAAI,CAAC,SAAS,CAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;IAC/C,CAAC;CACF"}
@@ -1,4 +1,5 @@
1
1
  export * from './common/index.js';
2
2
  export * from './core/index.js';
3
3
  export * from './query-schemas/index.js';
4
+ export * from './sqls/index.js';
4
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/base/repositories/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC;AACvB,cAAc,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/base/repositories/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC;AACvB,cAAc,iBAAiB,CAAC;AAChC,cAAc,QAAQ,CAAC"}
@@ -1,4 +1,5 @@
1
1
  export * from './common/index.js';
2
2
  export * from './core/index.js';
3
3
  export * from './query-schemas/index.js';
4
+ export * from './sqls/index.js';
4
5
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/base/repositories/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC;AACvB,cAAc,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/base/repositories/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC;AACvB,cAAc,iBAAiB,CAAC;AAChC,cAAc,QAAQ,CAAC"}
@@ -1,4 +1,27 @@
1
- /** Side-effect import, and load order is the point: `@hono/zod-openapi` peers on `zod`, so importing it patches `.openapi()` onto the shared `ZodType` prototype. `buildQuerySchemas` runs at module scope below, and ESM evaluates imports first, so the method exists by the time the decorator is called. Without this line the schemas silently build undecorated whenever this module happens to load before anything else pulls in the OpenAPI layer. */
2
- import '@hono/zod-openapi';
3
- export declare const FieldsSchema: import("zod").ZodOptional<import("zod").ZodUnion<[import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodBoolean>, import("zod").ZodArray<import("zod").ZodString>]>>, FilterSchema: any, InclusionSchema: any, LimitSchema: import("zod").ZodOptional<import("zod").ZodNumber>, OffsetSchema: import("zod").ZodOptional<import("zod").ZodNumber>, OrderBySchema: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>, SkipSchema: import("zod").ZodOptional<import("zod").ZodNumber>, WhereSchema: import("zod").ZodUnion<readonly [import("zod").ZodType<any, unknown, import("zod/v4/core").$ZodTypeInternals<any, unknown>>, import("zod").ZodPipe<import("zod").ZodPipe<import("zod").ZodString, import("zod").ZodTransform<any, string>>, import("zod").ZodType<any, unknown, import("zod/v4/core").$ZodTypeInternals<any, unknown>>>]>;
1
+ /** Load order is the point: `@hono/zod-openapi` peers on `zod`, so importing it patches `.openapi()` onto the shared `ZodType` prototype. `buildQuerySchemas` runs at module scope below, and ESM evaluates imports first, so the method exists by the time the decorator is called. Without this import the schemas silently build undecorated whenever this module happens to load before anything else pulls in the OpenAPI layer. */
2
+ import { z } from '@hono/zod-openapi';
3
+ export declare const FieldsSchema: z.ZodOptional<z.ZodUnion<[z.ZodRecord<z.ZodString, z.ZodBoolean>, z.ZodArray<z.ZodString>]>>, FilterSchema: any, InclusionSchema: any, LimitSchema: z.ZodOptional<z.ZodNumber>, OffsetSchema: z.ZodOptional<z.ZodNumber>, OrderBySchema: z.ZodOptional<z.ZodArray<z.ZodString>>, SkipSchema: z.ZodOptional<z.ZodNumber>, WhereSchema: z.ZodUnion<readonly [z.ZodType<any, unknown, z.core.$ZodTypeInternals<any, unknown>>, z.ZodPipe<z.ZodPipe<z.ZodString, z.ZodTransform<any, string>>, z.ZodType<any, unknown, z.core.$ZodTypeInternals<any, unknown>>>]>;
4
+ /**
5
+ * The query shape of a route that accepts a `filter`. The framework's own `find`, `findById` and
6
+ * `findOne` use it, and a hand-written route gets the same contract by naming it.
7
+ *
8
+ * `filter` needs no `.optional()` at the call site - {@link FilterSchema} already carries one, so a
9
+ * second is a no-op and so is a trailing `.partial()`.
10
+ *
11
+ * Extend it rather than rebuilding it when a route takes more than `filter`:
12
+ * `FilterQuerySchema.extend({ q: z.string().optional() })`.
13
+ */
14
+ export declare const FilterQuerySchema: z.ZodObject<{
15
+ filter: any;
16
+ }, z.core.$strip>;
17
+ /**
18
+ * The query shape of a route that accepts conditions and nothing else - `count` and anything shaped
19
+ * like it. `where` is OPTIONAL here.
20
+ *
21
+ * `updateBy` and `deleteBy` deliberately do not use this. They require `where`, because a missing
22
+ * one there rewrites or deletes every row in the table.
23
+ */
24
+ export declare const WhereQuerySchema: z.ZodObject<{
25
+ where: z.ZodOptional<z.ZodUnion<readonly [z.ZodType<any, unknown, z.core.$ZodTypeInternals<any, unknown>>, z.ZodPipe<z.ZodPipe<z.ZodString, z.ZodTransform<any, string>>, z.ZodType<any, unknown, z.core.$ZodTypeInternals<any, unknown>>>]>>;
26
+ }, z.core.$strip>;
4
27
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/base/repositories/query-schemas/index.ts"],"names":[],"mappings":"AAEA,+bAA+b;AAC/b,OAAO,mBAAmB,CAAC;AAO3B,eAAO,MACL,YAAY,oLACZ,YAAY,OACZ,eAAe,OACf,WAAW,sDACX,YAAY,sDACZ,aAAa,8EACb,UAAU,sDACV,WAAW,2UACwC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/base/repositories/query-schemas/index.ts"],"names":[],"mappings":"AAEA,yaAAya;AACza,OAAO,EAAE,CAAC,EAAE,MAAM,mBAAmB,CAAC;AAOtC,eAAO,MACL,YAAY,gGACZ,YAAY,OACZ,eAAe,OACf,WAAW,8BACX,YAAY,8BACZ,aAAa,0CACb,UAAU,8BACV,WAAW,yNACwC,CAAC;AAEtD;;;;;;;;;GASG;AACH,eAAO,MAAM,iBAAiB;;iBAE5B,CAAC;AAEH;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB;;iBAE3B,CAAC"}
@@ -1,9 +1,32 @@
1
1
  import { buildQuerySchemas } from '@venizia/ignis-filter/schemas';
2
- /** Side-effect import, and load order is the point: `@hono/zod-openapi` peers on `zod`, so importing it patches `.openapi()` onto the shared `ZodType` prototype. `buildQuerySchemas` runs at module scope below, and ESM evaluates imports first, so the method exists by the time the decorator is called. Without this line the schemas silently build undecorated whenever this module happens to load before anything else pulls in the OpenAPI layer. */
3
- import '@hono/zod-openapi';
2
+ /** Load order is the point: `@hono/zod-openapi` peers on `zod`, so importing it patches `.openapi()` onto the shared `ZodType` prototype. `buildQuerySchemas` runs at module scope below, and ESM evaluates imports first, so the method exists by the time the decorator is called. Without this import the schemas silently build undecorated whenever this module happens to load before anything else pulls in the OpenAPI layer. */
3
+ import { z } from '@hono/zod-openapi';
4
4
  /** The schemas themselves live in `@venizia/ignis-filter`, built with plain `zod` so a browser can use them. Documentation metadata is injected here because it is a server concern - `.openapi()` returns a new schema rather than mutating, and three of the decorations sit on inner nodes, so they cannot be applied after the tree is composed. */
5
5
  const openApiDecorator = (schema, metadata) => {
6
6
  return schema.openapi(metadata);
7
7
  };
8
8
  export const { FieldsSchema, FilterSchema, InclusionSchema, LimitSchema, OffsetSchema, OrderBySchema, SkipSchema, WhereSchema, } = buildQuerySchemas({ decorate: openApiDecorator });
9
+ /**
10
+ * The query shape of a route that accepts a `filter`. The framework's own `find`, `findById` and
11
+ * `findOne` use it, and a hand-written route gets the same contract by naming it.
12
+ *
13
+ * `filter` needs no `.optional()` at the call site - {@link FilterSchema} already carries one, so a
14
+ * second is a no-op and so is a trailing `.partial()`.
15
+ *
16
+ * Extend it rather than rebuilding it when a route takes more than `filter`:
17
+ * `FilterQuerySchema.extend({ q: z.string().optional() })`.
18
+ */
19
+ export const FilterQuerySchema = z.object({ filter: FilterSchema }).openapi({
20
+ description: 'Filter with where, fields, limit, skip, order, include',
21
+ });
22
+ /**
23
+ * The query shape of a route that accepts conditions and nothing else - `count` and anything shaped
24
+ * like it. `where` is OPTIONAL here.
25
+ *
26
+ * `updateBy` and `deleteBy` deliberately do not use this. They require `where`, because a missing
27
+ * one there rewrites or deletes every row in the table.
28
+ */
29
+ export const WhereQuerySchema = z.object({ where: WhereSchema.optional() }).openapi({
30
+ description: 'Filter conditions',
31
+ });
9
32
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/base/repositories/query-schemas/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAyB,MAAM,+BAA+B,CAAC;AAEzF,+bAA+b;AAC/b,OAAO,mBAAmB,CAAC;AAE3B,wVAAwV;AACxV,MAAM,gBAAgB,GAAqB,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE;IAC9D,OAAQ,MAAc,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;AAC3C,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,EACX,YAAY,EACZ,YAAY,EACZ,eAAe,EACf,WAAW,EACX,YAAY,EACZ,aAAa,EACb,UAAU,EACV,WAAW,GACZ,GAAG,iBAAiB,CAAC,EAAE,QAAQ,EAAE,gBAAgB,EAAE,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/base/repositories/query-schemas/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAyB,MAAM,+BAA+B,CAAC;AAEzF,yaAAya;AACza,OAAO,EAAE,CAAC,EAAE,MAAM,mBAAmB,CAAC;AAEtC,wVAAwV;AACxV,MAAM,gBAAgB,GAAqB,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE;IAC9D,OAAQ,MAAc,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;AAC3C,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,EACX,YAAY,EACZ,YAAY,EACZ,eAAe,EACf,WAAW,EACX,YAAY,EACZ,aAAa,EACb,UAAU,EACV,WAAW,GACZ,GAAG,iBAAiB,CAAC,EAAE,QAAQ,EAAE,gBAAgB,EAAE,CAAC,CAAC;AAEtD;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC,OAAO,CAAC;IAC1E,WAAW,EAAE,wDAAwD;CACtE,CAAC,CAAC;AAEH;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,WAAW,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC;IAClF,WAAW,EAAE,mBAAmB;CACjC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from './recursive-tree.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/base/repositories/sqls/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from './recursive-tree.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/base/repositories/sqls/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC"}
@@ -0,0 +1,56 @@
1
+ import type { TConstValue } from '@venizia/ignis-helpers/common';
2
+ import type { SQL } from 'drizzle-orm';
3
+ /** Walk direction relative to `rootId`: DOWN follows `parentColumn -> idColumn` (descendants), UP follows the reverse (ancestors). */
4
+ export declare class RecursiveTreeDirections {
5
+ static readonly UP = "UP";
6
+ static readonly DOWN = "DOWN";
7
+ static readonly SCHEME_SET: Set<string>;
8
+ static isValid(direction: string): boolean;
9
+ }
10
+ export type TRecursiveTreeDirection = TConstValue<typeof RecursiveTreeDirections>;
11
+ export interface IRecursiveTreeOptions {
12
+ /** CTE name the caller references in the SELECT it writes around this fragment. */
13
+ name: string;
14
+ /** Runtime-checked with `is(table, Table)`; also the sole dialect selector (Postgres vs SQLite) - see {@link RecursiveTreeSql}. */
15
+ table: unknown;
16
+ rootId: string;
17
+ direction: TRecursiveTreeDirection;
18
+ /**
19
+ * Counts EDGES, not rows: the root is at depth 0, so `N` returns up to `N+1` rows.
20
+ * No default - `0` type-checks but silently produces an empty result, so `walk` throws at
21
+ * runtime for `maxDepth <= 0`.
22
+ */
23
+ maxDepth: number;
24
+ idColumn?: string;
25
+ parentColumn?: string;
26
+ /** Extra columns, beyond `idColumn`/`parentColumn`, carried into every row of the walk. */
27
+ columns?: string[];
28
+ /** ANDed into the recursive term's WHERE clause - build it with Drizzle's own `sql` tag. */
29
+ recursiveFilter?: SQL;
30
+ /**
31
+ * Emits `path`/`is_cycle` and stops expanding once a row re-visits an id in its own path. Row
32
+ * shape differs per engine and nothing in this signature shows it: Postgres returns a real array
33
+ * and boolean; SQLite returns delimited text and `1`/`0` - so `row.path.length` throws on SQLite
34
+ * and `row.is_cycle === true` is always false there.
35
+ */
36
+ trackPath?: boolean;
37
+ startDepth?: number;
38
+ }
39
+ /**
40
+ * Returns the CTE definition only - the caller writes its own `SELECT ... FROM <name>` around it.
41
+ * Engine is read off `table`, never asked of the caller, so no option can disagree with the schema.
42
+ * SQLite's `path` is `char(31)`-delimited text, not an array: exact unless an id contains that byte,
43
+ * which this class does not reject. Identifiers cannot be parameterized, so `name`/`idColumn`/
44
+ * `parentColumn`/`columns` are allowlist-checked before reaching a template.
45
+ */
46
+ export declare class RecursiveTreeSql {
47
+ private static assertValidIdentifier;
48
+ static walk(opts: IRecursiveTreeOptions): SQL;
49
+ /** See {@link RecursiveTreeSql} for why there is no separate `engine` option. */
50
+ private static detectEngine;
51
+ /** Postgres needs an explicit cast so the base and recursive terms agree on the `depth` column's type; SQLite's looser typing does not, but casts anyway for parity and to fail loudly on a non-numeric `startDepth`. */
52
+ private static compileDepthCast;
53
+ /** See {@link RecursiveTreeSql} for why Postgres and SQLite need different `path`/`is_cycle` shapes. */
54
+ private static compileCycleGuardFragments;
55
+ }
56
+ //# sourceMappingURL=recursive-tree.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recursive-tree.d.ts","sourceRoot":"","sources":["../../../../../src/base/repositories/sqls/recursive-tree.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAEjE,OAAO,KAAK,EAAQ,GAAG,EAAE,MAAM,aAAa,CAAC;AAK7C,sIAAsI;AACtI,qBAAa,uBAAuB;IAClC,MAAM,CAAC,QAAQ,CAAC,EAAE,QAAQ;IAC1B,MAAM,CAAC,QAAQ,CAAC,IAAI,UAAU;IAC9B,MAAM,CAAC,QAAQ,CAAC,UAAU,cAAiC;IAE3D,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;CAG3C;AAED,MAAM,MAAM,uBAAuB,GAAG,WAAW,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAoBlF,MAAM,WAAW,qBAAqB;IACpC,mFAAmF;IACnF,IAAI,EAAE,MAAM,CAAC;IAEb,mIAAmI;IACnI,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,uBAAuB,CAAC;IAEnC;;;;OAIG;IACH,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,2FAA2F;IAC3F,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IAEnB,4FAA4F;IAC5F,eAAe,CAAC,EAAE,GAAG,CAAC;IAEtB;;;;;OAKG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;GAMG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAC,qBAAqB;IAUpC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,qBAAqB,GAAG,GAAG;IAgF7C,iFAAiF;IACjF,OAAO,CAAC,MAAM,CAAC,YAAY;IAc3B,yNAAyN;IACzN,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAkB/B,wGAAwG;IACxG,OAAO,CAAC,MAAM,CAAC,0BAA0B;CA0B1C"}
@@ -0,0 +1,143 @@
1
+ import { getError } from '@venizia/ignis-helpers/core';
2
+ import { getTableName, is, sql, Table } from 'drizzle-orm';
3
+ import { PgTable } from 'drizzle-orm/pg-core';
4
+ import { SQLiteTable } from 'drizzle-orm/sqlite-core';
5
+ /** Walk direction relative to `rootId`: DOWN follows `parentColumn -> idColumn` (descendants), UP follows the reverse (ancestors). */
6
+ export class RecursiveTreeDirections {
7
+ static { this.UP = 'UP'; }
8
+ static { this.DOWN = 'DOWN'; }
9
+ static { this.SCHEME_SET = new Set([this.UP, this.DOWN]); }
10
+ static isValid(direction) {
11
+ return this.SCHEME_SET.has(direction);
12
+ }
13
+ }
14
+ /** Internal only - not part of {@link IRecursiveTreeOptions}. Derived from `table`, never accepted as an option. */
15
+ class RecursiveTreeEngines {
16
+ static { this.POSTGRES = 'POSTGRES'; }
17
+ static { this.SQLITE = 'SQLITE'; }
18
+ static { this.SCHEME_SET = new Set([this.POSTGRES, this.SQLITE]); }
19
+ }
20
+ /** A SQL identifier is safe to splice only after it matches this allowlist - see {@link RecursiveTreeSql.assertValidIdentifier}. */
21
+ const IDENTIFIER_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*$/;
22
+ /**
23
+ * ASCII Unit Separator (0x1F) - chosen because it does not occur in real ids, unlike `/` or `,`.
24
+ * See {@link RecursiveTreeSql} for the exactness limitation this relies on.
25
+ */
26
+ const SQLITE_PATH_DELIMITER = sql.raw('char(31)');
27
+ /**
28
+ * Returns the CTE definition only - the caller writes its own `SELECT ... FROM <name>` around it.
29
+ * Engine is read off `table`, never asked of the caller, so no option can disagree with the schema.
30
+ * SQLite's `path` is `char(31)`-delimited text, not an array: exact unless an id contains that byte,
31
+ * which this class does not reject. Identifiers cannot be parameterized, so `name`/`idColumn`/
32
+ * `parentColumn`/`columns` are allowlist-checked before reaching a template.
33
+ */
34
+ export class RecursiveTreeSql {
35
+ static assertValidIdentifier(opts) {
36
+ const { field, value } = opts;
37
+ if (!IDENTIFIER_PATTERN.test(value)) {
38
+ throw getError({
39
+ message: `[RecursiveTreeSql.walk] Invalid '${field}' | Expected letters, digits and underscores only, not starting with a digit | Got: ${value}`,
40
+ });
41
+ }
42
+ }
43
+ static walk(opts) {
44
+ const { name, table, rootId, direction, maxDepth, idColumn = 'id', parentColumn = 'parent_id', columns = [], recursiveFilter, trackPath = false, startDepth = 0, } = opts;
45
+ RecursiveTreeSql.assertValidIdentifier({ field: 'name', value: name });
46
+ RecursiveTreeSql.assertValidIdentifier({ field: 'idColumn', value: idColumn });
47
+ RecursiveTreeSql.assertValidIdentifier({ field: 'parentColumn', value: parentColumn });
48
+ columns.forEach(column => RecursiveTreeSql.assertValidIdentifier({ field: 'columns', value: column }));
49
+ if (!RecursiveTreeDirections.isValid(direction)) {
50
+ throw getError({
51
+ message: `[RecursiveTreeSql.walk] Invalid 'direction' | Expected ${RecursiveTreeDirections.UP} or ${RecursiveTreeDirections.DOWN} | Got: ${direction}`,
52
+ });
53
+ }
54
+ if (!Number.isInteger(maxDepth) || maxDepth <= 0) {
55
+ throw getError({
56
+ message: `[RecursiveTreeSql.walk] Invalid 'maxDepth' | Expected a positive integer | Got: ${maxDepth}`,
57
+ });
58
+ }
59
+ if (!is(table, Table)) {
60
+ throw getError({
61
+ message: `[RecursiveTreeSql.walk] Invalid 'table' | Expected a Drizzle table | Got: ${typeof table}`,
62
+ });
63
+ }
64
+ const engine = RecursiveTreeSql.detectEngine(table);
65
+ const tableName = getTableName(table);
66
+ RecursiveTreeSql.assertValidIdentifier({ field: 'table', value: tableName });
67
+ const tableIdentifier = sql.identifier(tableName);
68
+ const cteIdentifier = sql.identifier(name);
69
+ const idIdentifier = sql.identifier(idColumn);
70
+ const parentIdentifier = sql.identifier(parentColumn);
71
+ const extraIdentifiers = columns.map(column => sql.identifier(column));
72
+ const baseColumnList = sql.join([idIdentifier, parentIdentifier, ...extraIdentifiers], sql `, `);
73
+ const recursiveColumnList = sql.join([idIdentifier, parentIdentifier, ...extraIdentifiers].map(identifier => sql `t.${identifier}`), sql `, `);
74
+ const depthCast = RecursiveTreeSql.compileDepthCast({ engine, depth: startDepth });
75
+ const { basePathColumns, recursivePathColumns } = trackPath
76
+ ? RecursiveTreeSql.compileCycleGuardFragments({ engine, idIdentifier })
77
+ : { basePathColumns: sql ``, recursivePathColumns: sql `` };
78
+ const baseCase = sql `SELECT ${baseColumnList}, ${depthCast} AS depth${basePathColumns} FROM ${tableIdentifier} WHERE ${idIdentifier} = ${rootId}`;
79
+ // DOWN walks parent -> children (t.parentColumn = r.idColumn); UP walks child -> parent (t.idColumn = r.parentColumn).
80
+ const joinCondition = direction === RecursiveTreeDirections.DOWN
81
+ ? sql `t.${parentIdentifier} = r.${idIdentifier}`
82
+ : sql `t.${idIdentifier} = r.${parentIdentifier}`;
83
+ // `NOT r.is_cycle` stops expanding a row already flagged cyclic - the row itself stays in the
84
+ // result set with is_cycle = true, only its own children are cut off.
85
+ const cycleGuard = trackPath ? sql ` AND NOT r.is_cycle` : sql ``;
86
+ const extraFilter = recursiveFilter ? sql ` AND (${recursiveFilter})` : sql ``;
87
+ const recursiveCase = sql `SELECT ${recursiveColumnList}, r.depth + 1${recursivePathColumns} FROM ${tableIdentifier} t JOIN ${cteIdentifier} r ON ${joinCondition} WHERE r.depth + 1 <= ${maxDepth}${cycleGuard}${extraFilter}`;
88
+ return sql `WITH RECURSIVE ${cteIdentifier} AS (${baseCase} UNION ALL ${recursiveCase})`;
89
+ }
90
+ /** See {@link RecursiveTreeSql} for why there is no separate `engine` option. */
91
+ static detectEngine(table) {
92
+ if (is(table, PgTable)) {
93
+ return RecursiveTreeEngines.POSTGRES;
94
+ }
95
+ if (is(table, SQLiteTable)) {
96
+ return RecursiveTreeEngines.SQLITE;
97
+ }
98
+ throw getError({
99
+ message: `[RecursiveTreeSql.walk] Invalid 'table' | Expected a Postgres or SQLite Drizzle table | Got: ${getTableName(table)}`,
100
+ });
101
+ }
102
+ /** Postgres needs an explicit cast so the base and recursive terms agree on the `depth` column's type; SQLite's looser typing does not, but casts anyway for parity and to fail loudly on a non-numeric `startDepth`. */
103
+ static compileDepthCast(opts) {
104
+ const { engine, depth } = opts;
105
+ switch (engine) {
106
+ case RecursiveTreeEngines.POSTGRES: {
107
+ return sql `${depth}::int`;
108
+ }
109
+ case RecursiveTreeEngines.SQLITE: {
110
+ return sql `CAST(${depth} AS INTEGER)`;
111
+ }
112
+ default: {
113
+ throw getError({
114
+ message: `[RecursiveTreeSql.walk] Invalid 'engine' | Got: ${engine}`,
115
+ });
116
+ }
117
+ }
118
+ }
119
+ /** See {@link RecursiveTreeSql} for why Postgres and SQLite need different `path`/`is_cycle` shapes. */
120
+ static compileCycleGuardFragments(opts) {
121
+ const { engine, idIdentifier } = opts;
122
+ switch (engine) {
123
+ case RecursiveTreeEngines.POSTGRES: {
124
+ return {
125
+ basePathColumns: sql `, ARRAY[${idIdentifier}] AS path, false AS is_cycle`,
126
+ recursivePathColumns: sql `, r.path || t.${idIdentifier} AS path, t.${idIdentifier} = ANY(r.path) AS is_cycle`,
127
+ };
128
+ }
129
+ case RecursiveTreeEngines.SQLITE: {
130
+ return {
131
+ basePathColumns: sql `, ${SQLITE_PATH_DELIMITER} || ${idIdentifier} || ${SQLITE_PATH_DELIMITER} AS path, 0 AS is_cycle`,
132
+ recursivePathColumns: sql `, r.path || t.${idIdentifier} || ${SQLITE_PATH_DELIMITER} AS path, instr(r.path, ${SQLITE_PATH_DELIMITER} || t.${idIdentifier} || ${SQLITE_PATH_DELIMITER}) > 0 AS is_cycle`,
133
+ };
134
+ }
135
+ default: {
136
+ throw getError({
137
+ message: `[RecursiveTreeSql.walk] Invalid 'engine' | Got: ${engine}`,
138
+ });
139
+ }
140
+ }
141
+ }
142
+ }
143
+ //# sourceMappingURL=recursive-tree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recursive-tree.js","sourceRoot":"","sources":["../../../../../src/base/repositories/sqls/recursive-tree.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,10 @@
1
+ import type { TAuthMode, TAuthStrategy } from '../../../base/auth/authenticate/common/index.js';
2
+ import type { IAuthorizationSpec } from '../../../base/auth/authorize/common/types.js';
1
3
  import type { ControllerTransports } from '../../../base/controllers/common/constants.js';
2
4
  import type { IDataSource, TDataSourceDriverClass } from '../../../base/datasources/index.js';
3
5
  import type { AbstractEntity } from '../../../base/models/index.js';
4
- import type { IRepository, TFilter, TRepositoryOperationScope } from '../../../base/repositories/index.js';
5
- import type { TAuthMode, TAuthStrategy } from '../../../base/auth/authenticate/common/index.js';
6
- import type { IAuthorizationSpec } from '../../../base/auth/authorize/common/types.js';
7
- import type { TClass, TGrpcMethod, TValueOrResolver } from '@venizia/ignis-helpers/common';
6
+ import type { IRepository, ScopeFilters, TFilter, TRepositoryOperationScope, TScopeFilterMissingBehavior, TWhere } from '../../../base/repositories/index.js';
7
+ import type { TClass, TGrpcMethod, TNullable, TValueOrResolver } from '@venizia/ignis-helpers/common';
8
8
  import { type IInjectMetadata as _IInjectMetadata, type IPropertyMetadata as _IPropertyMetadata } from '@venizia/ignis-inversion';
9
9
  interface IBaseControllerMetadata {
10
10
  path: string;
@@ -44,11 +44,41 @@ export interface IModelAuthorizeSettings {
44
44
  /** Extensible - consumers can add any extra authorization metadata. */
45
45
  [extra: string | symbol]: any;
46
46
  }
47
+ /**
48
+ * Row-scope resolver for `@model` settings.scopeFilter - resolved per query, so it can depend on
49
+ * the current request (tenant, org, membership). Framework-internal escape hatches aside, nothing
50
+ * short of removing this setting from the model turns scoping off.
51
+ */
52
+ export interface IScopeFilterSettings {
53
+ /**
54
+ * Returns the scope `where`; `ScopeFilters.UNRESTRICTED` to apply no scope for THIS call (an
55
+ * internal operator, a caller the application has decided sees everything); or null/undefined
56
+ * when this caller's scope cannot be determined at all.
57
+ */
58
+ resolve: () => TNullable<TWhere> | typeof ScopeFilters.UNRESTRICTED;
59
+ /**
60
+ * What `applyScopeFilter` does when `resolve()` returns null/undefined - no request context, no
61
+ * tenant, a background job. Defaults to `deny`: an unresolved scope matches zero rows, never
62
+ * every row. `allow` is an explicit, reviewed opt-out for migrations and background jobs, declared
63
+ * per MODEL - it cannot express a per-USER bypass; use `ScopeFilters.UNRESTRICTED` for that.
64
+ */
65
+ onMissing?: TScopeFilterMissingBehavior;
66
+ }
47
67
  export interface IModelSettings {
48
68
  /** Properties excluded from all query results at SQL level. */
49
69
  hiddenProperties?: string[];
50
70
  /** Default filter auto-applied to all repository operations. Bypassable via shouldSkipDefaultFilter. */
51
71
  defaultFilter?: TFilter;
72
+ /**
73
+ * Row scope: ANDed into every read and write whose scope is expressible as a filter clause, and
74
+ * NOT removable by `shouldSkipDefaultFilter`. Resolved per query, so it can depend on the current
75
+ * request. Ownership resolved per row or through a polymorphic reference is NOT expressible here -
76
+ * that check is still the application's to perform.
77
+ *
78
+ * Relational repositories only - a search-backed model (Typesense, Meilisearch) never reads
79
+ * this setting, so mirroring a scoped entity into a search index needs its own query-time scope.
80
+ */
81
+ scopeFilter?: IScopeFilterSettings;
52
82
  /** Default row limit when a query omits `limit`. Must be a positive integer. Falls back to DEFAULT_LIMIT (10). */
53
83
  defaultLimit?: number;
54
84
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../src/helpers/inversion/common/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../src/helpers/inversion/common/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@venizia/ignis-kernel",
3
- "version": "0.2.0-1",
3
+ "version": "0.2.0-10",
4
4
  "description": "Browser-pure kernel of the IGNIS framework: dependency injection, lifecycle, REST controllers, repository and datasource abstractions, and the authentication and authorization seams. No node builtin and no server-only peer, so the same kernel serves a Bun server and a browser Worker.",
5
5
  "keywords": [
6
6
  "authentication",
@@ -79,9 +79,9 @@
79
79
  "prepublishOnly": "bun run rebuild"
80
80
  },
81
81
  "dependencies": {
82
- "@venizia/ignis-filter": "^0.2.0-0",
83
- "@venizia/ignis-helpers": "^0.2.0-1",
84
- "@venizia/ignis-inversion": "^0.2.0-0",
82
+ "@venizia/ignis-filter": "^0.2.0-5",
83
+ "@venizia/ignis-helpers": "^0.2.0-8",
84
+ "@venizia/ignis-inversion": "^0.2.0-3",
85
85
  "lodash": "^4.18.1",
86
86
  "reflect-metadata": "^0.2.2",
87
87
  "zod": "^4.4.3"
@@ -107,7 +107,7 @@
107
107
  "devDependencies": {
108
108
  "@types/bun": "^1.3.14",
109
109
  "@types/lodash": "^4.17.23",
110
- "@venizia/dev-configs": "^0.2.0-0",
110
+ "@venizia/dev-configs": "^0.2.0-3",
111
111
  "casbin": "^5.51.1",
112
112
  "eslint": "^10.7.0",
113
113
  "prettier": "^3.9.5",