@prisma-next/target-postgres 0.14.0-dev.8 → 0.14.0-dev.81

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 (266) hide show
  1. package/dist/authoring-ChmUI_tC.mjs +674 -0
  2. package/dist/authoring-ChmUI_tC.mjs.map +1 -0
  3. package/dist/canonicalize-D1F4vUnP.d.mts +48 -0
  4. package/dist/canonicalize-D1F4vUnP.d.mts.map +1 -0
  5. package/dist/{codec-ids-CnXu9Qy3.d.mts → codec-ids-BzrFF-I4.d.mts} +3 -2
  6. package/dist/codec-ids-BzrFF-I4.d.mts.map +1 -0
  7. package/dist/{codec-ids-BvytN2P8.mjs → codec-ids-C_-Hj6bL.mjs} +3 -2
  8. package/dist/codec-ids-C_-Hj6bL.mjs.map +1 -0
  9. package/dist/codec-ids.d.mts +2 -2
  10. package/dist/codec-ids.mjs +2 -2
  11. package/dist/{codec-types-DHCkwPKE.d.mts → codec-types-BiIWziRO.d.mts} +3 -2
  12. package/dist/codec-types-BiIWziRO.d.mts.map +1 -0
  13. package/dist/codec-types.d.mts +1 -1
  14. package/dist/codecs-BemGS69L.mjs +927 -0
  15. package/dist/codecs-BemGS69L.mjs.map +1 -0
  16. package/dist/{codecs--0A5_4Bq.d.mts → codecs-Cm-nS4mQ.d.mts} +111 -4
  17. package/dist/codecs-Cm-nS4mQ.d.mts.map +1 -0
  18. package/dist/codecs.d.mts +2 -2
  19. package/dist/codecs.mjs +3 -757
  20. package/dist/codecs.mjs.map +1 -1
  21. package/dist/contract-free.d.mts +33 -3
  22. package/dist/contract-free.d.mts.map +1 -1
  23. package/dist/contract-free.mjs +23 -7
  24. package/dist/contract-free.mjs.map +1 -1
  25. package/dist/control-policy-BfQLCrha.mjs +1285 -0
  26. package/dist/control-policy-BfQLCrha.mjs.map +1 -0
  27. package/dist/control.d.mts +2 -2
  28. package/dist/control.d.mts.map +1 -1
  29. package/dist/control.mjs +866 -36
  30. package/dist/control.mjs.map +1 -1
  31. package/dist/data-transform-BOWpliq8.mjs.map +1 -1
  32. package/dist/{data-transform-DDgWdB5o.d.mts → data-transform-DPzwBMhW.d.mts} +3 -3
  33. package/dist/{data-transform-DDgWdB5o.d.mts.map → data-transform-DPzwBMhW.d.mts.map} +1 -1
  34. package/dist/data-transform.d.mts +1 -1
  35. package/dist/{ddl-QDyOSeLc.mjs → ddl-eBZav_MS.mjs} +128 -6
  36. package/dist/ddl-eBZav_MS.mjs.map +1 -0
  37. package/dist/ddl.d.mts +3 -2
  38. package/dist/ddl.mjs +2 -2
  39. package/dist/default-normalizer.d.mts +1 -1
  40. package/dist/default-normalizer.d.mts.map +1 -1
  41. package/dist/default-normalizer.mjs +247 -1
  42. package/dist/default-normalizer.mjs.map +1 -0
  43. package/dist/descriptor-meta-DAwRBZpA.mjs +23 -0
  44. package/dist/descriptor-meta-DAwRBZpA.mjs.map +1 -0
  45. package/dist/descriptor-meta-runtime-UwYdV8fD.mjs +12 -0
  46. package/dist/descriptor-meta-runtime-UwYdV8fD.mjs.map +1 -0
  47. package/dist/diff-database-schema-jsEOfSYT.mjs +305 -0
  48. package/dist/diff-database-schema-jsEOfSYT.mjs.map +1 -0
  49. package/dist/diff-database-schema.d.mts +46 -0
  50. package/dist/diff-database-schema.d.mts.map +1 -0
  51. package/dist/diff-database-schema.mjs +2 -0
  52. package/dist/errors-DO-w0EUS.mjs +35 -0
  53. package/dist/errors-DO-w0EUS.mjs.map +1 -0
  54. package/dist/errors.d.mts +11 -9
  55. package/dist/errors.d.mts.map +1 -1
  56. package/dist/errors.mjs +1 -1
  57. package/dist/issue-planner.d.mts +35 -11
  58. package/dist/issue-planner.d.mts.map +1 -1
  59. package/dist/issue-planner.mjs +2 -2
  60. package/dist/migration.d.mts +5 -5
  61. package/dist/migration.d.mts.map +1 -1
  62. package/dist/migration.mjs +4 -4
  63. package/dist/namespace-ids-xtp_ZY86.mjs +7 -0
  64. package/dist/namespace-ids-xtp_ZY86.mjs.map +1 -0
  65. package/dist/native-type-normalizer.mjs +37 -1
  66. package/dist/native-type-normalizer.mjs.map +1 -0
  67. package/dist/nodes-DJC5B8Id.mjs +192 -0
  68. package/dist/nodes-DJC5B8Id.mjs.map +1 -0
  69. package/dist/nodes-Dv5eCSq9.d.mts +170 -0
  70. package/dist/nodes-Dv5eCSq9.d.mts.map +1 -0
  71. package/dist/{op-factory-call-DmQEc3XV.d.mts → op-factory-call-Bn9zDx4_.d.mts} +114 -15
  72. package/dist/op-factory-call-Bn9zDx4_.d.mts.map +1 -0
  73. package/dist/{op-factory-call-D_p5vxwt.mjs → op-factory-call-Dwsb1xzl.mjs} +469 -32
  74. package/dist/op-factory-call-Dwsb1xzl.mjs.map +1 -0
  75. package/dist/op-factory-call.d.mts +2 -2
  76. package/dist/op-factory-call.mjs +2 -2
  77. package/dist/pack.d.mts +321 -3
  78. package/dist/pack.d.mts.map +1 -1
  79. package/dist/pack.mjs +1 -1
  80. package/dist/planner-ChCtpEGe.mjs +390 -0
  81. package/dist/planner-ChCtpEGe.mjs.map +1 -0
  82. package/dist/{planner-ddl-builders-B2wOwLqI.mjs → planner-ddl-builders-BKlmGDJl.mjs} +17 -28
  83. package/dist/planner-ddl-builders-BKlmGDJl.mjs.map +1 -0
  84. package/dist/planner-ddl-builders.d.mts +4 -6
  85. package/dist/planner-ddl-builders.d.mts.map +1 -1
  86. package/dist/planner-ddl-builders.mjs +2 -2
  87. package/dist/planner-identity-values-CJPha2Sz.mjs.map +1 -1
  88. package/dist/planner-identity-values.d.mts +8 -2
  89. package/dist/planner-identity-values.d.mts.map +1 -1
  90. package/dist/planner-identity-values.mjs +2 -2
  91. package/dist/{planner-produced-postgres-migration-QqHa2C2l.d.mts → planner-produced-postgres-migration-BEY1T0Xm.d.mts} +4 -4
  92. package/dist/{planner-produced-postgres-migration-QqHa2C2l.d.mts.map → planner-produced-postgres-migration-BEY1T0Xm.d.mts.map} +1 -1
  93. package/dist/{planner-produced-postgres-migration-Cji5vxUf.mjs → planner-produced-postgres-migration-Bb16yHNX.mjs} +3 -3
  94. package/dist/{planner-produced-postgres-migration-Cji5vxUf.mjs.map → planner-produced-postgres-migration-Bb16yHNX.mjs.map} +1 -1
  95. package/dist/planner-produced-postgres-migration.d.mts +1 -1
  96. package/dist/planner-produced-postgres-migration.mjs +1 -1
  97. package/dist/{planner-sql-checks-jqUUGyQR.mjs → planner-sql-checks-Cx0ATsPc.mjs} +5 -5
  98. package/dist/{planner-sql-checks-jqUUGyQR.mjs.map → planner-sql-checks-Cx0ATsPc.mjs.map} +1 -1
  99. package/dist/planner-sql-checks.d.mts +2 -2
  100. package/dist/planner-sql-checks.d.mts.map +1 -1
  101. package/dist/planner-sql-checks.mjs +1 -1
  102. package/dist/{planner-target-details-CIY6tLeo.d.mts → planner-target-details-HkP4RrRO.d.mts} +2 -2
  103. package/dist/planner-target-details-HkP4RrRO.d.mts.map +1 -0
  104. package/dist/planner-target-details.d.mts +1 -1
  105. package/dist/planner.d.mts +72 -17
  106. package/dist/planner.d.mts.map +1 -1
  107. package/dist/planner.mjs +3 -2
  108. package/dist/{postgres-contract-serializer-k3TAcPMY.mjs → postgres-contract-view-BiDhl5Ez.mjs} +45 -41
  109. package/dist/postgres-contract-view-BiDhl5Ez.mjs.map +1 -0
  110. package/dist/postgres-contract-view-C9j5cqP0.d.mts +34 -0
  111. package/dist/postgres-contract-view-C9j5cqP0.d.mts.map +1 -0
  112. package/dist/postgres-database-schema-node-CJv5bfbs.d.mts +262 -0
  113. package/dist/postgres-database-schema-node-CJv5bfbs.d.mts.map +1 -0
  114. package/dist/{postgres-migration-B5jKrXv3.mjs → postgres-migration-Cj5Tpj1a.mjs} +78 -45
  115. package/dist/postgres-migration-Cj5Tpj1a.mjs.map +1 -0
  116. package/dist/{postgres-migration-Y4YBJqkS.d.mts → postgres-migration-DbckK1su.d.mts} +58 -9
  117. package/dist/postgres-migration-DbckK1su.d.mts.map +1 -0
  118. package/dist/postgres-native-enum-BwVNf0Ku.mjs +45 -0
  119. package/dist/postgres-native-enum-BwVNf0Ku.mjs.map +1 -0
  120. package/dist/postgres-rls-policy--CSddvMR.d.mts +52 -0
  121. package/dist/postgres-rls-policy--CSddvMR.d.mts.map +1 -0
  122. package/dist/postgres-role-schema-node-Cm-j0ZGM.mjs +190 -0
  123. package/dist/postgres-role-schema-node-Cm-j0ZGM.mjs.map +1 -0
  124. package/dist/{postgres-schema-COGZ1ark.mjs → postgres-schema-ChBj22nX.mjs} +200 -11
  125. package/dist/postgres-schema-ChBj22nX.mjs.map +1 -0
  126. package/dist/postgres-schema-DKq6s1P3.d.mts +269 -0
  127. package/dist/postgres-schema-DKq6s1P3.d.mts.map +1 -0
  128. package/dist/postgres-table-schema-node-D6LvInCe.mjs +216 -0
  129. package/dist/postgres-table-schema-node-D6LvInCe.mjs.map +1 -0
  130. package/dist/render-ops.d.mts +1 -1
  131. package/dist/{render-typescript-KMgosran.mjs → render-typescript-7yqILcwr.mjs} +45 -16
  132. package/dist/render-typescript-7yqILcwr.mjs.map +1 -0
  133. package/dist/render-typescript.mjs +1 -1
  134. package/dist/resolve-ddl-schema-BCSMHFwl.mjs +22 -0
  135. package/dist/resolve-ddl-schema-BCSMHFwl.mjs.map +1 -0
  136. package/dist/rls-canonicalize.d.mts +27 -0
  137. package/dist/rls-canonicalize.d.mts.map +1 -0
  138. package/dist/rls-canonicalize.mjs +2 -0
  139. package/dist/runtime.d.mts +6 -8
  140. package/dist/runtime.d.mts.map +1 -1
  141. package/dist/runtime.mjs +3 -3
  142. package/dist/runtime.mjs.map +1 -1
  143. package/dist/schema-ir-annotations.d.mts +15 -0
  144. package/dist/schema-ir-annotations.d.mts.map +1 -0
  145. package/dist/schema-ir-annotations.mjs +2 -0
  146. package/dist/{sql-utils-DcfMz4MQ.mjs → sql-utils-SU4FDvIV.mjs} +12 -3
  147. package/dist/{sql-utils-DcfMz4MQ.mjs.map → sql-utils-SU4FDvIV.mjs.map} +1 -1
  148. package/dist/sql-utils.d.mts +8 -1
  149. package/dist/sql-utils.d.mts.map +1 -1
  150. package/dist/sql-utils.mjs +2 -2
  151. package/dist/types.d.mts +4 -140
  152. package/dist/types.mjs +5 -2
  153. package/dist/wire-name-DbQ9-2RC.mjs +104 -0
  154. package/dist/wire-name-DbQ9-2RC.mjs.map +1 -0
  155. package/package.json +26 -20
  156. package/src/contract-free/checks.ts +153 -0
  157. package/src/contract-free/control-bootstrap.ts +20 -3
  158. package/src/contract-free/ddl.ts +98 -1
  159. package/src/core/authoring.ts +726 -2
  160. package/src/core/codec-helpers.ts +33 -7
  161. package/src/core/codec-ids.ts +1 -0
  162. package/src/core/codec-type-map.ts +2 -0
  163. package/src/core/codecs.ts +193 -12
  164. package/src/core/ddl/nodes.ts +185 -2
  165. package/src/core/default-normalizer.ts +122 -2
  166. package/src/core/descriptor-meta.ts +12 -1
  167. package/src/core/entity-kinds.ts +41 -0
  168. package/src/core/errors.ts +14 -12
  169. package/src/core/migrations/bound-schema.ts +10 -0
  170. package/src/core/migrations/column-ddl-rendering.ts +117 -0
  171. package/src/core/migrations/contract-to-postgres-database-schema-node.ts +189 -0
  172. package/src/core/migrations/control-policy.ts +217 -65
  173. package/src/core/migrations/diff-database-schema.ts +252 -0
  174. package/src/core/migrations/issue-planner.ts +817 -656
  175. package/src/core/migrations/op-factory-call.ts +383 -23
  176. package/src/core/migrations/operations/columns.ts +24 -12
  177. package/src/core/migrations/operations/constraints.ts +1 -1
  178. package/src/core/migrations/operations/data-transform.ts +6 -0
  179. package/src/core/migrations/operations/dependencies.ts +2 -1
  180. package/src/core/migrations/operations/native-enum-types.ts +62 -0
  181. package/src/core/migrations/operations/rls.ts +187 -0
  182. package/src/core/migrations/operations/shared.ts +0 -30
  183. package/src/core/migrations/planner-ddl-builders.ts +31 -59
  184. package/src/core/migrations/planner-identity-values.ts +1 -1
  185. package/src/core/migrations/planner-recipes.ts +31 -13
  186. package/src/core/migrations/planner-sql-checks.ts +1 -1
  187. package/src/core/migrations/planner-strategies.ts +248 -216
  188. package/src/core/migrations/planner-target-details.ts +3 -1
  189. package/src/core/migrations/planner.ts +357 -67
  190. package/src/core/migrations/postgres-migration.ts +118 -86
  191. package/src/core/migrations/render-typescript.ts +42 -15
  192. package/src/core/migrations/resolve-ddl-schema.ts +26 -0
  193. package/src/core/migrations/runner.ts +11 -16
  194. package/src/core/migrations/verify-postgres-namespaces.ts +46 -31
  195. package/src/core/namespace-ids.ts +3 -0
  196. package/src/core/postgres-contract-serializer.ts +46 -71
  197. package/src/core/postgres-contract-view.ts +48 -0
  198. package/src/core/postgres-native-enum.ts +61 -0
  199. package/src/core/postgres-rls-enablement.ts +34 -0
  200. package/src/core/postgres-rls-policy.ts +64 -0
  201. package/src/core/postgres-role.ts +59 -0
  202. package/src/core/postgres-schema-verifier.ts +10 -7
  203. package/src/core/postgres-schema.ts +85 -15
  204. package/src/core/postgres-validators.ts +34 -0
  205. package/src/core/psl-infer/infer-psl-contract.ts +1273 -0
  206. package/src/core/psl-infer/postgres-default-mapping.ts +16 -0
  207. package/src/core/psl-infer/postgres-type-map.ts +128 -0
  208. package/src/core/rls/canonicalize.ts +65 -0
  209. package/src/core/rls/wire-name.ts +33 -0
  210. package/src/core/schema-ir/node-storage-coordinate.ts +26 -0
  211. package/src/core/schema-ir/postgres-database-schema-node.ts +61 -0
  212. package/src/core/schema-ir/postgres-namespace-schema-node.ts +70 -0
  213. package/src/core/schema-ir/postgres-native-enum-schema-node.ts +83 -0
  214. package/src/core/schema-ir/postgres-policy-schema-node.ts +90 -0
  215. package/src/core/schema-ir/postgres-role-schema-node.ts +65 -0
  216. package/src/core/schema-ir/postgres-table-schema-node.ts +140 -0
  217. package/src/core/schema-ir/schema-node-kinds.ts +122 -0
  218. package/src/core/sql-utils.ts +15 -2
  219. package/src/exports/codecs.ts +3 -0
  220. package/src/exports/contract-free.ts +11 -1
  221. package/src/exports/control.ts +27 -33
  222. package/src/exports/ddl.ts +8 -0
  223. package/src/exports/diff-database-schema.ts +7 -0
  224. package/src/exports/issue-planner.ts +1 -1
  225. package/src/exports/migration.ts +1 -0
  226. package/src/exports/op-factory-call.ts +4 -0
  227. package/src/exports/planner-ddl-builders.ts +0 -2
  228. package/src/exports/planner-identity-values.ts +4 -1
  229. package/src/exports/planner.ts +1 -0
  230. package/src/exports/rls-canonicalize.ts +12 -0
  231. package/src/exports/runtime.ts +1 -0
  232. package/src/exports/schema-ir-annotations.ts +1 -0
  233. package/src/exports/sql-utils.ts +1 -0
  234. package/src/exports/types.ts +37 -0
  235. package/dist/codec-ids-BvytN2P8.mjs.map +0 -1
  236. package/dist/codec-ids-CnXu9Qy3.d.mts.map +0 -1
  237. package/dist/codec-types-DHCkwPKE.d.mts.map +0 -1
  238. package/dist/codecs--0A5_4Bq.d.mts.map +0 -1
  239. package/dist/ddl-QDyOSeLc.mjs.map +0 -1
  240. package/dist/default-normalizer-DyyCHQWs.mjs +0 -131
  241. package/dist/default-normalizer-DyyCHQWs.mjs.map +0 -1
  242. package/dist/descriptor-meta-CpGygXpI.mjs +0 -140
  243. package/dist/descriptor-meta-CpGygXpI.mjs.map +0 -1
  244. package/dist/errors-CUk87ByX.mjs +0 -33
  245. package/dist/errors-CUk87ByX.mjs.map +0 -1
  246. package/dist/issue-planner-DL6g3CmE.mjs +0 -824
  247. package/dist/issue-planner-DL6g3CmE.mjs.map +0 -1
  248. package/dist/native-type-normalizer-Bc9XJzWC.mjs +0 -38
  249. package/dist/native-type-normalizer-Bc9XJzWC.mjs.map +0 -1
  250. package/dist/nodes-Bbhs2rwj.mjs +0 -76
  251. package/dist/nodes-Bbhs2rwj.mjs.map +0 -1
  252. package/dist/nodes-pLeLgdis.d.mts +0 -67
  253. package/dist/nodes-pLeLgdis.d.mts.map +0 -1
  254. package/dist/op-factory-call-D_p5vxwt.mjs.map +0 -1
  255. package/dist/op-factory-call-DmQEc3XV.d.mts.map +0 -1
  256. package/dist/planner-Bs_baQax.mjs +0 -324
  257. package/dist/planner-Bs_baQax.mjs.map +0 -1
  258. package/dist/planner-ddl-builders-B2wOwLqI.mjs.map +0 -1
  259. package/dist/planner-target-details-CIY6tLeo.d.mts.map +0 -1
  260. package/dist/postgres-contract-serializer-k3TAcPMY.mjs.map +0 -1
  261. package/dist/postgres-migration-B5jKrXv3.mjs.map +0 -1
  262. package/dist/postgres-migration-Y4YBJqkS.d.mts.map +0 -1
  263. package/dist/postgres-schema-COGZ1ark.mjs.map +0 -1
  264. package/dist/render-typescript-KMgosran.mjs.map +0 -1
  265. package/dist/types.d.mts.map +0 -1
  266. package/src/core/postgres-enum-type-schema.ts +0 -17
