@vertebr/admin 0.12.0 → 0.14.0

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 (300) hide show
  1. package/dist/api/catalog.d.ts +59 -0
  2. package/dist/api/catalog.d.ts.map +1 -0
  3. package/dist/api/catalog.js +85 -0
  4. package/dist/api/catalog.js.map +1 -0
  5. package/dist/api/configs.d.ts +15 -0
  6. package/dist/api/configs.d.ts.map +1 -0
  7. package/dist/api/configs.js +43 -0
  8. package/dist/api/configs.js.map +1 -0
  9. package/dist/api/emails.d.ts +85 -0
  10. package/dist/api/emails.d.ts.map +1 -0
  11. package/dist/api/emails.js +520 -0
  12. package/dist/api/emails.js.map +1 -0
  13. package/dist/api/gallery.d.ts +28 -0
  14. package/dist/api/gallery.d.ts.map +1 -0
  15. package/dist/api/gallery.js +91 -0
  16. package/dist/api/gallery.js.map +1 -0
  17. package/dist/api/metrics.d.ts +22 -0
  18. package/dist/api/metrics.d.ts.map +1 -0
  19. package/dist/api/metrics.js +38 -0
  20. package/dist/api/metrics.js.map +1 -0
  21. package/dist/api/public.d.ts +22 -0
  22. package/dist/api/public.d.ts.map +1 -0
  23. package/dist/api/public.js +69 -0
  24. package/dist/api/public.js.map +1 -0
  25. package/dist/api/request.d.ts +26 -0
  26. package/dist/api/request.d.ts.map +1 -0
  27. package/dist/api/request.js +38 -0
  28. package/dist/api/request.js.map +1 -0
  29. package/dist/api/resources.d.ts +85 -0
  30. package/dist/api/resources.d.ts.map +1 -0
  31. package/dist/api/resources.js +263 -0
  32. package/dist/api/resources.js.map +1 -0
  33. package/dist/api/routes.d.ts +8 -0
  34. package/dist/api/routes.d.ts.map +1 -0
  35. package/dist/api/routes.js +202 -0
  36. package/dist/api/routes.js.map +1 -0
  37. package/dist/api/spa.d.ts +2 -0
  38. package/dist/api/spa.d.ts.map +1 -0
  39. package/dist/api/spa.js +34 -0
  40. package/dist/api/spa.js.map +1 -0
  41. package/dist/connectors/payments/connector.d.ts +30 -0
  42. package/dist/connectors/payments/connector.d.ts.map +1 -0
  43. package/dist/connectors/payments/connector.js +226 -0
  44. package/dist/connectors/payments/connector.js.map +1 -0
  45. package/dist/connectors/payments/index.d.ts +4 -0
  46. package/dist/connectors/payments/index.d.ts.map +1 -0
  47. package/dist/connectors/payments/index.js +10 -0
  48. package/dist/connectors/payments/index.js.map +1 -0
  49. package/dist/connectors/payments/stripe.d.ts +99 -0
  50. package/dist/connectors/payments/stripe.d.ts.map +1 -0
  51. package/dist/connectors/payments/stripe.js +189 -0
  52. package/dist/connectors/payments/stripe.js.map +1 -0
  53. package/dist/connectors/payments/types.d.ts +67 -0
  54. package/dist/connectors/payments/types.d.ts.map +1 -0
  55. package/dist/connectors/payments/types.js +16 -0
  56. package/dist/connectors/payments/types.js.map +1 -0
  57. package/dist/connectors/stripe.d.ts +19 -0
  58. package/dist/connectors/stripe.d.ts.map +1 -0
  59. package/dist/connectors/stripe.js +26 -0
  60. package/dist/connectors/stripe.js.map +1 -0
  61. package/dist/constants.d.ts +5 -0
  62. package/dist/constants.d.ts.map +1 -0
  63. package/dist/constants.js +8 -0
  64. package/dist/constants.js.map +1 -0
  65. package/dist/createAdmin.d.ts +3 -0
  66. package/dist/createAdmin.d.ts.map +1 -0
  67. package/dist/createAdmin.js +152 -0
  68. package/dist/createAdmin.js.map +1 -0
  69. package/dist/database/firestore.d.ts +71 -0
  70. package/dist/database/firestore.d.ts.map +1 -0
  71. package/dist/database/firestore.js +115 -0
  72. package/dist/database/firestore.js.map +1 -0
  73. package/dist/database/memory.d.ts +12 -0
  74. package/dist/database/memory.d.ts.map +1 -0
  75. package/dist/database/memory.js +116 -0
  76. package/dist/database/memory.js.map +1 -0
  77. package/dist/database/mongo.d.ts +41 -0
  78. package/dist/database/mongo.d.ts.map +1 -0
  79. package/dist/database/mongo.js +151 -0
  80. package/dist/database/mongo.js.map +1 -0
  81. package/dist/database/postgres.d.ts +46 -0
  82. package/dist/database/postgres.d.ts.map +1 -0
  83. package/dist/database/postgres.js +262 -0
  84. package/dist/database/postgres.js.map +1 -0
  85. package/dist/errors.d.ts +17 -0
  86. package/dist/errors.d.ts.map +1 -0
  87. package/dist/errors.js +36 -0
  88. package/dist/errors.js.map +1 -0
  89. package/dist/index/api/catalog.d.ts +53 -0
  90. package/dist/index/api/catalog.d.ts.map +1 -0
  91. package/dist/index/api/catalog.js +70 -0
  92. package/dist/index/api/catalog.js.map +1 -0
  93. package/dist/index/api/configs.d.ts +15 -0
  94. package/dist/index/api/configs.d.ts.map +1 -0
  95. package/dist/index/api/configs.js +43 -0
  96. package/dist/index/api/configs.js.map +1 -0
  97. package/dist/index/api/gallery.d.ts +28 -0
  98. package/dist/index/api/gallery.d.ts.map +1 -0
  99. package/dist/index/api/gallery.js +89 -0
  100. package/dist/index/api/gallery.js.map +1 -0
  101. package/dist/index/api/metrics.d.ts +9 -0
  102. package/dist/index/api/metrics.d.ts.map +1 -0
  103. package/dist/index/api/metrics.js +26 -0
  104. package/dist/index/api/metrics.js.map +1 -0
  105. package/dist/index/api/public.d.ts +22 -0
  106. package/dist/index/api/public.d.ts.map +1 -0
  107. package/dist/index/api/public.js +69 -0
  108. package/dist/index/api/public.js.map +1 -0
  109. package/dist/index/api/request.d.ts +25 -0
  110. package/dist/index/api/request.d.ts.map +1 -0
  111. package/dist/index/api/request.js +38 -0
  112. package/dist/index/api/request.js.map +1 -0
  113. package/dist/index/api/resources.d.ts +64 -0
  114. package/dist/index/api/resources.d.ts.map +1 -0
  115. package/dist/index/api/resources.js +173 -0
  116. package/dist/index/api/resources.js.map +1 -0
  117. package/dist/index/api/routes.d.ts +8 -0
  118. package/dist/index/api/routes.d.ts.map +1 -0
  119. package/dist/index/api/routes.js +156 -0
  120. package/dist/index/api/routes.js.map +1 -0
  121. package/dist/index/api/spa.d.ts +2 -0
  122. package/dist/index/api/spa.d.ts.map +1 -0
  123. package/dist/index/api/spa.js +33 -0
  124. package/dist/index/api/spa.js.map +1 -0
  125. package/dist/index/connectors/stripe.d.ts +9 -0
  126. package/dist/index/connectors/stripe.d.ts.map +1 -0
  127. package/dist/index/connectors/stripe.js +23 -0
  128. package/dist/index/connectors/stripe.js.map +1 -0
  129. package/dist/index/constants.d.ts +5 -0
  130. package/dist/index/constants.d.ts.map +1 -0
  131. package/dist/index/constants.js +8 -0
  132. package/dist/index/constants.js.map +1 -0
  133. package/dist/index/createAdmin.d.ts +3 -0
  134. package/dist/index/createAdmin.d.ts.map +1 -0
  135. package/dist/index/createAdmin.js +145 -0
  136. package/dist/index/createAdmin.js.map +1 -0
  137. package/dist/index/errors.d.ts +17 -0
  138. package/dist/index/errors.d.ts.map +1 -0
  139. package/dist/index/errors.js +36 -0
  140. package/dist/index/errors.js.map +1 -0
  141. package/dist/index/services/environment.d.ts +8 -0
  142. package/dist/index/services/environment.d.ts.map +1 -0
  143. package/dist/index/services/environment.js +78 -0
  144. package/dist/index/services/environment.js.map +1 -0
  145. package/dist/index/services/registry.d.ts +6 -0
  146. package/dist/index/services/registry.d.ts.map +1 -0
  147. package/dist/index/services/registry.js +32 -0
  148. package/dist/index/services/registry.js.map +1 -0
  149. package/dist/index/services/state.d.ts +24 -0
  150. package/dist/index/services/state.d.ts.map +1 -0
  151. package/dist/index/services/state.js +3 -0
  152. package/dist/index/services/state.js.map +1 -0
  153. package/dist/index/types/admin.d.ts +77 -0
  154. package/dist/index/types/admin.d.ts.map +1 -0
  155. package/dist/index/types/admin.js +3 -0
  156. package/dist/index/types/admin.js.map +1 -0
  157. package/dist/index/types/auth.d.ts +67 -0
  158. package/dist/index/types/auth.d.ts.map +1 -0
  159. package/dist/index/types/auth.js +3 -0
  160. package/dist/index/types/auth.js.map +1 -0
  161. package/dist/index/types/config.d.ts +35 -0
  162. package/dist/index/types/config.d.ts.map +1 -0
  163. package/dist/index/types/config.js +3 -0
  164. package/dist/index/types/config.js.map +1 -0
  165. package/dist/index/types/index.d.ts +7 -0
  166. package/dist/index/types/index.d.ts.map +1 -0
  167. package/dist/index/types/index.js +3 -0
  168. package/dist/index/types/index.js.map +1 -0
  169. package/dist/index/types/layout.d.ts +27 -0
  170. package/dist/index/types/layout.d.ts.map +1 -0
  171. package/dist/index/types/layout.js +3 -0
  172. package/dist/index/types/layout.js.map +1 -0
  173. package/dist/index/types/metrics.d.ts +15 -0
  174. package/dist/index/types/metrics.d.ts.map +1 -0
  175. package/dist/index/types/metrics.js +3 -0
  176. package/dist/index/types/metrics.js.map +1 -0
  177. package/dist/index/types/resource.d.ts +34 -0
  178. package/dist/index/types/resource.d.ts.map +1 -0
  179. package/dist/index/types/resource.js +3 -0
  180. package/dist/index/types/resource.js.map +1 -0
  181. package/dist/index/utils/auth.d.ts +4 -0
  182. package/dist/index/utils/auth.d.ts.map +1 -0
  183. package/dist/index/utils/auth.js +29 -0
  184. package/dist/index/utils/auth.js.map +1 -0
  185. package/dist/index/utils/config.d.ts +4 -0
  186. package/dist/index/utils/config.d.ts.map +1 -0
  187. package/dist/index/utils/config.js +14 -0
  188. package/dist/index/utils/config.js.map +1 -0
  189. package/dist/index/utils/http.d.ts +5 -0
  190. package/dist/index/utils/http.d.ts.map +1 -0
  191. package/dist/index/utils/http.js +38 -0
  192. package/dist/index/utils/http.js.map +1 -0
  193. package/dist/index/utils/staticDir.d.ts +2 -0
  194. package/dist/index/utils/staticDir.d.ts.map +1 -0
  195. package/dist/index/utils/staticDir.js +16 -0
  196. package/dist/index/utils/staticDir.js.map +1 -0
  197. package/dist/index/utils/uploads.d.ts +6 -0
  198. package/dist/index/utils/uploads.d.ts.map +1 -0
  199. package/dist/index/utils/uploads.js +66 -0
  200. package/dist/index/utils/uploads.js.map +1 -0
  201. package/dist/mail.d.ts +22 -0
  202. package/dist/mail.d.ts.map +1 -0
  203. package/dist/mail.js +248 -0
  204. package/dist/mail.js.map +1 -0
  205. package/dist/runtime/api/catalog.js +1 -1
  206. package/dist/runtime/api/catalog.js.map +1 -1
  207. package/dist/runtime/types/audit.d.ts +5 -0
  208. package/dist/runtime/types/audit.d.ts.map +1 -1
  209. package/dist/services/environment.d.ts +8 -0
  210. package/dist/services/environment.d.ts.map +1 -0
  211. package/dist/services/environment.js +78 -0
  212. package/dist/services/environment.js.map +1 -0
  213. package/dist/services/registry.d.ts +6 -0
  214. package/dist/services/registry.d.ts.map +1 -0
  215. package/dist/services/registry.js +32 -0
  216. package/dist/services/registry.js.map +1 -0
  217. package/dist/services/state.d.ts +25 -0
  218. package/dist/services/state.d.ts.map +1 -0
  219. package/dist/services/state.js +3 -0
  220. package/dist/services/state.js.map +1 -0
  221. package/dist/types/actions.d.ts +15 -0
  222. package/dist/types/actions.d.ts.map +1 -0
  223. package/dist/types/actions.js +3 -0
  224. package/dist/types/actions.js.map +1 -0
  225. package/dist/types/admin.d.ts +83 -0
  226. package/dist/types/admin.d.ts.map +1 -0
  227. package/dist/types/admin.js +3 -0
  228. package/dist/types/admin.js.map +1 -0
  229. package/dist/types/auth.d.ts +67 -0
  230. package/dist/types/auth.d.ts.map +1 -0
  231. package/dist/types/auth.js +3 -0
  232. package/dist/types/auth.js.map +1 -0
  233. package/dist/types/config.d.ts +39 -0
  234. package/dist/types/config.d.ts.map +1 -0
  235. package/dist/types/config.js +3 -0
  236. package/dist/types/config.js.map +1 -0
  237. package/dist/types/index.d.ts +13 -0
  238. package/dist/types/index.d.ts.map +1 -0
  239. package/dist/types/index.js +7 -0
  240. package/dist/types/index.js.map +1 -0
  241. package/dist/types/layout.d.ts +29 -0
  242. package/dist/types/layout.d.ts.map +1 -0
  243. package/dist/types/layout.js +3 -0
  244. package/dist/types/layout.js.map +1 -0
  245. package/dist/types/mail/catalog.d.ts +104 -0
  246. package/dist/types/mail/catalog.d.ts.map +1 -0
  247. package/dist/types/mail/catalog.js +3 -0
  248. package/dist/types/mail/catalog.js.map +1 -0
  249. package/dist/types/mail/definition.d.ts +68 -0
  250. package/dist/types/mail/definition.d.ts.map +1 -0
  251. package/dist/types/mail/definition.js +3 -0
  252. package/dist/types/mail/definition.js.map +1 -0
  253. package/dist/types/mail/index.d.ts +4 -0
  254. package/dist/types/mail/index.d.ts.map +1 -0
  255. package/dist/types/mail/index.js +3 -0
  256. package/dist/types/mail/index.js.map +1 -0
  257. package/dist/types/mail/message.d.ts +45 -0
  258. package/dist/types/mail/message.d.ts.map +1 -0
  259. package/dist/types/mail/message.js +3 -0
  260. package/dist/types/mail/message.js.map +1 -0
  261. package/dist/types/metrics.d.ts +46 -0
  262. package/dist/types/metrics.d.ts.map +1 -0
  263. package/dist/types/metrics.js +3 -0
  264. package/dist/types/metrics.js.map +1 -0
  265. package/dist/types/resource.d.ts +41 -0
  266. package/dist/types/resource.d.ts.map +1 -0
  267. package/dist/types/resource.js +3 -0
  268. package/dist/types/resource.js.map +1 -0
  269. package/dist/utils/auth.d.ts +4 -0
  270. package/dist/utils/auth.d.ts.map +1 -0
  271. package/dist/utils/auth.js +29 -0
  272. package/dist/utils/auth.js.map +1 -0
  273. package/dist/utils/config.d.ts +4 -0
  274. package/dist/utils/config.d.ts.map +1 -0
  275. package/dist/utils/config.js +14 -0
  276. package/dist/utils/config.js.map +1 -0
  277. package/dist/utils/http.d.ts +7 -0
  278. package/dist/utils/http.d.ts.map +1 -0
  279. package/dist/utils/http.js +61 -0
  280. package/dist/utils/http.js.map +1 -0
  281. package/dist/utils/metricsRange.d.ts +34 -0
  282. package/dist/utils/metricsRange.d.ts.map +1 -0
  283. package/dist/utils/metricsRange.js +121 -0
  284. package/dist/utils/metricsRange.js.map +1 -0
  285. package/dist/utils/sidebar.d.ts +2 -0
  286. package/dist/utils/sidebar.d.ts.map +1 -0
  287. package/dist/utils/sidebar.js +8 -0
  288. package/dist/utils/sidebar.js.map +1 -0
  289. package/dist/utils/staticDir.d.ts +2 -0
  290. package/dist/utils/staticDir.d.ts.map +1 -0
  291. package/dist/utils/staticDir.js +16 -0
  292. package/dist/utils/staticDir.js.map +1 -0
  293. package/dist/utils/uploads.d.ts +6 -0
  294. package/dist/utils/uploads.d.ts.map +1 -0
  295. package/dist/utils/uploads.js +66 -0
  296. package/dist/utils/uploads.js.map +1 -0
  297. package/package.json +1 -1
  298. package/static/assets/{index-lpbEyGac.js → index-DqDnCvHx.js} +95 -95
  299. package/static/assets/{index-BklZMQp7.css → index-bykX16vc.css} +1 -1
  300. package/static/index.html +2 -2
