anchordb 0.2.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 (438) hide show
  1. package/CHANGELOG.md +61 -0
  2. package/LICENSE +21 -0
  3. package/README.md +160 -0
  4. package/dist/cjs/conflict/strategies.d.ts +110 -0
  5. package/dist/cjs/conflict/strategies.d.ts.map +1 -0
  6. package/dist/cjs/conflict/strategies.js +298 -0
  7. package/dist/cjs/conflict/strategies.js.map +1 -0
  8. package/dist/cjs/conflict/types.d.ts +38 -0
  9. package/dist/cjs/conflict/types.d.ts.map +1 -0
  10. package/dist/cjs/conflict/types.js +3 -0
  11. package/dist/cjs/conflict/types.js.map +1 -0
  12. package/dist/cjs/core/anchor-db.d.ts +154 -0
  13. package/dist/cjs/core/anchor-db.d.ts.map +1 -0
  14. package/dist/cjs/core/anchor-db.js +273 -0
  15. package/dist/cjs/core/anchor-db.js.map +1 -0
  16. package/dist/cjs/core/errors.d.ts +125 -0
  17. package/dist/cjs/core/errors.d.ts.map +1 -0
  18. package/dist/cjs/core/errors.js +174 -0
  19. package/dist/cjs/core/errors.js.map +1 -0
  20. package/dist/cjs/core/hex.d.ts +4 -0
  21. package/dist/cjs/core/hex.d.ts.map +1 -0
  22. package/dist/cjs/core/hex.js +41 -0
  23. package/dist/cjs/core/hex.js.map +1 -0
  24. package/dist/cjs/core/hlc.d.ts +96 -0
  25. package/dist/cjs/core/hlc.d.ts.map +1 -0
  26. package/dist/cjs/core/hlc.js +161 -0
  27. package/dist/cjs/core/hlc.js.map +1 -0
  28. package/dist/cjs/core/object-id.d.ts +38 -0
  29. package/dist/cjs/core/object-id.d.ts.map +1 -0
  30. package/dist/cjs/core/object-id.js +167 -0
  31. package/dist/cjs/core/object-id.js.map +1 -0
  32. package/dist/cjs/core/random.d.ts +6 -0
  33. package/dist/cjs/core/random.d.ts.map +1 -0
  34. package/dist/cjs/core/random.js +39 -0
  35. package/dist/cjs/core/random.js.map +1 -0
  36. package/dist/cjs/core/runtime.d.ts +96 -0
  37. package/dist/cjs/core/runtime.d.ts.map +1 -0
  38. package/dist/cjs/core/runtime.js +3 -0
  39. package/dist/cjs/core/runtime.js.map +1 -0
  40. package/dist/cjs/core/uuid.d.ts +16 -0
  41. package/dist/cjs/core/uuid.d.ts.map +1 -0
  42. package/dist/cjs/core/uuid.js +37 -0
  43. package/dist/cjs/core/uuid.js.map +1 -0
  44. package/dist/cjs/decorators/index.d.ts +48 -0
  45. package/dist/cjs/decorators/index.d.ts.map +1 -0
  46. package/dist/cjs/decorators/index.js +295 -0
  47. package/dist/cjs/decorators/index.js.map +1 -0
  48. package/dist/cjs/events/emitter.d.ts +16 -0
  49. package/dist/cjs/events/emitter.d.ts.map +1 -0
  50. package/dist/cjs/events/emitter.js +56 -0
  51. package/dist/cjs/events/emitter.js.map +1 -0
  52. package/dist/cjs/index/keys.d.ts +79 -0
  53. package/dist/cjs/index/keys.d.ts.map +1 -0
  54. package/dist/cjs/index/keys.js +208 -0
  55. package/dist/cjs/index/keys.js.map +1 -0
  56. package/dist/cjs/index.d.ts +81 -0
  57. package/dist/cjs/index.d.ts.map +1 -0
  58. package/dist/cjs/index.js +193 -0
  59. package/dist/cjs/index.js.map +1 -0
  60. package/dist/cjs/inspector/agent.d.ts +75 -0
  61. package/dist/cjs/inspector/agent.d.ts.map +1 -0
  62. package/dist/cjs/inspector/agent.js +520 -0
  63. package/dist/cjs/inspector/agent.js.map +1 -0
  64. package/dist/cjs/inspector/auth.d.ts +49 -0
  65. package/dist/cjs/inspector/auth.d.ts.map +1 -0
  66. package/dist/cjs/inspector/auth.js +234 -0
  67. package/dist/cjs/inspector/auth.js.map +1 -0
  68. package/dist/cjs/inspector/bridge.d.ts +141 -0
  69. package/dist/cjs/inspector/bridge.d.ts.map +1 -0
  70. package/dist/cjs/inspector/bridge.js +190 -0
  71. package/dist/cjs/inspector/bridge.js.map +1 -0
  72. package/dist/cjs/inspector/client.d.ts +111 -0
  73. package/dist/cjs/inspector/client.d.ts.map +1 -0
  74. package/dist/cjs/inspector/client.js +218 -0
  75. package/dist/cjs/inspector/client.js.map +1 -0
  76. package/dist/cjs/inspector/protocol.d.ts +160 -0
  77. package/dist/cjs/inspector/protocol.d.ts.map +1 -0
  78. package/dist/cjs/inspector/protocol.js +53 -0
  79. package/dist/cjs/inspector/protocol.js.map +1 -0
  80. package/dist/cjs/inspector/transports/in-process.d.ts +7 -0
  81. package/dist/cjs/inspector/transports/in-process.d.ts.map +1 -0
  82. package/dist/cjs/inspector/transports/in-process.js +58 -0
  83. package/dist/cjs/inspector/transports/in-process.js.map +1 -0
  84. package/dist/cjs/inspector/transports/websocket.d.ts +39 -0
  85. package/dist/cjs/inspector/transports/websocket.d.ts.map +1 -0
  86. package/dist/cjs/inspector/transports/websocket.js +60 -0
  87. package/dist/cjs/inspector/transports/websocket.js.map +1 -0
  88. package/dist/cjs/interop/csv.d.ts +53 -0
  89. package/dist/cjs/interop/csv.d.ts.map +1 -0
  90. package/dist/cjs/interop/csv.js +230 -0
  91. package/dist/cjs/interop/csv.js.map +1 -0
  92. package/dist/cjs/interop/ejson.d.ts +41 -0
  93. package/dist/cjs/interop/ejson.d.ts.map +1 -0
  94. package/dist/cjs/interop/ejson.js +182 -0
  95. package/dist/cjs/interop/ejson.js.map +1 -0
  96. package/dist/cjs/interop/export-import.d.ts +98 -0
  97. package/dist/cjs/interop/export-import.d.ts.map +1 -0
  98. package/dist/cjs/interop/export-import.js +222 -0
  99. package/dist/cjs/interop/export-import.js.map +1 -0
  100. package/dist/cjs/model/document.d.ts +66 -0
  101. package/dist/cjs/model/document.d.ts.map +1 -0
  102. package/dist/cjs/model/document.js +302 -0
  103. package/dist/cjs/model/document.js.map +1 -0
  104. package/dist/cjs/model/model.d.ts +178 -0
  105. package/dist/cjs/model/model.d.ts.map +1 -0
  106. package/dist/cjs/model/model.js +823 -0
  107. package/dist/cjs/model/model.js.map +1 -0
  108. package/dist/cjs/package.json +3 -0
  109. package/dist/cjs/query/aggregation/expressions.d.ts +34 -0
  110. package/dist/cjs/query/aggregation/expressions.d.ts.map +1 -0
  111. package/dist/cjs/query/aggregation/expressions.js +552 -0
  112. package/dist/cjs/query/aggregation/expressions.js.map +1 -0
  113. package/dist/cjs/query/aggregation/pipeline.d.ts +79 -0
  114. package/dist/cjs/query/aggregation/pipeline.d.ts.map +1 -0
  115. package/dist/cjs/query/aggregation/pipeline.js +597 -0
  116. package/dist/cjs/query/aggregation/pipeline.js.map +1 -0
  117. package/dist/cjs/query/aggregation/source.d.ts +35 -0
  118. package/dist/cjs/query/aggregation/source.d.ts.map +1 -0
  119. package/dist/cjs/query/aggregation/source.js +81 -0
  120. package/dist/cjs/query/aggregation/source.js.map +1 -0
  121. package/dist/cjs/query/builder/query.d.ts +113 -0
  122. package/dist/cjs/query/builder/query.d.ts.map +1 -0
  123. package/dist/cjs/query/builder/query.js +215 -0
  124. package/dist/cjs/query/builder/query.js.map +1 -0
  125. package/dist/cjs/query/filter.d.ts +50 -0
  126. package/dist/cjs/query/filter.d.ts.map +1 -0
  127. package/dist/cjs/query/filter.js +275 -0
  128. package/dist/cjs/query/filter.js.map +1 -0
  129. package/dist/cjs/query/path.d.ts +41 -0
  130. package/dist/cjs/query/path.d.ts.map +1 -0
  131. package/dist/cjs/query/path.js +294 -0
  132. package/dist/cjs/query/path.js.map +1 -0
  133. package/dist/cjs/query/update.d.ts +30 -0
  134. package/dist/cjs/query/update.d.ts.map +1 -0
  135. package/dist/cjs/query/update.js +205 -0
  136. package/dist/cjs/query/update.js.map +1 -0
  137. package/dist/cjs/reactive/live-query.d.ts +41 -0
  138. package/dist/cjs/reactive/live-query.d.ts.map +1 -0
  139. package/dist/cjs/reactive/live-query.js +88 -0
  140. package/dist/cjs/reactive/live-query.js.map +1 -0
  141. package/dist/cjs/schema/cast.d.ts +38 -0
  142. package/dist/cjs/schema/cast.d.ts.map +1 -0
  143. package/dist/cjs/schema/cast.js +280 -0
  144. package/dist/cjs/schema/cast.js.map +1 -0
  145. package/dist/cjs/schema/index.d.ts +5 -0
  146. package/dist/cjs/schema/index.d.ts.map +1 -0
  147. package/dist/cjs/schema/index.js +27 -0
  148. package/dist/cjs/schema/index.js.map +1 -0
  149. package/dist/cjs/schema/schema.d.ts +58 -0
  150. package/dist/cjs/schema/schema.d.ts.map +1 -0
  151. package/dist/cjs/schema/schema.js +363 -0
  152. package/dist/cjs/schema/schema.js.map +1 -0
  153. package/dist/cjs/schema/types.d.ts +144 -0
  154. package/dist/cjs/schema/types.d.ts.map +1 -0
  155. package/dist/cjs/schema/types.js +20 -0
  156. package/dist/cjs/schema/types.js.map +1 -0
  157. package/dist/cjs/schema/validate.d.ts +15 -0
  158. package/dist/cjs/schema/validate.d.ts.map +1 -0
  159. package/dist/cjs/schema/validate.js +101 -0
  160. package/dist/cjs/schema/validate.js.map +1 -0
  161. package/dist/cjs/storage/adapters/capacitor-sqlite.d.ts +67 -0
  162. package/dist/cjs/storage/adapters/capacitor-sqlite.d.ts.map +1 -0
  163. package/dist/cjs/storage/adapters/capacitor-sqlite.js +69 -0
  164. package/dist/cjs/storage/adapters/capacitor-sqlite.js.map +1 -0
  165. package/dist/cjs/storage/adapters/expo-sqlite.d.ts +55 -0
  166. package/dist/cjs/storage/adapters/expo-sqlite.d.ts.map +1 -0
  167. package/dist/cjs/storage/adapters/expo-sqlite.js +53 -0
  168. package/dist/cjs/storage/adapters/expo-sqlite.js.map +1 -0
  169. package/dist/cjs/storage/adapters/indexeddb.d.ts +55 -0
  170. package/dist/cjs/storage/adapters/indexeddb.d.ts.map +1 -0
  171. package/dist/cjs/storage/adapters/indexeddb.js +393 -0
  172. package/dist/cjs/storage/adapters/indexeddb.js.map +1 -0
  173. package/dist/cjs/storage/adapters/memory.d.ts +44 -0
  174. package/dist/cjs/storage/adapters/memory.d.ts.map +1 -0
  175. package/dist/cjs/storage/adapters/memory.js +286 -0
  176. package/dist/cjs/storage/adapters/memory.js.map +1 -0
  177. package/dist/cjs/storage/adapters/node-sqlite.d.ts +59 -0
  178. package/dist/cjs/storage/adapters/node-sqlite.d.ts.map +1 -0
  179. package/dist/cjs/storage/adapters/node-sqlite.js +457 -0
  180. package/dist/cjs/storage/adapters/node-sqlite.js.map +1 -0
  181. package/dist/cjs/storage/adapters/sql-base.d.ts +84 -0
  182. package/dist/cjs/storage/adapters/sql-base.d.ts.map +1 -0
  183. package/dist/cjs/storage/adapters/sql-base.js +393 -0
  184. package/dist/cjs/storage/adapters/sql-base.js.map +1 -0
  185. package/dist/cjs/storage/types.d.ts +131 -0
  186. package/dist/cjs/storage/types.d.ts.map +1 -0
  187. package/dist/cjs/storage/types.js +3 -0
  188. package/dist/cjs/storage/types.js.map +1 -0
  189. package/dist/cjs/sync/adapters/rest.d.ts +31 -0
  190. package/dist/cjs/sync/adapters/rest.d.ts.map +1 -0
  191. package/dist/cjs/sync/adapters/rest.js +75 -0
  192. package/dist/cjs/sync/adapters/rest.js.map +1 -0
  193. package/dist/cjs/sync/attach.d.ts +30 -0
  194. package/dist/cjs/sync/attach.d.ts.map +1 -0
  195. package/dist/cjs/sync/attach.js +104 -0
  196. package/dist/cjs/sync/attach.js.map +1 -0
  197. package/dist/cjs/sync/engine.d.ts +96 -0
  198. package/dist/cjs/sync/engine.d.ts.map +1 -0
  199. package/dist/cjs/sync/engine.js +491 -0
  200. package/dist/cjs/sync/engine.js.map +1 -0
  201. package/dist/cjs/sync/protocol.d.ts +128 -0
  202. package/dist/cjs/sync/protocol.d.ts.map +1 -0
  203. package/dist/cjs/sync/protocol.js +38 -0
  204. package/dist/cjs/sync/protocol.js.map +1 -0
  205. package/dist/cjs/sync/queue.d.ts +77 -0
  206. package/dist/cjs/sync/queue.d.ts.map +1 -0
  207. package/dist/cjs/sync/queue.js +245 -0
  208. package/dist/cjs/sync/queue.js.map +1 -0
  209. package/dist/cjs/sync/server/memory-server.d.ts +65 -0
  210. package/dist/cjs/sync/server/memory-server.d.ts.map +1 -0
  211. package/dist/cjs/sync/server/memory-server.js +193 -0
  212. package/dist/cjs/sync/server/memory-server.js.map +1 -0
  213. package/dist/cjs/timestamps/index.d.ts +47 -0
  214. package/dist/cjs/timestamps/index.d.ts.map +1 -0
  215. package/dist/cjs/timestamps/index.js +88 -0
  216. package/dist/cjs/timestamps/index.js.map +1 -0
  217. package/dist/cjs/timestamps/timezone.d.ts +65 -0
  218. package/dist/cjs/timestamps/timezone.d.ts.map +1 -0
  219. package/dist/cjs/timestamps/timezone.js +208 -0
  220. package/dist/cjs/timestamps/timezone.js.map +1 -0
  221. package/dist/esm/conflict/strategies.d.ts +110 -0
  222. package/dist/esm/conflict/strategies.d.ts.map +1 -0
  223. package/dist/esm/conflict/strategies.js +289 -0
  224. package/dist/esm/conflict/strategies.js.map +1 -0
  225. package/dist/esm/conflict/types.d.ts +38 -0
  226. package/dist/esm/conflict/types.d.ts.map +1 -0
  227. package/dist/esm/conflict/types.js +2 -0
  228. package/dist/esm/conflict/types.js.map +1 -0
  229. package/dist/esm/core/anchor-db.d.ts +154 -0
  230. package/dist/esm/core/anchor-db.d.ts.map +1 -0
  231. package/dist/esm/core/anchor-db.js +269 -0
  232. package/dist/esm/core/anchor-db.js.map +1 -0
  233. package/dist/esm/core/errors.d.ts +125 -0
  234. package/dist/esm/core/errors.d.ts.map +1 -0
  235. package/dist/esm/core/errors.js +161 -0
  236. package/dist/esm/core/errors.js.map +1 -0
  237. package/dist/esm/core/hex.d.ts +4 -0
  238. package/dist/esm/core/hex.d.ts.map +1 -0
  239. package/dist/esm/core/hex.js +37 -0
  240. package/dist/esm/core/hex.js.map +1 -0
  241. package/dist/esm/core/hlc.d.ts +96 -0
  242. package/dist/esm/core/hlc.d.ts.map +1 -0
  243. package/dist/esm/core/hlc.js +153 -0
  244. package/dist/esm/core/hlc.js.map +1 -0
  245. package/dist/esm/core/object-id.d.ts +38 -0
  246. package/dist/esm/core/object-id.d.ts.map +1 -0
  247. package/dist/esm/core/object-id.js +163 -0
  248. package/dist/esm/core/object-id.js.map +1 -0
  249. package/dist/esm/core/random.d.ts +6 -0
  250. package/dist/esm/core/random.d.ts.map +1 -0
  251. package/dist/esm/core/random.js +34 -0
  252. package/dist/esm/core/random.js.map +1 -0
  253. package/dist/esm/core/runtime.d.ts +96 -0
  254. package/dist/esm/core/runtime.d.ts.map +1 -0
  255. package/dist/esm/core/runtime.js +2 -0
  256. package/dist/esm/core/runtime.js.map +1 -0
  257. package/dist/esm/core/uuid.d.ts +16 -0
  258. package/dist/esm/core/uuid.d.ts.map +1 -0
  259. package/dist/esm/core/uuid.js +33 -0
  260. package/dist/esm/core/uuid.js.map +1 -0
  261. package/dist/esm/decorators/index.d.ts +48 -0
  262. package/dist/esm/decorators/index.d.ts.map +1 -0
  263. package/dist/esm/decorators/index.js +286 -0
  264. package/dist/esm/decorators/index.js.map +1 -0
  265. package/dist/esm/events/emitter.d.ts +16 -0
  266. package/dist/esm/events/emitter.d.ts.map +1 -0
  267. package/dist/esm/events/emitter.js +52 -0
  268. package/dist/esm/events/emitter.js.map +1 -0
  269. package/dist/esm/index/keys.d.ts +79 -0
  270. package/dist/esm/index/keys.d.ts.map +1 -0
  271. package/dist/esm/index/keys.js +198 -0
  272. package/dist/esm/index/keys.js.map +1 -0
  273. package/dist/esm/index.d.ts +81 -0
  274. package/dist/esm/index.d.ts.map +1 -0
  275. package/dist/esm/index.js +59 -0
  276. package/dist/esm/index.js.map +1 -0
  277. package/dist/esm/inspector/agent.d.ts +75 -0
  278. package/dist/esm/inspector/agent.d.ts.map +1 -0
  279. package/dist/esm/inspector/agent.js +482 -0
  280. package/dist/esm/inspector/agent.js.map +1 -0
  281. package/dist/esm/inspector/auth.d.ts +49 -0
  282. package/dist/esm/inspector/auth.d.ts.map +1 -0
  283. package/dist/esm/inspector/auth.js +228 -0
  284. package/dist/esm/inspector/auth.js.map +1 -0
  285. package/dist/esm/inspector/bridge.d.ts +141 -0
  286. package/dist/esm/inspector/bridge.d.ts.map +1 -0
  287. package/dist/esm/inspector/bridge.js +182 -0
  288. package/dist/esm/inspector/bridge.js.map +1 -0
  289. package/dist/esm/inspector/client.d.ts +111 -0
  290. package/dist/esm/inspector/client.d.ts.map +1 -0
  291. package/dist/esm/inspector/client.js +213 -0
  292. package/dist/esm/inspector/client.js.map +1 -0
  293. package/dist/esm/inspector/protocol.d.ts +160 -0
  294. package/dist/esm/inspector/protocol.d.ts.map +1 -0
  295. package/dist/esm/inspector/protocol.js +43 -0
  296. package/dist/esm/inspector/protocol.js.map +1 -0
  297. package/dist/esm/inspector/transports/in-process.d.ts +7 -0
  298. package/dist/esm/inspector/transports/in-process.d.ts.map +1 -0
  299. package/dist/esm/inspector/transports/in-process.js +55 -0
  300. package/dist/esm/inspector/transports/in-process.js.map +1 -0
  301. package/dist/esm/inspector/transports/websocket.d.ts +39 -0
  302. package/dist/esm/inspector/transports/websocket.d.ts.map +1 -0
  303. package/dist/esm/inspector/transports/websocket.js +56 -0
  304. package/dist/esm/inspector/transports/websocket.js.map +1 -0
  305. package/dist/esm/interop/csv.d.ts +53 -0
  306. package/dist/esm/interop/csv.d.ts.map +1 -0
  307. package/dist/esm/interop/csv.js +222 -0
  308. package/dist/esm/interop/csv.js.map +1 -0
  309. package/dist/esm/interop/ejson.d.ts +41 -0
  310. package/dist/esm/interop/ejson.d.ts.map +1 -0
  311. package/dist/esm/interop/ejson.js +176 -0
  312. package/dist/esm/interop/ejson.js.map +1 -0
  313. package/dist/esm/interop/export-import.d.ts +98 -0
  314. package/dist/esm/interop/export-import.d.ts.map +1 -0
  315. package/dist/esm/interop/export-import.js +210 -0
  316. package/dist/esm/interop/export-import.js.map +1 -0
  317. package/dist/esm/model/document.d.ts +66 -0
  318. package/dist/esm/model/document.d.ts.map +1 -0
  319. package/dist/esm/model/document.js +297 -0
  320. package/dist/esm/model/document.js.map +1 -0
  321. package/dist/esm/model/model.d.ts +178 -0
  322. package/dist/esm/model/model.d.ts.map +1 -0
  323. package/dist/esm/model/model.js +815 -0
  324. package/dist/esm/model/model.js.map +1 -0
  325. package/dist/esm/package.json +3 -0
  326. package/dist/esm/query/aggregation/expressions.d.ts +34 -0
  327. package/dist/esm/query/aggregation/expressions.d.ts.map +1 -0
  328. package/dist/esm/query/aggregation/expressions.js +545 -0
  329. package/dist/esm/query/aggregation/expressions.js.map +1 -0
  330. package/dist/esm/query/aggregation/pipeline.d.ts +79 -0
  331. package/dist/esm/query/aggregation/pipeline.d.ts.map +1 -0
  332. package/dist/esm/query/aggregation/pipeline.js +591 -0
  333. package/dist/esm/query/aggregation/pipeline.js.map +1 -0
  334. package/dist/esm/query/aggregation/source.d.ts +35 -0
  335. package/dist/esm/query/aggregation/source.d.ts.map +1 -0
  336. package/dist/esm/query/aggregation/source.js +77 -0
  337. package/dist/esm/query/aggregation/source.js.map +1 -0
  338. package/dist/esm/query/builder/query.d.ts +113 -0
  339. package/dist/esm/query/builder/query.d.ts.map +1 -0
  340. package/dist/esm/query/builder/query.js +209 -0
  341. package/dist/esm/query/builder/query.js.map +1 -0
  342. package/dist/esm/query/filter.d.ts +50 -0
  343. package/dist/esm/query/filter.d.ts.map +1 -0
  344. package/dist/esm/query/filter.js +267 -0
  345. package/dist/esm/query/filter.js.map +1 -0
  346. package/dist/esm/query/path.d.ts +41 -0
  347. package/dist/esm/query/path.d.ts.map +1 -0
  348. package/dist/esm/query/path.js +282 -0
  349. package/dist/esm/query/path.js.map +1 -0
  350. package/dist/esm/query/update.d.ts +30 -0
  351. package/dist/esm/query/update.d.ts.map +1 -0
  352. package/dist/esm/query/update.js +198 -0
  353. package/dist/esm/query/update.js.map +1 -0
  354. package/dist/esm/reactive/live-query.d.ts +41 -0
  355. package/dist/esm/reactive/live-query.d.ts.map +1 -0
  356. package/dist/esm/reactive/live-query.js +83 -0
  357. package/dist/esm/reactive/live-query.js.map +1 -0
  358. package/dist/esm/schema/cast.d.ts +38 -0
  359. package/dist/esm/schema/cast.d.ts.map +1 -0
  360. package/dist/esm/schema/cast.js +275 -0
  361. package/dist/esm/schema/cast.js.map +1 -0
  362. package/dist/esm/schema/index.d.ts +5 -0
  363. package/dist/esm/schema/index.d.ts.map +1 -0
  364. package/dist/esm/schema/index.js +5 -0
  365. package/dist/esm/schema/index.js.map +1 -0
  366. package/dist/esm/schema/schema.d.ts +58 -0
  367. package/dist/esm/schema/schema.d.ts.map +1 -0
  368. package/dist/esm/schema/schema.js +358 -0
  369. package/dist/esm/schema/schema.js.map +1 -0
  370. package/dist/esm/schema/types.d.ts +144 -0
  371. package/dist/esm/schema/types.d.ts.map +1 -0
  372. package/dist/esm/schema/types.js +17 -0
  373. package/dist/esm/schema/types.js.map +1 -0
  374. package/dist/esm/schema/validate.d.ts +15 -0
  375. package/dist/esm/schema/validate.d.ts.map +1 -0
  376. package/dist/esm/schema/validate.js +98 -0
  377. package/dist/esm/schema/validate.js.map +1 -0
  378. package/dist/esm/storage/adapters/capacitor-sqlite.d.ts +67 -0
  379. package/dist/esm/storage/adapters/capacitor-sqlite.d.ts.map +1 -0
  380. package/dist/esm/storage/adapters/capacitor-sqlite.js +65 -0
  381. package/dist/esm/storage/adapters/capacitor-sqlite.js.map +1 -0
  382. package/dist/esm/storage/adapters/expo-sqlite.d.ts +55 -0
  383. package/dist/esm/storage/adapters/expo-sqlite.d.ts.map +1 -0
  384. package/dist/esm/storage/adapters/expo-sqlite.js +49 -0
  385. package/dist/esm/storage/adapters/expo-sqlite.js.map +1 -0
  386. package/dist/esm/storage/adapters/indexeddb.d.ts +55 -0
  387. package/dist/esm/storage/adapters/indexeddb.d.ts.map +1 -0
  388. package/dist/esm/storage/adapters/indexeddb.js +389 -0
  389. package/dist/esm/storage/adapters/indexeddb.js.map +1 -0
  390. package/dist/esm/storage/adapters/memory.d.ts +44 -0
  391. package/dist/esm/storage/adapters/memory.d.ts.map +1 -0
  392. package/dist/esm/storage/adapters/memory.js +282 -0
  393. package/dist/esm/storage/adapters/memory.js.map +1 -0
  394. package/dist/esm/storage/adapters/node-sqlite.d.ts +59 -0
  395. package/dist/esm/storage/adapters/node-sqlite.d.ts.map +1 -0
  396. package/dist/esm/storage/adapters/node-sqlite.js +450 -0
  397. package/dist/esm/storage/adapters/node-sqlite.js.map +1 -0
  398. package/dist/esm/storage/adapters/sql-base.d.ts +84 -0
  399. package/dist/esm/storage/adapters/sql-base.d.ts.map +1 -0
  400. package/dist/esm/storage/adapters/sql-base.js +383 -0
  401. package/dist/esm/storage/adapters/sql-base.js.map +1 -0
  402. package/dist/esm/storage/types.d.ts +131 -0
  403. package/dist/esm/storage/types.d.ts.map +1 -0
  404. package/dist/esm/storage/types.js +2 -0
  405. package/dist/esm/storage/types.js.map +1 -0
  406. package/dist/esm/sync/adapters/rest.d.ts +31 -0
  407. package/dist/esm/sync/adapters/rest.d.ts.map +1 -0
  408. package/dist/esm/sync/adapters/rest.js +71 -0
  409. package/dist/esm/sync/adapters/rest.js.map +1 -0
  410. package/dist/esm/sync/attach.d.ts +30 -0
  411. package/dist/esm/sync/attach.d.ts.map +1 -0
  412. package/dist/esm/sync/attach.js +98 -0
  413. package/dist/esm/sync/attach.js.map +1 -0
  414. package/dist/esm/sync/engine.d.ts +96 -0
  415. package/dist/esm/sync/engine.d.ts.map +1 -0
  416. package/dist/esm/sync/engine.js +487 -0
  417. package/dist/esm/sync/engine.js.map +1 -0
  418. package/dist/esm/sync/protocol.d.ts +128 -0
  419. package/dist/esm/sync/protocol.d.ts.map +1 -0
  420. package/dist/esm/sync/protocol.js +33 -0
  421. package/dist/esm/sync/protocol.js.map +1 -0
  422. package/dist/esm/sync/queue.d.ts +77 -0
  423. package/dist/esm/sync/queue.d.ts.map +1 -0
  424. package/dist/esm/sync/queue.js +241 -0
  425. package/dist/esm/sync/queue.js.map +1 -0
  426. package/dist/esm/sync/server/memory-server.d.ts +65 -0
  427. package/dist/esm/sync/server/memory-server.d.ts.map +1 -0
  428. package/dist/esm/sync/server/memory-server.js +189 -0
  429. package/dist/esm/sync/server/memory-server.js.map +1 -0
  430. package/dist/esm/timestamps/index.d.ts +47 -0
  431. package/dist/esm/timestamps/index.d.ts.map +1 -0
  432. package/dist/esm/timestamps/index.js +70 -0
  433. package/dist/esm/timestamps/index.js.map +1 -0
  434. package/dist/esm/timestamps/timezone.d.ts +65 -0
  435. package/dist/esm/timestamps/timezone.d.ts.map +1 -0
  436. package/dist/esm/timestamps/timezone.js +196 -0
  437. package/dist/esm/timestamps/timezone.js.map +1 -0
  438. package/package.json +163 -0
