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
@@ -0,0 +1,255 @@
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 { Database } from "bun:sqlite";
11
+ import { validateIdentifier, resolveSafePath, sanitizePathComponent, generateSecureId } from "@boltstore/utils";
12
+ /** Wrap a path traversal error as a 400 response-like error. */
13
+ function safeResolvePath(baseDir, relative) {
14
+ try {
15
+ return resolveSafePath(baseDir, relative);
16
+ }
17
+ catch {
18
+ throw Object.assign(new Error(`Invalid or unsafe path "${relative}".`), { status: 400 });
19
+ }
20
+ }
21
+ import { mkdirSync, existsSync, readFileSync, copyFileSync, statSync } from "node:fs";
22
+ // ---------------------------------------------------------------------------
23
+ // Constants
24
+ // ---------------------------------------------------------------------------
25
+ /** Bootstrap the _backups metadata table. */
26
+ const BOOTSTRAP_BACKUPS = `CREATE TABLE IF NOT EXISTS _backups (
27
+ id TEXT PRIMARY KEY,
28
+ path TEXT NOT NULL,
29
+ size_bytes INTEGER NOT NULL DEFAULT 0,
30
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
31
+ label TEXT
32
+ )`;
33
+ // ---------------------------------------------------------------------------
34
+ // Helpers
35
+ // ---------------------------------------------------------------------------
36
+ /** Generate a unique backup ID. */
37
+ function generateBackupId() {
38
+ return generateSecureId("bkp");
39
+ }
40
+ /** Verify a SQLite backup file by opening it read-only and running PRAGMA integrity_check. */
41
+ function verifyBackupIntegrity(path) {
42
+ let db;
43
+ try {
44
+ db = new Database(path, { readonly: true });
45
+ const result = db.query("PRAGMA integrity_check").get();
46
+ if (!result || result.integrity_check !== "ok") {
47
+ throw Object.assign(new Error(`Backup integrity check failed: ${result?.integrity_check ?? "unknown error"}.`), { status: 400 });
48
+ }
49
+ }
50
+ finally {
51
+ db?.close();
52
+ }
53
+ }
54
+ /** Replace the live database file with a verified backup, keeping a `.pre-restore` copy. */
55
+ function swapDatabaseFile(safeBackupPath, safeDbPath) {
56
+ const preRestorePath = `${safeDbPath}.pre-restore`;
57
+ try {
58
+ copyFileSync(safeDbPath, preRestorePath);
59
+ }
60
+ catch {
61
+ // Best effort; continue even if pre-restore copy fails.
62
+ }
63
+ verifyBackupIntegrity(safeBackupPath);
64
+ copyFileSync(safeBackupPath, safeDbPath);
65
+ }
66
+ // ---------------------------------------------------------------------------
67
+ // Public API
68
+ // ---------------------------------------------------------------------------
69
+ /**
70
+ * Create a backup of a database using SQLite's `VACUUM INTO`.
71
+ *
72
+ * The backup is a self-contained, consistent SQLite snapshot stored in
73
+ * `data/{app}/backups/{app}-{timestamp}.db`. Metadata is recorded in the
74
+ * `_backups` table for later listing and restore.
75
+ *
76
+ * `POST /api/admin/:database/backup`
77
+ */
78
+ export function createBackup(pool, databaseName, dataDir, options = {}) {
79
+ validateIdentifier(databaseName, "database name");
80
+ // Ensure _backups table exists
81
+ const db = pool.write();
82
+ db.run(BOOTSTRAP_BACKUPS);
83
+ // Ensure backups directory exists
84
+ const safeName = sanitizePathComponent(databaseName);
85
+ const backupsDir = safeResolvePath(dataDir, `${safeName}/backups`);
86
+ mkdirSync(backupsDir, { recursive: true });
87
+ // Generate backup file name
88
+ const id = generateBackupId();
89
+ const timestamp = new Date().toISOString().replace(/[:.]/g, "-");
90
+ const backupPath = `${backupsDir}/${safeName}-${timestamp}.db`;
91
+ // VACUUM INTO cannot run inside a transaction — execute it directly
92
+ const writeDb = pool.write();
93
+ writeDb.run(`VACUUM INTO ?`, [backupPath]);
94
+ // Get file size
95
+ let sizeBytes = 0;
96
+ try {
97
+ sizeBytes = statSync(backupPath).size;
98
+ }
99
+ catch {
100
+ // Best effort
101
+ }
102
+ const now = new Date().toISOString();
103
+ // Record in _backups (inside a transaction is fine for metadata)
104
+ pool.writeTransaction(() => {
105
+ pool.write().run(`INSERT INTO _backups (id, path, size_bytes, created_at, label) VALUES (?, ?, ?, ?, ?)`, [id, backupPath, sizeBytes, now, options.label || null]);
106
+ });
107
+ return {
108
+ id,
109
+ path: backupPath,
110
+ sizeBytes,
111
+ createdAt: now,
112
+ label: options.label,
113
+ };
114
+ }
115
+ /**
116
+ * List all backups for a database.
117
+ *
118
+ * `GET /api/admin/:database/backups`
119
+ */
120
+ export function listBackups(pool) {
121
+ const db = pool.read();
122
+ // Check if _backups table exists
123
+ const tableExists = db
124
+ .query("SELECT 1 FROM sqlite_master WHERE type='table' AND name='_backups'")
125
+ .get();
126
+ if (!tableExists)
127
+ return [];
128
+ const rows = db
129
+ .query("SELECT id, path, size_bytes, created_at, label FROM _backups ORDER BY created_at DESC")
130
+ .all();
131
+ return rows.map((r) => ({
132
+ id: r.id,
133
+ path: r.path,
134
+ sizeBytes: r.size_bytes,
135
+ createdAt: r.created_at,
136
+ label: r.label || undefined,
137
+ }));
138
+ }
139
+ /**
140
+ * Get a specific backup by ID.
141
+ */
142
+ export function getBackup(pool, backupId) {
143
+ const db = pool.read();
144
+ // Check if _backups table exists
145
+ const tableExists = db
146
+ .query("SELECT 1 FROM sqlite_master WHERE type='table' AND name='_backups'")
147
+ .get();
148
+ if (!tableExists) {
149
+ throw Object.assign(new Error(`Backup "${backupId}" not found.`), { status: 404 });
150
+ }
151
+ const row = db
152
+ .query("SELECT id, path, size_bytes, created_at, label FROM _backups WHERE id=?")
153
+ .get(backupId);
154
+ if (!row) {
155
+ throw Object.assign(new Error(`Backup "${backupId}" not found.`), { status: 404 });
156
+ }
157
+ return {
158
+ id: row.id,
159
+ path: row.path,
160
+ sizeBytes: row.size_bytes,
161
+ createdAt: row.created_at,
162
+ label: row.label || undefined,
163
+ };
164
+ }
165
+ /**
166
+ * Restore a database from a backup snapshot.
167
+ *
168
+ * **This closes the existing connection pool**, swaps the database file
169
+ * with the backup, then reopens the pool. All active connections to the
170
+ * database will be dropped — suitable for maintenance windows.
171
+ *
172
+ * After restore, the `_backups` metadata table persists because it lives
173
+ * inside the backup snapshot itself.
174
+ *
175
+ * `POST /api/admin/:database/restore/:backupId`
176
+ */
177
+ export function restoreBackup(manager, databaseName, backupId) {
178
+ validateIdentifier(databaseName, "database name");
179
+ // First, get the backup info by reading the live database
180
+ const pool = manager.get(databaseName);
181
+ const backup = getBackup(pool, backupId);
182
+ // Verify the backup file exists on disk
183
+ const safeBackupPath = safeResolvePath(manager.getDataDir(), backup.path);
184
+ if (!existsSync(safeBackupPath)) {
185
+ throw Object.assign(new Error(`Backup file not found at "${backup.path}". The file may have been deleted.`), { status: 404 });
186
+ }
187
+ // Get the database path before closing
188
+ const dbInfo = manager.listDatabases().find((d) => d.name === databaseName);
189
+ if (!dbInfo) {
190
+ throw Object.assign(new Error(`Database "${databaseName}" not found.`), { status: 404 });
191
+ }
192
+ const safeDbPath = safeResolvePath(manager.getDataDir(), dbInfo.path);
193
+ // Close the existing pool (drops all connections)
194
+ manager.closePool(databaseName);
195
+ // Copy backup file over the live database file
196
+ try {
197
+ swapDatabaseFile(safeBackupPath, safeDbPath);
198
+ }
199
+ catch (err) {
200
+ // Try to reopen the original pool on failure
201
+ manager.get(databaseName);
202
+ throw Object.assign(new Error(`Failed to restore from backup: ${err.message}`), { status: err.status || 500 });
203
+ }
204
+ // Reopen the pool (this will create a fresh DatabasePool at the existing path)
205
+ manager.get(databaseName);
206
+ return {
207
+ database: databaseName,
208
+ backupPath: backup.path,
209
+ restoredAt: new Date().toISOString(),
210
+ };
211
+ }
212
+ /**
213
+ * Restore a database directly from a file path (CLI usage).
214
+ *
215
+ * Useful when the backup file is not tracked in `_backups` metadata,
216
+ * e.g., a backup copied from another machine.
217
+ */
218
+ export function restoreFromFile(manager, databaseName, backupFilePath) {
219
+ validateIdentifier(databaseName, "database name");
220
+ // Verify the backup file exists and is inside the data directory
221
+ const safeBackupPath = safeResolvePath(manager.getDataDir(), backupFilePath);
222
+ if (!existsSync(safeBackupPath)) {
223
+ throw Object.assign(new Error(`Backup file not found at "${backupFilePath}".`), { status: 404 });
224
+ }
225
+ // Verify it looks like a SQLite database
226
+ const headerBytes = readFileSync(safeBackupPath);
227
+ const header = Buffer.from(headerBytes.subarray(0, 16)).toString("utf8");
228
+ if (!header.startsWith("SQLite format 3")) {
229
+ throw Object.assign(new Error(`File at "${backupFilePath}" is not a valid SQLite database.`), { status: 400 });
230
+ }
231
+ // Get the database path
232
+ const dbInfo = manager.listDatabases().find((d) => d.name === databaseName);
233
+ if (!dbInfo) {
234
+ throw Object.assign(new Error(`Database "${databaseName}" not found.`), { status: 404 });
235
+ }
236
+ const safeDbPath = safeResolvePath(manager.getDataDir(), dbInfo.path);
237
+ // Close the existing pool
238
+ manager.closePool(databaseName);
239
+ // Copy backup file over the live database file
240
+ try {
241
+ swapDatabaseFile(safeBackupPath, safeDbPath);
242
+ }
243
+ catch (err) {
244
+ manager.get(databaseName);
245
+ throw Object.assign(new Error(`Failed to restore from file: ${err.message}`), { status: err.status || 500 });
246
+ }
247
+ // Reopen
248
+ manager.get(databaseName);
249
+ return {
250
+ database: databaseName,
251
+ backupPath: backupFilePath,
252
+ restoredAt: new Date().toISOString(),
253
+ };
254
+ }
255
+ //# sourceMappingURL=backup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backup.js","sourceRoot":"","sources":["../../src/admin/backup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare function parseCSV(text: string): string[][];
2
+ export declare function coerceCSVValue(value: string): unknown;
3
+ export declare function recordsToCSV(records: Record<string, unknown>[], fields: string[]): string;
4
+ //# sourceMappingURL=csv.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"csv.d.ts","sourceRoot":"","sources":["../../../src/admin/import-export/csv.ts"],"names":[],"mappings":"AAAA,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,CA6EjD;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAarD;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAezF"}
@@ -0,0 +1,123 @@
1
+ export function parseCSV(text) {
2
+ const rows = [];
3
+ const len = text.length;
4
+ let i = 0;
5
+ let currentRow = [];
6
+ let currentField = "";
7
+ let inQuotes = false;
8
+ while (i < len) {
9
+ const ch = text[i];
10
+ if (inQuotes) {
11
+ if (ch === '"') {
12
+ if (i + 1 < len && text[i + 1] === '"') {
13
+ currentField += '"';
14
+ i += 2;
15
+ continue;
16
+ }
17
+ inQuotes = false;
18
+ i += 1;
19
+ }
20
+ else {
21
+ currentField += ch;
22
+ i += 1;
23
+ }
24
+ }
25
+ else {
26
+ if (ch === '"') {
27
+ if (currentField === "") {
28
+ inQuotes = true;
29
+ i += 1;
30
+ }
31
+ else {
32
+ currentField += ch;
33
+ i += 1;
34
+ }
35
+ }
36
+ else if (ch === ",") {
37
+ currentRow.push(currentField);
38
+ currentField = "";
39
+ i += 1;
40
+ }
41
+ else if (ch === "\r") {
42
+ if (i + 1 < len && text[i + 1] === "\n") {
43
+ currentRow.push(currentField);
44
+ rows.push(currentRow);
45
+ currentRow = [];
46
+ currentField = "";
47
+ i += 2;
48
+ }
49
+ else {
50
+ currentRow.push(currentField);
51
+ rows.push(currentRow);
52
+ currentRow = [];
53
+ currentField = "";
54
+ i += 1;
55
+ }
56
+ }
57
+ else if (ch === "\n") {
58
+ currentRow.push(currentField);
59
+ rows.push(currentRow);
60
+ currentRow = [];
61
+ currentField = "";
62
+ i += 1;
63
+ }
64
+ else {
65
+ currentField += ch;
66
+ i += 1;
67
+ }
68
+ }
69
+ }
70
+ if (currentField !== "" || currentRow.length > 0) {
71
+ currentRow.push(currentField);
72
+ }
73
+ if (currentRow.length > 0) {
74
+ rows.push(currentRow);
75
+ }
76
+ if (rows.length === 1 && rows[0].length === 1 && rows[0][0] === "") {
77
+ return [];
78
+ }
79
+ return rows;
80
+ }
81
+ export function coerceCSVValue(value) {
82
+ if (value.toLowerCase() === "true")
83
+ return true;
84
+ if (value.toLowerCase() === "false")
85
+ return false;
86
+ if (value === "" || value.toLowerCase() === "null")
87
+ return null;
88
+ if (/^-?\d+$/.test(value)) {
89
+ const n = parseInt(value, 10);
90
+ if (Number.isSafeInteger(n))
91
+ return n;
92
+ }
93
+ if (/^-?\d+\.\d+$/.test(value)) {
94
+ const n = parseFloat(value);
95
+ if (!Number.isNaN(n))
96
+ return n;
97
+ }
98
+ return value;
99
+ }
100
+ export function recordsToCSV(records, fields) {
101
+ const lines = [];
102
+ lines.push(fields.map((f) => escapeCSVField(f)).join(","));
103
+ for (const record of records) {
104
+ const values = fields.map((field) => {
105
+ const value = record[field];
106
+ if (value === null || value === undefined)
107
+ return "";
108
+ if (typeof value === "object") {
109
+ return escapeCSVField(JSON.stringify(value));
110
+ }
111
+ return escapeCSVField(String(value));
112
+ });
113
+ lines.push(values.join(","));
114
+ }
115
+ return lines.join("\n") + (records.length > 0 || fields.length > 0 ? "\n" : "");
116
+ }
117
+ function escapeCSVField(value) {
118
+ if (value.includes(",") || value.includes('"') || value.includes("\n") || value.includes("\r")) {
119
+ return `"${value.replace(/"/g, '""')}"`;
120
+ }
121
+ return value;
122
+ }
123
+ //# sourceMappingURL=csv.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"csv.js","sourceRoot":"","sources":["../../../src/admin/import-export/csv.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { DatabasePool } from "../../db/pool";
2
+ import { ExportOptions, ExportResult } from "./types";
3
+ export declare function exportData(pool: DatabasePool, collection: string, options?: ExportOptions): ExportResult;
4
+ //# sourceMappingURL=export.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../../../src/admin/import-export/export.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAK7C,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEtD,wBAAgB,UAAU,CACxB,IAAI,EAAE,YAAY,EAClB,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,aAAkB,GAC1B,YAAY,CAmEd"}
@@ -0,0 +1,66 @@
1
+ import { validateIdentifier } from "@boltstore/utils";
2
+ import { getCollection } from "../../collections";
3
+ import { listRecords } from "../../records";
4
+ import { recordsToCSV } from "./csv";
5
+ export function exportData(pool, collection, options = {}) {
6
+ validateIdentifier(collection, "collection name");
7
+ const format = options.format ?? "json";
8
+ let exportFields;
9
+ if (options.fields && options.fields.length > 0) {
10
+ exportFields = options.fields;
11
+ }
12
+ else {
13
+ try {
14
+ const info = getCollection(pool, collection);
15
+ exportFields = info.schema.map((c) => c.name);
16
+ }
17
+ catch {
18
+ exportFields = [];
19
+ }
20
+ }
21
+ const records = listRecords(pool, collection, {
22
+ filter: options.filter,
23
+ sort: options.sort,
24
+ direction: options.direction,
25
+ limit: options.limit,
26
+ offset: options.offset,
27
+ });
28
+ const filtered = exportFields.length > 0
29
+ ? records.map((rec) => {
30
+ const out = {};
31
+ for (const f of exportFields) {
32
+ if (f in rec)
33
+ out[f] = rec[f];
34
+ }
35
+ return out;
36
+ })
37
+ : records;
38
+ if (format === "csv") {
39
+ const fields = exportFields.length > 0 ? exportFields : Array.from(new Set(filtered.flatMap((r) => Object.keys(r))));
40
+ const csv = recordsToCSV(filtered, fields);
41
+ return {
42
+ data: csv,
43
+ meta: {
44
+ recordCount: records.length,
45
+ format: "csv",
46
+ collection,
47
+ },
48
+ };
49
+ }
50
+ return {
51
+ data: JSON.stringify({
52
+ data: filtered,
53
+ meta: {
54
+ recordCount: records.length,
55
+ format: "json",
56
+ collection,
57
+ },
58
+ }),
59
+ meta: {
60
+ recordCount: records.length,
61
+ format: "json",
62
+ collection,
63
+ },
64
+ };
65
+ }
66
+ //# sourceMappingURL=export.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export.js","sourceRoot":"","sources":["../../../src/admin/import-export/export.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAGrC,MAAM,UAAU,UAAU,CACxB,IAAkB,EAClB,UAAkB,EAClB,UAAyB,EAAE;IAE3B,kBAAkB,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC;IAElD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,MAAM,CAAC;IAExC,IAAI,YAAsB,CAAC;IAC3B,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChD,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAChC,CAAC;SAAM,CAAC;QACN,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;YAC7C,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAmB,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAClE,CAAC;QAAC,MAAM,CAAC;YACP,YAAY,GAAG,EAAE,CAAC;QACpB,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,EAAE,UAAU,EAAE;QAC5C,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,YAAY,CAAC,MAAM,GAAG,CAAC;QACtC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAA4B,EAAE,EAAE;YAC3C,MAAM,GAAG,GAA4B,EAAE,CAAC;YACxC,KAAK,MAAM,CAAC,IAAI,YAAY,EAAE,CAAC;gBAC7B,IAAI,CAAC,IAAI,GAAG;oBAAE,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;YAChC,CAAC;YACD,OAAO,GAAG,CAAC;QACb,CAAC,CAAC;QACJ,CAAC,CAAC,OAAO,CAAC;IAEZ,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;QACrB,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAChE,IAAI,GAAG,CAAS,QAAQ,CAAC,OAAO,CAAC,CAAC,CAA0B,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAClF,CAAC;QAEF,MAAM,GAAG,GAAG,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAE3C,OAAO;YACL,IAAI,EAAE,GAAG;YACT,IAAI,EAAE;gBACJ,WAAW,EAAE,OAAO,CAAC,MAAM;gBAC3B,MAAM,EAAE,KAAK;gBACb,UAAU;aACX;SACF,CAAC;IACJ,CAAC;IAED,OAAO;QACL,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE;gBACJ,WAAW,EAAE,OAAO,CAAC,MAAM;gBAC3B,MAAM,EAAE,MAAM;gBACd,UAAU;aACX;SACF,CAAC;QACF,IAAI,EAAE;YACJ,WAAW,EAAE,OAAO,CAAC,MAAM;YAC3B,MAAM,EAAE,MAAM;YACd,UAAU;SACX;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { DatabasePool } from "../../db/pool";
2
+ import { ImportOptions, ImportResult } from "./types";
3
+ export declare function importData(pool: DatabasePool, collection: string, input: string, options?: ImportOptions): ImportResult;
4
+ //# sourceMappingURL=import.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import.d.ts","sourceRoot":"","sources":["../../../src/admin/import-export/import.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAQ7C,OAAO,EAAE,aAAa,EAAE,YAAY,EAAkB,MAAM,SAAS,CAAC;AA+EtE,wBAAgB,UAAU,CACxB,IAAI,EAAE,YAAY,EAClB,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,aAAkB,GAC1B,YAAY,CAuNd"}