boltstore 0.5.2 → 0.6.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 (420) hide show
  1. package/README.md +65 -23
  2. package/dist/admin/api-keys.d.ts +87 -0
  3. package/dist/admin/api-keys.d.ts.map +1 -0
  4. package/dist/admin/api-keys.js +267 -0
  5. package/dist/admin/api-keys.js.map +1 -0
  6. package/dist/admin/backup.d.ts +76 -0
  7. package/dist/admin/backup.d.ts.map +1 -0
  8. package/dist/admin/backup.js +255 -0
  9. package/dist/admin/backup.js.map +1 -0
  10. package/dist/admin/import-export/csv.d.ts +4 -0
  11. package/dist/admin/import-export/csv.d.ts.map +1 -0
  12. package/dist/admin/import-export/csv.js +123 -0
  13. package/dist/admin/import-export/csv.js.map +1 -0
  14. package/dist/admin/import-export/export.d.ts +4 -0
  15. package/dist/admin/import-export/export.d.ts.map +1 -0
  16. package/dist/admin/import-export/export.js +66 -0
  17. package/dist/admin/import-export/export.js.map +1 -0
  18. package/dist/admin/import-export/import.d.ts +4 -0
  19. package/dist/admin/import-export/import.d.ts.map +1 -0
  20. package/dist/admin/import-export/import.js +253 -0
  21. package/dist/admin/import-export/import.js.map +1 -0
  22. package/dist/admin/import-export/index.d.ts +7 -0
  23. package/dist/admin/import-export/index.d.ts.map +1 -0
  24. package/dist/admin/import-export/index.js +7 -0
  25. package/dist/admin/import-export/index.js.map +1 -0
  26. package/dist/admin/import-export/json-input.d.ts +2 -0
  27. package/dist/admin/import-export/json-input.d.ts.map +1 -0
  28. package/dist/admin/import-export/json-input.js +42 -0
  29. package/dist/admin/import-export/json-input.js.map +1 -0
  30. package/dist/admin/import-export/schema-inference.d.ts +6 -0
  31. package/dist/admin/import-export/schema-inference.d.ts.map +1 -0
  32. package/dist/admin/import-export/schema-inference.js +34 -0
  33. package/dist/admin/import-export/schema-inference.js.map +1 -0
  34. package/dist/admin/import-export/types.d.ts +40 -0
  35. package/dist/admin/import-export/types.d.ts.map +1 -0
  36. package/dist/admin/import-export/types.js +2 -0
  37. package/dist/admin/import-export/types.js.map +1 -0
  38. package/dist/admin/oauth/github.d.ts +12 -0
  39. package/dist/admin/oauth/github.d.ts.map +1 -0
  40. package/dist/admin/oauth/github.js +78 -0
  41. package/dist/admin/oauth/github.js.map +1 -0
  42. package/dist/admin/oauth/google.d.ts +12 -0
  43. package/dist/admin/oauth/google.d.ts.map +1 -0
  44. package/dist/admin/oauth/google.js +55 -0
  45. package/dist/admin/oauth/google.js.map +1 -0
  46. package/dist/admin/oauth/handler.d.ts +5 -0
  47. package/dist/admin/oauth/handler.d.ts.map +1 -0
  48. package/dist/admin/oauth/handler.js +37 -0
  49. package/dist/admin/oauth/handler.js.map +1 -0
  50. package/dist/admin/oauth/index.d.ts +5 -0
  51. package/dist/admin/oauth/index.d.ts.map +1 -0
  52. package/dist/admin/oauth/index.js +5 -0
  53. package/dist/admin/oauth/index.js.map +1 -0
  54. package/dist/admin/oauth/registry.d.ts +16 -0
  55. package/dist/admin/oauth/registry.d.ts.map +1 -0
  56. package/dist/admin/oauth/registry.js +37 -0
  57. package/dist/admin/oauth/registry.js.map +1 -0
  58. package/dist/admin/oauth/types.d.ts +14 -0
  59. package/dist/admin/oauth/types.d.ts.map +1 -0
  60. package/dist/admin/oauth/types.js +2 -0
  61. package/dist/admin/oauth/types.js.map +1 -0
  62. package/dist/admin/oauth/user.d.ts +12 -0
  63. package/dist/admin/oauth/user.d.ts.map +1 -0
  64. package/dist/admin/oauth/user.js +28 -0
  65. package/dist/admin/oauth/user.js.map +1 -0
  66. package/dist/admin/query.d.ts +54 -0
  67. package/dist/admin/query.d.ts.map +1 -0
  68. package/dist/admin/query.js +168 -0
  69. package/dist/admin/query.js.map +1 -0
  70. package/dist/admin/transaction.d.ts +46 -0
  71. package/dist/admin/transaction.d.ts.map +1 -0
  72. package/dist/admin/transaction.js +52 -0
  73. package/dist/admin/transaction.js.map +1 -0
  74. package/dist/admin/views.d.ts +64 -0
  75. package/dist/admin/views.d.ts.map +1 -0
  76. package/dist/admin/views.js +197 -0
  77. package/dist/admin/views.js.map +1 -0
  78. package/dist/audit.d.ts +36 -0
  79. package/dist/audit.d.ts.map +1 -0
  80. package/dist/audit.js +92 -0
  81. package/dist/audit.js.map +1 -0
  82. package/dist/auth/jwt.d.ts +8 -0
  83. package/dist/auth/jwt.d.ts.map +1 -0
  84. package/dist/auth/jwt.js +81 -0
  85. package/dist/auth/jwt.js.map +1 -0
  86. package/dist/auth/password.d.ts +4 -0
  87. package/dist/auth/password.d.ts.map +1 -0
  88. package/dist/auth/password.js +15 -0
  89. package/dist/auth/password.js.map +1 -0
  90. package/dist/auth/tables.d.ts +5 -0
  91. package/dist/auth/tables.d.ts.map +1 -0
  92. package/dist/auth/tables.js +65 -0
  93. package/dist/auth/tables.js.map +1 -0
  94. package/dist/auth/tokens.d.ts +16 -0
  95. package/dist/auth/tokens.d.ts.map +1 -0
  96. package/dist/auth/tokens.js +126 -0
  97. package/dist/auth/tokens.js.map +1 -0
  98. package/dist/auth/types.d.ts +36 -0
  99. package/dist/auth/types.d.ts.map +1 -0
  100. package/dist/auth/types.js +2 -0
  101. package/dist/auth/types.js.map +1 -0
  102. package/dist/auth/users.d.ts +9 -0
  103. package/dist/auth/users.d.ts.map +1 -0
  104. package/dist/auth/users.js +83 -0
  105. package/dist/auth/users.js.map +1 -0
  106. package/dist/auth/validation.d.ts +5 -0
  107. package/dist/auth/validation.d.ts.map +1 -0
  108. package/dist/auth/validation.js +25 -0
  109. package/dist/auth/validation.js.map +1 -0
  110. package/dist/auth.d.ts +9 -0
  111. package/dist/auth.d.ts.map +1 -0
  112. package/dist/auth.js +9 -0
  113. package/dist/auth.js.map +1 -0
  114. package/dist/cli.d.ts +12 -0
  115. package/dist/cli.d.ts.map +1 -0
  116. package/dist/cli.js +322 -0
  117. package/dist/cli.js.map +1 -0
  118. package/dist/collections/ddl.d.ts +25 -0
  119. package/dist/collections/ddl.d.ts.map +1 -0
  120. package/dist/collections/ddl.js +83 -0
  121. package/dist/collections/ddl.js.map +1 -0
  122. package/dist/collections/management.d.ts +57 -0
  123. package/dist/collections/management.d.ts.map +1 -0
  124. package/dist/collections/management.js +289 -0
  125. package/dist/collections/management.js.map +1 -0
  126. package/dist/collections.d.ts +3 -0
  127. package/dist/collections.d.ts.map +1 -0
  128. package/dist/collections.js +3 -0
  129. package/dist/collections.js.map +1 -0
  130. package/dist/config.d.ts +47 -0
  131. package/dist/config.d.ts.map +1 -0
  132. package/dist/config.js +274 -0
  133. package/dist/config.js.map +1 -0
  134. package/dist/db/cast.d.ts +15 -0
  135. package/dist/db/cast.d.ts.map +1 -0
  136. package/dist/db/cast.js +16 -0
  137. package/dist/db/cast.js.map +1 -0
  138. package/dist/db/manager.d.ts +93 -0
  139. package/dist/db/manager.d.ts.map +1 -0
  140. package/dist/db/manager.js +209 -0
  141. package/dist/db/manager.js.map +1 -0
  142. package/dist/db/pool.d.ts +99 -0
  143. package/dist/db/pool.d.ts.map +1 -0
  144. package/dist/db/pool.js +232 -0
  145. package/dist/db/pool.js.map +1 -0
  146. package/dist/entry.d.ts +11 -0
  147. package/dist/entry.d.ts.map +1 -0
  148. package/dist/entry.js +80 -0
  149. package/dist/entry.js.map +1 -0
  150. package/dist/index.d.ts +10 -0
  151. package/dist/index.d.ts.map +1 -0
  152. package/dist/index.js +47 -0
  153. package/dist/index.js.map +1 -0
  154. package/dist/indexes.d.ts +61 -0
  155. package/dist/indexes.d.ts.map +1 -0
  156. package/dist/indexes.js +174 -0
  157. package/dist/indexes.js.map +1 -0
  158. package/dist/logger.d.ts +40 -0
  159. package/dist/logger.d.ts.map +1 -0
  160. package/dist/logger.js +147 -0
  161. package/dist/logger.js.map +1 -0
  162. package/dist/middleware/auth.d.ts +43 -0
  163. package/dist/middleware/auth.d.ts.map +1 -0
  164. package/dist/middleware/auth.js +87 -0
  165. package/dist/middleware/auth.js.map +1 -0
  166. package/dist/middleware/cors.d.ts +28 -0
  167. package/dist/middleware/cors.d.ts.map +1 -0
  168. package/dist/middleware/cors.js +71 -0
  169. package/dist/middleware/cors.js.map +1 -0
  170. package/dist/middleware/proxy.d.ts +10 -0
  171. package/dist/middleware/proxy.d.ts.map +1 -0
  172. package/dist/middleware/proxy.js +31 -0
  173. package/dist/middleware/proxy.js.map +1 -0
  174. package/dist/middleware/rate-limit.d.ts +64 -0
  175. package/dist/middleware/rate-limit.d.ts.map +1 -0
  176. package/dist/middleware/rate-limit.js +130 -0
  177. package/dist/middleware/rate-limit.js.map +1 -0
  178. package/dist/migrations.d.ts +56 -0
  179. package/dist/migrations.d.ts.map +1 -0
  180. package/dist/migrations.js +133 -0
  181. package/dist/migrations.js.map +1 -0
  182. package/dist/query/builder.d.ts +6 -0
  183. package/dist/query/builder.d.ts.map +1 -0
  184. package/dist/query/builder.js +97 -0
  185. package/dist/query/builder.js.map +1 -0
  186. package/dist/query/executor.d.ts +3 -0
  187. package/dist/query/executor.d.ts.map +1 -0
  188. package/dist/query/executor.js +64 -0
  189. package/dist/query/executor.js.map +1 -0
  190. package/dist/query/filter-builder.d.ts +8 -0
  191. package/dist/query/filter-builder.d.ts.map +1 -0
  192. package/dist/query/filter-builder.js +128 -0
  193. package/dist/query/filter-builder.js.map +1 -0
  194. package/dist/query/search.d.ts +4 -0
  195. package/dist/query/search.d.ts.map +1 -0
  196. package/dist/query/search.js +28 -0
  197. package/dist/query/search.js.map +1 -0
  198. package/dist/query/types.d.ts +45 -0
  199. package/dist/query/types.d.ts.map +1 -0
  200. package/dist/query/types.js +2 -0
  201. package/dist/query/types.js.map +1 -0
  202. package/dist/query.d.ts +6 -0
  203. package/dist/query.d.ts.map +1 -0
  204. package/dist/query.js +6 -0
  205. package/dist/query.js.map +1 -0
  206. package/dist/records/batch.d.ts +13 -0
  207. package/dist/records/batch.d.ts.map +1 -0
  208. package/dist/records/batch.js +113 -0
  209. package/dist/records/batch.js.map +1 -0
  210. package/dist/records/count.d.ts +5 -0
  211. package/dist/records/count.d.ts.map +1 -0
  212. package/dist/records/count.js +34 -0
  213. package/dist/records/count.js.map +1 -0
  214. package/dist/records/crud.d.ts +8 -0
  215. package/dist/records/crud.d.ts.map +1 -0
  216. package/dist/records/crud.js +121 -0
  217. package/dist/records/crud.js.map +1 -0
  218. package/dist/records/distinct.d.ts +5 -0
  219. package/dist/records/distinct.d.ts.map +1 -0
  220. package/dist/records/distinct.js +22 -0
  221. package/dist/records/distinct.js.map +1 -0
  222. package/dist/records/helpers.d.ts +4 -0
  223. package/dist/records/helpers.d.ts.map +1 -0
  224. package/dist/records/helpers.js +9 -0
  225. package/dist/records/helpers.js.map +1 -0
  226. package/dist/records/list.d.ts +44 -0
  227. package/dist/records/list.d.ts.map +1 -0
  228. package/dist/records/list.js +133 -0
  229. package/dist/records/list.js.map +1 -0
  230. package/dist/records/schema-cache.d.ts +8 -0
  231. package/dist/records/schema-cache.d.ts.map +1 -0
  232. package/dist/records/schema-cache.js +64 -0
  233. package/dist/records/schema-cache.js.map +1 -0
  234. package/dist/records.d.ts +8 -0
  235. package/dist/records.d.ts.map +1 -0
  236. package/dist/records.js +8 -0
  237. package/dist/records.js.map +1 -0
  238. package/dist/relations.d.ts +50 -0
  239. package/dist/relations.d.ts.map +1 -0
  240. package/dist/relations.js +179 -0
  241. package/dist/relations.js.map +1 -0
  242. package/dist/rls.d.ts +63 -0
  243. package/dist/rls.d.ts.map +1 -0
  244. package/dist/rls.js +146 -0
  245. package/dist/rls.js.map +1 -0
  246. package/dist/router.d.ts +53 -0
  247. package/dist/router.d.ts.map +1 -0
  248. package/dist/router.js +104 -0
  249. package/dist/router.js.map +1 -0
  250. package/dist/routes/admin-query.d.ts +5 -0
  251. package/dist/routes/admin-query.d.ts.map +1 -0
  252. package/dist/routes/admin-query.js +57 -0
  253. package/dist/routes/admin-query.js.map +1 -0
  254. package/dist/routes/api-keys.d.ts +12 -0
  255. package/dist/routes/api-keys.d.ts.map +1 -0
  256. package/dist/routes/api-keys.js +114 -0
  257. package/dist/routes/api-keys.js.map +1 -0
  258. package/dist/routes/auth.d.ts +10 -0
  259. package/dist/routes/auth.d.ts.map +1 -0
  260. package/dist/routes/auth.js +116 -0
  261. package/dist/routes/auth.js.map +1 -0
  262. package/dist/routes/backup.d.ts +5 -0
  263. package/dist/routes/backup.d.ts.map +1 -0
  264. package/dist/routes/backup.js +88 -0
  265. package/dist/routes/backup.js.map +1 -0
  266. package/dist/routes/collections.d.ts +5 -0
  267. package/dist/routes/collections.d.ts.map +1 -0
  268. package/dist/routes/collections.js +110 -0
  269. package/dist/routes/collections.js.map +1 -0
  270. package/dist/routes/databases.d.ts +5 -0
  271. package/dist/routes/databases.d.ts.map +1 -0
  272. package/dist/routes/databases.js +90 -0
  273. package/dist/routes/databases.js.map +1 -0
  274. package/dist/routes/health.d.ts +9 -0
  275. package/dist/routes/health.d.ts.map +1 -0
  276. package/dist/routes/health.js +34 -0
  277. package/dist/routes/health.js.map +1 -0
  278. package/dist/routes/import-export.d.ts +8 -0
  279. package/dist/routes/import-export.d.ts.map +1 -0
  280. package/dist/routes/import-export.js +173 -0
  281. package/dist/routes/import-export.js.map +1 -0
  282. package/dist/routes/indexes.d.ts +5 -0
  283. package/dist/routes/indexes.d.ts.map +1 -0
  284. package/dist/routes/indexes.js +94 -0
  285. package/dist/routes/indexes.js.map +1 -0
  286. package/dist/routes/migrations.d.ts +5 -0
  287. package/dist/routes/migrations.d.ts.map +1 -0
  288. package/dist/routes/migrations.js +87 -0
  289. package/dist/routes/migrations.js.map +1 -0
  290. package/dist/routes/oauth.d.ts +5 -0
  291. package/dist/routes/oauth.d.ts.map +1 -0
  292. package/dist/routes/oauth.js +35 -0
  293. package/dist/routes/oauth.js.map +1 -0
  294. package/dist/routes/query.d.ts +5 -0
  295. package/dist/routes/query.d.ts.map +1 -0
  296. package/dist/routes/query.js +36 -0
  297. package/dist/routes/query.js.map +1 -0
  298. package/dist/routes/records.d.ts +5 -0
  299. package/dist/routes/records.d.ts.map +1 -0
  300. package/dist/routes/records.js +181 -0
  301. package/dist/routes/records.js.map +1 -0
  302. package/dist/routes/transactions.d.ts +5 -0
  303. package/dist/routes/transactions.d.ts.map +1 -0
  304. package/dist/routes/transactions.js +43 -0
  305. package/dist/routes/transactions.js.map +1 -0
  306. package/dist/routes/views.d.ts +5 -0
  307. package/dist/routes/views.d.ts.map +1 -0
  308. package/dist/routes/views.js +123 -0
  309. package/dist/routes/views.js.map +1 -0
  310. package/dist/server.d.ts +80 -0
  311. package/dist/server.d.ts.map +1 -0
  312. package/dist/server.js +271 -0
  313. package/dist/server.js.map +1 -0
  314. package/package.json +20 -43
  315. package/bin/cli.ts +0 -185
  316. package/src/admin/assets.ts +0 -126
  317. package/src/admin/serve.ts +0 -447
  318. package/src/admin-ui/App.vue +0 -71
  319. package/src/admin-ui/api/client.ts +0 -179
  320. package/src/admin-ui/components/Icon.vue +0 -85
  321. package/src/admin-ui/components/Sidebar.vue +0 -268
  322. package/src/admin-ui/components/StatCard.vue +0 -40
  323. package/src/admin-ui/dist/assets/ApiKeys.css +0 -1
  324. package/src/admin-ui/dist/assets/ApiKeys.js +0 -1
  325. package/src/admin-ui/dist/assets/AppDashboard.css +0 -1
  326. package/src/admin-ui/dist/assets/AppDashboard.js +0 -1
  327. package/src/admin-ui/dist/assets/Backups.js +0 -1
  328. package/src/admin-ui/dist/assets/Dashboard.css +0 -1
  329. package/src/admin-ui/dist/assets/Dashboard.js +0 -3
  330. package/src/admin-ui/dist/assets/DataBrowser.css +0 -1
  331. package/src/admin-ui/dist/assets/DataBrowser.js +0 -1
  332. package/src/admin-ui/dist/assets/FileBrowser.css +0 -1
  333. package/src/admin-ui/dist/assets/FileBrowser.js +0 -1
  334. package/src/admin-ui/dist/assets/HookEditor.css +0 -1
  335. package/src/admin-ui/dist/assets/HookEditor.js +0 -2
  336. package/src/admin-ui/dist/assets/LogViewer.css +0 -1
  337. package/src/admin-ui/dist/assets/LogViewer.js +0 -1
  338. package/src/admin-ui/dist/assets/Login.css +0 -1
  339. package/src/admin-ui/dist/assets/Login.js +0 -1
  340. package/src/admin-ui/dist/assets/SchemaBuilder.css +0 -1
  341. package/src/admin-ui/dist/assets/SchemaBuilder.js +0 -1
  342. package/src/admin-ui/dist/assets/Settings.js +0 -1
  343. package/src/admin-ui/dist/assets/Setup.css +0 -1
  344. package/src/admin-ui/dist/assets/Setup.js +0 -1
  345. package/src/admin-ui/dist/assets/StatCard.css +0 -1
  346. package/src/admin-ui/dist/assets/StatCard.js +0 -1
  347. package/src/admin-ui/dist/assets/main.css +0 -1
  348. package/src/admin-ui/dist/assets/main.js +0 -30
  349. package/src/admin-ui/dist/index.html +0 -49
  350. package/src/admin-ui/index.html +0 -48
  351. package/src/admin-ui/main.ts +0 -25
  352. package/src/admin-ui/pages/ApiKeys.vue +0 -198
  353. package/src/admin-ui/pages/AppDashboard.vue +0 -274
  354. package/src/admin-ui/pages/Applications.vue +0 -123
  355. package/src/admin-ui/pages/Backups.vue +0 -140
  356. package/src/admin-ui/pages/Dashboard.vue +0 -293
  357. package/src/admin-ui/pages/DataBrowser.vue +0 -310
  358. package/src/admin-ui/pages/FileBrowser.vue +0 -587
  359. package/src/admin-ui/pages/HookEditor.vue +0 -258
  360. package/src/admin-ui/pages/LogViewer.vue +0 -109
  361. package/src/admin-ui/pages/Login.vue +0 -229
  362. package/src/admin-ui/pages/SchemaBuilder.vue +0 -501
  363. package/src/admin-ui/pages/Settings.vue +0 -251
  364. package/src/admin-ui/pages/Setup.vue +0 -275
  365. package/src/admin-ui/router.ts +0 -163
  366. package/src/admin-ui/stores/application.ts +0 -68
  367. package/src/admin-ui/stores/auth.ts +0 -109
  368. package/src/admin-ui/style.css +0 -532
  369. package/src/admin-ui/tsconfig.json +0 -21
  370. package/src/admin-ui/version.ts +0 -3
  371. package/src/admin-ui/vite.config.ts +0 -35
  372. package/src/api/admin-config.ts +0 -596
  373. package/src/api/admin.ts +0 -8
  374. package/src/api/aggregate.ts +0 -104
  375. package/src/api/applications.ts +0 -148
  376. package/src/api/auth.ts +0 -782
  377. package/src/api/backups.ts +0 -173
  378. package/src/api/batch.ts +0 -135
  379. package/src/api/collections.ts +0 -354
  380. package/src/api/files.ts +0 -808
  381. package/src/api/health.ts +0 -48
  382. package/src/api/helpers.ts +0 -86
  383. package/src/api/middleware/auth.ts +0 -205
  384. package/src/api/middleware/cors.ts +0 -78
  385. package/src/api/middleware/logging.ts +0 -27
  386. package/src/api/middleware/ratelimit.ts +0 -166
  387. package/src/api/middleware/rls.ts +0 -37
  388. package/src/api/records.ts +0 -571
  389. package/src/api/router.ts +0 -296
  390. package/src/app.ts +0 -617
  391. package/src/auth/apikey.ts +0 -73
  392. package/src/auth/jwt.ts +0 -220
  393. package/src/auth/oauth2.ts +0 -144
  394. package/src/auth/password.ts +0 -68
  395. package/src/backup/manager.ts +0 -227
  396. package/src/config/yaml.ts +0 -78
  397. package/src/config.ts +0 -240
  398. package/src/db/application-migrations.ts +0 -112
  399. package/src/db/application-schema.ts +0 -297
  400. package/src/db/migrations.ts +0 -54
  401. package/src/db/pool.ts +0 -143
  402. package/src/db/system-schema.ts +0 -153
  403. package/src/hooks/api.ts +0 -157
  404. package/src/hooks/loader.ts +0 -263
  405. package/src/hooks/runner.ts +0 -116
  406. package/src/index.ts +0 -17
  407. package/src/logging/logger.ts +0 -131
  408. package/src/realtime/broadcast.ts +0 -132
  409. package/src/realtime/subscriptions.ts +0 -124
  410. package/src/security/rls-engine.ts +0 -183
  411. package/src/security/sanitizer.ts +0 -72
  412. package/src/storage/interface.ts +0 -48
  413. package/src/storage/local.ts +0 -189
  414. package/src/storage/mime-types.ts +0 -32
  415. package/src/storage/s3.ts +0 -213
  416. package/src/sync/changelog.ts +0 -247
  417. package/src/sync/engine.ts +0 -159
  418. package/src/sync/lamport.ts +0 -48
  419. package/src/sync/protocol.ts +0 -253
  420. package/src/version.ts +0 -2