@@ -1,24 +1,46 @@
1
+ import type { Contract } from '@prisma-next/contract/types';
1
2
  import {
2
3
  freezeNode,
3
4
  hydrateNamespaceEntities,
4
- NamespaceBase,
5
5
  UNBOUND_NAMESPACE_ID,
6
6
  } from '@prisma-next/framework-components/ir';
7
7
  import { composeSqlEntityKinds } from '@prisma-next/sql-contract/entity-kinds';
8
- import type {
9
- SqlNamespaceEntries,
10
- SqlNamespaceTablesInput,
11
- SqlStorage,
12
- StorageTable,
13
- StorageValueSet,
8
+ import {
9
+ SqlNamespaceBase,
10
+ type SqlNamespaceEntries,
11
+ type SqlNamespaceInput,
12
+ type SqlStorage,
13
+ type StorageTable,
14
+ type StorageValueSet,
14
15
  } from '@prisma-next/sql-contract/types';
16
+
15
17
  import { type CfExpr, cfExpr } from '@prisma-next/sql-relational-core/contract-free';
18
+ import { invariant } from '@prisma-next/utils/assertions';
16
19
  import { blindCast } from '@prisma-next/utils/casts';
17
20
  import { ifDefined } from '@prisma-next/utils/defined';
18
21
  import { PostgresTableSource } from './ast/table-source';
19
22
  import { PG_TEXT_CODEC_ID } from './codec-ids';
23
+ import {
24
+ nativeEnumEntityKind,
25
+ policyEntityKind,
26
+ rlsEnablementEntityKind,
27
+ roleEntityKind,
28
+ } from './entity-kinds';
29
+ import { PostgresNativeEnum } from './postgres-native-enum';
30
+ import type { PostgresRlsEnablement } from './postgres-rls-enablement';
31
+ import type { PostgresRlsPolicy } from './postgres-rls-policy';
32
+ import type { PostgresRole } from './postgres-role';
20
33
  import { escapeLiteral } from './sql-utils';
21
34
 
35
+ export type PostgresContract = Contract<SqlStorage> & { readonly target: 'postgres' };
36
+
37
+ export type PostgresNamespaceEntries = SqlNamespaceEntries & {
38
+ readonly policy?: Readonly<Record<string, PostgresRlsPolicy>>;
39
+ readonly role?: Readonly<Record<string, PostgresRole>>;
40
+ readonly rls?: Readonly<Record<string, PostgresRlsEnablement>>;
41
+ readonly native_enum?: Readonly<Record<string, PostgresNativeEnum>>;
42
+ };
43
+
22
44
  export interface PostgresSchemaInput {
23
45
  readonly id: string;
24
46
  readonly entries: Readonly<Record<string, Readonly<Record<string, unknown>>>>;
@@ -38,7 +60,7 @@ export interface PostgresSchemaInput {
38
60
  * prefix entirely — call sites stay polymorphic and never branch on
39
61
  * `id === UNBOUND_NAMESPACE_ID`.
40
62
  */
41
- export class PostgresSchema extends NamespaceBase {
63
+ export class PostgresSchema extends SqlNamespaceBase {
42
64
  /**
43
65
  * Stable singleton reference for the late-bound slot. Materialised
44
66
  * lazily below the singleton subclass declaration so the static
@@ -50,13 +72,42 @@ export class PostgresSchema extends NamespaceBase {
50
72
 
51
73
  declare readonly kind: 'schema';
52
74
  readonly id: string;
53
- readonly entries: SqlNamespaceEntries;
75
+ readonly entries: PostgresNamespaceEntries;
54
76
 
55
77
  constructor(input: PostgresSchemaInput) {
56
78
  super();
57
79
  this.id = input.id;
58
80
 
59
- const dispatched = hydrateNamespaceEntities(input.entries, composeSqlEntityKinds(), 'carry');
81
+ const dispatched = hydrateNamespaceEntities(
82
+ input.entries,
83
+ composeSqlEntityKinds([
84
+ policyEntityKind,
85
+ roleEntityKind,
86
+ rlsEnablementEntityKind,
87
+ nativeEnumEntityKind,
88
+ ]),
89
+ 'carry',
90
+ );
91
+
92
+ // A native enum keys under its PHYSICAL type name in storage `entries`
93
+ // (ADR 221 coordinate `entityName`). The family/authoring layer keys every
94
+ // block by its author handle, so re-key the `native_enum` slot by each
95
+ // entity's `typeName` here — target-local Postgres code that already knows
96
+ // this entity kind. This runs at both authoring and hydration; a serialized
97
+ // contract's key already equals the `typeName`, so the re-key is idempotent.
98
+ const nativeEnumSlot = dispatched['native_enum'];
99
+ if (nativeEnumSlot !== undefined) {
100
+ const rekeyed: Record<string, unknown> = {};
101
+ for (const [handle, entity] of Object.entries(nativeEnumSlot)) {
102
+ const physicalName = PostgresNativeEnum.is(entity) ? entity.typeName : handle;
103
+ invariant(
104
+ !Object.hasOwn(rekeyed, physicalName),
105
+ `PostgresSchema "${input.id}": two native_enum entities resolve to the same physical type name "${physicalName}". Give them distinct @@map type names.`,
106
+ );
107
+ rekeyed[physicalName] = entity;
108
+ }
109
+ dispatched['native_enum'] = Object.freeze(rekeyed);
110
+ }
60
111
 
61
112
  // Drop an empty valueSet so presence signals non-emptiness.
62
113
  const valueSetRaw = dispatched['valueSet'];
@@ -65,11 +116,15 @@ export class PostgresSchema extends NamespaceBase {
65
116
  ? { ...dispatched, valueSet: undefined }
66
117
  : dispatched;
67
118
 
119
+ const entriesInput: Record<string, Readonly<Record<string, unknown>> | undefined> = {
120
+ ...withPresence,
121
+ };
122
+
68
123
  this.entries = Object.freeze(
69
124
  blindCast<
70
- SqlNamespaceEntries,
71
- 'composeSqlEntityKinds() supplies table→StorageTable and valueSet→StorageValueSet descriptors, so this open-dict result holds exactly the typed members SqlNamespaceEntries declares; the descriptor Map erases those per-kind Node types from the return.'
72
- >(withPresence),
125
+ PostgresNamespaceEntries,
126
+ 'composeSqlEntityKinds([policyEntityKind, roleEntityKind, rlsEnablementEntityKind, nativeEnumEntityKind]) supplies table→StorageTable, valueSet→StorageValueSet, policy→PostgresRlsPolicy, role→PostgresRole, rls→PostgresRlsEnablement, native_enum→PostgresNativeEnum descriptors'
127
+ >(entriesInput),
73
128
  );
74
129
  Object.defineProperty(this, 'kind', {
75
130
  value: 'schema',
@@ -88,6 +143,18 @@ export class PostgresSchema extends NamespaceBase {
88
143
  return this.entries.valueSet;
89
144
  }
90
145
 
146
+ get policy(): Readonly<Record<string, PostgresRlsPolicy>> {
147
+ return this.entries.policy ?? Object.freeze({});
148
+ }
149
+
150
+ get role(): Readonly<Record<string, PostgresRole>> {
151
+ return this.entries.role ?? Object.freeze({});
152
+ }
153
+
154
+ get rls(): Readonly<Record<string, PostgresRlsEnablement>> {
155
+ return this.entries.rls ?? Object.freeze({});
156
+ }
157
+
91
158
  /**
92
159
  * The bare schema qualifier as it would appear in a rendered SQL
93
160
  * fragment (already quoted). The unbound-schema singleton overrides
@@ -245,9 +312,12 @@ export function isPostgresSchema(ns: unknown): ns is PostgresSchema {
245
312
  * The factory has no per-call state — every named id deterministically
246
313
  * maps to a distinct schema instance — so callers can pass it through
247
314
  * by reference and trust the resulting `SqlStorage.namespaces` map to
248
- * be value-stable for a given input set.
315
+ * be value-stable for a given input set. Native-enum column type names are
316
+ * schema-qualified earlier, at column construction, via the target's
317
+ * `authoring.qualifyColumnType` hook (`postgresQualifyColumnType`), so this
318
+ * factory just materialises the namespace from already-qualified entries.
249
319
  */
250
- export function postgresCreateNamespace(input: SqlNamespaceTablesInput): PostgresSchema {
320
+ export function postgresCreateNamespace(input: SqlNamespaceInput): PostgresSchema {
251
321
  const schemaInput: PostgresSchemaInput = {
252
322
  id: input.id,
253
323
  entries: {
@@ -0,0 +1,34 @@
1
+ import { type } from 'arktype';
2
+
3
+ export const PostgresRoleSchema = type({
4
+ kind: "'role'",
5
+ name: 'string',
6
+ namespaceId: 'string',
7
+ 'control?': "'external'",
8
+ });
9
+
10
+ export const PostgresRlsPolicySchema = type({
11
+ kind: "'policy'",
12
+ name: 'string',
13
+ prefix: 'string',
14
+ tableName: 'string',
15
+ namespaceId: 'string',
16
+ operation: "'select' | 'insert' | 'update' | 'delete' | 'all'",
17
+ roles: type.string.array().readonly(),
18
+ 'using?': 'string',
19
+ 'withCheck?': 'string',
20
+ permissive: 'boolean',
21
+ });
22
+
23
+ export const PostgresRlsEnablementSchema = type({
24
+ kind: "'rls'",
25
+ tableName: 'string',
26
+ namespaceId: 'string',
27
+ });
28
+
29
+ export const PostgresNativeEnumSchema = type({
30
+ kind: "'postgres-enum'",
31
+ typeName: 'string',
32
+ members: type.string.array().readonly(),
33
+ 'control?': "'managed' | 'tolerated' | 'external' | 'observed'",
34
+ });