@@ -0,0 +1,39 @@
1
+ import type { InspectorMessage, InspectorTransport } from "../protocol.js";
2
+ /**
3
+ * WebSocket transport, used by both ends.
4
+ *
5
+ * React Native, browsers and Node 22+ all provide a WebSocket **client**, and none of them provide
6
+ * a server without a native module. That asymmetry is why the cross-device topology has both the
7
+ * app and Lens dial out to a relay rather than one of them listening: this single client-side
8
+ * implementation then works everywhere, unchanged.
9
+ */
10
+ export interface WebSocketLike {
11
+ send(data: string): void;
12
+ close(): void;
13
+ readyState: number;
14
+ addEventListener(type: string, listener: (event: {
15
+ data?: unknown;
16
+ }) => void): void;
17
+ removeEventListener?(type: string, listener: (event: {
18
+ data?: unknown;
19
+ }) => void): void;
20
+ }
21
+ export interface WebSocketTransportOptions {
22
+ socket: WebSocketLike;
23
+ /** Called for frames that are not valid protocol messages, instead of throwing into the socket. */
24
+ onProtocolError?: (raw: unknown, error: Error) => void;
25
+ }
26
+ export declare class WebSocketTransport implements InspectorTransport {
27
+ readonly name = "websocket";
28
+ private readonly socket;
29
+ private readonly handlers;
30
+ private readonly onProtocolError;
31
+ /** Frames written before the socket opened, flushed on open rather than dropped. */
32
+ private pending;
33
+ constructor(options: WebSocketTransportOptions);
34
+ get isOpen(): boolean;
35
+ send(message: InspectorMessage): void;
36
+ onMessage(handler: (message: InspectorMessage) => void): () => void;
37
+ close(): void;
38
+ }
39
+ //# sourceMappingURL=websocket.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocket.d.ts","sourceRoot":"","sources":["../../../../src/inspector/transports/websocket.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAE3E;;;;;;;GAOG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,IAAI,IAAI,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE;QAAE,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,GAAG,IAAI,CAAC;IACpF,mBAAmB,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE;QAAE,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,GAAG,IAAI,CAAC;CACzF;AAED,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,aAAa,CAAC;IACtB,mGAAmG;IACnG,eAAe,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CACxD;AAED,qBAAa,kBAAmB,YAAW,kBAAkB;IAC3D,QAAQ,CAAC,IAAI,eAAe;IAC5B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;IACvC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA4C;IACrE,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA+C;IAC/E,oFAAoF;IACpF,OAAO,CAAC,OAAO,CAAgB;gBAEnB,OAAO,EAAE,yBAAyB;IAyB9C,IAAI,MAAM,IAAI,OAAO,CAEpB;IAED,IAAI,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI;IAMrC,SAAS,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,gBAAgB,KAAK,IAAI,GAAG,MAAM,IAAI;IAKnE,KAAK,IAAI,IAAI;CAId"}
@@ -0,0 +1,56 @@
1
+ export class WebSocketTransport {
2
+ constructor(options) {
3
+ this.name = "websocket";
4
+ this.handlers = new Set();
5
+ /** Frames written before the socket opened, flushed on open rather than dropped. */
6
+ this.pending = [];
7
+ this.socket = options.socket;
8
+ this.onProtocolError = options.onProtocolError;
9
+ this.socket.addEventListener("open", () => {
10
+ for (const frame of this.pending)
11
+ this.socket.send(frame);
12
+ this.pending = [];
13
+ });
14
+ this.socket.addEventListener("message", (event) => {
15
+ let parsed;
16
+ try {
17
+ parsed = JSON.parse(String(event.data));
18
+ }
19
+ catch (err) {
20
+ this.onProtocolError?.(event.data, err);
21
+ return;
22
+ }
23
+ if (!isProtocolMessage(parsed)) {
24
+ this.onProtocolError?.(parsed, new Error("Frame is not an Anchor Inspector message"));
25
+ return;
26
+ }
27
+ for (const handler of [...this.handlers])
28
+ handler(parsed);
29
+ });
30
+ }
31
+ get isOpen() {
32
+ return this.socket.readyState === 1;
33
+ }
34
+ send(message) {
35
+ const frame = JSON.stringify(message);
36
+ if (this.socket.readyState === 1)
37
+ this.socket.send(frame);
38
+ else
39
+ this.pending.push(frame);
40
+ }
41
+ onMessage(handler) {
42
+ this.handlers.add(handler);
43
+ return () => this.handlers.delete(handler);
44
+ }
45
+ close() {
46
+ this.handlers.clear();
47
+ this.socket.close();
48
+ }
49
+ }
50
+ function isProtocolMessage(value) {
51
+ if (value === null || typeof value !== "object")
52
+ return false;
53
+ const m = value;
54
+ return typeof m.v === "number" && (m.type === "req" || m.type === "res" || m.type === "evt");
55
+ }
56
+ //# sourceMappingURL=websocket.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocket.js","sourceRoot":"","sources":["../../../../src/inspector/transports/websocket.ts"],"names":[],"mappings":"AAwBA,MAAM,OAAO,kBAAkB;IAQ7B,YAAY,OAAkC;QAPrC,SAAI,GAAG,WAAW,CAAC;QAEX,aAAQ,GAAG,IAAI,GAAG,EAAiC,CAAC;QAErE,oFAAoF;QAC5E,YAAO,GAAa,EAAE,CAAC;QAG7B,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC7B,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC;QAE/C,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,MAAM,EAAE,GAAG,EAAE;YACxC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,OAAO;gBAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC1D,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;QACpB,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE;YAChD,IAAI,MAAe,CAAC;YACpB,IAAI,CAAC;gBACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YAC1C,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,CAAC,eAAe,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,GAAY,CAAC,CAAC;gBACjD,OAAO;YACT,CAAC;YACD,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC/B,IAAI,CAAC,eAAe,EAAE,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC,CAAC;gBACtF,OAAO;YACT,CAAC;YACD,KAAK,MAAM,OAAO,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC;gBAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QAC5D,CAAC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,MAAM,CAAC,UAAU,KAAK,CAAC,CAAC;IACtC,CAAC;IAED,IAAI,CAAC,OAAyB;QAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACtC,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,KAAK,CAAC;YAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;;YACrD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC;IAED,SAAS,CAAC,OAA4C;QACpD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC3B,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC7C,CAAC;IAED,KAAK;QACH,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IACtB,CAAC;CACF;AAED,SAAS,iBAAiB,CAAC,KAAc;IACvC,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC9D,MAAM,CAAC,GAAG,KAAwC,CAAC;IACnD,OAAO,OAAO,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,IAAI,CAAC,CAAC,IAAI,KAAK,KAAK,IAAI,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC;AAC/F,CAAC"}
@@ -0,0 +1,53 @@
1
+ import type { Schema } from "../schema/schema.js";
2
+ /**
3
+ * CSV interchange (RFC 4180), shaped to match `mongoexport --type=csv` / `mongoimport --type=csv`.
4
+ *
5
+ * ## Why this lives in the SDK rather than in Anchor Lens
6
+ *
7
+ * Lens offers "Import JSON or CSV file" the way Compass does, but a CSV parser written in the
8
+ * inspector would be a *second interpretation of the user's data* — one that would eventually
9
+ * disagree with the database about what `"42"` or `"2026-01-01T00:00:00Z"` means. §55 exists to stop
10
+ * exactly that, so the codec belongs here, next to the Extended JSON one.
11
+ *
12
+ * ## What CSV genuinely cannot carry, stated rather than hidden
13
+ *
14
+ * - **Types.** Every cell is text. On import, values are inferred conservatively and then cast
15
+ * through the collection's schema, so a declared `Number` becomes a real number rather than the
16
+ * string the file literally held. Fields the schema does not declare keep the inferred type.
17
+ * - **`null` versus missing.** Both write as an empty cell, and an empty cell reads back as *missing*
18
+ * — matching `mongoimport --ignoreBlanks`. Round-tripping a document through CSV therefore drops
19
+ * explicit nulls. JSON is the lossless format; CSV is the one spreadsheets can open.
20
+ *
21
+ * Nested fields use `mongoexport`'s dotted-path convention (`address.city`). Whole arrays and
22
+ * sub-objects are written as Extended JSON in a single cell, which round-trips exactly.
23
+ */
24
+ /** Serialise documents to RFC 4180 CSV. */
25
+ export declare function toCsv(documents: Array<Record<string, unknown>>): string;
26
+ /** The union of every document's leaf paths, `_id` first so the file opens the way a table reads. */
27
+ export declare function csvHeaders(documents: Array<Record<string, unknown>>): string[];
28
+ /**
29
+ * Parse CSV into documents.
30
+ *
31
+ * Pass the collection's schema when there is one: declared paths are cast through it, which is what
32
+ * turns CSV's universal string back into the Number, Date or ObjectId the model actually stores.
33
+ */
34
+ export declare function fromCsv(text: string, schema?: Schema): Array<Record<string, unknown>>;
35
+ /**
36
+ * RFC 4180 reader: quoted fields may contain commas, newlines and doubled quotes.
37
+ *
38
+ * Written as a character state machine rather than `split(",")` because a naive split corrupts every
39
+ * document containing an address or a sentence — the single most common way CSV import goes wrong.
40
+ */
41
+ export declare function parseCsvRows(text: string): string[][];
42
+ /** Heuristic used by import auto-detection: a header row and no JSON opener. */
43
+ export declare function looksLikeCsv(text: string): boolean;
44
+ /**
45
+ * Infer a type from a cell, conservatively.
46
+ *
47
+ * The bar is "would a round-trip through this be a surprise?". Leading zeros and digit strings too
48
+ * long to survive as a double stay text, because a national ID or a phone number silently becoming
49
+ * `9.4711e+11` is far worse than it staying a string. Anything the schema declares is re-cast
50
+ * afterwards anyway, so guessing less here costs nothing.
51
+ */
52
+ export declare function inferCsvValue(raw: string): unknown;
53
+ //# sourceMappingURL=csv.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"csv.d.ts","sourceRoot":"","sources":["../../../src/interop/csv.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAGlD;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,2CAA2C;AAC3C,wBAAgB,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,MAAM,CAUvE;AAED,qGAAqG;AACrG,wBAAgB,UAAU,CAAC,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,MAAM,EAAE,CAO9E;AAED;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAsBrF;AAgBD;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,CA2DrD;AAED,gFAAgF;AAChF,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAKlD;AAsBD;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CA0BlD"}
@@ -0,0 +1,222 @@
1
+ import { ObjectId } from "../core/object-id.js";
2
+ import { flattenPaths, getPath, setPath } from "../query/path.js";
3
+ import { castValue } from "../schema/cast.js";
4
+ import { fromEJSON, toEJSON } from "./ejson.js";
5
+ /**
6
+ * CSV interchange (RFC 4180), shaped to match `mongoexport --type=csv` / `mongoimport --type=csv`.
7
+ *
8
+ * ## Why this lives in the SDK rather than in Anchor Lens
9
+ *
10
+ * Lens offers "Import JSON or CSV file" the way Compass does, but a CSV parser written in the
11
+ * inspector would be a *second interpretation of the user's data* — one that would eventually
12
+ * disagree with the database about what `"42"` or `"2026-01-01T00:00:00Z"` means. §55 exists to stop
13
+ * exactly that, so the codec belongs here, next to the Extended JSON one.
14
+ *
15
+ * ## What CSV genuinely cannot carry, stated rather than hidden
16
+ *
17
+ * - **Types.** Every cell is text. On import, values are inferred conservatively and then cast
18
+ * through the collection's schema, so a declared `Number` becomes a real number rather than the
19
+ * string the file literally held. Fields the schema does not declare keep the inferred type.
20
+ * - **`null` versus missing.** Both write as an empty cell, and an empty cell reads back as *missing*
21
+ * — matching `mongoimport --ignoreBlanks`. Round-tripping a document through CSV therefore drops
22
+ * explicit nulls. JSON is the lossless format; CSV is the one spreadsheets can open.
23
+ *
24
+ * Nested fields use `mongoexport`'s dotted-path convention (`address.city`). Whole arrays and
25
+ * sub-objects are written as Extended JSON in a single cell, which round-trips exactly.
26
+ */
27
+ /** Serialise documents to RFC 4180 CSV. */
28
+ export function toCsv(documents) {
29
+ const headers = csvHeaders(documents);
30
+ const lines = [headers.map(escapeCsvCell).join(",")];
31
+ for (const document of documents) {
32
+ const flat = flattenPaths(document);
33
+ lines.push(headers.map((h) => escapeCsvCell(serialiseCsvCell(flat.get(h)))).join(","));
34
+ }
35
+ return lines.join("\n");
36
+ }
37
+ /** The union of every document's leaf paths, `_id` first so the file opens the way a table reads. */
38
+ export function csvHeaders(documents) {
39
+ const seen = new Set();
40
+ for (const document of documents) {
41
+ for (const path of flattenPaths(document).keys())
42
+ seen.add(path);
43
+ }
44
+ const rest = [...seen].filter((h) => h !== "_id");
45
+ return seen.has("_id") ? ["_id", ...rest] : rest;
46
+ }
47
+ /**
48
+ * Parse CSV into documents.
49
+ *
50
+ * Pass the collection's schema when there is one: declared paths are cast through it, which is what
51
+ * turns CSV's universal string back into the Number, Date or ObjectId the model actually stores.
52
+ */
53
+ export function fromCsv(text, schema) {
54
+ const rows = parseCsvRows(text);
55
+ if (rows.length === 0)
56
+ return [];
57
+ const headers = rows[0].map((h) => h.trim());
58
+ const documents = [];
59
+ for (let r = 1; r < rows.length; r++) {
60
+ const row = rows[r];
61
+ if (row.length === 1 && row[0] === "")
62
+ continue; // a blank line, not an empty document
63
+ const document = {};
64
+ for (let c = 0; c < headers.length; c++) {
65
+ const header = headers[c];
66
+ const cell = row[c];
67
+ if (header === "" || cell === undefined || cell === "")
68
+ continue;
69
+ setPath(document, header, inferCsvValue(cell));
70
+ }
71
+ documents.push(schema ? castThroughSchema(document, schema) : document);
72
+ }
73
+ return documents;
74
+ }
75
+ /**
76
+ * Cast the paths a schema declares, leaving everything else as inferred.
77
+ *
78
+ * Deliberately not `castDocument`: that applies `strict` and would silently drop any column the
79
+ * schema does not know about, which in an import is data loss disguised as success.
80
+ */
81
+ function castThroughSchema(document, schema) {
82
+ for (const [path, def] of schema.paths) {
83
+ const raw = getPath(document, path);
84
+ if (raw !== undefined)
85
+ setPath(document, path, castValue(raw, def, path));
86
+ }
87
+ return document;
88
+ }
89
+ /**
90
+ * RFC 4180 reader: quoted fields may contain commas, newlines and doubled quotes.
91
+ *
92
+ * Written as a character state machine rather than `split(",")` because a naive split corrupts every
93
+ * document containing an address or a sentence — the single most common way CSV import goes wrong.
94
+ */
95
+ export function parseCsvRows(text) {
96
+ const input = text.charCodeAt(0) === 0xfeff ? text.slice(1) : text; // strip a BOM from Excel
97
+ const rows = [];
98
+ let row = [];
99
+ let field = "";
100
+ let quoted = false;
101
+ let i = 0;
102
+ const endField = () => {
103
+ row.push(field);
104
+ field = "";
105
+ };
106
+ const endRow = () => {
107
+ endField();
108
+ rows.push(row);
109
+ row = [];
110
+ };
111
+ while (i < input.length) {
112
+ const char = input[i];
113
+ if (quoted) {
114
+ if (char === '"') {
115
+ if (input[i + 1] === '"') {
116
+ field += '"';
117
+ i += 2;
118
+ continue;
119
+ }
120
+ quoted = false;
121
+ i++;
122
+ continue;
123
+ }
124
+ field += char;
125
+ i++;
126
+ continue;
127
+ }
128
+ if (char === '"' && field === "") {
129
+ quoted = true;
130
+ i++;
131
+ }
132
+ else if (char === ",") {
133
+ endField();
134
+ i++;
135
+ }
136
+ else if (char === "\r") {
137
+ // On CRLF only the \r is consumed here; the \n terminates the row on the next pass.
138
+ // Consuming both would swallow the line break and merge every row into one.
139
+ if (input[i + 1] !== "\n")
140
+ endRow();
141
+ i++;
142
+ }
143
+ else if (char === "\n") {
144
+ endRow();
145
+ i++;
146
+ }
147
+ else {
148
+ field += char;
149
+ i++;
150
+ }
151
+ }
152
+ if (field !== "" || row.length > 0)
153
+ endRow();
154
+ return rows;
155
+ }
156
+ /** Heuristic used by import auto-detection: a header row and no JSON opener. */
157
+ export function looksLikeCsv(text) {
158
+ const trimmed = text.trimStart();
159
+ if (trimmed === "" || trimmed.startsWith("{") || trimmed.startsWith("["))
160
+ return false;
161
+ const firstLine = parseCsvRows(trimmed.split("\n", 1)[0])[0];
162
+ return (firstLine?.length ?? 0) > 1;
163
+ }
164
+ function serialiseCsvCell(value) {
165
+ if (value === undefined || value === null)
166
+ return "";
167
+ if (value instanceof ObjectId)
168
+ return value.toHexString();
169
+ if (value instanceof Date)
170
+ return value.toISOString();
171
+ if (typeof value === "string")
172
+ return value;
173
+ if (typeof value === "number" || typeof value === "boolean" || typeof value === "bigint") {
174
+ return String(value);
175
+ }
176
+ // Arrays, sub-objects and binary go in as Extended JSON so the cell round-trips exactly.
177
+ return JSON.stringify(toEJSON(value, { mode: "relaxed" }));
178
+ }
179
+ function escapeCsvCell(value) {
180
+ const needsQuotes = /[",\n\r]/.test(value) || value !== value.trim();
181
+ return needsQuotes ? `"${value.replace(/"/g, '""')}"` : value;
182
+ }
183
+ const ISO_DATE = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d{1,3})?(Z|[+-]\d{2}:\d{2})$/;
184
+ const NUMBER = /^-?(0|[1-9]\d*)(\.\d+)?([eE][+-]?\d+)?$/;
185
+ /**
186
+ * Infer a type from a cell, conservatively.
187
+ *
188
+ * The bar is "would a round-trip through this be a surprise?". Leading zeros and digit strings too
189
+ * long to survive as a double stay text, because a national ID or a phone number silently becoming
190
+ * `9.4711e+11` is far worse than it staying a string. Anything the schema declares is re-cast
191
+ * afterwards anyway, so guessing less here costs nothing.
192
+ */
193
+ export function inferCsvValue(raw) {
194
+ if (raw === "true")
195
+ return true;
196
+ if (raw === "false")
197
+ return false;
198
+ if (raw === "null")
199
+ return null;
200
+ if (NUMBER.test(raw)) {
201
+ const parsed = Number(raw);
202
+ if (Number.isFinite(parsed) && String(parsed) === raw)
203
+ return parsed;
204
+ }
205
+ if (ISO_DATE.test(raw)) {
206
+ const date = new Date(raw);
207
+ if (!Number.isNaN(date.getTime()))
208
+ return date;
209
+ }
210
+ if (raw.startsWith("{") || raw.startsWith("[")) {
211
+ try {
212
+ return fromEJSON(JSON.parse(raw));
213
+ }
214
+ catch {
215
+ return raw; // it only looked like JSON
216
+ }
217
+ }
218
+ // A 24-char hex string is left as text on purpose: the schema decides whether it is an ObjectId
219
+ // or genuinely a string, and guessing here would corrupt legitimate hash columns.
220
+ return raw;
221
+ }
222
+ //# sourceMappingURL=csv.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"csv.js","sourceRoot":"","sources":["../../../src/interop/csv.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * MongoDB Extended JSON v2.
3
+ *
4
+ * ## Why a second encoding exists
5
+ *
6
+ * The sync wire format sends `_id` as a plain 24-char hex string and dates as ISO-8601 strings,
7
+ * because Mongoose casts both automatically — that is what makes the payload droppable into a model
8
+ * with no transform.
9
+ *
10
+ * But `mongoimport`, `mongoexport` and the raw driver do not speak that. They speak Extended JSON,
11
+ * where types are explicit: `{"$oid": "..."}`, `{"$date": "..."}`. Emitting hex strings into a file
12
+ * fed to `mongoimport` would silently store `_id` as a **String**, not an ObjectId — the documents
13
+ * would load, look right, and then fail to join against anything.
14
+ *
15
+ * So: hex on the wire, Extended JSON in files. One codec, two channels, each getting the encoding
16
+ * it actually needs.
17
+ *
18
+ * Three modes, matching the three MongoDB Compass offers on its export dialog:
19
+ *
20
+ * - **canonical** — every type is explicit (`$numberInt`, `$numberDouble`). Round-trips losslessly
21
+ * and is the default for export files, because a file is read by tools, not people.
22
+ * - **relaxed** — numbers and dates are plain JSON. Readable, but int32 and double become
23
+ * indistinguishable.
24
+ * - **default** — relaxed, except that an integer JSON cannot mark as an integer is emitted as
25
+ * `$numberLong`. AnchorDB has no Int64 type — every number is a JS double — so for ordinary data
26
+ * this is identical to relaxed. It differs only past 2^53, where a bare JSON number would be read
27
+ * back by `mongoimport` as a double and quietly stop being an integer.
28
+ */
29
+ export type EJsonMode = "canonical" | "relaxed" | "default";
30
+ export interface EJsonOptions {
31
+ mode?: EJsonMode;
32
+ }
33
+ /** Encode a value into Extended JSON. */
34
+ export declare function toEJSON(value: unknown, options?: EJsonOptions): unknown;
35
+ /** Decode Extended JSON back into JavaScript values. */
36
+ export declare function fromEJSON(value: unknown): unknown;
37
+ export declare function stringifyEJSON(value: unknown, options?: EJsonOptions & {
38
+ pretty?: boolean;
39
+ }): string;
40
+ export declare function parseEJSON(text: string): unknown;
41
+ //# sourceMappingURL=ejson.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ejson.d.ts","sourceRoot":"","sources":["../../../src/interop/ejson.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,MAAM,MAAM,SAAS,GAAG,WAAW,GAAG,SAAS,GAAG,SAAS,CAAC;AAK5D,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,SAAS,CAAC;CAClB;AAED,yCAAyC;AACzC,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,GAAE,YAAiB,GAAG,OAAO,CAG3E;AAuDD,wDAAwD;AACxD,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAiDjD;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,GAAE,YAAY,GAAG;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,MAAM,CAGxG;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEhD"}
@@ -0,0 +1,176 @@
1
+ import { ObjectId } from "../core/object-id.js";
2
+ /** Largest magnitude representable as a BSON Int64. Beyond this, `$numberLong` would overflow. */
3
+ const INT64_LIMIT = 9223372036854775807;
4
+ /** Encode a value into Extended JSON. */
5
+ export function toEJSON(value, options = {}) {
6
+ const mode = options.mode ?? "canonical";
7
+ return encode(value, mode);
8
+ }
9
+ function encode(value, mode) {
10
+ if (value === null || value === undefined)
11
+ return null;
12
+ if (value instanceof ObjectId)
13
+ return { $oid: value.toHexString() };
14
+ if (isForeignObjectId(value))
15
+ return { $oid: value.toHexString() };
16
+ if (value instanceof Date) {
17
+ if (Number.isNaN(value.getTime()))
18
+ throw new TypeError("Cannot encode an invalid Date");
19
+ return mode === "canonical"
20
+ ? { $date: { $numberLong: String(value.getTime()) } }
21
+ : { $date: value.toISOString() };
22
+ }
23
+ if (value instanceof RegExp) {
24
+ return { $regularExpression: { pattern: value.source, options: value.flags.replace("g", "") } };
25
+ }
26
+ if (value instanceof Uint8Array) {
27
+ return { $binary: { base64: bytesToBase64(value), subType: "00" } };
28
+ }
29
+ if (typeof value === "number") {
30
+ if (mode === "relaxed")
31
+ return value;
32
+ if (mode === "default") {
33
+ // Past 2^53 a bare JSON number is read back as a double, so the value stops being an integer.
34
+ // Marking it keeps mongoimport storing an Int64. Everything else stays plain and readable.
35
+ if (Number.isInteger(value) && !Number.isSafeInteger(value) && Math.abs(value) <= INT64_LIMIT) {
36
+ return { $numberLong: String(value) };
37
+ }
38
+ return value;
39
+ }
40
+ // Canonical mode preserves the int/double distinction MongoDB actually stores.
41
+ if (Number.isInteger(value) && Math.abs(value) <= 2_147_483_647)
42
+ return { $numberInt: String(value) };
43
+ if (Number.isInteger(value) && Number.isSafeInteger(value))
44
+ return { $numberLong: String(value) };
45
+ return { $numberDouble: numberToCanonicalString(value) };
46
+ }
47
+ if (typeof value === "bigint")
48
+ return { $numberLong: value.toString() };
49
+ if (typeof value === "string" || typeof value === "boolean")
50
+ return value;
51
+ if (Array.isArray(value))
52
+ return value.map((v) => encode(v, mode));
53
+ if (typeof value === "object") {
54
+ const out = {};
55
+ for (const [k, v] of Object.entries(value)) {
56
+ out[k] = encode(v, mode);
57
+ }
58
+ return out;
59
+ }
60
+ return String(value);
61
+ }
62
+ /** Decode Extended JSON back into JavaScript values. */
63
+ export function fromEJSON(value) {
64
+ if (value === null || value === undefined)
65
+ return null;
66
+ if (Array.isArray(value))
67
+ return value.map(fromEJSON);
68
+ if (typeof value !== "object")
69
+ return value;
70
+ const obj = value;
71
+ const keys = Object.keys(obj);
72
+ if (keys.length === 1 || (keys.length === 2 && keys.includes("$scope"))) {
73
+ if ("$oid" in obj)
74
+ return new ObjectId(String(obj.$oid));
75
+ if ("$date" in obj) {
76
+ const d = obj.$date;
77
+ if (typeof d === "string")
78
+ return new Date(d);
79
+ if (typeof d === "number")
80
+ return new Date(d);
81
+ if (d && typeof d === "object" && "$numberLong" in d) {
82
+ return new Date(Number(d.$numberLong));
83
+ }
84
+ }
85
+ if ("$numberInt" in obj)
86
+ return Number(obj.$numberInt);
87
+ if ("$numberLong" in obj)
88
+ return Number(obj.$numberLong);
89
+ if ("$numberDouble" in obj) {
90
+ const raw = String(obj.$numberDouble);
91
+ if (raw === "Infinity")
92
+ return Infinity;
93
+ if (raw === "-Infinity")
94
+ return -Infinity;
95
+ if (raw === "NaN")
96
+ return NaN;
97
+ return Number(raw);
98
+ }
99
+ if ("$numberDecimal" in obj)
100
+ return Number(obj.$numberDecimal);
101
+ if ("$binary" in obj) {
102
+ const b = obj.$binary;
103
+ return base64ToBytes(b.base64);
104
+ }
105
+ if ("$regularExpression" in obj) {
106
+ const r = obj.$regularExpression;
107
+ return new RegExp(r.pattern, r.options ?? "");
108
+ }
109
+ // Legacy Extended JSON v1 shapes, still emitted by older tooling.
110
+ if ("$undefined" in obj)
111
+ return undefined;
112
+ if ("$maxKey" in obj || "$minKey" in obj)
113
+ return obj;
114
+ }
115
+ const out = {};
116
+ for (const [k, v] of Object.entries(obj))
117
+ out[k] = fromEJSON(v);
118
+ return out;
119
+ }
120
+ export function stringifyEJSON(value, options = {}) {
121
+ const encoded = toEJSON(value, options);
122
+ return options.pretty ? JSON.stringify(encoded, null, 2) : JSON.stringify(encoded);
123
+ }
124
+ export function parseEJSON(text) {
125
+ return fromEJSON(JSON.parse(text));
126
+ }
127
+ function isForeignObjectId(value) {
128
+ return (typeof value === "object" &&
129
+ value !== null &&
130
+ value._bsontype === "ObjectId" &&
131
+ typeof value.toHexString === "function");
132
+ }
133
+ /** MongoDB writes whole doubles as "1.0"; plain String(1) would give "1" and read back as an int. */
134
+ function numberToCanonicalString(value) {
135
+ if (Number.isNaN(value))
136
+ return "NaN";
137
+ if (value === Infinity)
138
+ return "Infinity";
139
+ if (value === -Infinity)
140
+ return "-Infinity";
141
+ if (Number.isInteger(value))
142
+ return `${value}.0`;
143
+ return String(value);
144
+ }
145
+ const B64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
146
+ function bytesToBase64(bytes) {
147
+ let out = "";
148
+ for (let i = 0; i < bytes.length; i += 3) {
149
+ const b0 = bytes[i];
150
+ const b1 = bytes[i + 1];
151
+ const b2 = bytes[i + 2];
152
+ out += B64[b0 >> 2];
153
+ out += B64[((b0 & 3) << 4) | ((b1 ?? 0) >> 4)];
154
+ out += b1 === undefined ? "=" : B64[((b1 & 15) << 2) | ((b2 ?? 0) >> 6)];
155
+ out += b2 === undefined ? "=" : B64[b2 & 63];
156
+ }
157
+ return out;
158
+ }
159
+ function base64ToBytes(text) {
160
+ const clean = text.replace(/=+$/, "");
161
+ const out = new Uint8Array(Math.floor((clean.length * 3) / 4));
162
+ let p = 0;
163
+ for (let i = 0; i < clean.length; i += 4) {
164
+ const n = (B64.indexOf(clean[i]) << 18) |
165
+ (B64.indexOf(clean[i + 1]) << 12) |
166
+ ((clean[i + 2] ? B64.indexOf(clean[i + 2]) : 0) << 6) |
167
+ (clean[i + 3] ? B64.indexOf(clean[i + 3]) : 0);
168
+ out[p++] = (n >> 16) & 0xff;
169
+ if (clean[i + 2])
170
+ out[p++] = (n >> 8) & 0xff;
171
+ if (clean[i + 3])
172
+ out[p++] = n & 0xff;
173
+ }
174
+ return out;
175
+ }
176
+ //# sourceMappingURL=ejson.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ejson.js","sourceRoot":"","sources":["../../../src/interop/ejson.ts"],"names":[],"mappings":"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"}