package/README.md CHANGED
@@ -1,39 +1,81 @@
1
1
  # Boltstore
2
2
 
3
- **Single-binary, self-hosted Backend-as-a-Service.**
3
+ **Boltstore** — A lightweight, self-hostable backend-as-a-service on SQLite + bun.js.
4
4
 
5
- Offline sync + S3-compatible storage + realtime + extensible JS hooks + Row-Level Security. Runs on a 512MB VPS. Built on **Bun**.
5
+ Built for mobile apps that need offline sync, realtime updates, and managed authentication without the complexity of managing a full cloud backend.
6
6
 
7
- Zero production dependencies. Everything uses Bun built-ins: `bun:sqlite`, `Bun.serve()`, `Bun.password`, Web Crypto API.
7
+ ## Features
8
+
9
+ - **SQLite via HTTP REST API** — Full CRUD, filtering, sorting, pagination, aggregation, FTS5, JSON extraction, and raw SQL
10
+ - **Multi-database support** — One instance serves multiple apps, each with isolated SQLite databases
11
+ - **Realtime WebSocket** — Live subscriptions on collection and record changes
12
+ - **Offline sync** — Client-side sync with conflict resolution (last-write-wins, custom merge)
13
+ - **Authentication** — Email/password, JWT tokens, OAuth (future), Row-Level Security
14
+ - **File storage** — Local filesystem and S3-compatible providers
15
+ - **Hooks & extensions** — User-defined JavaScript functions for validation, auth, and business logic
16
+ - **Admin panel** — Vue 3 SPA served at `/admin` with HMR during development
17
+ - **Secure by design** — Route tiers (Public → Authenticated → Admin), parameterized queries, audit logging
8
18
 