@@ -0,0 +1,41 @@
1
+ import type { DatabaseAdapter } from "./types";
2
+ /**
3
+ * Minimal MongoDB surface — duck-typed so @vertebr/admin does not require
4
+ * the official driver as a dependency.
5
+ */
6
+ export type MongoCursorLike = {
7
+ sort: (sort: Record<string, 1 | -1>) => MongoCursorLike;
8
+ limit: (n: number) => MongoCursorLike;
9
+ toArray: () => Promise<Array<Record<string, unknown>>>;
10
+ };
11
+ export type MongoCollectionLike = {
12
+ find: (filter?: Record<string, unknown>) => MongoCursorLike;
13
+ findOne: (filter: Record<string, unknown>) => Promise<Record<string, unknown> | null>;
14
+ updateOne: (filter: Record<string, unknown>, update: Record<string, unknown>, options?: {
15
+ upsert?: boolean;
16
+ }) => Promise<unknown>;
17
+ insertOne: (doc: Record<string, unknown>) => Promise<{
18
+ insertedId?: unknown;
19
+ }>;
20
+ deleteOne: (filter: Record<string, unknown>) => Promise<unknown>;
21
+ countDocuments: (filter?: Record<string, unknown>) => Promise<number>;
22
+ };
23
+ export type MongoDbLike = {
24
+ collection: (name: string) => MongoCollectionLike;
25
+ };
26
+ export type MongoAdapterOptions = {
27
+ getDb: () => MongoDbLike | Promise<MongoDbLike>;
28
+ /** Field used as document id. @default "_id" mapped to `id` in rows. */
29
+ idField?: string;
30
+ };
31
+ /**
32
+ * Opt-in MongoDB adapter. The host app supplies `getDb()` — Vertebr never
33
+ * opens a Mongo connection string on its own.
34
+ *
35
+ * @example
36
+ * import { MongoClient } from "mongodb";
37
+ * const client = await MongoClient.connect(process.env.MONGO_URL!);
38
+ * const db = mongoAdapter({ getDb: () => client.db() });
39
+ */
40
+ export declare function mongoAdapter(options: MongoAdapterOptions): DatabaseAdapter;
41
+ //# sourceMappingURL=mongo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mongo.d.ts","sourceRoot":"","sources":["../../src/database/mongo.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EAIhB,MAAM,SAAS,CAAC;AAEjB;;;GAGG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,eAAe,CAAC;IACxD,KAAK,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,eAAe,CAAC;IACtC,OAAO,EAAE,MAAM,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;CACxD,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,eAAe,CAAC;IAC5D,OAAO,EAAE,CACP,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC5B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;IAC7C,SAAS,EAAE,CACT,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,KAC3B,OAAO,CAAC,OAAO,CAAC,CAAC;IACtB,SAAS,EAAE,CACT,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KACzB,OAAO,CAAC;QAAE,UAAU,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IACvC,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACjE,cAAc,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CACvE,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,mBAAmB,CAAC;CACnD,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,KAAK,EAAE,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IAChD,wEAAwE;IACxE,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAiFF;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,eAAe,CAuF1E"}
@@ -0,0 +1,151 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.mongoAdapter = mongoAdapter;
4
+ function serializeValue(value) {
5
+ if (value == null)
6
+ return value;
7
+ if (value instanceof Date)
8
+ return value.toISOString();
9
+ if (Array.isArray(value))
10
+ return value.map(serializeValue);
11
+ if (typeof value === "object") {
12
+ // ObjectId / Decimal128 etc. — prefer string form when available
13
+ if ("toHexString" in value &&
14
+ typeof value.toHexString === "function") {
15
+ return value.toHexString();
16
+ }
17
+ const out = {};
18
+ for (const [key, entry] of Object.entries(value)) {
19
+ out[key] = serializeValue(entry);
20
+ }
21
+ return out;
22
+ }
23
+ return value;
24
+ }
25
+ function toDoc(raw, idField) {
26
+ const data = serializeValue(raw);
27
+ const id = String(data.id ?? data[idField] ?? "");
28
+ const { [idField]: _mongoId, ...rest } = data;
29
+ return { ...rest, id };
30
+ }
31
+ function mongoOp(op) {
32
+ switch (op) {
33
+ case "==":
34
+ return "$eq";
35
+ case "!=":
36
+ return "$ne";
37
+ case ">":
38
+ return "$gt";
39
+ case "<":
40
+ return "$lt";
41
+ case ">=":
42
+ return "$gte";
43
+ case "<=":
44
+ return "$lte";
45
+ case "in":
46
+ return "$in";
47
+ case "array-contains":
48
+ return "$elemMatch";
49
+ default:
50
+ throw new Error(`Unsupported where op: ${String(op)}`);
51
+ }
52
+ }
53
+ function buildFilter(options, idField) {
54
+ const filter = {};
55
+ for (const clause of options?.where ?? []) {
56
+ const field = clause.field === "id" ? idField : clause.field;
57
+ if (clause.op === "==") {
58
+ filter[field] = clause.value;
59
+ continue;
60
+ }
61
+ if (clause.op === "array-contains") {
62
+ filter[field] = clause.value;
63
+ continue;
64
+ }
65
+ const current = filter[field] ?? {};
66
+ current[mongoOp(clause.op)] = clause.value;
67
+ filter[field] = current;
68
+ }
69
+ return filter;
70
+ }
71
+ /**
72
+ * Opt-in MongoDB adapter. The host app supplies `getDb()` — Vertebr never
73
+ * opens a Mongo connection string on its own.
74
+ *
75
+ * @example
76
+ * import { MongoClient } from "mongodb";
77
+ * const client = await MongoClient.connect(process.env.MONGO_URL!);
78
+ * const db = mongoAdapter({ getDb: () => client.db() });
79
+ */
80
+ function mongoAdapter(options) {
81
+ const idField = options.idField ?? "_id";
82
+ async function db() {
83
+ return options.getDb();
84
+ }
85
+ return {
86
+ async list(collection, listOptions) {
87
+ const mongo = await db();
88
+ const filter = buildFilter(listOptions, idField);
89
+ let cursor = mongo.collection(collection).find(filter);
90
+ if (listOptions?.orderBy) {
91
+ const field = listOptions.orderBy.field === "id"
92
+ ? idField
93
+ : listOptions.orderBy.field;
94
+ const direction = listOptions.orderBy.direction?.toLowerCase() === "desc" ? -1 : 1;
95
+ cursor = cursor.sort({ [field]: direction });
96
+ }
97
+ const rows = listOptions?.limit != null
98
+ ? await cursor.limit(listOptions.limit).toArray()
99
+ : await cursor.toArray();
100
+ return rows.map((row) => toDoc(row, idField));
101
+ },
102
+ async get(collection, id) {
103
+ const mongo = await db();
104
+ const row = await mongo.collection(collection).findOne({ [idField]: id });
105
+ return row ? toDoc(row, idField) : null;
106
+ },
107
+ async set(collection, id, value, setOptions) {
108
+ const mongo = await db();
109
+ const merge = setOptions?.merge ?? true;
110
+ const payload = { ...value };
111
+ delete payload.id;
112
+ delete payload[idField];
113
+ if (merge) {
114
+ await mongo.collection(collection).updateOne({ [idField]: id }, { $set: { ...payload, [idField]: id } }, { upsert: true });
115
+ return;
116
+ }
117
+ // Full replace — drop previous fields by rewriting the document.
118
+ await mongo.collection(collection).deleteOne({ [idField]: id });
119
+ await mongo.collection(collection).insertOne({
120
+ ...payload,
121
+ [idField]: id,
122
+ });
123
+ },
124
+ async create(collection, value, id) {
125
+ const mongo = await db();
126
+ const resolvedId = id ??
127
+ (typeof value.id === "string" ? value.id : undefined) ??
128
+ (typeof crypto !== "undefined" && "randomUUID" in crypto
129
+ ? crypto.randomUUID()
130
+ : `row_${Date.now().toString(36)}`);
131
+ const payload = { ...value };
132
+ delete payload.id;
133
+ await mongo.collection(collection).insertOne({
134
+ ...payload,
135
+ [idField]: resolvedId,
136
+ });
137
+ return { id: resolvedId, ...payload };
138
+ },
139
+ async remove(collection, id) {
140
+ const mongo = await db();
141
+ await mongo.collection(collection).deleteOne({ [idField]: id });
142
+ },
143
+ async count(collection, listOptions) {
144
+ const mongo = await db();
145
+ return mongo
146
+ .collection(collection)
147
+ .countDocuments(buildFilter(listOptions, idField));
148
+ },
149
+ };
150
+ }
151
+ //# sourceMappingURL=mongo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mongo.js","sourceRoot":"","sources":["../../src/database/mongo.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ import type { DatabaseAdapter } from "./types";
2
+ /**
3
+ * Minimal Postgres client surface (`pg` Pool / Client, postgres.js, etc.).
4
+ * Duck-typed so @vertebr/admin does not require `pg` as a dependency.
5
+ */
6
+ export type PostgresQueryable = {
7
+ query: (text: string, values?: unknown[]) => Promise<{
8
+ rows: Array<Record<string, unknown>>;
9
+ }>;
10
+ };
11
+ export type PostgresAdapterMode = "flat" | "jsonb";
12
+ export type PostgresAdapterOptions = {
13
+ /**
14
+ * Return a queryable client/pool for the current call.
15
+ * Use ALS / env switching here so Vertebr stays DB-agnostic.
16
+ */
17
+ getClient: () => PostgresQueryable | Promise<PostgresQueryable>;
18
+ /**
19
+ * `flat` — row columns are document fields (default).
20
+ * `jsonb` — table has `id` + JSON `data` column (document store).
21
+ */
22
+ mode?: PostgresAdapterMode;
23
+ /** Primary key column. @default "id" */
24
+ idColumn?: string;
25
+ /** JSONB payload column when mode is `jsonb`. @default "data" */
26
+ dataColumn?: string;
27
+ /** Optional schema prefix, e.g. `public` → `"public"."products"`. */
28
+ schema?: string;
29
+ };
30
+ /**
31
+ * Opt-in Postgres adapter. The host app supplies `getClient()` — Vertebr
32
+ * never opens a database URL on its own.
33
+ *
34
+ * @example
35
+ * import pg from "pg";
36
+ * const pool = new pg.Pool({ connectionString: process.env.DATABASE_URL });
37
+ * const db = postgresAdapter({ getClient: () => pool, mode: "jsonb" });
38
+ */
39
+ export declare function postgresAdapter(options: PostgresAdapterOptions): DatabaseAdapter;
40
+ /** Suggested DDL for jsonb-mode tables used with `postgresAdapter`. */
41
+ export declare function postgresJsonbTableDDL(table: string, options?: {
42
+ schema?: string;
43
+ idColumn?: string;
44
+ dataColumn?: string;
45
+ }): string;
46
+ //# sourceMappingURL=postgres.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgres.d.ts","sourceRoot":"","sources":["../../src/database/postgres.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EAIhB,MAAM,SAAS,CAAC;AAEjB;;;GAGG;AACH,MAAM,MAAM,iBAAiB,GAAG;IAC9B,KAAK,EAAE,CACL,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,OAAO,EAAE,KACf,OAAO,CAAC;QAAE,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;KAAE,CAAC,CAAC;CACxD,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG,MAAM,GAAG,OAAO,CAAC;AAEnD,MAAM,MAAM,sBAAsB,GAAG;IACnC;;;OAGG;IACH,SAAS,EAAE,MAAM,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAChE;;;OAGG;IACH,IAAI,CAAC,EAAE,mBAAmB,CAAC;IAC3B,wCAAwC;IACxC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iEAAiE;IACjE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,qEAAqE;IACrE,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AA8KF;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,sBAAsB,GAC9B,eAAe,CA2JjB;AAED,uEAAuE;AACvE,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GACpE,MAAM,CASR"}
@@ -0,0 +1,262 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.postgresAdapter = postgresAdapter;
4
+ exports.postgresJsonbTableDDL = postgresJsonbTableDDL;
5
+ function assertIdent(name, label) {
6
+ if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(name)) {
7
+ throw new Error(`Invalid SQL ${label}: "${name}"`);
8
+ }
9
+ return name;
10
+ }
11
+ function quoteIdent(name) {
12
+ return `"${assertIdent(name, "identifier")}"`;
13
+ }
14
+ function quoteLiteral(value) {
15
+ return `'${value.replace(/'/g, "''")}'`;
16
+ }
17
+ function tableRef(collection, schema) {
18
+ const table = quoteIdent(collection);
19
+ if (!schema)
20
+ return table;
21
+ return `${quoteIdent(schema)}.${table}`;
22
+ }
23
+ function serializeValue(value) {
24
+ if (value == null)
25
+ return value;
26
+ if (value instanceof Date)
27
+ return value.toISOString();
28
+ if (Array.isArray(value))
29
+ return value.map(serializeValue);
30
+ if (typeof value === "object") {
31
+ const out = {};
32
+ for (const [key, entry] of Object.entries(value)) {
33
+ out[key] = serializeValue(entry);
34
+ }
35
+ return out;
36
+ }
37
+ return value;
38
+ }
39
+ function rowToDoc(row, idColumn, mode, dataColumn) {
40
+ if (mode === "jsonb") {
41
+ const raw = row[dataColumn];
42
+ const data = raw && typeof raw === "object" && !Array.isArray(raw)
43
+ ? serializeValue(raw)
44
+ : {};
45
+ const id = String(row[idColumn] ?? data.id ?? "");
46
+ return { id, ...data, [idColumn]: id };
47
+ }
48
+ const data = serializeValue(row);
49
+ const id = String(data[idColumn] ?? "");
50
+ return { ...data, id };
51
+ }
52
+ function sqlOp(op) {
53
+ switch (op) {
54
+ case "==":
55
+ return "=";
56
+ case "!=":
57
+ return "<>";
58
+ case ">":
59
+ case "<":
60
+ case ">=":
61
+ case "<=":
62
+ return op;
63
+ case "in":
64
+ return "IN";
65
+ case "array-contains":
66
+ return "@>";
67
+ default:
68
+ throw new Error(`Unsupported where op: ${String(op)}`);
69
+ }
70
+ }
71
+ function fieldExpr(field, mode, dataColumn) {
72
+ const safe = assertIdent(field, "field");
73
+ if (mode === "jsonb") {
74
+ return `${quoteIdent(dataColumn)}->>${quoteLiteral(safe)}`;
75
+ }
76
+ return quoteIdent(safe);
77
+ }
78
+ function buildWhere(options, mode, dataColumn) {
79
+ const values = [];
80
+ const parts = [];
81
+ let index = 1;
82
+ for (const clause of options?.where ?? []) {
83
+ const column = fieldExpr(clause.field, mode, dataColumn);
84
+ const op = sqlOp(clause.op);
85
+ if (clause.op === "in") {
86
+ if (!Array.isArray(clause.value)) {
87
+ throw new Error(`Where "in" requires an array for ${clause.field}`);
88
+ }
89
+ if (clause.value.length === 0) {
90
+ parts.push("FALSE");
91
+ continue;
92
+ }
93
+ const slots = clause.value.map((entry) => {
94
+ values.push(entry);
95
+ return `$${index++}`;
96
+ });
97
+ parts.push(`${column} IN (${slots.join(", ")})`);
98
+ continue;
99
+ }
100
+ if (clause.op === "array-contains") {
101
+ if (mode !== "jsonb") {
102
+ throw new Error(`array-contains is only supported in jsonb mode (field: ${clause.field})`);
103
+ }
104
+ const safe = assertIdent(clause.field, "field");
105
+ values.push(JSON.stringify([clause.value]));
106
+ parts.push(`${quoteIdent(dataColumn)}->${quoteLiteral(safe)} @> $${index++}::jsonb`);
107
+ continue;
108
+ }
109
+ values.push(clause.value);
110
+ parts.push(`${column} ${op} $${index++}`);
111
+ }
112
+ return {
113
+ sql: parts.length ? ` WHERE ${parts.join(" AND ")}` : "",
114
+ values,
115
+ };
116
+ }
117
+ function buildOrderLimit(options, mode, dataColumn) {
118
+ let sql = "";
119
+ if (options?.orderBy) {
120
+ const column = fieldExpr(options.orderBy.field, mode, dataColumn);
121
+ const direction = options.orderBy.direction?.toLowerCase() === "desc" ? "DESC" : "ASC";
122
+ sql += ` ORDER BY ${column} ${direction}`;
123
+ }
124
+ if (options?.limit != null) {
125
+ const limit = Number(options.limit);
126
+ if (!Number.isFinite(limit) || limit < 0) {
127
+ throw new Error(`Invalid limit: ${options.limit}`);
128
+ }
129
+ sql += ` LIMIT ${Math.floor(limit)}`;
130
+ }
131
+ return sql;
132
+ }
133
+ function cryptoRandomId() {
134
+ if (typeof crypto !== "undefined" && "randomUUID" in crypto) {
135
+ return crypto.randomUUID();
136
+ }
137
+ return `row_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 10)}`;
138
+ }
139
+ /**
140
+ * Opt-in Postgres adapter. The host app supplies `getClient()` — Vertebr
141
+ * never opens a database URL on its own.
142
+ *
143
+ * @example
144
+ * import pg from "pg";
145
+ * const pool = new pg.Pool({ connectionString: process.env.DATABASE_URL });
146
+ * const db = postgresAdapter({ getClient: () => pool, mode: "jsonb" });
147
+ */
148
+ function postgresAdapter(options) {
149
+ const mode = options.mode ?? "flat";
150
+ const idColumn = options.idColumn ?? "id";
151
+ const dataColumn = options.dataColumn ?? "data";
152
+ assertIdent(idColumn, "idColumn");
153
+ assertIdent(dataColumn, "dataColumn");
154
+ async function client() {
155
+ return options.getClient();
156
+ }
157
+ function ref(collection) {
158
+ return tableRef(collection, options.schema);
159
+ }
160
+ async function set(collection, id, value, setOptions) {
161
+ const db = await client();
162
+ const merge = setOptions?.merge ?? true;
163
+ const payload = { ...value };
164
+ delete payload.id;
165
+ if (idColumn !== "id")
166
+ delete payload[idColumn];
167
+ if (mode === "jsonb") {
168
+ const json = JSON.stringify(serializeValue(payload));
169
+ if (merge) {
170
+ await db.query(`INSERT INTO ${ref(collection)} (${quoteIdent(idColumn)}, ${quoteIdent(dataColumn)})
171
+ VALUES ($1, $2::jsonb)
172
+ ON CONFLICT (${quoteIdent(idColumn)}) DO UPDATE SET
173
+ ${quoteIdent(dataColumn)} = COALESCE(${ref(collection)}.${quoteIdent(dataColumn)}, '{}'::jsonb) || EXCLUDED.${quoteIdent(dataColumn)}`, [id, json]);
174
+ }
175
+ else {
176
+ await db.query(`INSERT INTO ${ref(collection)} (${quoteIdent(idColumn)}, ${quoteIdent(dataColumn)})
177
+ VALUES ($1, $2::jsonb)
178
+ ON CONFLICT (${quoteIdent(idColumn)}) DO UPDATE SET
179
+ ${quoteIdent(dataColumn)} = EXCLUDED.${quoteIdent(dataColumn)}`, [id, json]);
180
+ }
181
+ return;
182
+ }
183
+ const existing = await db.query(`SELECT * FROM ${ref(collection)} WHERE ${quoteIdent(idColumn)} = $1 LIMIT 1`, [id]);
184
+ const current = (existing.rows[0] ?? {});
185
+ const serialized = serializeValue(payload);
186
+ const serializedObj = serialized && typeof serialized === "object" && !Array.isArray(serialized)
187
+ ? serialized
188
+ : {};
189
+ const next = merge
190
+ ? { ...current, ...serializedObj, [idColumn]: id }
191
+ : { ...serializedObj, [idColumn]: id };
192
+ // Keep the primary key; only drop a separate `id` field when PK is renamed.
193
+ if (idColumn !== "id") {
194
+ delete next.id;
195
+ }
196
+ const columns = Object.keys(next);
197
+ if (columns.length === 0) {
198
+ await db.query(`INSERT INTO ${ref(collection)} (${quoteIdent(idColumn)}) VALUES ($1)
199
+ ON CONFLICT (${quoteIdent(idColumn)}) DO NOTHING`, [id]);
200
+ return;
201
+ }
202
+ const insertCols = columns.map(quoteIdent).join(", ");
203
+ const insertVals = columns.map((_, i) => `$${i + 1}`).join(", ");
204
+ const updateCols = columns.filter((col) => col !== idColumn);
205
+ const updates = updateCols.length > 0
206
+ ? updateCols
207
+ .map((col) => `${quoteIdent(col)} = EXCLUDED.${quoteIdent(col)}`)
208
+ .join(", ")
209
+ : `${quoteIdent(idColumn)} = EXCLUDED.${quoteIdent(idColumn)}`;
210
+ const values = columns.map((col) => next[col]);
211
+ await db.query(`INSERT INTO ${ref(collection)} (${insertCols})
212
+ VALUES (${insertVals})
213
+ ON CONFLICT (${quoteIdent(idColumn)}) DO UPDATE SET ${updates}`, values);
214
+ }
215
+ async function get(collection, id) {
216
+ const db = await client();
217
+ const result = await db.query(`SELECT * FROM ${ref(collection)} WHERE ${quoteIdent(idColumn)} = $1 LIMIT 1`, [id]);
218
+ const row = result.rows[0];
219
+ return row ? rowToDoc(row, idColumn, mode, dataColumn) : null;
220
+ }
221
+ return {
222
+ async list(collection, listOptions) {
223
+ const db = await client();
224
+ const where = buildWhere(listOptions, mode, dataColumn);
225
+ const orderLimit = buildOrderLimit(listOptions, mode, dataColumn);
226
+ const result = await db.query(`SELECT * FROM ${ref(collection)}${where.sql}${orderLimit}`, where.values);
227
+ return result.rows.map((row) => rowToDoc(row, idColumn, mode, dataColumn));
228
+ },
229
+ get,
230
+ set,
231
+ async create(collection, value, id) {
232
+ const resolvedId = id ??
233
+ (typeof value.id === "string" ? value.id : undefined) ??
234
+ cryptoRandomId();
235
+ await set(collection, resolvedId, value, { merge: true });
236
+ const doc = await get(collection, resolvedId);
237
+ return doc ?? { id: resolvedId, ...value };
238
+ },
239
+ async remove(collection, id) {
240
+ const db = await client();
241
+ await db.query(`DELETE FROM ${ref(collection)} WHERE ${quoteIdent(idColumn)} = $1`, [id]);
242
+ },
243
+ async count(collection, listOptions) {
244
+ const db = await client();
245
+ const where = buildWhere(listOptions, mode, dataColumn);
246
+ const result = await db.query(`SELECT COUNT(*)::int AS count FROM ${ref(collection)}${where.sql}`, where.values);
247
+ return Number(result.rows[0]?.count ?? 0);
248
+ },
249
+ };
250
+ }
251
+ /** Suggested DDL for jsonb-mode tables used with `postgresAdapter`. */
252
+ function postgresJsonbTableDDL(table, options) {
253
+ const idColumn = options?.idColumn ?? "id";
254
+ const dataColumn = options?.dataColumn ?? "data";
255
+ const name = tableRef(table, options?.schema);
256
+ return `CREATE TABLE IF NOT EXISTS ${name} (
257
+ ${quoteIdent(idColumn)} TEXT PRIMARY KEY,
258
+ ${quoteIdent(dataColumn)} JSONB NOT NULL DEFAULT '{}'::jsonb,
259
+ updated_at TIMESTAMPTZ DEFAULT NOW()
260
+ );`;
261
+ }
262
+ //# sourceMappingURL=postgres.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgres.js","sourceRoot":"","sources":["../../src/database/postgres.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ export declare class VertebrAuthError extends Error {
2
+ readonly statusCode = 401;
3
+ constructor(message?: string);
4
+ }
5
+ export declare class VertebrNotFoundError extends Error {
6
+ readonly statusCode = 404;
7
+ constructor(message?: string);
8
+ }
9
+ export declare class VertebrEnvError extends Error {
10
+ readonly statusCode = 400;
11
+ constructor(message?: string);
12
+ }
13
+ export declare class VertebrBadRequestError extends Error {
14
+ readonly statusCode = 400;
15
+ constructor(message?: string);
16
+ }
17
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,QAAQ,CAAC,UAAU,OAAO;gBACd,OAAO,SAAiB;CAIrC;AAED,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C,QAAQ,CAAC,UAAU,OAAO;gBACd,OAAO,SAAc;CAIlC;AAED,qBAAa,eAAgB,SAAQ,KAAK;IACxC,QAAQ,CAAC,UAAU,OAAO;gBACd,OAAO,SAAwB;CAI5C;AAED,qBAAa,sBAAuB,SAAQ,KAAK;IAC/C,QAAQ,CAAC,UAAU,OAAO;gBACd,OAAO,SAAgB;CAIpC"}
package/dist/errors.js ADDED
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.VertebrBadRequestError = exports.VertebrEnvError = exports.VertebrNotFoundError = exports.VertebrAuthError = void 0;
4
+ class VertebrAuthError extends Error {
5
+ statusCode = 401;
6
+ constructor(message = "Unauthorized") {
7
+ super(message);
8
+ this.name = "VertebrAuthError";
9
+ }
10
+ }
11
+ exports.VertebrAuthError = VertebrAuthError;
12
+ class VertebrNotFoundError extends Error {
13
+ statusCode = 404;
14
+ constructor(message = "Not found") {
15
+ super(message);
16
+ this.name = "VertebrNotFoundError";
17
+ }
18
+ }
19
+ exports.VertebrNotFoundError = VertebrNotFoundError;
20
+ class VertebrEnvError extends Error {
21
+ statusCode = 400;
22
+ constructor(message = "Invalid environment") {
23
+ super(message);
24
+ this.name = "VertebrEnvError";
25
+ }
26
+ }
27
+ exports.VertebrEnvError = VertebrEnvError;
28
+ class VertebrBadRequestError extends Error {
29
+ statusCode = 400;
30
+ constructor(message = "Bad request") {
31
+ super(message);
32
+ this.name = "VertebrBadRequestError";
33
+ }
34
+ }
35
+ exports.VertebrBadRequestError = VertebrBadRequestError;
36
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":";;;AAAA,MAAa,gBAAiB,SAAQ,KAAK;IAChC,UAAU,GAAG,GAAG,CAAC;IAC1B,YAAY,OAAO,GAAG,cAAc;QAClC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;IACjC,CAAC;CACF;AAND,4CAMC;AAED,MAAa,oBAAqB,SAAQ,KAAK;IACpC,UAAU,GAAG,GAAG,CAAC;IAC1B,YAAY,OAAO,GAAG,WAAW;QAC/B,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;IACrC,CAAC;CACF;AAND,oDAMC;AAED,MAAa,eAAgB,SAAQ,KAAK;IAC/B,UAAU,GAAG,GAAG,CAAC;IAC1B,YAAY,OAAO,GAAG,qBAAqB;QACzC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF;AAND,0CAMC;AAED,MAAa,sBAAuB,SAAQ,KAAK;IACtC,UAAU,GAAG,GAAG,CAAC;IAC1B,YAAY,OAAO,GAAG,aAAa;QACjC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;IACvC,CAAC;CACF;AAND,wDAMC"}
@@ -0,0 +1,53 @@
1
+ import type { AdminState } from "../services/state";
2
+ export declare function bootstrapHandler(state: AdminState): Promise<{
3
+ ok: boolean;
4
+ brand: string;
5
+ defaultEnvironment: string;
6
+ environments: {
7
+ id: string;
8
+ label: string;
9
+ tone: "neutral" | "warn" | "danger";
10
+ auth: import("../types").EnvironmentAuthPublic;
11
+ }[];
12
+ }>;
13
+ export declare function catalogHandler(state: AdminState, request: unknown): Promise<{
14
+ ok: boolean;
15
+ brand: string;
16
+ environment: string;
17
+ environments: {
18
+ id: string;
19
+ label: string;
20
+ tone: "neutral" | "warn" | "danger";
21
+ auth: import("../types").EnvironmentAuthPublic;
22
+ }[];
23
+ defaultEnvironment: string;
24
+ resources: {
25
+ id: string;
26
+ label: string;
27
+ schema: Record<string, import("../../schema").FieldSchema>;
28
+ permissions: {
29
+ create: boolean;
30
+ update: boolean;
31
+ delete: boolean;
32
+ };
33
+ uploads: Record<string, import("../../schema").ResourceUploadMeta> | undefined;
34
+ }[];
35
+ configs: {
36
+ id: string;
37
+ label: string;
38
+ schema: Record<string, import("../../schema").FieldSchema>;
39
+ section: string;
40
+ }[];
41
+ metrics: {
42
+ id: string;
43
+ label: string;
44
+ } | null;
45
+ gallery: {
46
+ id: string;
47
+ label: string;
48
+ accept: string[];
49
+ maxBytes: number;
50
+ canDelete: boolean;
51
+ } | null;
52
+ }>;
53
+ //# sourceMappingURL=catalog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../../src/index/api/catalog.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAIpD,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,UAAU;;;;;;;;;;GAYvD;AAED,wBAAsB,cAAc,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CvE"}