@rebasepro/server 0.24.0 → 0.24.1-canary.gcb918fc

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 (224) hide show
  1. package/README.md +27 -2
  2. package/dist/GCSStorageController-fv6JAZ87.js +402 -0
  3. package/dist/GCSStorageController-fv6JAZ87.js.map +1 -0
  4. package/dist/S3StorageController-BNg-pXiY.js +480 -0
  5. package/dist/S3StorageController-BNg-pXiY.js.map +1 -0
  6. package/dist/api/mount-path.d.ts +30 -0
  7. package/dist/api/mount.d.ts +6 -13
  8. package/dist/api/rest/api-generator.d.ts +53 -1
  9. package/dist/api/rest/auth-collection-writes.d.ts +28 -21
  10. package/dist/api/rest/field-access-query.d.ts +28 -8
  11. package/dist/api/rest/field-ops.d.ts +19 -7
  12. package/dist/api/rest/query-body.d.ts +10 -0
  13. package/dist/api/rest/write-validation.d.ts +7 -5
  14. package/dist/api/schema-editor-routes.d.ts +10 -1
  15. package/dist/api/sql-export-routes.d.ts +8 -0
  16. package/dist/api/types.d.ts +35 -0
  17. package/dist/{ast-schema-editor-CWqS_sLJ.js → ast-schema-editor-mCeSC03x.js} +3 -3
  18. package/dist/{ast-schema-editor-CWqS_sLJ.js.map → ast-schema-editor-mCeSC03x.js.map} +1 -1
  19. package/dist/auth/access.d.ts +57 -8
  20. package/dist/auth/admin-user-ops.d.ts +24 -2
  21. package/dist/auth/admin-users-route.d.ts +1 -0
  22. package/dist/auth/api-keys/api-key-middleware.d.ts +10 -3
  23. package/dist/auth/api-keys/api-key-routes.d.ts +4 -1
  24. package/dist/auth/builtin-auth-adapter.d.ts +13 -0
  25. package/dist/auth/email-change-routes.d.ts +3 -0
  26. package/dist/auth/expired-token-sweep.d.ts +5 -1
  27. package/dist/auth/interfaces.d.ts +10 -0
  28. package/dist/auth/jwks-routes.d.ts +5 -1
  29. package/dist/auth/jwt-crypto.d.ts +7 -0
  30. package/dist/auth/jwt-keys.d.ts +4 -0
  31. package/dist/auth/jwt.d.ts +282 -166
  32. package/dist/auth/magic-link-routes.d.ts +3 -0
  33. package/dist/auth/mfa-crypto.d.ts +9 -3
  34. package/dist/auth/mfa-gate.d.ts +4 -2
  35. package/dist/auth/mfa-routes.d.ts +6 -0
  36. package/dist/auth/middleware.d.ts +9 -2
  37. package/dist/auth/otp-routes.d.ts +3 -0
  38. package/dist/auth/rate-limiter.d.ts +61 -34
  39. package/dist/auth/registration-policy.d.ts +17 -0
  40. package/dist/auth/require-auth.d.ts +1 -1
  41. package/dist/auth/routes.d.ts +16 -0
  42. package/dist/auth/session-routes.d.ts +6 -0
  43. package/dist/auth/user-picking.d.ts +37 -0
  44. package/dist/auth/verify-credential.d.ts +25 -4
  45. package/dist/{auth-DMLngxn_.js → auth-GnONzteu.js} +2869 -1871
  46. package/dist/auth-GnONzteu.js.map +1 -0
  47. package/dist/auth_adapter-CIItCTc8.js +21 -0
  48. package/dist/auth_adapter-CIItCTc8.js.map +1 -0
  49. package/dist/backend/create-backend.d.ts +281 -0
  50. package/dist/backend/default-backend.d.ts +35 -0
  51. package/dist/backend/options.d.ts +912 -0
  52. package/dist/backend/scope.d.ts +23 -0
  53. package/dist/backend/services.d.ts +54 -0
  54. package/dist/backend-DTAOsLQc.js.map +1 -1
  55. package/dist/backup/backup-common.d.ts +14 -3
  56. package/dist/backup/backup-routes.d.ts +23 -2
  57. package/dist/backup/backup-storage.d.ts +3 -1
  58. package/dist/backup/index.d.ts +3 -1
  59. package/dist/{backup-CN0s50D2.js → backup-BnvkSLHi.js} +176 -35
  60. package/dist/backup-BnvkSLHi.js.map +1 -0
  61. package/dist/boot/boot.d.ts +2 -2
  62. package/dist/boot/driver.d.ts +3 -0
  63. package/dist/boot/env.d.ts +9 -2
  64. package/dist/boot/http-server.d.ts +22 -0
  65. package/dist/boot/options.d.ts +16 -1
  66. package/dist/boot/provision.d.ts +4 -2
  67. package/dist/boot/runtime-cors.d.ts +17 -0
  68. package/dist/boot/sources.d.ts +2 -0
  69. package/dist/boot/static-routing.d.ts +9 -0
  70. package/dist/{contract-routes-fz8i4pxs.js → contract-routes-Ey6ftnKH.js} +4 -20
  71. package/dist/contract-routes-Ey6ftnKH.js.map +1 -0
  72. package/dist/cron/cron-loader.d.ts +77 -18
  73. package/dist/cron/cron-routes.d.ts +1 -1
  74. package/dist/cron/cron-scheduler.d.ts +69 -3
  75. package/dist/cron/cron-store.d.ts +33 -5
  76. package/dist/cron/define-cron.d.ts +6 -2
  77. package/dist/cron/index.d.ts +3 -3
  78. package/dist/cron-loader-B-u0snqq.js +202 -0
  79. package/dist/cron-loader-B-u0snqq.js.map +1 -0
  80. package/dist/{cron-routes-Bc-SB0Se.js → cron-routes-OD6BstUj.js} +27 -4
  81. package/dist/cron-routes-OD6BstUj.js.map +1 -0
  82. package/dist/{cron-scheduler-CYQgco86.js → cron-scheduler-idtLPoN-.js} +299 -33
  83. package/dist/cron-scheduler-idtLPoN-.js.map +1 -0
  84. package/dist/cron-store-CZ30ZBi-.js +577 -0
  85. package/dist/cron-store-CZ30ZBi-.js.map +1 -0
  86. package/dist/email/smtp-email-service.d.ts +23 -0
  87. package/dist/email/types.d.ts +18 -0
  88. package/dist/env.d.ts +0 -37
  89. package/dist/filter-dialect-O1HK6Nvr.js +1628 -0
  90. package/dist/filter-dialect-O1HK6Nvr.js.map +1 -0
  91. package/dist/{function-loader-D7o5Epjj.js → function-loader-iKhOZatS.js} +68 -38
  92. package/dist/function-loader-iKhOZatS.js.map +1 -0
  93. package/dist/{function-routes-CaNG4waN.js → function-routes-j9TwpvQe.js} +5 -4
  94. package/dist/function-routes-j9TwpvQe.js.map +1 -0
  95. package/dist/functions/context.d.ts +9 -0
  96. package/dist/functions/define-function.d.ts +10 -6
  97. package/dist/functions/function-loader.d.ts +75 -18
  98. package/dist/functions/function-routes.d.ts +2 -1
  99. package/dist/functions/index.d.ts +5 -4
  100. package/dist/functions/index.js +42 -13
  101. package/dist/functions/index.js.map +1 -1
  102. package/dist/functions/internal.d.ts +2 -2
  103. package/dist/functions/proxy.d.ts +6 -2
  104. package/dist/functions/request-timeout.d.ts +7 -5
  105. package/dist/history/history-routes.d.ts +9 -0
  106. package/dist/history/retention-sweep.d.ts +81 -0
  107. package/dist/{history-recorder-Nr8zLvoU.js → history-recorder-BfWRwmPy.js} +3 -3
  108. package/dist/{history-recorder-Nr8zLvoU.js.map → history-recorder-BfWRwmPy.js.map} +1 -1
  109. package/dist/{history-store-rcAm_xFR.js → history-store-DPofGVDp.js} +2 -2
  110. package/dist/{history-store-rcAm_xFR.js.map → history-store-DPofGVDp.js.map} +1 -1
  111. package/dist/index.d.ts +23 -10
  112. package/dist/index.es.js +24423 -20038
  113. package/dist/index.es.js.map +1 -1
  114. package/dist/init/docs.d.ts +27 -10
  115. package/dist/init/process-safety.d.ts +7 -2
  116. package/dist/init/shutdown.d.ts +18 -3
  117. package/dist/init.d.ts +49 -865
  118. package/dist/internal-tables-L2t39RdT.js +136 -0
  119. package/dist/internal-tables-L2t39RdT.js.map +1 -0
  120. package/dist/jobs/job-queue.d.ts +8 -0
  121. package/dist/jobs/job-store.d.ts +24 -0
  122. package/dist/jobs/types.d.ts +25 -4
  123. package/dist/{jobs-DqYNfquG.js → jobs-BCbflZj2.js} +234 -24
  124. package/dist/jobs-BCbflZj2.js.map +1 -0
  125. package/dist/{jwt-R6bSPMjk.js → jwt-BlvuKoR6.js} +529 -454
  126. package/dist/jwt-BlvuKoR6.js.map +1 -0
  127. package/dist/{keys-GAVZqbqx.js → keys-COzQ2aE8.js} +2 -2
  128. package/dist/{keys-GAVZqbqx.js.map → keys-COzQ2aE8.js.map} +1 -1
  129. package/dist/load-failure-L5hvfDoG.js +80 -0
  130. package/dist/load-failure-L5hvfDoG.js.map +1 -0
  131. package/dist/mcp/mcp-routes.d.ts +6 -0
  132. package/dist/mcp/mcp-tools.d.ts +8 -0
  133. package/dist/mcp/oauth-routes.d.ts +7 -0
  134. package/dist/metrics/index.d.ts +18 -0
  135. package/dist/metrics/pool-wait.d.ts +50 -0
  136. package/dist/offline-QNQgsPOq-B2yGeXkn.js +3305 -0
  137. package/dist/offline-QNQgsPOq-B2yGeXkn.js.map +1 -0
  138. package/dist/offline-store-Cm5sAX81-CALiO4Gn.js +1915 -0
  139. package/dist/offline-store-Cm5sAX81-CALiO4Gn.js.map +1 -0
  140. package/dist/{openapi-generator-DAq_XVDu.js → openapi-generator-D9zUQmEp.js} +366 -82
  141. package/dist/openapi-generator-D9zUQmEp.js.map +1 -0
  142. package/dist/policy-PdzX-Opd.js +121 -0
  143. package/dist/policy-PdzX-Opd.js.map +1 -0
  144. package/dist/project_manifest-R6y_KHms.js +59 -0
  145. package/dist/project_manifest-R6y_KHms.js.map +1 -0
  146. package/dist/{proxy-qRlqeUmO.js → proxy-CkTlMGmh.js} +4 -3
  147. package/dist/proxy-CkTlMGmh.js.map +1 -0
  148. package/dist/{query-parser-BgiKJKvc.js → query-parser-4WkMoA_K.js} +510 -15
  149. package/dist/query-parser-4WkMoA_K.js.map +1 -0
  150. package/dist/{request-timeout-DgH7j8qO.js → request-timeout-Dnl2_OBc.js} +15 -8
  151. package/dist/request-timeout-Dnl2_OBc.js.map +1 -0
  152. package/dist/resumable-upload-threshold-CKv-Ry0l.js +24 -0
  153. package/dist/resumable-upload-threshold-CKv-Ry0l.js.map +1 -0
  154. package/dist/schema-edit/apply-schema-change.d.ts +10 -0
  155. package/dist/schema-edit/local-source.d.ts +29 -0
  156. package/dist/schema-edit/remote-source.d.ts +13 -3
  157. package/dist/schema-edit/source-editor.d.ts +28 -0
  158. package/dist/{schema-editor-routes-oIyuWl3L.js → schema-editor-routes-C11Tumyd.js} +54 -10
  159. package/dist/schema-editor-routes-C11Tumyd.js.map +1 -0
  160. package/dist/services/outbound-post.d.ts +50 -0
  161. package/dist/services/outbound-url-guard.d.ts +34 -5
  162. package/dist/services/routed-realtime-service.d.ts +5 -0
  163. package/dist/services/webhook-service.d.ts +66 -14
  164. package/dist/singleton.d.ts +9 -5
  165. package/dist/soft-delete-params-DfV3vVN5.js +668 -0
  166. package/dist/soft-delete-params-DfV3vVN5.js.map +1 -0
  167. package/dist/sql-export-routes-ClRwzIsC.js +240 -0
  168. package/dist/sql-export-routes-ClRwzIsC.js.map +1 -0
  169. package/dist/{src-CatHFUym.js → src-D5Y3N-S4.js} +2 -1
  170. package/dist/{src-CatHFUym.js.map → src-D5Y3N-S4.js.map} +1 -1
  171. package/dist/storage/GCSStorageController.d.ts +46 -2
  172. package/dist/storage/LocalStorageController.d.ts +67 -2
  173. package/dist/storage/S3StorageController.d.ts +37 -3
  174. package/dist/storage/image-transform.d.ts +5 -0
  175. package/dist/storage/maintenance-routes.d.ts +23 -0
  176. package/dist/storage/maintenance.d.ts +126 -0
  177. package/dist/storage/rendition-cache.d.ts +9 -11
  178. package/dist/storage/request-principals.d.ts +30 -0
  179. package/dist/storage/routes.d.ts +20 -0
  180. package/dist/storage/source-variables.d.ts +10 -0
  181. package/dist/storage/streams.d.ts +42 -0
  182. package/dist/storage/tus-handler.d.ts +46 -2
  183. package/dist/storage/types.d.ts +82 -7
  184. package/dist/storage/upload-validation.d.ts +13 -0
  185. package/dist/storage-resumable-VO-cMpse-C_YX71pO.js +125 -0
  186. package/dist/storage-resumable-VO-cMpse-C_YX71pO.js.map +1 -0
  187. package/dist/strings.es-BeZWAodn.js +256 -0
  188. package/dist/strings.es-BeZWAodn.js.map +1 -0
  189. package/dist/upload-validation-Dd-fnsbA.js +172 -0
  190. package/dist/upload-validation-Dd-fnsbA.js.map +1 -0
  191. package/dist/utils/byte-size.d.ts +10 -0
  192. package/dist/utils/compression.d.ts +6 -0
  193. package/dist/utils/load-failure.d.ts +14 -0
  194. package/package.json +5 -5
  195. package/dist/GCSStorageController-BSiP1c-f.js +0 -256
  196. package/dist/GCSStorageController-BSiP1c-f.js.map +0 -1
  197. package/dist/S3StorageController-CAwFRgjV.js +0 -276
  198. package/dist/S3StorageController-CAwFRgjV.js.map +0 -1
  199. package/dist/auth-DMLngxn_.js.map +0 -1
  200. package/dist/backup-CN0s50D2.js.map +0 -1
  201. package/dist/contract-routes-fz8i4pxs.js.map +0 -1
  202. package/dist/cron-loader-CwaANlOG.js +0 -118
  203. package/dist/cron-loader-CwaANlOG.js.map +0 -1
  204. package/dist/cron-routes-Bc-SB0Se.js.map +0 -1
  205. package/dist/cron-scheduler-CYQgco86.js.map +0 -1
  206. package/dist/cron-store-D2Q9-Aco.js +0 -300
  207. package/dist/cron-store-D2Q9-Aco.js.map +0 -1
  208. package/dist/dynamic-import-X40pTZUQ.js +0 -23
  209. package/dist/dynamic-import-X40pTZUQ.js.map +0 -1
  210. package/dist/function-loader-D7o5Epjj.js.map +0 -1
  211. package/dist/function-routes-CaNG4waN.js.map +0 -1
  212. package/dist/jobs-DqYNfquG.js.map +0 -1
  213. package/dist/jwt-R6bSPMjk.js.map +0 -1
  214. package/dist/openapi-generator-DAq_XVDu.js.map +0 -1
  215. package/dist/proxy-qRlqeUmO.js.map +0 -1
  216. package/dist/query-parser-BgiKJKvc.js.map +0 -1
  217. package/dist/request-timeout-DgH7j8qO.js.map +0 -1
  218. package/dist/schema-editor-routes-oIyuWl3L.js.map +0 -1
  219. package/dist/soft-delete-params-BWPilMPF.js +0 -59
  220. package/dist/soft-delete-params-BWPilMPF.js.map +0 -1
  221. package/dist/src-I3aG1PcY.js +0 -6870
  222. package/dist/src-I3aG1PcY.js.map +0 -1
  223. package/dist/types-BfKcm9do.js +0 -39
  224. package/dist/types-BfKcm9do.js.map +0 -1