9
- ## Quick Start
19
+ ## Quick start
10
20
 
11
21
  ```bash
12
- bun install
13
- bun run dev
22
+ npm install -g boltstore
23
+ boltstore serve --port 8080 --db ./data
14
24
  ```
15
25
 
16
- ## Packages
26
+ Or with Docker:
17
27
 
18
- This repo is the main `boltstore` package (published on npm). The admin UI (Vue SPA) lives at `src/admin-ui/` and is built into the binary.
28
+ ```bash
29
+ docker run -p 8080:8080 -v ./data:/data boltstore/boltstore
30
+ ```
19
31
 
20
- Companion packages published separately:
21
- - **[@boltstore/utils](https://www.npmjs.com/package/@boltstore/utils)** — Shared types, validation, filter parser (used by client SDK)
22
- - **[@boltstore/client](https://www.npmjs.com/package/@boltstore/client)** — TypeScript SDK for Bun, Node 18+, browsers
32
+ ## Configuration
23
33
 
24
- ## Features
34
+ CLI flags override env vars override config file:
35
+
36
+ ```bash
37
+ boltstore serve --port 8080 --db ./data --config boltstore.yaml
38
+ ```
39
+
40
+ | Environment variable | Default | Description |
41
+ |---|---|---|
42
+ | `PORT` | `8080` | HTTP server port |
43
+ | `DATABASE_PATH` | `./data` | Directory for SQLite database files |
44
+ | `JWT_SECRET` | — | Secret key for JWT tokens |
45
+ | `RATE_LIMIT_PUBLIC` | `60/min` | Rate limit for public endpoints |
46
+ | `RATE_LIMIT_AUTH` | `600/min` | Rate limit for authenticated endpoints |
47
+ | `SERVER_TIMEZONE` | `UTC` | Server timezone |
48
+
49
+ ## API Tiers
50
+
51
+ | Prefix | Access | Operations |
52
+ |---|---|---|
53
+ | `GET /api/health` | Public | Health check |
54
+ | `POST /api/auth/*` | Public | Login, register |
55
+ | `/api/collections/:collection/records` | Authenticated | CRUD on records |
56
+ | `/api/admin/*` | Admin only | Schema changes, indexes, views, raw SQL, transactions |
25
57
 
26
- - SQLite with dual-pool concurrency and WAL mode
27
- - REST API auto-generated from collection schemas
28
- - JWT + bcrypt + OAuth2 (Google, GitHub) + API keys
29
- - Row-Level Security (SQL policy injection)
30
- - WebSocket pub/sub with RLS-aware fan-out
31
- - Offline sync (4 strategies, per-field override)
32
- - LocalDisk + S3-compatible file storage
33
- - Lifecycle hooks + custom routes/WS/CLI extensions
34
- - Vue admin UI embedded in binary
35
- - Standard SQLite backups + full-instance archives
58
+ ## Admin Panel
59
+
60
+ Open `http://localhost:8080/admin` in your browser after starting the server.
61
+
62
+ During development, Vite HMR automatically refreshes the admin UI as you edit Vue files.
63
+
64
+ ## Development
65
+
66
+ ```bash
67
+ bun install
68
+ bun run build # compile TypeScript
69
+ bun test # run tests
70
+ bun run dev # watch mode
71
+ ```
72
+
73
+ ## Publishing
74
+
75
+ ```bash
76
+ npm publish
77
+ ```
36
78
 
37
79
  ## License
38
80
 
39
- MIT
81
+ MIT
@@ -0,0 +1,87 @@
1
+ /**
2
+ * API Key management for Boltstore — machine-to-machine authentication.
3
+ *
4
+ * API keys provide scoped, non-expiring credentials for programmatic
5
+ * access. Keys are hashed before storage (bcrypt via Bun.password);
6
+ * the raw key is returned only once at creation time.
7
+ *
8
+ * Routes live under `/api/admin/api-keys` — admin only.
9
+ *
10
+ * @module boltstore/admin/api-keys
11
+ */
12
+ import { DatabasePool } from "../db/pool";
13
+ /** Valid operations an API key can be scoped to. */
14
+ export declare const API_KEY_OPERATIONS: readonly ["read", "create", "update", "delete", "admin"];
15
+ export type ApiKeyOperation = (typeof API_KEY_OPERATIONS)[number];
16
+ /** Permission set attached to an API key. */
17
+ export interface ApiKeyPermissions {
18
+ /** Allowed operations. An empty/missing list means no operations are allowed. */
19
+ operations?: ApiKeyOperation[];
20
+ /** Optional collection allow-list. If omitted, the key can access all collections. */
21
+ collections?: string[];
22
+ }
23
+ /** Internal representation of an API key row. */
24
+ export interface ApiKey {
25
+ id: string;
26
+ name: string;
27
+ /** First 8 chars of the raw key for display (the full hash is stored internally). */
28
+ prefix: string;
29
+ permissions: ApiKeyPermissions;
30
+ /** Whether this key has been revoked. */
31
+ revoked: boolean;
32
+ /** ISO-8601 creation timestamp. */
33
+ created_at: string;
34
+ /** ISO-8601 timestamp of last use. Null if never used. */
35
+ last_used_at: string | null;
36
+ }
37
+ /** Full API key returned on creation (raw key + metadata). */
38
+ export interface ApiKeyWithSecret extends ApiKey {
39
+ /** The raw API key secret. Only returned once at creation time. */
40
+ secret: string;
41
+ }
42
+ /** Verified API key context after successful authentication. */
43
+ export interface ApiKeyContext {
44
+ keyId: string;
45
+ name: string;
46
+ permissions: ApiKeyPermissions;
47
+ }
48
+ /** Map an HTTP/CRUD intent to an API-key operation name. */
49
+ export declare function operationForMethod(method: string): ApiKeyOperation;
50
+ /** Check whether an API key context is allowed to perform an operation on a collection. */
51
+ export declare function apiKeyAllows(ctx: ApiKeyContext, operation: ApiKeyOperation, collection?: string): boolean;
52
+ /** Bootstrap the _api_keys table in a database. */
53
+ export declare function bootstrapApiKeyTables(pool: DatabasePool): void;
54
+ /**
55
+ * Create a new API key. Returns the raw key — store it immediately,
56
+ * as it will never be shown again.
57
+ *
58
+ * `POST /api/admin/:database/api-keys`
59
+ */
60
+ export declare function createApiKey(pool: DatabasePool, name: string, permissions?: ApiKeyPermissions): Promise<ApiKeyWithSecret>;
61
+ /**
62
+ * List all API keys for a database (without secrets).
63
+ *
64
+ * `GET /api/admin/:database/api-keys`
65
+ */
66
+ export declare function listApiKeys(pool: DatabasePool): ApiKey[];
67
+ /**
68
+ * Get a single API key by ID (without secret).
69
+ *
70
+ * `GET /api/admin/:database/api-keys/:id`
71
+ */
72
+ export declare function getApiKey(pool: DatabasePool, id: string): ApiKey;
73
+ /**
74
+ * Revoke an API key. After revocation, it can no longer be used for
75
+ * authentication. This is irreversible.
76
+ *
77
+ * `DELETE /api/admin/:database/api-keys/:id`
78
+ */
79
+ export declare function revokeApiKey(pool: DatabasePool, id: string): void;
80
+ /**
81
+ * Verify an API key secret and return the associated permissions context.
82
+ * Throws if the key is invalid, revoked, or not found.
83
+ *
84
+ * Used by the auth middleware to authenticate machine-to-machine requests.
85
+ */
86
+ export declare function verifyApiKey(pool: DatabasePool, secret: string): Promise<ApiKeyContext>;
87
+ //# sourceMappingURL=api-keys.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-keys.d.ts","sourceRoot":"","sources":["../../src/admin/api-keys.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAQ1C,oDAAoD;AACpD,eAAO,MAAM,kBAAkB,0DAA2D,CAAC;AAC3F,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAC;AAElE,6CAA6C;AAC7C,MAAM,WAAW,iBAAiB;IAChC,iFAAiF;IACjF,UAAU,CAAC,EAAE,eAAe,EAAE,CAAC;IAC/B,sFAAsF;IACtF,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,iDAAiD;AACjD,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,qFAAqF;IACrF,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,iBAAiB,CAAC;IAC/B,yCAAyC;IACzC,OAAO,EAAE,OAAO,CAAC;IACjB,mCAAmC;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,0DAA0D;IAC1D,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,8DAA8D;AAC9D,MAAM,WAAW,gBAAiB,SAAQ,MAAM;IAC9C,mEAAmE;IACnE,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,gEAAgE;AAChE,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,iBAAiB,CAAC;CAChC;AAED,4DAA4D;AAC5D,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,eAAe,CAelE;AAED,2FAA2F;AAC3F,wBAAgB,YAAY,CAC1B,GAAG,EAAE,aAAa,EAClB,SAAS,EAAE,eAAe,EAC1B,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAST;AAYD,mDAAmD;AACnD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,CAmB9D;AA4BD;;;;;GAKG;AACH,wBAAsB,YAAY,CAChC,IAAI,EAAE,YAAY,EAClB,IAAI,EAAE,MAAM,EACZ,WAAW,GAAE,iBAAsB,GAClC,OAAO,CAAC,gBAAgB,CAAC,CA2D3B;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,EAAE,CAyBxD;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CA6BhE;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAejE;AAMD;;;;;GAKG;AACH,wBAAsB,YAAY,CAChC,IAAI,EAAE,YAAY,EAClB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,aAAa,CAAC,CA6CxB"}
@@ -0,0 +1,267 @@
1
+ /**
2
+ * API Key management for Boltstore — machine-to-machine authentication.
3
+ *
4
+ * API keys provide scoped, non-expiring credentials for programmatic
5
+ * access. Keys are hashed before storage (bcrypt via Bun.password);
6
+ * the raw key is returned only once at creation time.
7
+ *
8
+ * Routes live under `/api/admin/api-keys` — admin only.
9
+ *
10
+ * @module boltstore/admin/api-keys
11
+ */
12
+ import { hashPassword, verifyPassword } from "../auth";
13
+ import { generateSecureId } from "@boltstore/utils";
14
+ // ---------------------------------------------------------------------------
15
+ // Types
16
+ // ---------------------------------------------------------------------------
17
+ /** Valid operations an API key can be scoped to. */
18
+ export const API_KEY_OPERATIONS = ["read", "create", "update", "delete", "admin"];
19
+ /** Map an HTTP/CRUD intent to an API-key operation name. */
20
+ export function operationForMethod(method) {
21
+ switch (method) {
22
+ case "GET":
23
+ case "HEAD":
24
+ return "read";
25
+ case "POST":
26
+ return "create";
27
+ case "PATCH":
28
+ case "PUT":
29
+ return "update";
30
+ case "DELETE":
31
+ return "delete";
32
+ default:
33
+ return "read";
34
+ }
35
+ }
36
+ /** Check whether an API key context is allowed to perform an operation on a collection. */
37
+ export function apiKeyAllows(ctx, operation, collection) {
38
+ const ops = ctx.permissions.operations ?? [];
39
+ if (ops.includes("admin"))
40
+ return true;
41
+ if (!ops.includes(operation))
42
+ return false;
43
+ const cols = ctx.permissions.collections;
44
+ if (cols && cols.length > 0) {
45
+ if (!collection || !cols.includes(collection))
46
+ return false;
47
+ }
48
+ return true;
49
+ }
50
+ // ---------------------------------------------------------------------------
51
+ // Constants
52
+ // ---------------------------------------------------------------------------
53
+ const API_KEY_PREFIX = "blt_";
54
+ // ---------------------------------------------------------------------------
55
+ // Table bootstrapping
56
+ // ---------------------------------------------------------------------------
57
+ /** Bootstrap the _api_keys table in a database. */
58
+ export function bootstrapApiKeyTables(pool) {
59
+ const db = pool.write();
60
+ db.run(`
61
+ CREATE TABLE IF NOT EXISTS _api_keys (
62
+ id TEXT PRIMARY KEY,
63
+ name TEXT NOT NULL,
64
+ key_hash TEXT NOT NULL UNIQUE,
65
+ prefix TEXT NOT NULL,
66
+ permissions_json TEXT NOT NULL DEFAULT '{}',
67
+ revoked INTEGER NOT NULL DEFAULT 0,
68
+ created_at TEXT NOT NULL,
69
+ last_used_at TEXT
70
+ )
71
+ `);
72
+ db.run(`
73
+ CREATE INDEX IF NOT EXISTS idx_api_keys_prefix ON _api_keys(prefix)
74
+ `);
75
+ }
76
+ // ---------------------------------------------------------------------------
77
+ // Helpers
78
+ // ---------------------------------------------------------------------------
79
+ /** Generate a unique API key ID. */
80
+ function generateKeyId() {
81
+ return generateSecureId("apk");
82
+ }
83
+ /** Generate a cryptographically random API key secret. */
84
+ function generateKeySecret() {
85
+ const bytes = new Uint8Array(32);
86
+ crypto.getRandomValues(bytes);
87
+ const raw = Buffer.from(bytes).toString("base64url");
88
+ return `${API_KEY_PREFIX}${raw}`;
89
+ }
90
+ /** Get current ISO-8601 timestamp. */
91
+ function now() {
92
+ return new Date().toISOString();
93
+ }
94
+ // ---------------------------------------------------------------------------
95
+ // Public API — CRUD
96
+ // ---------------------------------------------------------------------------
97
+ /**
98
+ * Create a new API key. Returns the raw key — store it immediately,
99
+ * as it will never be shown again.
100
+ *
101
+ * `POST /api/admin/:database/api-keys`
102
+ */
103
+ export async function createApiKey(pool, name, permissions = {}) {
104
+ if (!name || typeof name !== "string" || name.trim().length === 0) {
105
+ throw Object.assign(new Error("API key name is required."), { status: 400 });
106
+ }
107
+ if (name.length > 128) {
108
+ throw Object.assign(new Error("API key name must be 128 characters or fewer."), { status: 400 });
109
+ }
110
+ // Validate permissions
111
+ if (permissions.collections) {
112
+ if (!Array.isArray(permissions.collections)) {
113
+ throw Object.assign(new Error("permissions.collections must be an array."), { status: 400 });
114
+ }
115
+ for (const c of permissions.collections) {
116
+ if (typeof c !== "string") {
117
+ throw Object.assign(new Error("permissions.collections entries must be strings."), { status: 400 });
118
+ }
119
+ }
120
+ }
121
+ if (permissions.operations) {
122
+ if (!Array.isArray(permissions.operations)) {
123
+ throw Object.assign(new Error("permissions.operations must be an array."), { status: 400 });
124
+ }
125
+ for (const op of permissions.operations) {
126
+ if (typeof op !== "string" || !API_KEY_OPERATIONS.includes(op)) {
127
+ throw Object.assign(new Error(`Invalid operation "${op}". Valid operations: ${API_KEY_OPERATIONS.join(", ")}.`), { status: 400 });
128
+ }
129
+ }
130
+ }
131
+ bootstrapApiKeyTables(pool);
132
+ const secret = generateKeySecret();
133
+ const keyHash = await hashPassword(secret);
134
+ const id = generateKeyId();
135
+ const prefix = secret.slice(0, 8);
136
+ const ts = now();
137
+ const db = pool.write();
138
+ db.run(`INSERT INTO _api_keys (id, name, key_hash, prefix, permissions_json, revoked, created_at, last_used_at)
139
+ VALUES (?, ?, ?, ?, ?, 0, ?, NULL)`, [id, name.trim(), keyHash, prefix, JSON.stringify(permissions), ts]);
140
+ return {
141
+ id,
142
+ name: name.trim(),
143
+ prefix,
144
+ secret,
145
+ permissions,
146
+ revoked: false,
147
+ created_at: ts,
148
+ last_used_at: null,
149
+ };
150
+ }
151
+ /**
152
+ * List all API keys for a database (without secrets).
153
+ *
154
+ * `GET /api/admin/:database/api-keys`
155
+ */
156
+ export function listApiKeys(pool) {
157
+ bootstrapApiKeyTables(pool);
158
+ const db = pool.read();
159
+ const rows = db
160
+ .query("SELECT id, name, prefix, permissions_json, revoked, created_at, last_used_at FROM _api_keys ORDER BY created_at DESC")
161
+ .all();
162
+ return rows.map((row) => ({
163
+ id: row.id,
164
+ name: row.name,
165
+ prefix: row.prefix,
166
+ permissions: safeParseJson(row.permissions_json),
167
+ revoked: row.revoked === 1,
168
+ created_at: row.created_at,
169
+ last_used_at: row.last_used_at,
170
+ }));
171
+ }
172
+ /**
173
+ * Get a single API key by ID (without secret).
174
+ *
175
+ * `GET /api/admin/:database/api-keys/:id`
176
+ */
177
+ export function getApiKey(pool, id) {
178
+ bootstrapApiKeyTables(pool);
179
+ const db = pool.read();
180
+ const row = db
181
+ .query("SELECT id, name, prefix, permissions_json, revoked, created_at, last_used_at FROM _api_keys WHERE id=?")
182
+ .get(id);
183
+ if (!row) {
184
+ throw Object.assign(new Error(`API key "${id}" not found.`), { status: 404 });
185
+ }
186
+ return {
187
+ id: row.id,
188
+ name: row.name,
189
+ prefix: row.prefix,
190
+ permissions: safeParseJson(row.permissions_json),
191
+ revoked: row.revoked === 1,
192
+ created_at: row.created_at,
193
+ last_used_at: row.last_used_at,
194
+ };
195
+ }
196
+ /**
197
+ * Revoke an API key. After revocation, it can no longer be used for
198
+ * authentication. This is irreversible.
199
+ *
200
+ * `DELETE /api/admin/:database/api-keys/:id`
201
+ */
202
+ export function revokeApiKey(pool, id) {
203
+ bootstrapApiKeyTables(pool);
204
+ const db = pool.write();
205
+ // Verify the key exists
206
+ const existing = db
207
+ .query("SELECT id FROM _api_keys WHERE id=?")
208
+ .get(id);
209
+ if (!existing) {
210
+ throw Object.assign(new Error(`API key "${id}" not found.`), { status: 404 });
211
+ }
212
+ db.run("UPDATE _api_keys SET revoked=1 WHERE id=?", [id]);
213
+ }
214
+ // ---------------------------------------------------------------------------
215
+ // Authentication
216
+ // ---------------------------------------------------------------------------
217
+ /**
218
+ * Verify an API key secret and return the associated permissions context.
219
+ * Throws if the key is invalid, revoked, or not found.
220
+ *
221
+ * Used by the auth middleware to authenticate machine-to-machine requests.
222
+ */
223
+ export async function verifyApiKey(pool, secret) {
224
+ if (!secret || typeof secret !== "string" || secret.length < 4) {
225
+ throw Object.assign(new Error("Invalid API key."), { status: 401 });
226
+ }
227
+ bootstrapApiKeyTables(pool);
228
+ // Look up by prefix first (efficient index scan)
229
+ const prefix = secret.slice(0, 8);
230
+ const db = pool.read();
231
+ const candidates = db
232
+ .query("SELECT id, name, key_hash, permissions_json, revoked FROM _api_keys WHERE prefix=? AND revoked=0")
233
+ .all(prefix);
234
+ for (const candidate of candidates) {
235
+ const match = await verifyPassword(secret, candidate.key_hash);
236
+ if (match) {
237
+ // Update last_used_at
238
+ try {
239
+ pool.write().run("UPDATE _api_keys SET last_used_at=? WHERE id=?", [
240
+ now(),
241
+ candidate.id,
242
+ ]);
243
+ }
244
+ catch {
245
+ // Non-critical — don't fail auth for a tracking update
246
+ }
247
+ return {
248
+ keyId: candidate.id,
249
+ name: candidate.name,
250
+ permissions: safeParseJson(candidate.permissions_json),
251
+ };
252
+ }
253
+ }
254
+ throw Object.assign(new Error("Invalid or revoked API key."), { status: 401 });
255
+ }
256
+ // ---------------------------------------------------------------------------
257
+ // Internal helpers
258
+ // ---------------------------------------------------------------------------
259
+ function safeParseJson(json) {
260
+ try {
261
+ return JSON.parse(json);
262
+ }
263
+ catch {
264
+ return {};
265
+ }
266
+ }
267
+ //# sourceMappingURL=api-keys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-keys.js","sourceRoot":"","sources":["../../src/admin/api-keys.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Backup & Restore module for Boltstore databases.
3
+ *
4
+ * Creates SQLite backup snapshots via `VACUUM INTO` and supports
5
+ * restoring from those snapshots. Restore closes the existing pool
6
+ * (dropping all connections), swaps the database file, and reopens.
7
+ *
8
+ * @module boltstore/admin/backup
9
+ */
10
+ import { DatabasePool } from "../db/pool";
11
+ import { DatabaseManager } from "../db/manager";
12
+ export interface BackupOptions {
13
+ /** Human-readable label for this backup. */
14
+ label?: string;
15
+ }
16
+ export interface BackupInfo {
17
+ /** Unique backup identifier (generated). */
18
+ id: string;
19
+ /** Full filesystem path to the backup file. */
20
+ path: string;
21
+ /** Size of the backup file in bytes. */
22
+ sizeBytes: number;
23
+ /** ISO-8601 timestamp of when the backup was created. */
24
+ createdAt: string;
25
+ /** Optional human-readable label. */
26
+ label?: string;
27
+ }
28
+ export interface RestoreResult {
29
+ /** Database name that was restored. */
30
+ database: string;
31
+ /** Path to the backup file that was used. */
32
+ backupPath: string;
33
+ /** ISO-8601 timestamp of when the restore occurred. */
34
+ restoredAt: string;
35
+ }
36
+ /**
37
+ * Create a backup of a database using SQLite's `VACUUM INTO`.
38
+ *
39
+ * The backup is a self-contained, consistent SQLite snapshot stored in
40
+ * `data/{app}/backups/{app}-{timestamp}.db`. Metadata is recorded in the
41
+ * `_backups` table for later listing and restore.
42
+ *
43
+ * `POST /api/admin/:database/backup`
44
+ */
45
+ export declare function createBackup(pool: DatabasePool, databaseName: string, dataDir: string, options?: BackupOptions): BackupInfo;
46
+ /**
47
+ * List all backups for a database.
48
+ *
49
+ * `GET /api/admin/:database/backups`
50
+ */
51
+ export declare function listBackups(pool: DatabasePool): BackupInfo[];
52
+ /**
53
+ * Get a specific backup by ID.
54
+ */
55
+ export declare function getBackup(pool: DatabasePool, backupId: string): BackupInfo;
56
+ /**
57
+ * Restore a database from a backup snapshot.
58
+ *
59
+ * **This closes the existing connection pool**, swaps the database file
60
+ * with the backup, then reopens the pool. All active connections to the
61
+ * database will be dropped — suitable for maintenance windows.
62
+ *
63
+ * After restore, the `_backups` metadata table persists because it lives
64
+ * inside the backup snapshot itself.
65
+ *
66
+ * `POST /api/admin/:database/restore/:backupId`
67
+ */
68
+ export declare function restoreBackup(manager: DatabaseManager, databaseName: string, backupId: string): RestoreResult;
69
+ /**
70
+ * Restore a database directly from a file path (CLI usage).
71
+ *
72
+ * Useful when the backup file is not tracked in `_backups` metadata,
73
+ * e.g., a backup copied from another machine.
74
+ */
75
+ export declare function restoreFromFile(manager: DatabaseManager, databaseName: string, backupFilePath: string): RestoreResult;
76
+ //# sourceMappingURL=backup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backup.d.ts","sourceRoot":"","sources":["../../src/admin/backup.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAoBhD,MAAM,WAAW,aAAa;IAC5B,4CAA4C;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,4CAA4C;IAC5C,EAAE,EAAE,MAAM,CAAC;IACX,+CAA+C;IAC/C,IAAI,EAAE,MAAM,CAAC;IACb,wCAAwC;IACxC,SAAS,EAAE,MAAM,CAAC;IAClB,yDAAyD;IACzD,SAAS,EAAE,MAAM,CAAC;IAClB,qCAAqC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,uCAAuC;IACvC,QAAQ,EAAE,MAAM,CAAC;IACjB,6CAA6C;IAC7C,UAAU,EAAE,MAAM,CAAC;IACnB,uDAAuD;IACvD,UAAU,EAAE,MAAM,CAAC;CACpB;AA0DD;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,YAAY,EAClB,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,aAAkB,GAC1B,UAAU,CA8CZ;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,YAAY,GAAG,UAAU,EAAE,CA0B5D;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,GAAG,UAAU,CAgC1E;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,eAAe,EACxB,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,GACf,aAAa,CA+Cf;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,eAAe,EACxB,YAAY,EAAE,MAAM,EACpB,cAAc,EAAE,MAAM,GACrB,aAAa,CAmDf"}