@venizia/ignis-kernel 0.2.0-44 → 0.2.0-46

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 (175) hide show
  1. package/README.md +97 -9
  2. package/dist/cjs/base/applications/common/types/application.d.ts +7 -0
  3. package/dist/cjs/base/applications/common/types/application.d.ts.map +1 -1
  4. package/dist/cjs/base/applications/rest.d.ts +6 -0
  5. package/dist/cjs/base/applications/rest.d.ts.map +1 -1
  6. package/dist/cjs/base/applications/rest.js +39 -6
  7. package/dist/cjs/base/applications/rest.js.map +1 -1
  8. package/dist/cjs/base/auth/models/requests/change-password.schema.js +1 -1
  9. package/dist/cjs/base/auth/models/requests/change-password.schema.js.map +1 -1
  10. package/dist/cjs/base/controllers/common/html-response.d.ts +26 -5
  11. package/dist/cjs/base/controllers/common/html-response.d.ts.map +1 -1
  12. package/dist/cjs/base/controllers/common/html-response.js +1 -8
  13. package/dist/cjs/base/controllers/common/html-response.js.map +1 -1
  14. package/dist/cjs/base/controllers/factory/controller.d.ts +4 -0
  15. package/dist/cjs/base/controllers/factory/controller.d.ts.map +1 -1
  16. package/dist/cjs/base/controllers/factory/controller.js +8 -0
  17. package/dist/cjs/base/controllers/factory/controller.js.map +1 -1
  18. package/dist/cjs/base/controllers/factory/crud/persistable.d.ts +8 -0
  19. package/dist/cjs/base/controllers/factory/crud/persistable.d.ts.map +1 -1
  20. package/dist/cjs/base/controllers/factory/crud/persistable.js +18 -0
  21. package/dist/cjs/base/controllers/factory/crud/persistable.js.map +1 -1
  22. package/dist/cjs/base/controllers/factory/definition.d.ts +351 -159
  23. package/dist/cjs/base/controllers/factory/definition.d.ts.map +1 -1
  24. package/dist/cjs/base/controllers/factory/definition.js +66 -13
  25. package/dist/cjs/base/controllers/factory/definition.js.map +1 -1
  26. package/dist/cjs/base/controllers/factory/index.d.ts +1 -0
  27. package/dist/cjs/base/controllers/factory/index.d.ts.map +1 -1
  28. package/dist/cjs/base/controllers/factory/index.js +1 -0
  29. package/dist/cjs/base/controllers/factory/index.js.map +1 -1
  30. package/dist/cjs/base/controllers/factory/repository-injection.d.ts +14 -0
  31. package/dist/cjs/base/controllers/factory/repository-injection.d.ts.map +1 -0
  32. package/dist/cjs/base/controllers/factory/repository-injection.js +31 -0
  33. package/dist/cjs/base/controllers/factory/repository-injection.js.map +1 -0
  34. package/dist/cjs/base/datasources/abstract.d.ts +2 -0
  35. package/dist/cjs/base/datasources/abstract.d.ts.map +1 -1
  36. package/dist/cjs/base/datasources/abstract.js +4 -0
  37. package/dist/cjs/base/datasources/abstract.js.map +1 -1
  38. package/dist/cjs/base/datasources/common/types.d.ts +2 -0
  39. package/dist/cjs/base/datasources/common/types.d.ts.map +1 -1
  40. package/dist/cjs/base/metadata/persistents.d.ts +2 -2
  41. package/dist/cjs/base/metadata/persistents.d.ts.map +1 -1
  42. package/dist/cjs/base/metadata/persistents.js +34 -17
  43. package/dist/cjs/base/metadata/persistents.js.map +1 -1
  44. package/dist/cjs/base/middlewares/common/errors.d.ts +9 -1
  45. package/dist/cjs/base/middlewares/common/errors.d.ts.map +1 -1
  46. package/dist/cjs/base/middlewares/common/errors.js +6 -1
  47. package/dist/cjs/base/middlewares/common/errors.js.map +1 -1
  48. package/dist/cjs/base/models/base.d.ts +2 -0
  49. package/dist/cjs/base/models/base.d.ts.map +1 -1
  50. package/dist/cjs/base/models/base.js +4 -0
  51. package/dist/cjs/base/models/base.js.map +1 -1
  52. package/dist/cjs/base/models/common/schemas.d.ts +79 -13
  53. package/dist/cjs/base/models/common/schemas.d.ts.map +1 -1
  54. package/dist/cjs/base/models/common/schemas.js +13 -4
  55. package/dist/cjs/base/models/common/schemas.js.map +1 -1
  56. package/dist/cjs/base/repositories/common/constants.d.ts +9 -0
  57. package/dist/cjs/base/repositories/common/constants.d.ts.map +1 -1
  58. package/dist/cjs/base/repositories/common/constants.js +11 -1
  59. package/dist/cjs/base/repositories/common/constants.js.map +1 -1
  60. package/dist/cjs/base/repositories/core/abstract.d.ts.map +1 -1
  61. package/dist/cjs/base/repositories/core/abstract.js +6 -4
  62. package/dist/cjs/base/repositories/core/abstract.js.map +1 -1
  63. package/dist/cjs/base/repositories/index.d.ts +0 -1
  64. package/dist/cjs/base/repositories/index.d.ts.map +1 -1
  65. package/dist/cjs/base/repositories/index.js +0 -1
  66. package/dist/cjs/base/repositories/index.js.map +1 -1
  67. package/dist/cjs/helpers/inversion/common/types/persistence.d.ts +16 -3
  68. package/dist/cjs/helpers/inversion/common/types/persistence.d.ts.map +1 -1
  69. package/dist/cjs/helpers/inversion/mixins/repository.mixin.d.ts +5 -3
  70. package/dist/cjs/helpers/inversion/mixins/repository.mixin.d.ts.map +1 -1
  71. package/dist/cjs/helpers/inversion/mixins/repository.mixin.js.map +1 -1
  72. package/dist/cjs/helpers/inversion/registry.d.ts +4 -2
  73. package/dist/cjs/helpers/inversion/registry.d.ts.map +1 -1
  74. package/dist/cjs/repository.d.ts +5 -0
  75. package/dist/cjs/repository.d.ts.map +1 -1
  76. package/dist/cjs/repository.js +15 -1
  77. package/dist/cjs/repository.js.map +1 -1
  78. package/dist/cjs/utilities/error.utility.js +4 -4
  79. package/dist/cjs/utilities/error.utility.js.map +1 -1
  80. package/dist/esm/base/applications/common/types/application.d.ts +7 -0
  81. package/dist/esm/base/applications/common/types/application.d.ts.map +1 -1
  82. package/dist/esm/base/applications/rest.d.ts +6 -0
  83. package/dist/esm/base/applications/rest.d.ts.map +1 -1
  84. package/dist/esm/base/applications/rest.js +40 -7
  85. package/dist/esm/base/applications/rest.js.map +1 -1
  86. package/dist/esm/base/auth/models/requests/change-password.schema.js +1 -1
  87. package/dist/esm/base/auth/models/requests/change-password.schema.js.map +1 -1
  88. package/dist/esm/base/controllers/common/html-response.d.ts +26 -5
  89. package/dist/esm/base/controllers/common/html-response.d.ts.map +1 -1
  90. package/dist/esm/base/controllers/common/html-response.js +2 -9
  91. package/dist/esm/base/controllers/common/html-response.js.map +1 -1
  92. package/dist/esm/base/controllers/factory/controller.d.ts +4 -0
  93. package/dist/esm/base/controllers/factory/controller.d.ts.map +1 -1
  94. package/dist/esm/base/controllers/factory/controller.js +8 -0
  95. package/dist/esm/base/controllers/factory/controller.js.map +1 -1
  96. package/dist/esm/base/controllers/factory/crud/persistable.d.ts +8 -0
  97. package/dist/esm/base/controllers/factory/crud/persistable.d.ts.map +1 -1
  98. package/dist/esm/base/controllers/factory/crud/persistable.js +18 -0
  99. package/dist/esm/base/controllers/factory/crud/persistable.js.map +1 -1
  100. package/dist/esm/base/controllers/factory/definition.d.ts +351 -159
  101. package/dist/esm/base/controllers/factory/definition.d.ts.map +1 -1
  102. package/dist/esm/base/controllers/factory/definition.js +66 -13
  103. package/dist/esm/base/controllers/factory/definition.js.map +1 -1
  104. package/dist/esm/base/controllers/factory/index.d.ts +1 -0
  105. package/dist/esm/base/controllers/factory/index.d.ts.map +1 -1
  106. package/dist/esm/base/controllers/factory/index.js +1 -0
  107. package/dist/esm/base/controllers/factory/index.js.map +1 -1
  108. package/dist/esm/base/controllers/factory/repository-injection.d.ts +14 -0
  109. package/dist/esm/base/controllers/factory/repository-injection.d.ts.map +1 -0
  110. package/dist/esm/base/controllers/factory/repository-injection.js +27 -0
  111. package/dist/esm/base/controllers/factory/repository-injection.js.map +1 -0
  112. package/dist/esm/base/datasources/abstract.d.ts +2 -0
  113. package/dist/esm/base/datasources/abstract.d.ts.map +1 -1
  114. package/dist/esm/base/datasources/abstract.js +4 -0
  115. package/dist/esm/base/datasources/abstract.js.map +1 -1
  116. package/dist/esm/base/datasources/common/types.d.ts +2 -0
  117. package/dist/esm/base/datasources/common/types.d.ts.map +1 -1
  118. package/dist/esm/base/metadata/persistents.d.ts +2 -2
  119. package/dist/esm/base/metadata/persistents.d.ts.map +1 -1
  120. package/dist/esm/base/metadata/persistents.js +34 -17
  121. package/dist/esm/base/metadata/persistents.js.map +1 -1
  122. package/dist/esm/base/middlewares/common/errors.d.ts +9 -1
  123. package/dist/esm/base/middlewares/common/errors.d.ts.map +1 -1
  124. package/dist/esm/base/middlewares/common/errors.js +6 -1
  125. package/dist/esm/base/middlewares/common/errors.js.map +1 -1
  126. package/dist/esm/base/models/base.d.ts +2 -0
  127. package/dist/esm/base/models/base.d.ts.map +1 -1
  128. package/dist/esm/base/models/base.js +4 -0
  129. package/dist/esm/base/models/base.js.map +1 -1
  130. package/dist/esm/base/models/common/schemas.d.ts +79 -13
  131. package/dist/esm/base/models/common/schemas.d.ts.map +1 -1
  132. package/dist/esm/base/models/common/schemas.js +11 -3
  133. package/dist/esm/base/models/common/schemas.js.map +1 -1
  134. package/dist/esm/base/repositories/common/constants.d.ts +9 -0
  135. package/dist/esm/base/repositories/common/constants.d.ts.map +1 -1
  136. package/dist/esm/base/repositories/common/constants.js +9 -0
  137. package/dist/esm/base/repositories/common/constants.js.map +1 -1
  138. package/dist/esm/base/repositories/core/abstract.d.ts.map +1 -1
  139. package/dist/esm/base/repositories/core/abstract.js +3 -1
  140. package/dist/esm/base/repositories/core/abstract.js.map +1 -1
  141. package/dist/esm/base/repositories/index.d.ts +0 -1
  142. package/dist/esm/base/repositories/index.d.ts.map +1 -1
  143. package/dist/esm/base/repositories/index.js +0 -1
  144. package/dist/esm/base/repositories/index.js.map +1 -1
  145. package/dist/esm/helpers/inversion/common/types/persistence.d.ts +16 -3
  146. package/dist/esm/helpers/inversion/common/types/persistence.d.ts.map +1 -1
  147. package/dist/esm/helpers/inversion/mixins/repository.mixin.d.ts +5 -3
  148. package/dist/esm/helpers/inversion/mixins/repository.mixin.d.ts.map +1 -1
  149. package/dist/esm/helpers/inversion/mixins/repository.mixin.js.map +1 -1
  150. package/dist/esm/helpers/inversion/registry.d.ts +4 -2
  151. package/dist/esm/helpers/inversion/registry.d.ts.map +1 -1
  152. package/dist/esm/package.json +6 -0
  153. package/dist/esm/repository.d.ts +5 -0
  154. package/dist/esm/repository.d.ts.map +1 -1
  155. package/dist/esm/repository.js +6 -0
  156. package/dist/esm/repository.js.map +1 -1
  157. package/dist/esm/utilities/error.utility.js +1 -1
  158. package/dist/esm/utilities/error.utility.js.map +1 -1
  159. package/package.json +5 -5
  160. package/dist/cjs/base/repositories/sqls/index.d.ts +0 -2
  161. package/dist/cjs/base/repositories/sqls/index.d.ts.map +0 -1
  162. package/dist/cjs/base/repositories/sqls/index.js +0 -18
  163. package/dist/cjs/base/repositories/sqls/index.js.map +0 -1
  164. package/dist/cjs/base/repositories/sqls/recursive-tree.d.ts +0 -56
  165. package/dist/cjs/base/repositories/sqls/recursive-tree.d.ts.map +0 -1
  166. package/dist/cjs/base/repositories/sqls/recursive-tree.js +0 -148
  167. package/dist/cjs/base/repositories/sqls/recursive-tree.js.map +0 -1
  168. package/dist/esm/base/repositories/sqls/index.d.ts +0 -2
  169. package/dist/esm/base/repositories/sqls/index.d.ts.map +0 -1
  170. package/dist/esm/base/repositories/sqls/index.js +0 -2
  171. package/dist/esm/base/repositories/sqls/index.js.map +0 -1
  172. package/dist/esm/base/repositories/sqls/recursive-tree.d.ts +0 -56
  173. package/dist/esm/base/repositories/sqls/recursive-tree.d.ts.map +0 -1
  174. package/dist/esm/base/repositories/sqls/recursive-tree.js +0 -143
  175. package/dist/esm/base/repositories/sqls/recursive-tree.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"repository.js","sourceRoot":"","sources":["../../src/repository.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAYjE,OAAO,EAAE,cAAc,EAAE,MAAM,0CAA0C,CAAC;AAK1E,mGAAmG;AACnG,qFAAqF;AACrF,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"repository.js","sourceRoot":"","sources":["../../src/repository.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAYjE,OAAO,EAAE,cAAc,EAAE,MAAM,0CAA0C,CAAC;AAE1E,mGAAmG;AACnG,mEAAmE;AACnE,OAAO,EACL,aAAa,EACb,iBAAiB,EACjB,yBAAyB,EACzB,eAAe,GAChB,MAAM,sCAAsC,CAAC;AAE9C,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAK9D,mGAAmG;AACnG,qFAAqF;AACrF,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC"}
@@ -1,4 +1,4 @@
1
- import { CoreErrorCodes } from '../common/index.js';
1
+ import { CoreErrorCodes } from '../common/error-codes.js';
2
2
  import { HTTP } from '@venizia/ignis-helpers/common';
3
3
  import { getError } from '@venizia/ignis-helpers/core';
4
4
  /** Standardized NotSupported error (HTTP 501) for a capability an implementation deliberately does not provide - logs a warning before throwing so the gap shows in operational logs, not just to the caller. */
@@ -1 +1 @@
1
- {"version":3,"file":"error.utility.js","sourceRoot":"","sources":["../../../src/utilities/error.utility.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAE,IAAI,EAAE,MAAM,+BAA+B,CAAC;AAErD,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAEvD,iNAAiN;AACjN,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,IAIjC,EAAS,EAAE;IACV,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAExC,MAAM,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,iCAAiC,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;IAE3F,MAAM,QAAQ,CAAC;QACb,UAAU,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,cAAc;QAChD,WAAW,EAAE,cAAc,CAAC,aAAa;QACzC,OAAO,EAAE,IAAI,KAAK,KAAK,OAAO,oBAAoB;KACnD,CAAC,CAAC;AACL,CAAC,CAAC"}
1
+ {"version":3,"file":"error.utility.js","sourceRoot":"","sources":["../../../src/utilities/error.utility.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,IAAI,EAAE,MAAM,+BAA+B,CAAC;AAErD,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAEvD,iNAAiN;AACjN,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,IAIjC,EAAS,EAAE;IACV,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAExC,MAAM,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,iCAAiC,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;IAE3F,MAAM,QAAQ,CAAC;QACb,UAAU,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,cAAc;QAChD,WAAW,EAAE,cAAc,CAAC,aAAa;QACzC,OAAO,EAAE,IAAI,KAAK,KAAK,OAAO,oBAAoB;KACnD,CAAC,CAAC;AACL,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@venizia/ignis-kernel",
3
- "version": "0.2.0-44",
3
+ "version": "0.2.0-46",
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",
@@ -37,7 +37,7 @@
37
37
  },
38
38
  "license": "MIT",
39
39
  "engines": {
40
- "bun": ">=1.3"
40
+ "bun": ">=1.4"
41
41
  },
42
42
  "main": "./dist/cjs/index.js",
43
43
  "module": "./dist/esm/index.js",
@@ -91,9 +91,9 @@
91
91
  "prepublishOnly": "bun run rebuild"
92
92
  },
93
93
  "dependencies": {
94
- "@venizia/ignis-filter": "^0.2.0-21",
95
- "@venizia/ignis-helpers": "^0.2.0-39",
96
- "@venizia/ignis-inversion": "^0.2.0-22",
94
+ "@venizia/ignis-filter": "^0.2.0-23",
95
+ "@venizia/ignis-helpers": "^0.2.0-41",
96
+ "@venizia/ignis-inversion": "^0.2.0-24",
97
97
  "reflect-metadata": "^0.2.2",
98
98
  "zod": "^4.5.4"
99
99
  },
@@ -1,2 +0,0 @@
1
- export * from './recursive-tree';
2
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/base/repositories/sqls/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC"}
@@ -1,18 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
- for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
- };
16
- Object.defineProperty(exports, "__esModule", { value: true });
17
- __exportStar(require("./recursive-tree"), exports);
18
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/base/repositories/sqls/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,mDAAiC"}
@@ -1,56 +0,0 @@
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
@@ -1 +0,0 @@
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"}
@@ -1,148 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.RecursiveTreeSql = exports.RecursiveTreeDirections = void 0;
4
- const core_1 = require("@venizia/ignis-helpers/core");
5
- const drizzle_orm_1 = require("drizzle-orm");
6
- const pg_core_1 = require("drizzle-orm/pg-core");
7
- const sqlite_core_1 = require("drizzle-orm/sqlite-core");
8
- /** Walk direction relative to `rootId`: DOWN follows `parentColumn -> idColumn` (descendants), UP follows the reverse (ancestors). */
9
- class RecursiveTreeDirections {
10
- static { this.UP = 'UP'; }
11
- static { this.DOWN = 'DOWN'; }
12
- static { this.SCHEME_SET = new Set([this.UP, this.DOWN]); }
13
- static isValid(direction) {
14
- return this.SCHEME_SET.has(direction);
15
- }
16
- }
17
- exports.RecursiveTreeDirections = RecursiveTreeDirections;
18
- /** Internal only - not part of {@link IRecursiveTreeOptions}. Derived from `table`, never accepted as an option. */
19
- class RecursiveTreeEngines {
20
- static { this.POSTGRES = 'POSTGRES'; }
21
- static { this.SQLITE = 'SQLITE'; }
22
- static { this.SCHEME_SET = new Set([this.POSTGRES, this.SQLITE]); }
23
- }
24
- /** A SQL identifier is safe to splice only after it matches this allowlist - see {@link RecursiveTreeSql.assertValidIdentifier}. */
25
- const IDENTIFIER_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*$/;
26
- /**
27
- * ASCII Unit Separator (0x1F) - chosen because it does not occur in real ids, unlike `/` or `,`.
28
- * See {@link RecursiveTreeSql} for the exactness limitation this relies on.
29
- */
30
- const SQLITE_PATH_DELIMITER = drizzle_orm_1.sql.raw('char(31)');
31
- /**
32
- * Returns the CTE definition only - the caller writes its own `SELECT ... FROM <name>` around it.
33
- * Engine is read off `table`, never asked of the caller, so no option can disagree with the schema.
34
- * SQLite's `path` is `char(31)`-delimited text, not an array: exact unless an id contains that byte,
35
- * which this class does not reject. Identifiers cannot be parameterized, so `name`/`idColumn`/
36
- * `parentColumn`/`columns` are allowlist-checked before reaching a template.
37
- */
38
- class RecursiveTreeSql {
39
- static assertValidIdentifier(opts) {
40
- const { field, value } = opts;
41
- if (!IDENTIFIER_PATTERN.test(value)) {
42
- throw (0, core_1.getError)({
43
- message: `[RecursiveTreeSql.walk] Invalid '${field}' | Expected letters, digits and underscores only, not starting with a digit | Got: ${value}`,
44
- });
45
- }
46
- }
47
- static walk(opts) {
48
- const { name, table, rootId, direction, maxDepth, idColumn = 'id', parentColumn = 'parent_id', columns = [], recursiveFilter, trackPath = false, startDepth = 0, } = opts;
49
- RecursiveTreeSql.assertValidIdentifier({ field: 'name', value: name });
50
- RecursiveTreeSql.assertValidIdentifier({ field: 'idColumn', value: idColumn });
51
- RecursiveTreeSql.assertValidIdentifier({ field: 'parentColumn', value: parentColumn });
52
- columns.forEach(column => RecursiveTreeSql.assertValidIdentifier({ field: 'columns', value: column }));
53
- if (!RecursiveTreeDirections.isValid(direction)) {
54
- throw (0, core_1.getError)({
55
- message: `[RecursiveTreeSql.walk] Invalid 'direction' | Expected ${RecursiveTreeDirections.UP} or ${RecursiveTreeDirections.DOWN} | Got: ${direction}`,
56
- });
57
- }
58
- if (!Number.isInteger(maxDepth) || maxDepth <= 0) {
59
- throw (0, core_1.getError)({
60
- message: `[RecursiveTreeSql.walk] Invalid 'maxDepth' | Expected a positive integer | Got: ${maxDepth}`,
61
- });
62
- }
63
- if (!(0, drizzle_orm_1.is)(table, drizzle_orm_1.Table)) {
64
- throw (0, core_1.getError)({
65
- message: `[RecursiveTreeSql.walk] Invalid 'table' | Expected a Drizzle table | Got: ${typeof table}`,
66
- });
67
- }
68
- const engine = RecursiveTreeSql.detectEngine(table);
69
- const tableName = (0, drizzle_orm_1.getTableName)(table);
70
- RecursiveTreeSql.assertValidIdentifier({ field: 'table', value: tableName });
71
- const tableIdentifier = drizzle_orm_1.sql.identifier(tableName);
72
- const cteIdentifier = drizzle_orm_1.sql.identifier(name);
73
- const idIdentifier = drizzle_orm_1.sql.identifier(idColumn);
74
- const parentIdentifier = drizzle_orm_1.sql.identifier(parentColumn);
75
- const extraIdentifiers = columns.map(column => drizzle_orm_1.sql.identifier(column));
76
- const baseColumnList = drizzle_orm_1.sql.join([idIdentifier, parentIdentifier, ...extraIdentifiers], (0, drizzle_orm_1.sql) `, `);
77
- const recursiveColumnList = drizzle_orm_1.sql.join([idIdentifier, parentIdentifier, ...extraIdentifiers].map(identifier => (0, drizzle_orm_1.sql) `t.${identifier}`), (0, drizzle_orm_1.sql) `, `);
78
- const depthCast = RecursiveTreeSql.compileDepthCast({ engine, depth: startDepth });
79
- const { basePathColumns, recursivePathColumns } = trackPath
80
- ? RecursiveTreeSql.compileCycleGuardFragments({ engine, idIdentifier })
81
- : { basePathColumns: (0, drizzle_orm_1.sql) ``, recursivePathColumns: (0, drizzle_orm_1.sql) `` };
82
- const baseCase = (0, drizzle_orm_1.sql) `SELECT ${baseColumnList}, ${depthCast} AS depth${basePathColumns} FROM ${tableIdentifier} WHERE ${idIdentifier} = ${rootId}`;
83
- // DOWN walks parent -> children (t.parentColumn = r.idColumn); UP walks child -> parent (t.idColumn = r.parentColumn).
84
- const joinCondition = direction === RecursiveTreeDirections.DOWN
85
- ? (0, drizzle_orm_1.sql) `t.${parentIdentifier} = r.${idIdentifier}`
86
- : (0, drizzle_orm_1.sql) `t.${idIdentifier} = r.${parentIdentifier}`;
87
- // `NOT r.is_cycle` stops expanding a row already flagged cyclic - the row itself stays in the
88
- // result set with is_cycle = true, only its own children are cut off.
89
- const cycleGuard = trackPath ? (0, drizzle_orm_1.sql) ` AND NOT r.is_cycle` : (0, drizzle_orm_1.sql) ``;
90
- const extraFilter = recursiveFilter ? (0, drizzle_orm_1.sql) ` AND (${recursiveFilter})` : (0, drizzle_orm_1.sql) ``;
91
- const recursiveCase = (0, drizzle_orm_1.sql) `SELECT ${recursiveColumnList}, r.depth + 1${recursivePathColumns} FROM ${tableIdentifier} t JOIN ${cteIdentifier} r ON ${joinCondition} WHERE r.depth + 1 <= ${maxDepth}${cycleGuard}${extraFilter}`;
92
- return (0, drizzle_orm_1.sql) `WITH RECURSIVE ${cteIdentifier} AS (${baseCase} UNION ALL ${recursiveCase})`;
93
- }
94
- /** See {@link RecursiveTreeSql} for why there is no separate `engine` option. */
95
- static detectEngine(table) {
96
- if ((0, drizzle_orm_1.is)(table, pg_core_1.PgTable)) {
97
- return RecursiveTreeEngines.POSTGRES;
98
- }
99
- if ((0, drizzle_orm_1.is)(table, sqlite_core_1.SQLiteTable)) {
100
- return RecursiveTreeEngines.SQLITE;
101
- }
102
- throw (0, core_1.getError)({
103
- message: `[RecursiveTreeSql.walk] Invalid 'table' | Expected a Postgres or SQLite Drizzle table | Got: ${(0, drizzle_orm_1.getTableName)(table)}`,
104
- });
105
- }
106
- /** 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`. */
107
- static compileDepthCast(opts) {
108
- const { engine, depth } = opts;
109
- switch (engine) {
110
- case RecursiveTreeEngines.POSTGRES: {
111
- return (0, drizzle_orm_1.sql) `${depth}::int`;
112
- }
113
- case RecursiveTreeEngines.SQLITE: {
114
- return (0, drizzle_orm_1.sql) `CAST(${depth} AS INTEGER)`;
115
- }
116
- default: {
117
- throw (0, core_1.getError)({
118
- message: `[RecursiveTreeSql.walk] Invalid 'engine' | Got: ${engine}`,
119
- });
120
- }
121
- }
122
- }
123
- /** See {@link RecursiveTreeSql} for why Postgres and SQLite need different `path`/`is_cycle` shapes. */
124
- static compileCycleGuardFragments(opts) {
125
- const { engine, idIdentifier } = opts;
126
- switch (engine) {
127
- case RecursiveTreeEngines.POSTGRES: {
128
- return {
129
- basePathColumns: (0, drizzle_orm_1.sql) `, ARRAY[${idIdentifier}] AS path, false AS is_cycle`,
130
- recursivePathColumns: (0, drizzle_orm_1.sql) `, r.path || t.${idIdentifier} AS path, t.${idIdentifier} = ANY(r.path) AS is_cycle`,
131
- };
132
- }
133
- case RecursiveTreeEngines.SQLITE: {
134
- return {
135
- basePathColumns: (0, drizzle_orm_1.sql) `, ${SQLITE_PATH_DELIMITER} || ${idIdentifier} || ${SQLITE_PATH_DELIMITER} AS path, 0 AS is_cycle`,
136
- recursivePathColumns: (0, drizzle_orm_1.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`,
137
- };
138
- }
139
- default: {
140
- throw (0, core_1.getError)({
141
- message: `[RecursiveTreeSql.walk] Invalid 'engine' | Got: ${engine}`,
142
- });
143
- }
144
- }
145
- }
146
- }
147
- exports.RecursiveTreeSql = RecursiveTreeSql;
148
- //# sourceMappingURL=recursive-tree.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"recursive-tree.js","sourceRoot":"","sources":["../../../../../src/base/repositories/sqls/recursive-tree.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export * from './recursive-tree.js';
2
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/base/repositories/sqls/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC"}
@@ -1,2 +0,0 @@
1
- export * from './recursive-tree.js';
2
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/base/repositories/sqls/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC"}
@@ -1,56 +0,0 @@
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
@@ -1 +0,0 @@
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"}
@@ -1,143 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"recursive-tree.js","sourceRoot":"","sources":["../../../../../src/base/repositories/sqls/recursive-tree.ts"],"names":[],"mappings":"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"}