@@ -0,0 +1,668 @@
1
+ import { createRequire as __rebaseCreateRequire } from "module";
2
+ import __rebaseProcess from "process";
3
+ globalThis.process ??= __rebaseProcess;
4
+ __rebaseCreateRequire(import.meta.url);
5
+ import { r as toSnakeCase } from "./strings.es-BeZWAodn.js";
6
+ import { W as isRelationalCollectionConfig } from "./src-D5Y3N-S4.js";
7
+ import { t as ApiError } from "./errors-D6_y86c5.js";
8
+ //#region ../utils/dist/plurals.es.js
9
+ /**
10
+ * Returns the singular of an English word.
11
+ *
12
+ * @param {string} word
13
+ * @param {number} [amount]
14
+ * @returns {string}
15
+ */
16
+ function singular(word, amount) {
17
+ if (amount !== void 0 && amount !== 1) return word;
18
+ const singulars = {
19
+ "(quiz)zes$": "$1",
20
+ "(matr)ices$": "$1ix",
21
+ "(vert|ind)ices$": "$1ex",
22
+ "^(ox)en$": "$1",
23
+ "(alias)es$": "$1",
24
+ "(octop|vir)i$": "$1us",
25
+ "(cris|ax|test)es$": "$1is",
26
+ "(shoe)s$": "$1",
27
+ "(o)es$": "$1",
28
+ "(bus)es$": "$1",
29
+ "([m|l])ice$": "$1ouse",
30
+ "(x|ch|ss|sh)es$": "$1",
31
+ "(m)ovies$": "$1ovie",
32
+ "(s)eries$": "$1eries",
33
+ "([^aeiouy]|qu)ies$": "$1y",
34
+ "([lr])ves$": "$1f",
35
+ "(tive)s$": "$1",
36
+ "(hive)s$": "$1",
37
+ "(li|wi|kni)ves$": "$1fe",
38
+ "(shea|loa|lea|thie)ves$": "$1f",
39
+ "(^analy)ses$": "$1sis",
40
+ "((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$": "$1$2sis",
41
+ "([ti])a$": "$1um",
42
+ "(n)ews$": "$1ews",
43
+ "(h|bl)ouses$": "$1ouse",
44
+ "(corpse)s$": "$1",
45
+ "(us)es$": "$1",
46
+ s$: ""
47
+ };
48
+ const irregular = {
49
+ move: "moves",
50
+ foot: "feet",
51
+ goose: "geese",
52
+ sex: "sexes",
53
+ child: "children",
54
+ man: "men",
55
+ tooth: "teeth",
56
+ person: "people"
57
+ };
58
+ if ([
59
+ "sheep",
60
+ "fish",
61
+ "deer",
62
+ "moose",
63
+ "series",
64
+ "species",
65
+ "money",
66
+ "rice",
67
+ "information",
68
+ "equipment",
69
+ "bison",
70
+ "cod",
71
+ "offspring",
72
+ "pike",
73
+ "salmon",
74
+ "shrimp",
75
+ "swine",
76
+ "trout",
77
+ "aircraft",
78
+ "hovercraft",
79
+ "spacecraft",
80
+ "sugar",
81
+ "tuna",
82
+ "you",
83
+ "wood"
84
+ ].indexOf(word.toLowerCase()) >= 0) return word;
85
+ for (const w in irregular) {
86
+ const pattern = new RegExp(`${irregular[w]}$`, "i");
87
+ if (pattern.test(word)) return word.replace(pattern, w);
88
+ }
89
+ for (const reg in singulars) {
90
+ const pattern = new RegExp(reg, "i");
91
+ if (pattern.test(word)) return word.replace(pattern, singulars[reg]);
92
+ }
93
+ return word;
94
+ }
95
+ //#endregion
96
+ //#region ../utils/dist/names.es.js
97
+ /**
98
+ * Generates a foreign key column name from a given string, typically a collection slug or name.
99
+ * It singularizes the name, converts it to snake_case and appends '_id'.
100
+ *
101
+ * Singularization runs *before* snake-casing so that acronyms survive: `toSnakeCase`
102
+ * splits on every capital, which turned "URLs" into "ur_ls" and then "ur_l_id".
103
+ *
104
+ * @param name The base name to convert to a foreign key.
105
+ * @returns A foreign key name in the format 'singular_name_id'.
106
+ *
107
+ * @example
108
+ * // returns "user_id"
109
+ * generateForeignKeyName("users")
110
+ *
111
+ * @example
112
+ * // returns "category_id"
113
+ * generateForeignKeyName("categories")
114
+ *
115
+ * @example
116
+ * // returns "product_id"
117
+ * generateForeignKeyName("Product")
118
+ *
119
+ */
120
+ function generateForeignKeyName(name) {
121
+ return `${toSnakeCase(singularizeForKey(name))}_id`;
122
+ }
123
+ /**
124
+ * `singular()` handles real English plurals, but its final catch-all rule strips
125
+ * any trailing "s", which mangles words that only look plural. Guard the two
126
+ * cases that produce a column name nobody would recognise:
127
+ *
128
+ * - a double "s" ending is never a plural marker ("address", "class", "process"),
129
+ * so stripping it yields "addres";
130
+ * - a name that singularizes to nothing (the literal "s") would yield "_id".
131
+ */
132
+ function singularizeForKey(name) {
133
+ if (/ss$/i.test(name)) return name;
134
+ const result = singular(name);
135
+ return result.length > 0 ? result : name;
136
+ }
137
+ /**
138
+ * The API name a database column is served under.
139
+ *
140
+ * The wire name of a field is its property key, and Rebase's property keys are
141
+ * camelCase — `displayName`, `createdAt`, `photoURL`. Columns are snake_case,
142
+ * because an unquoted Postgres identifier folds to lower case and a camelCase
143
+ * column is therefore reachable only as `"authorId"` forever: in hand-written
144
+ * SQL, in psql, in an RLS policy body, in a dump, and in every third-party tool
145
+ * that ever touches the database. So the two conventions are both right, and
146
+ * this is the function that crosses between them.
147
+ *
148
+ * It exists because two sources of field names never crossed: a foreign key
149
+ * derived from a relation (`author_id`) and a column read back by introspection
150
+ * (`user_id`) both landed on the wire under their column name, while every
151
+ * hand-authored collection next to them used camelCase. One API, two
152
+ * conventions, and no rule a caller could infer from outside — those names are
153
+ * also the `where` and `orderBy` keys, so it was not a matter of taste.
154
+ *
155
+ * Rules, in the order they matter:
156
+ *
157
+ * - **A name with no separator is returned unchanged.** `photoURL` stays
158
+ * `photoURL` and `id` stays `id`. Lower-casing a single token is what makes
159
+ * a "camelCase" helper destructive — `camelCase("photoURL")` is `photourl` —
160
+ * and this function is applied to names that are *already* keys.
161
+ * - **Each following segment keeps its own casing** apart from an upper-cased
162
+ * first letter, so `photo_URL` → `photoURL` rather than `photoUrl`.
163
+ * - **The result may still not be a JavaScript identifier.** `2fa_enabled`
164
+ * becomes `2faEnabled`, which is a perfectly good object key and still needs
165
+ * quoting where one is written into generated source.
166
+ *
167
+ * Not the inverse of {@link toSnakeCase}: `toSnakeCase` tokenises on case
168
+ * boundaries and would turn `photoURL` into `photo_url`. Round-tripping is not
169
+ * a property either function promises, which is why a column name that a
170
+ * property maps explicitly is always read off `columnName` rather than derived.
171
+ */
172
+ function toWireKey(columnName) {
173
+ if (!columnName) return columnName;
174
+ const segments = columnName.split(/[-_ ]+/).filter(Boolean);
175
+ if (segments.length <= 1) return columnName;
176
+ return segments.map((segment, index) => index === 0 ? segment.charAt(0).toLowerCase() + segment.slice(1) : segment.charAt(0).toUpperCase() + segment.slice(1)).join("");
177
+ }
178
+ //#endregion
179
+ //#region ../common/src/util/resolve-relation.ts
180
+ /**
181
+ * Fill in a relation's defaults.
182
+ *
183
+ * This replaces `sanitizeRelation`, which had to work out *which kind of link
184
+ * you meant* from whichever optional fields happened to be set — 194 lines of
185
+ * it, including a pass that inspected the target collection's own relations to
186
+ * decide whether a `many`/`inverse` pair was a one-to-many or the far side of a
187
+ * many-to-many, wrapped in a `try/catch` that fell through to the wrong answer
188
+ * when it could not tell. Two consumers running that logic at different moments
189
+ * could reach different conclusions about the same relation.
190
+ *
191
+ * With the kind declared there is nothing to work out. What remains is
192
+ * defaulting — a table name, a column name — which is deterministic, depends
193
+ * only on the relation and its two endpoints, and cannot fail. That is why this
194
+ * function returns rather than throws, and why it needs no cache to be
195
+ * consistent.
196
+ */
197
+ function resolveRelation(relation, sourceCollection, propertyKey) {
198
+ const target = relation.target;
199
+ if (typeof target !== "function") throw new Error(`Relation${relation.relationName ? ` '${relation.relationName}'` : ""} on '${sourceCollection.slug}' has no \`target\`. Give it a thunk: \`target: () => otherCollection\`.`);
200
+ const targetCollection = callTarget(relation, sourceCollection, propertyKey, target);
201
+ const relationName = relation.relationName ?? propertyKey ?? toSnakeCase(targetCollection.slug);
202
+ const shared = {
203
+ relationName,
204
+ target: () => unwrapModuleNamespace(target()),
205
+ targetSlug: targetCollection.slug,
206
+ onUpdate: relation.onUpdate,
207
+ onDelete: relation.onDelete,
208
+ overrides: relation.overrides
209
+ };
210
+ const sourceName = toSnakeCase(sourceCollection.slug ?? sourceCollection.name);
211
+ switch (relation.kind) {
212
+ case "belongsTo": return {
213
+ ...shared,
214
+ kind: "belongsTo",
215
+ cardinality: "one",
216
+ writable: true,
217
+ shared: false,
218
+ localKey: relation.localKey ?? generateForeignKeyName(relationName),
219
+ index: relation.index !== false
220
+ };
221
+ case "hasOne": return {
222
+ ...shared,
223
+ kind: "hasOne",
224
+ cardinality: "one",
225
+ writable: true,
226
+ shared: false,
227
+ foreignKeyOnTarget: relation.foreignKeyOnTarget ?? generateForeignKeyName(sourceName),
228
+ sourceKey: relation.sourceKey
229
+ };
230
+ case "hasMany": return {
231
+ ...shared,
232
+ kind: "hasMany",
233
+ cardinality: "many",
234
+ writable: true,
235
+ shared: false,
236
+ foreignKeyOnTarget: relation.foreignKeyOnTarget ?? generateForeignKeyName(sourceName),
237
+ sourceKey: relation.sourceKey
238
+ };
239
+ case "manyToMany": {
240
+ const sourceTable = getTableName(sourceCollection);
241
+ const targetTable = getTableName(targetCollection);
242
+ return {
243
+ ...shared,
244
+ kind: "manyToMany",
245
+ cardinality: "many",
246
+ writable: true,
247
+ shared: true,
248
+ through: {
249
+ table: relation.through?.table ?? [sourceTable, targetTable].sort().join("_"),
250
+ sourceColumn: relation.through?.sourceColumn ?? generateForeignKeyName(sourceName),
251
+ targetColumn: relation.through?.targetColumn ?? generateForeignKeyName(relationName),
252
+ properties: relation.through?.properties ?? {}
253
+ }
254
+ };
255
+ }
256
+ case "via": return {
257
+ ...shared,
258
+ kind: "via",
259
+ cardinality: relation.cardinality,
260
+ writable: false,
261
+ shared: true,
262
+ joinPath: relation.joinPath
263
+ };
264
+ default: throw new Error(`Unknown relation kind: ${JSON.stringify(relation)}`);
265
+ }
266
+ }
267
+ /** How this relation is addressed in an error message, before it has a resolved name. */
268
+ function describe(relation, sourceCollection, propertyKey) {
269
+ const name = relation.relationName ?? propertyKey;
270
+ return `Relation${name ? ` '${name}'` : ""} on '${sourceCollection.slug}'`;
271
+ }
272
+ /**
273
+ * A module namespace, unwrapped to the collection it exports.
274
+ *
275
+ * A cycle transpiled to CommonJS does not hand the importing module the
276
+ * *default export* — it hands it the module object, `{ __esModule: true,
277
+ * default: … }`, captured before the exporting module finished evaluating. The
278
+ * `default` slot fills in later, so by the time a lazy `target` thunk runs the
279
+ * collection is sitting right there, one level down. Returning the namespace is
280
+ * never a thing a thunk means to do, and there is exactly one reading of it.
281
+ *
282
+ * Only unwrapped when the inner value is itself a collection: a `default` that
283
+ * is not one is a genuinely wrong thunk, and it should reach the error below
284
+ * rather than be quietly swapped in.
285
+ */
286
+ function unwrapModuleNamespace(value) {
287
+ if (!value || typeof value !== "object") return value;
288
+ if (value.slug) return value;
289
+ const inner = value.default;
290
+ return inner && typeof inner === "object" && inner.slug ? inner : value;
291
+ }
292
+ /**
293
+ * Call the `target` thunk, and translate the ways an import cycle breaks it into
294
+ * an error that names the cause — or, where the value is recoverable, into the
295
+ * collection the thunk meant.
296
+ *
297
+ * The thunk exists to defer the reference until every module has finished
298
+ * evaluating, and for a cycle that closes at import time it does. Two cycles
299
+ * leave the binding permanently unusable:
300
+ *
301
+ * - **ESM/TDZ.** `const` and `class` bindings in a not-yet-evaluated module are
302
+ * in the temporal dead zone, so reading one throws `ReferenceError: x is not
303
+ * defined`. The stack points at the thunk — a one-line arrow function that is
304
+ * obviously fine — and says nothing about the cycle that made it throw.
305
+ * - **CJS interop, unresolved.** The half-initialised module object has no
306
+ * `default` yet, the import resolves to `undefined`, and the thunk returns it
307
+ * without complaint. That one used to surface here as "did not resolve to a
308
+ * collection", which is true and unhelpful.
309
+ *
310
+ * Both mean the same thing, and the fix for both is the same: break the cycle,
311
+ * or move the relation into the collection that does not close it.
312
+ *
313
+ * A third shape is *not* an error, and used to be reported as one. A loader that
314
+ * transpiles ESM to CJS — jiti, which is what `rebase generate-sdk` and
315
+ * `rebase build` load collections with — gives the module entered second in a
316
+ * cycle a namespace object rather than the default export, and never replaces it
317
+ * with a live binding. The thunk then returns `{ __esModule: true, default: … }`
318
+ * holding the fully-initialised collection. Native ESM resolves the same thunk
319
+ * to the collection directly, so this was a loader artefact reported as an
320
+ * authoring mistake, and the advice it gave — make the target a lazy thunk — was
321
+ * already satisfied by the code it was rejecting. Bidirectional relations make
322
+ * these cycles unavoidable, and the lazy thunk is this framework's own answer to
323
+ * them, so {@link unwrapModuleNamespace} takes the collection and moves on.
324
+ */
325
+ function callTarget(relation, sourceCollection, propertyKey, target) {
326
+ let targetCollection;
327
+ try {
328
+ targetCollection = unwrapModuleNamespace(target());
329
+ } catch (error) {
330
+ if (error instanceof ReferenceError) throw new Error(`${describe(relation, sourceCollection, propertyKey)} targets a collection that is not initialized yet — almost always an import cycle between the two collection files. Break the cycle (move the shared piece into a third module, or import the target lazily) so the target's module finishes evaluating before the registry is built.`, { cause: error });
331
+ throw error;
332
+ }
333
+ if (!targetCollection?.slug) throw new Error(`${describe(relation, sourceCollection, propertyKey)} has a \`target\` that resolved to ${targetCollection === void 0 ? "`undefined`" : "something that is not a collection"}. ` + (targetCollection === void 0 ? "Under CommonJS interop an import cycle resolves the default import to `undefined`, so check whether this collection and its target import each other. Otherwise the thunk is returning the wrong value — it must return the collection itself, not a promise or a module." : typeof targetCollection.then === "function" ? "The thunk returned a promise — `target: () => import(\"./other\")` is asynchronous. Import the collection at the top of the file and return the binding: `target: () => otherCollection`." : "The thunk must return a collection config with a `slug`."));
334
+ return targetCollection;
335
+ }
336
+ //#endregion
337
+ //#region ../common/src/util/relations.ts
338
+ /**
339
+ * Whether the target rows are shared with other parents — a many-to-many, or a
340
+ * multi-hop `via` chain.
341
+ *
342
+ * Decides what a write "through" the relation may touch: a shared target
343
+ * belongs to every parent that links it, so the parent owns the *link* and not
344
+ * the row. The backend enforces that (an unlink rather than a delete) and the
345
+ * admin renders it (remove-from-parent rather than delete).
346
+ *
347
+ * Now a field on the resolved relation rather than a re-derivation, so both
348
+ * sides read the same answer instead of each computing one.
349
+ */
350
+ function isJunctionBackedRelation(relation) {
351
+ return relation.shared;
352
+ }
353
+ /** WeakMap cache — same collection instance always yields the same relation map. */
354
+ var _resolvedRelationsCache = /* @__PURE__ */ new WeakMap();
355
+ /**
356
+ * Every relation a collection declares, keyed by the name it is addressed by.
357
+ *
358
+ * A relation reaches the map from either of two places — the collection's
359
+ * `relations` array, or a `relation` property that declares one inline — and is
360
+ * keyed by its resolved `relationName`, which is what a nested path segment,
361
+ * an `include` key and an admin tab all match against.
362
+ *
363
+ * Resolution no longer swallows failures. It used to wrap each relation in a
364
+ * `try/catch` that dropped anything it could not work out, so a
365
+ * mis-declared relation silently vanished instead of being reported; with the
366
+ * kind declared, the only remaining failure is a `target` that does not resolve,
367
+ * which is worth hearing about.
368
+ */
369
+ function resolveCollectionRelations(collection) {
370
+ const cached = _resolvedRelationsCache.get(collection);
371
+ if (cached) return cached;
372
+ if (!isRelationalCollectionConfig(collection)) return {};
373
+ const relations = {};
374
+ for (const relation of collection.relations ?? []) {
375
+ const resolved = resolveRelation(relation, collection);
376
+ relations[resolved.relationName] = resolved;
377
+ }
378
+ for (const [propertyKey, property] of Object.entries(collection.properties ?? {})) {
379
+ if (property?.type !== "relation") continue;
380
+ const declared = property.relation;
381
+ if (!declared || relations[propertyKey]) continue;
382
+ relations[propertyKey] = resolveRelation(declared, collection, propertyKey);
383
+ }
384
+ _resolvedRelationsCache.set(collection, relations);
385
+ return relations;
386
+ }
387
+ /**
388
+ * The `type: "relation"` property that declares a link, or `undefined` for one
389
+ * that only exists in the collection's `relations` array.
390
+ *
391
+ * Both declaration sites end up in {@link resolveCollectionRelations}, and only
392
+ * one of them has a property to carry field-level facts — `name`, `admin`, and
393
+ * the one this exists for, `validation.required`.
394
+ */
395
+ function relationDeclaringProperty(collection, relation) {
396
+ const resolved = resolveCollectionRelations(collection);
397
+ for (const [key, raw] of Object.entries(collection.properties ?? {})) {
398
+ const prop = raw;
399
+ if (prop?.type !== "relation") continue;
400
+ if (resolved[key] === relation) return prop;
401
+ const addressed = prop.relation?.relationName;
402
+ if (addressed && findRelation(resolved, addressed) === relation) return prop;
403
+ }
404
+ }
405
+ /**
406
+ * Must every row of this collection point at a target through this link?
407
+ *
408
+ * Read from the declaring property's `validation.required` — the same key every
409
+ * other field uses, and the only place it lives.
410
+ *
411
+ * `RelationBase` carried its own `validation.required` until 0.18, which made
412
+ * this two questions rather than one. They were answered by different readers:
413
+ * the Postgres DDL generator asked the property (so the foreign-key column was
414
+ * `NOT NULL`) and the SDK type generator asked the relation (so the generated
415
+ * `Insert` type made the field optional). A `create()` that left the relation
416
+ * out therefore typechecked and then failed at the database with a not-null
417
+ * violation, and the two `required`s had to be written twice, identically, for
418
+ * the pair to agree.
419
+ *
420
+ * A relation with no declaring property — an entry in `relations` nothing
421
+ * points at — is not required. There is no field to fill in.
422
+ */
423
+ function isRelationRequired(collection, relation) {
424
+ return Boolean(relationDeclaringProperty(collection, relation)?.validation?.required);
425
+ }
426
+ /**
427
+ * The table a collection reads and writes.
428
+ *
429
+ * `table` when it is set, otherwise `toSnakeCase(slug)` — which is what made it
430
+ * safe to drop `table` from the required fields on the config type: the runtime
431
+ * had always derived it, and the type was demanding a value it did not need.
432
+ *
433
+ * The `||` chain is load-bearing. `toSnakeCase(undefined)` returns `""`, not
434
+ * `undefined`, so the previous `??` chain short-circuited on the empty string
435
+ * and the name fallback could never run — a safety net that read like one and
436
+ * caught nothing. It was unreachable while `slug` was required; it stops being
437
+ * unreachable the moment anything constructs a config without one.
438
+ */
439
+ function getTableName(collection) {
440
+ return (isRelationalCollectionConfig(collection) ? collection.table : void 0) || toSnakeCase(collection.slug) || toSnakeCase(collection.name);
441
+ }
442
+ /**
443
+ * The field key a database column is served and addressed under.
444
+ *
445
+ * A column has two names and they are not the same name. `author_id` is what
446
+ * Postgres stores; `authorId` is the key on the JSON row, the key in the
447
+ * generated Drizzle table, and the key a caller writes in `where` and
448
+ * `orderBy`. Every place that starts from a column and has to reach a row, a
449
+ * Drizzle table or a payload goes through here, so there is one answer rather
450
+ * than one per call site — the two that disagreed put `displayName` and
451
+ * `author_id` on the same API.
452
+ *
453
+ * A declared property is the authority when there is one, because its key *is*
454
+ * the wire name and `columnName` is the only thing that ever renamed the
455
+ * column:
456
+ *
457
+ * 1. an explicit `columnName` equal to this column;
458
+ * 2. a property whose key is literally the column (an author who wrote
459
+ * `author_id:` meant `author_id` on the wire, and gets it);
460
+ * 3. a property whose key snake-cases to the column, which is the default
461
+ * mapping — `authorId` → `author_id`.
462
+ *
463
+ * With no property in the way — a foreign key derived from a relation, which
464
+ * usually has none — the name is derived: {@link toWireKey}.
465
+ *
466
+ * Note the fallback is *not* the column verbatim. That was the old behaviour
467
+ * and it is precisely the defect: a derived foreign key reached the wire under
468
+ * its column name while every hand-authored field beside it was camelCase.
469
+ */
470
+ function fieldKeyForColumn(collection, column) {
471
+ const properties = collection?.properties;
472
+ if (properties) {
473
+ for (const [key, prop] of Object.entries(properties)) {
474
+ const columnName = prop?.columnName;
475
+ if (typeof columnName === "string" && columnName === column) return key;
476
+ }
477
+ for (const key of Object.keys(properties)) {
478
+ if (key === column) return key;
479
+ if (toSnakeCase(key) === column) return key;
480
+ }
481
+ }
482
+ return toWireKey(column);
483
+ }
484
+ /**
485
+ * Look up a relation by key with forgiving normalization.
486
+ *
487
+ * `resolveCollectionRelations` stores each relation under a single canonical
488
+ * key (no aliases). This helper tries the given key as-is, then falls back to
489
+ * slug form (underscores → hyphens) and snake_case form (hyphens → underscores)
490
+ * so that callers that receive a key from external input (URL path segments,
491
+ * user-provided config, etc.) can still find the right entry.
492
+ */
493
+ function findRelation(resolvedRelations, key) {
494
+ if (resolvedRelations[key]) return resolvedRelations[key];
495
+ const slugKey = key.replace(/_/g, "-");
496
+ if (slugKey !== key && resolvedRelations[slugKey]) return resolvedRelations[slugKey];
497
+ const snakeKey = key.replace(/-/g, "_");
498
+ if (snakeKey !== key && resolvedRelations[snakeKey]) return resolvedRelations[snakeKey];
499
+ }
500
+ /**
501
+ * What a property's access rules actually are, with `excludeFromApi` expanded.
502
+ *
503
+ * Returns `undefined` when the property constrains nothing, so callers can skip
504
+ * the whole check for the overwhelmingly common case.
505
+ */
506
+ function effectiveAccess(property) {
507
+ if (!property) return void 0;
508
+ if (property.excludeFromApi) return EXCLUDED_ACCESS;
509
+ const access = property.access;
510
+ if (!access) return void 0;
511
+ if (access.read === void 0 && access.write === void 0) return void 0;
512
+ return access;
513
+ }
514
+ /** The rule `excludeFromApi: true` expands to. Frozen: it is shared by every caller. */
515
+ var EXCLUDED_ACCESS = Object.freeze({
516
+ read: Object.freeze([]),
517
+ write: Object.freeze([])
518
+ });
519
+ /**
520
+ * Does a caller holding `roles` satisfy `allowed`?
521
+ *
522
+ * Three cases, and the middle one is the one worth stating out loud:
523
+ *
524
+ * - `allowed` omitted — the field carries no rule of its own, so the row's
525
+ * policies have already answered. True.
526
+ * - `allowed` empty — nobody, at any privilege, through any API. Not the admin,
527
+ * not the service key, not the trusted plane reading on a caller's behalf.
528
+ * This is what `excludeFromApi` has always meant on the read side, and
529
+ * collapsing the two spellings means the empty list has to keep meaning it.
530
+ * - `allowed` non-empty — one of the named roles, or `admin`, or no viewer at
531
+ * all (the trusted server plane, which is not an API caller).
532
+ */
533
+ function satisfies(allowed, viewer) {
534
+ if (allowed === void 0) return true;
535
+ if (allowed.length === 0) return false;
536
+ if (!viewer) return true;
537
+ const roles = viewer.roles;
538
+ if (!roles || roles.length === 0) return false;
539
+ return roles.includes("admin") || allowed.some((role) => roles.includes(role));
540
+ }
541
+ /** May this caller receive this field's value? */
542
+ function canReadField(property, viewer) {
543
+ const access = effectiveAccess(property);
544
+ return access ? satisfies(access.read, viewer) : true;
545
+ }
546
+ /** May this caller set this field's value? */
547
+ function canWriteField(property, viewer) {
548
+ const access = effectiveAccess(property);
549
+ return access ? satisfies(access.write, viewer) : true;
550
+ }
551
+ /**
552
+ * The names on this collection a caller may not touch, in the two spellings a
553
+ * caller can write them in.
554
+ *
555
+ * `declared` is the property keys, which is what has to leave a *known-fields*
556
+ * set. `refused` is those plus the physical column names behind them: a caller
557
+ * who knows the table can send `password_hash` as readily as `passwordHash`, and
558
+ * a rule that only knew the wire name would be one rename away from useless.
559
+ *
560
+ * A restricted to-one relation takes its foreign key with it. `bandId: 7` names
561
+ * the band exactly as `band: { id: 7 }` does, and the row carries the column
562
+ * beside the relation — so a rule on the relation that left the key alone
563
+ * withheld the value from the row and still let `?bandId=7` ask for it.
564
+ *
565
+ * `kind` picks which half of the rule is read; nothing else differs.
566
+ */
567
+ function restrictedFieldNames(collection, viewer, kind) {
568
+ const allowed = kind === "read" ? canReadField : canWriteField;
569
+ return namesWhere(collection, (property) => !allowed(property, viewer));
570
+ }
571
+ /**
572
+ * The names on this collection that the API does not have, in every spelling
573
+ * a caller could write them in — the `excludeFromApi` properties, their column
574
+ * names, and the foreign key of an excluded to-one relation.
575
+ *
576
+ * Not the same set as {@link restrictedFieldNames}. A field restricted by role
577
+ * is public by name: OpenAPI and `list_collections` describe it, and refusing a
578
+ * query on it with "not readable" tells the caller nothing they could not read
579
+ * there. An `excludeFromApi` field is described nowhere, so a query naming one
580
+ * has to be answered as a query naming a column that does not exist — anything
581
+ * else confirms that it does.
582
+ */
583
+ function apiHiddenFieldNames(collection) {
584
+ return namesWhere(collection, (property) => Boolean(property?.excludeFromApi)).refused;
585
+ }
586
+ function namesWhere(collection, restricted) {
587
+ const declared = [];
588
+ const refused = /* @__PURE__ */ new Set();
589
+ const properties = collection.properties ?? {};
590
+ let relations;
591
+ const restrict = (name) => {
592
+ if (name in properties && !declared.includes(name)) declared.push(name);
593
+ refused.add(name);
594
+ };
595
+ for (const [name, property] of Object.entries(properties)) {
596
+ if (!restricted(property)) continue;
597
+ restrict(name);
598
+ const columnName = property.columnName;
599
+ if (columnName) refused.add(columnName);
600
+ if (property.type === "relation") {
601
+ relations ??= resolveCollectionRelations(collection);
602
+ const relation = findRelation(relations, name);
603
+ if (relation?.kind === "belongsTo") {
604
+ restrict(fieldKeyForColumn(collection, relation.localKey));
605
+ refused.add(relation.localKey);
606
+ }
607
+ }
608
+ }
609
+ return {
610
+ declared,
611
+ refused
612
+ };
613
+ }
614
+ //#endregion
615
+ //#region src/api/rest/soft-delete-params.ts
616
+ /**
617
+ * The two query parameters soft delete adds to the REST surface.
618
+ *
619
+ * Kept in their own module so the call sites in `query-parser.ts` and the
620
+ * delete routes are a single line each: the parsing rules belong to soft
621
+ * delete, not to the parser, and a rule spread across the two files that read
622
+ * it is a rule that drifts.
623
+ */
624
+ /** `?deleted=` — what to do about rows a soft delete has stamped. */
625
+ var DELETED_QUERY_PARAM = "deleted";
626
+ /** `?hard=` — ask for a real `DELETE` on a soft-delete collection. */
627
+ var HARD_DELETE_QUERY_PARAM = "hard";
628
+ /**
629
+ * `?deleted=include|only` → the driver's `withDeleted`.
630
+ *
631
+ * Spelled `deleted` on the wire and `withDeleted` in the driver, deliberately:
632
+ * the URL reads as a question about the rows (`?deleted=only` — "only the
633
+ * deleted ones"), and the driver option reads as an instruction about the query.
634
+ *
635
+ * A value neither word is a 400 rather than a silent fallback to the default.
636
+ * `?deleted=true` quietly hiding every deleted row is the worst of both: it
637
+ * looks like it worked and answers the opposite question. Absent is the
638
+ * default, which is "hide them".
639
+ */
640
+ function parseWithDeleted(raw) {
641
+ if (raw === void 0 || raw === null || raw === "") return void 0;
642
+ const value = String(raw).trim().toLowerCase();
643
+ if (value === "include") return true;
644
+ if (value === "only") return "only";
645
+ throw ApiError.badRequest(`Invalid \`?${DELETED_QUERY_PARAM}=${String(raw)}\`. It takes 'include' (live rows and deleted ones) or 'only' (deleted rows alone). Omit it to see only the live rows.`, "INVALID_DELETED_PARAM");
646
+ }
647
+ /**
648
+ * `?hard=true` → a real `DELETE` on a collection that soft-deletes.
649
+ *
650
+ * Needs no permission beyond the delete it replaces: it is the same verb, and a
651
+ * second access-control surface for one operation is a second thing to get
652
+ * wrong. What it changes is whether the row can be restored.
653
+ *
654
+ * Only the exact words `true` and `1` mean yes. Anything else is a 400, not a
655
+ * "no" — a typo that silently soft-deletes when the caller asked to purge is a
656
+ * caller who believes the data is gone.
657
+ */
658
+ function parseHardDelete(raw) {
659
+ if (raw === void 0 || raw === null || raw === "") return false;
660
+ const value = String(raw).trim().toLowerCase();
661
+ if (value === "true" || value === "1") return true;
662
+ if (value === "false" || value === "0") return false;
663
+ throw ApiError.badRequest(`Invalid \`?${HARD_DELETE_QUERY_PARAM}=${String(raw)}\`. It takes 'true' or 'false'.`, "INVALID_HARD_PARAM");
664
+ }
665
+ //#endregion
666
+ export { apiHiddenFieldNames as a, fieldKeyForColumn as c, isJunctionBackedRelation as d, isRelationRequired as f, toWireKey as g, resolveRelation as h, parseWithDeleted as i, findRelation as l, resolveCollectionRelations as m, HARD_DELETE_QUERY_PARAM as n, effectiveAccess as o, relationDeclaringProperty as p, parseHardDelete as r, restrictedFieldNames as s, DELETED_QUERY_PARAM as t, getTableName as u };
667
+
668
+ //# sourceMappingURL=soft-delete-params-DfV3vVN5.js.map