@connecttomahdi/rxdb 17.0.0-beta.17 → 17.1.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 (379) hide show
  1. package/AGENTS.md +4 -0
  2. package/CHANGELOG.md +47 -4
  3. package/CLAUDE.md +2 -0
  4. package/dist/cjs/change-event-buffer.js +2 -1
  5. package/dist/cjs/change-event-buffer.js.map +1 -1
  6. package/dist/cjs/custom-index.js +85 -12
  7. package/dist/cjs/custom-index.js.map +1 -1
  8. package/dist/cjs/doc-cache.js +117 -35
  9. package/dist/cjs/doc-cache.js.map +1 -1
  10. package/dist/cjs/event-reduce.js +10 -1
  11. package/dist/cjs/event-reduce.js.map +1 -1
  12. package/dist/cjs/plugin-helpers.js +16 -0
  13. package/dist/cjs/plugin-helpers.js.map +1 -1
  14. package/dist/cjs/plugins/attachments/index.js +3 -3
  15. package/dist/cjs/plugins/attachments/index.js.map +1 -1
  16. package/dist/cjs/plugins/cleanup/cleanup.js +5 -3
  17. package/dist/cjs/plugins/cleanup/cleanup.js.map +1 -1
  18. package/dist/cjs/plugins/crdt/index.js +52 -0
  19. package/dist/cjs/plugins/crdt/index.js.map +1 -1
  20. package/dist/cjs/plugins/dev-mode/check-query.js +7 -1
  21. package/dist/cjs/plugins/dev-mode/check-query.js.map +1 -1
  22. package/dist/cjs/plugins/dev-mode/check-schema.js +2 -1
  23. package/dist/cjs/plugins/dev-mode/check-schema.js.map +1 -1
  24. package/dist/cjs/plugins/dev-mode/error-messages.js +43 -5
  25. package/dist/cjs/plugins/dev-mode/error-messages.js.map +1 -1
  26. package/dist/cjs/plugins/encryption-crypto-js/index.js +22 -6
  27. package/dist/cjs/plugins/encryption-crypto-js/index.js.map +1 -1
  28. package/dist/cjs/plugins/leader-election/index.js +5 -5
  29. package/dist/cjs/plugins/leader-election/index.js.map +1 -1
  30. package/dist/cjs/plugins/local-documents/local-documents.js +20 -13
  31. package/dist/cjs/plugins/local-documents/local-documents.js.map +1 -1
  32. package/dist/cjs/plugins/migration-schema/migration-helpers.js +3 -0
  33. package/dist/cjs/plugins/migration-schema/migration-helpers.js.map +1 -1
  34. package/dist/cjs/plugins/migration-schema/rx-migration-state.js +1 -1
  35. package/dist/cjs/plugins/migration-schema/rx-migration-state.js.map +1 -1
  36. package/dist/cjs/plugins/pipeline/rx-pipeline.js +5 -1
  37. package/dist/cjs/plugins/pipeline/rx-pipeline.js.map +1 -1
  38. package/dist/cjs/plugins/query-builder/mquery/nosql-query-builder.js +4 -2
  39. package/dist/cjs/plugins/query-builder/mquery/nosql-query-builder.js.map +1 -1
  40. package/dist/cjs/plugins/replication/index.js +40 -2
  41. package/dist/cjs/plugins/replication/index.js.map +1 -1
  42. package/dist/cjs/plugins/replication-google-drive/document-handling.js +17 -6
  43. package/dist/cjs/plugins/replication-google-drive/document-handling.js.map +1 -1
  44. package/dist/cjs/plugins/replication-google-drive/google-drive-helper.js +1 -1
  45. package/dist/cjs/plugins/replication-google-drive/google-drive-helper.js.map +1 -1
  46. package/dist/cjs/plugins/replication-google-drive/google-drive-types.js.map +1 -1
  47. package/dist/cjs/plugins/replication-google-drive/signaling.js +4 -1
  48. package/dist/cjs/plugins/replication-google-drive/signaling.js.map +1 -1
  49. package/dist/cjs/plugins/replication-google-drive/upstream.js +7 -4
  50. package/dist/cjs/plugins/replication-google-drive/upstream.js.map +1 -1
  51. package/dist/cjs/plugins/replication-microsoft-onedrive/signaling.js +4 -1
  52. package/dist/cjs/plugins/replication-microsoft-onedrive/signaling.js.map +1 -1
  53. package/dist/cjs/plugins/state/rx-state.js +14 -3
  54. package/dist/cjs/plugins/state/rx-state.js.map +1 -1
  55. package/dist/cjs/plugins/storage-dexie/rx-storage-instance-dexie.js +10 -17
  56. package/dist/cjs/plugins/storage-dexie/rx-storage-instance-dexie.js.map +1 -1
  57. package/dist/cjs/plugins/storage-memory/binary-search-bounds.js +112 -40
  58. package/dist/cjs/plugins/storage-memory/binary-search-bounds.js.map +1 -1
  59. package/dist/cjs/plugins/storage-memory/memory-helper.js +127 -40
  60. package/dist/cjs/plugins/storage-memory/memory-helper.js.map +1 -1
  61. package/dist/cjs/plugins/storage-memory/memory-indexes.js +1 -0
  62. package/dist/cjs/plugins/storage-memory/memory-indexes.js.map +1 -1
  63. package/dist/cjs/plugins/storage-memory/memory-types.js.map +1 -1
  64. package/dist/cjs/plugins/storage-memory/rx-storage-instance-memory.js +97 -37
  65. package/dist/cjs/plugins/storage-memory/rx-storage-instance-memory.js.map +1 -1
  66. package/dist/cjs/plugins/storage-mongodb/mongodb-helper.js +42 -1
  67. package/dist/cjs/plugins/storage-mongodb/mongodb-helper.js.map +1 -1
  68. package/dist/cjs/plugins/storage-mongodb/rx-storage-instance-mongodb.js +7 -7
  69. package/dist/cjs/plugins/storage-mongodb/rx-storage-instance-mongodb.js.map +1 -1
  70. package/dist/cjs/plugins/test-utils/config.js +1 -1
  71. package/dist/cjs/plugins/test-utils/config.js.map +1 -1
  72. package/dist/cjs/plugins/test-utils/performance.js +122 -92
  73. package/dist/cjs/plugins/test-utils/performance.js.map +1 -1
  74. package/dist/cjs/plugins/test-utils/schema-objects.js +1 -1
  75. package/dist/cjs/plugins/test-utils/schema-objects.js.map +1 -1
  76. package/dist/cjs/plugins/test-utils/test-util.js +62 -0
  77. package/dist/cjs/plugins/test-utils/test-util.js.map +1 -1
  78. package/dist/cjs/plugins/utils/utils-map.js +2 -2
  79. package/dist/cjs/plugins/utils/utils-map.js.map +1 -1
  80. package/dist/cjs/plugins/utils/utils-object-deep-equal.js +3 -2
  81. package/dist/cjs/plugins/utils/utils-object-deep-equal.js.map +1 -1
  82. package/dist/cjs/plugins/utils/utils-object-dot-prop.js +25 -0
  83. package/dist/cjs/plugins/utils/utils-object-dot-prop.js.map +1 -1
  84. package/dist/cjs/plugins/utils/utils-object.js +102 -27
  85. package/dist/cjs/plugins/utils/utils-object.js.map +1 -1
  86. package/dist/cjs/plugins/utils/utils-other.js +9 -4
  87. package/dist/cjs/plugins/utils/utils-other.js.map +1 -1
  88. package/dist/cjs/plugins/utils/utils-premium.js +1 -19
  89. package/dist/cjs/plugins/utils/utils-premium.js.map +1 -1
  90. package/dist/cjs/plugins/utils/utils-revision.js +20 -10
  91. package/dist/cjs/plugins/utils/utils-revision.js.map +1 -1
  92. package/dist/cjs/plugins/utils/utils-rxdb-version.js +1 -1
  93. package/dist/cjs/plugins/utils/utils-rxdb-version.js.map +1 -1
  94. package/dist/cjs/plugins/utils/utils-string.js +11 -8
  95. package/dist/cjs/plugins/utils/utils-string.js.map +1 -1
  96. package/dist/cjs/plugins/utils/utils-time.js +21 -16
  97. package/dist/cjs/plugins/utils/utils-time.js.map +1 -1
  98. package/dist/cjs/query-cache.js +6 -4
  99. package/dist/cjs/query-cache.js.map +1 -1
  100. package/dist/cjs/query-planner.js +2 -2
  101. package/dist/cjs/query-planner.js.map +1 -1
  102. package/dist/cjs/replication-protocol/downstream.js +1 -1
  103. package/dist/cjs/replication-protocol/downstream.js.map +1 -1
  104. package/dist/cjs/rx-collection-helper.js +11 -6
  105. package/dist/cjs/rx-collection-helper.js.map +1 -1
  106. package/dist/cjs/rx-collection.js +34 -6
  107. package/dist/cjs/rx-collection.js.map +1 -1
  108. package/dist/cjs/rx-database.js +40 -7
  109. package/dist/cjs/rx-database.js.map +1 -1
  110. package/dist/cjs/rx-document.js +10 -3
  111. package/dist/cjs/rx-document.js.map +1 -1
  112. package/dist/cjs/rx-query-helper.js +35 -12
  113. package/dist/cjs/rx-query-helper.js.map +1 -1
  114. package/dist/cjs/rx-query-single-result.js +9 -2
  115. package/dist/cjs/rx-query-single-result.js.map +1 -1
  116. package/dist/cjs/rx-query.js +72 -29
  117. package/dist/cjs/rx-query.js.map +1 -1
  118. package/dist/cjs/rx-schema-helper.js +9 -3
  119. package/dist/cjs/rx-schema-helper.js.map +1 -1
  120. package/dist/cjs/rx-schema.js +1 -0
  121. package/dist/cjs/rx-schema.js.map +1 -1
  122. package/dist/cjs/rx-storage-helper.js +212 -129
  123. package/dist/cjs/rx-storage-helper.js.map +1 -1
  124. package/dist/cjs/types/rx-error.d.js.map +1 -1
  125. package/dist/cjs/types/rx-schema.d.js.map +1 -1
  126. package/dist/esm/change-event-buffer.js +2 -1
  127. package/dist/esm/change-event-buffer.js.map +1 -1
  128. package/dist/esm/custom-index.js +85 -12
  129. package/dist/esm/custom-index.js.map +1 -1
  130. package/dist/esm/doc-cache.js +118 -36
  131. package/dist/esm/doc-cache.js.map +1 -1
  132. package/dist/esm/event-reduce.js +10 -1
  133. package/dist/esm/event-reduce.js.map +1 -1
  134. package/dist/esm/plugin-helpers.js +16 -0
  135. package/dist/esm/plugin-helpers.js.map +1 -1
  136. package/dist/esm/plugins/attachments/index.js +3 -3
  137. package/dist/esm/plugins/attachments/index.js.map +1 -1
  138. package/dist/esm/plugins/cleanup/cleanup.js +5 -3
  139. package/dist/esm/plugins/cleanup/cleanup.js.map +1 -1
  140. package/dist/esm/plugins/crdt/index.js +52 -0
  141. package/dist/esm/plugins/crdt/index.js.map +1 -1
  142. package/dist/esm/plugins/dev-mode/check-query.js +7 -1
  143. package/dist/esm/plugins/dev-mode/check-query.js.map +1 -1
  144. package/dist/esm/plugins/dev-mode/check-schema.js +2 -1
  145. package/dist/esm/plugins/dev-mode/check-schema.js.map +1 -1
  146. package/dist/esm/plugins/dev-mode/error-messages.js +43 -5
  147. package/dist/esm/plugins/dev-mode/error-messages.js.map +1 -1
  148. package/dist/esm/plugins/encryption-crypto-js/index.js +22 -6
  149. package/dist/esm/plugins/encryption-crypto-js/index.js.map +1 -1
  150. package/dist/esm/plugins/leader-election/index.js +4 -4
  151. package/dist/esm/plugins/leader-election/index.js.map +1 -1
  152. package/dist/esm/plugins/local-documents/local-documents.js +20 -13
  153. package/dist/esm/plugins/local-documents/local-documents.js.map +1 -1
  154. package/dist/esm/plugins/migration-schema/migration-helpers.js +3 -0
  155. package/dist/esm/plugins/migration-schema/migration-helpers.js.map +1 -1
  156. package/dist/esm/plugins/migration-schema/rx-migration-state.js +1 -1
  157. package/dist/esm/plugins/migration-schema/rx-migration-state.js.map +1 -1
  158. package/dist/esm/plugins/pipeline/rx-pipeline.js +5 -1
  159. package/dist/esm/plugins/pipeline/rx-pipeline.js.map +1 -1
  160. package/dist/esm/plugins/query-builder/mquery/nosql-query-builder.js +4 -2
  161. package/dist/esm/plugins/query-builder/mquery/nosql-query-builder.js.map +1 -1
  162. package/dist/esm/plugins/replication/index.js +40 -2
  163. package/dist/esm/plugins/replication/index.js.map +1 -1
  164. package/dist/esm/plugins/replication-google-drive/document-handling.js +17 -6
  165. package/dist/esm/plugins/replication-google-drive/document-handling.js.map +1 -1
  166. package/dist/esm/plugins/replication-google-drive/google-drive-helper.js +1 -1
  167. package/dist/esm/plugins/replication-google-drive/google-drive-helper.js.map +1 -1
  168. package/dist/esm/plugins/replication-google-drive/google-drive-types.js.map +1 -1
  169. package/dist/esm/plugins/replication-google-drive/signaling.js +4 -1
  170. package/dist/esm/plugins/replication-google-drive/signaling.js.map +1 -1
  171. package/dist/esm/plugins/replication-google-drive/upstream.js +7 -4
  172. package/dist/esm/plugins/replication-google-drive/upstream.js.map +1 -1
  173. package/dist/esm/plugins/replication-microsoft-onedrive/signaling.js +4 -1
  174. package/dist/esm/plugins/replication-microsoft-onedrive/signaling.js.map +1 -1
  175. package/dist/esm/plugins/state/rx-state.js +15 -4
  176. package/dist/esm/plugins/state/rx-state.js.map +1 -1
  177. package/dist/esm/plugins/storage-dexie/rx-storage-instance-dexie.js +11 -18
  178. package/dist/esm/plugins/storage-dexie/rx-storage-instance-dexie.js.map +1 -1
  179. package/dist/esm/plugins/storage-memory/binary-search-bounds.js +107 -40
  180. package/dist/esm/plugins/storage-memory/binary-search-bounds.js.map +1 -1
  181. package/dist/esm/plugins/storage-memory/memory-helper.js +128 -41
  182. package/dist/esm/plugins/storage-memory/memory-helper.js.map +1 -1
  183. package/dist/esm/plugins/storage-memory/memory-indexes.js +1 -0
  184. package/dist/esm/plugins/storage-memory/memory-indexes.js.map +1 -1
  185. package/dist/esm/plugins/storage-memory/memory-types.js.map +1 -1
  186. package/dist/esm/plugins/storage-memory/rx-storage-instance-memory.js +90 -30
  187. package/dist/esm/plugins/storage-memory/rx-storage-instance-memory.js.map +1 -1
  188. package/dist/esm/plugins/storage-mongodb/mongodb-helper.js +39 -0
  189. package/dist/esm/plugins/storage-mongodb/mongodb-helper.js.map +1 -1
  190. package/dist/esm/plugins/storage-mongodb/rx-storage-instance-mongodb.js +8 -8
  191. package/dist/esm/plugins/storage-mongodb/rx-storage-instance-mongodb.js.map +1 -1
  192. package/dist/esm/plugins/test-utils/config.js +1 -1
  193. package/dist/esm/plugins/test-utils/config.js.map +1 -1
  194. package/dist/esm/plugins/test-utils/performance.js +122 -92
  195. package/dist/esm/plugins/test-utils/performance.js.map +1 -1
  196. package/dist/esm/plugins/test-utils/schema-objects.js +1 -1
  197. package/dist/esm/plugins/test-utils/schema-objects.js.map +1 -1
  198. package/dist/esm/plugins/test-utils/test-util.js +59 -0
  199. package/dist/esm/plugins/test-utils/test-util.js.map +1 -1
  200. package/dist/esm/plugins/utils/utils-map.js +2 -2
  201. package/dist/esm/plugins/utils/utils-map.js.map +1 -1
  202. package/dist/esm/plugins/utils/utils-object-deep-equal.js +3 -2
  203. package/dist/esm/plugins/utils/utils-object-deep-equal.js.map +1 -1
  204. package/dist/esm/plugins/utils/utils-object-dot-prop.js +25 -0
  205. package/dist/esm/plugins/utils/utils-object-dot-prop.js.map +1 -1
  206. package/dist/esm/plugins/utils/utils-object.js +102 -27
  207. package/dist/esm/plugins/utils/utils-object.js.map +1 -1
  208. package/dist/esm/plugins/utils/utils-other.js +9 -4
  209. package/dist/esm/plugins/utils/utils-other.js.map +1 -1
  210. package/dist/esm/plugins/utils/utils-premium.js +1 -19
  211. package/dist/esm/plugins/utils/utils-premium.js.map +1 -1
  212. package/dist/esm/plugins/utils/utils-revision.js +20 -10
  213. package/dist/esm/plugins/utils/utils-revision.js.map +1 -1
  214. package/dist/esm/plugins/utils/utils-rxdb-version.js +1 -1
  215. package/dist/esm/plugins/utils/utils-rxdb-version.js.map +1 -1
  216. package/dist/esm/plugins/utils/utils-string.js +11 -8
  217. package/dist/esm/plugins/utils/utils-string.js.map +1 -1
  218. package/dist/esm/plugins/utils/utils-time.js +21 -16
  219. package/dist/esm/plugins/utils/utils-time.js.map +1 -1
  220. package/dist/esm/query-cache.js +7 -5
  221. package/dist/esm/query-cache.js.map +1 -1
  222. package/dist/esm/query-planner.js +2 -2
  223. package/dist/esm/query-planner.js.map +1 -1
  224. package/dist/esm/replication-protocol/downstream.js +1 -1
  225. package/dist/esm/replication-protocol/downstream.js.map +1 -1
  226. package/dist/esm/rx-collection-helper.js +12 -7
  227. package/dist/esm/rx-collection-helper.js.map +1 -1
  228. package/dist/esm/rx-collection.js +35 -7
  229. package/dist/esm/rx-collection.js.map +1 -1
  230. package/dist/esm/rx-database.js +40 -7
  231. package/dist/esm/rx-database.js.map +1 -1
  232. package/dist/esm/rx-document.js +11 -4
  233. package/dist/esm/rx-document.js.map +1 -1
  234. package/dist/esm/rx-query-helper.js +35 -12
  235. package/dist/esm/rx-query-helper.js.map +1 -1
  236. package/dist/esm/rx-query-single-result.js +10 -3
  237. package/dist/esm/rx-query-single-result.js.map +1 -1
  238. package/dist/esm/rx-query.js +72 -29
  239. package/dist/esm/rx-query.js.map +1 -1
  240. package/dist/esm/rx-schema-helper.js +9 -3
  241. package/dist/esm/rx-schema-helper.js.map +1 -1
  242. package/dist/esm/rx-schema.js +1 -0
  243. package/dist/esm/rx-schema.js.map +1 -1
  244. package/dist/esm/rx-storage-helper.js +176 -94
  245. package/dist/esm/rx-storage-helper.js.map +1 -1
  246. package/dist/esm/types/rx-error.d.js.map +1 -1
  247. package/dist/esm/types/rx-schema.d.js.map +1 -1
  248. package/dist/types/custom-index.d.ts +5 -0
  249. package/dist/types/doc-cache.d.ts +1 -1
  250. package/dist/types/index.d.ts +25 -26
  251. package/dist/types/plugins/dev-mode/error-messages.d.ts +36 -0
  252. package/dist/types/plugins/leader-election/index.d.ts +1 -0
  253. package/dist/types/plugins/replication-google-drive/document-handling.d.ts +4 -1
  254. package/dist/types/plugins/replication-google-drive/google-drive-types.d.ts +1 -0
  255. package/dist/types/plugins/state/rx-state.d.ts +1 -1
  256. package/dist/types/plugins/storage-denokv/index.d.ts +1 -1
  257. package/dist/types/plugins/storage-dexie/rx-storage-dexie.d.ts +1 -1
  258. package/dist/types/plugins/storage-localstorage/index.d.ts +1 -1
  259. package/dist/types/plugins/storage-memory/binary-search-bounds.d.ts +21 -10
  260. package/dist/types/plugins/storage-memory/memory-helper.d.ts +7 -3
  261. package/dist/types/plugins/storage-memory/memory-types.d.ts +5 -0
  262. package/dist/types/plugins/storage-mongodb/mongodb-helper.d.ts +9 -1
  263. package/dist/types/plugins/storage-mongodb/rx-storage-instance-mongodb.d.ts +2 -2
  264. package/dist/types/plugins/storage-mongodb/rx-storage-mongodb.d.ts +1 -1
  265. package/dist/types/plugins/storage-remote/rx-storage-remote.d.ts +1 -1
  266. package/dist/types/plugins/storage-sqlite/index.d.ts +1 -1
  267. package/dist/types/plugins/test-utils/performance.d.ts +36 -0
  268. package/dist/types/plugins/test-utils/test-util.d.ts +17 -0
  269. package/dist/types/plugins/utils/utils-object.d.ts +8 -3
  270. package/dist/types/plugins/utils/utils-premium.d.ts +0 -2
  271. package/dist/types/plugins/utils/utils-rxdb-version.d.ts +1 -1
  272. package/dist/types/rx-database.d.ts +1 -1
  273. package/dist/types/rx-query-single-result.d.ts +1 -1
  274. package/dist/types/rx-query.d.ts +3 -2
  275. package/dist/types/rx-storage-helper.d.ts +15 -0
  276. package/eslint.config.mjs +2 -1
  277. package/package.json +732 -729
  278. package/scripts/check-code-block-line-length.js +91 -0
  279. package/scripts/check-em-dashes.js +53 -0
  280. package/scripts/docs-fetch-git-history.mjs +36 -0
  281. package/scripts/install-foundationdb.sh +0 -6
  282. package/scripts/notify-indexnow.mjs +171 -0
  283. package/scripts/start-foundationdb-docker.sh +73 -0
  284. package/src/change-event-buffer.ts +4 -1
  285. package/src/custom-index.ts +93 -16
  286. package/src/doc-cache.ts +117 -41
  287. package/src/event-reduce.ts +10 -1
  288. package/src/plugin-helpers.ts +10 -0
  289. package/src/plugins/attachments/index.ts +10 -12
  290. package/src/plugins/cleanup/cleanup.ts +5 -3
  291. package/src/plugins/crdt/index.ts +55 -0
  292. package/src/plugins/dev-mode/check-query.ts +7 -1
  293. package/src/plugins/dev-mode/check-schema.ts +2 -1
  294. package/src/plugins/dev-mode/error-messages.ts +45 -5
  295. package/src/plugins/encryption-crypto-js/index.ts +18 -6
  296. package/src/plugins/leader-election/index.ts +9 -8
  297. package/src/plugins/local-documents/local-documents.ts +21 -12
  298. package/src/plugins/migration-schema/migration-helpers.ts +3 -0
  299. package/src/plugins/migration-schema/rx-migration-state.ts +1 -1
  300. package/src/plugins/pipeline/rx-pipeline.ts +5 -1
  301. package/src/plugins/query-builder/mquery/nosql-query-builder.ts +8 -2
  302. package/src/plugins/replication/index.ts +41 -3
  303. package/src/plugins/replication-google-drive/document-handling.ts +17 -5
  304. package/src/plugins/replication-google-drive/google-drive-helper.ts +1 -1
  305. package/src/plugins/replication-google-drive/google-drive-types.ts +1 -0
  306. package/src/plugins/replication-google-drive/signaling.ts +4 -1
  307. package/src/plugins/replication-google-drive/upstream.ts +7 -4
  308. package/src/plugins/replication-microsoft-onedrive/signaling.ts +4 -1
  309. package/src/plugins/state/rx-state.ts +17 -5
  310. package/src/plugins/storage-dexie/rx-storage-instance-dexie.ts +0 -27
  311. package/src/plugins/storage-memory/binary-search-bounds.ts +105 -40
  312. package/src/plugins/storage-memory/memory-helper.ts +158 -67
  313. package/src/plugins/storage-memory/memory-indexes.ts +1 -0
  314. package/src/plugins/storage-memory/memory-types.ts +5 -0
  315. package/src/plugins/storage-memory/rx-storage-instance-memory.ts +104 -53
  316. package/src/plugins/storage-mongodb/mongodb-helper.ts +43 -1
  317. package/src/plugins/storage-mongodb/rx-storage-instance-mongodb.ts +11 -9
  318. package/src/plugins/test-utils/config.ts +2 -1
  319. package/src/plugins/test-utils/performance.ts +159 -85
  320. package/src/plugins/test-utils/schema-objects.ts +1 -1
  321. package/src/plugins/test-utils/test-util.ts +71 -0
  322. package/src/plugins/utils/utils-map.ts +2 -2
  323. package/src/plugins/utils/utils-object-deep-equal.ts +2 -4
  324. package/src/plugins/utils/utils-object-dot-prop.ts +25 -0
  325. package/src/plugins/utils/utils-object.ts +103 -28
  326. package/src/plugins/utils/utils-other.ts +9 -4
  327. package/src/plugins/utils/utils-premium.ts +11 -37
  328. package/src/plugins/utils/utils-revision.ts +20 -9
  329. package/src/plugins/utils/utils-rxdb-version.ts +1 -1
  330. package/src/plugins/utils/utils-string.ts +11 -9
  331. package/src/plugins/utils/utils-time.ts +21 -17
  332. package/src/query-cache.ts +6 -5
  333. package/src/query-planner.ts +2 -2
  334. package/src/replication-protocol/downstream.ts +1 -1
  335. package/src/rx-collection-helper.ts +12 -6
  336. package/src/rx-collection.ts +39 -8
  337. package/src/rx-database.ts +49 -17
  338. package/src/rx-document.ts +12 -3
  339. package/src/rx-query-helper.ts +36 -15
  340. package/src/rx-query-single-result.ts +10 -3
  341. package/src/rx-query.ts +48 -8
  342. package/src/rx-schema-helper.ts +7 -4
  343. package/src/rx-schema.ts +1 -0
  344. package/src/rx-storage-helper.ts +210 -139
  345. package/src/types/rx-error.d.ts +3 -0
  346. package/src/types/rx-schema.d.ts +5 -0
  347. package/dist/esm/package.json +0 -1
  348. package/dist/types/types/conflict-handling.d.ts +0 -48
  349. package/dist/types/types/couchdb.d.ts +0 -293
  350. package/dist/types/types/index.d.ts +0 -32
  351. package/dist/types/types/modules/index.d.ts +0 -0
  352. package/dist/types/types/modules/mocha.parallel.d.ts +0 -1
  353. package/dist/types/types/plugins/backup.d.ts +0 -35
  354. package/dist/types/types/plugins/cleanup.d.ts +0 -38
  355. package/dist/types/types/plugins/crdt.d.ts +0 -76
  356. package/dist/types/types/plugins/dexie.d.ts +0 -30
  357. package/dist/types/types/plugins/local-documents.d.ts +0 -49
  358. package/dist/types/types/plugins/migration.d.ts +0 -14
  359. package/dist/types/types/plugins/reactivity.d.ts +0 -40
  360. package/dist/types/types/plugins/replication-graphql.d.ts +0 -98
  361. package/dist/types/types/plugins/replication.d.ts +0 -175
  362. package/dist/types/types/plugins/state.d.ts +0 -4
  363. package/dist/types/types/plugins/update.d.ts +0 -23
  364. package/dist/types/types/plugins/webmcp.d.ts +0 -40
  365. package/dist/types/types/query-planner.d.ts +0 -47
  366. package/dist/types/types/replication-protocol.d.ts +0 -296
  367. package/dist/types/types/rx-attachment.d.ts +0 -46
  368. package/dist/types/types/rx-change-event.d.ts +0 -85
  369. package/dist/types/types/rx-collection.d.ts +0 -117
  370. package/dist/types/types/rx-database-internal-store.d.ts +0 -54
  371. package/dist/types/types/rx-database.d.ts +0 -124
  372. package/dist/types/types/rx-document.d.ts +0 -160
  373. package/dist/types/types/rx-error.d.ts +0 -222
  374. package/dist/types/types/rx-plugin.d.ts +0 -167
  375. package/dist/types/types/rx-query.d.ts +0 -144
  376. package/dist/types/types/rx-schema.d.ts +0 -209
  377. package/dist/types/types/rx-storage.d.ts +0 -347
  378. package/dist/types/types/rx-storage.interface.d.ts +0 -312
  379. package/dist/types/types/util.d.ts +0 -180
@@ -230,7 +230,7 @@ export function fillWithDefaultSettings(schemaObj) {
230
230
 
231
231
  // make indexes unique
232
232
  var hasIndex = new Set();
233
- useIndexes.filter(index => {
233
+ schemaObj.indexes = useIndexes.filter(index => {
234
234
  var indexStr = index.join(',');
235
235
  if (hasIndex.has(indexStr)) {
236
236
  return false;
@@ -239,7 +239,6 @@ export function fillWithDefaultSettings(schemaObj) {
239
239
  return true;
240
240
  }
241
241
  });
242
- schemaObj.indexes = useIndexes;
243
242
  return schemaObj;
244
243
  }
245
244
  export var META_LWT_UNIX_TIME_MAX = 1000000000000000;
@@ -295,7 +294,14 @@ export function fillObjectWithDefaults(rxSchema, obj) {
295
294
  for (var i = 0; i < defaultKeys.length; ++i) {
296
295
  var key = defaultKeys[i];
297
296
  if (obj[key] === undefined) {
298
- obj[key] = rxSchema.defaultValues[key];
297
+ var val = rxSchema.defaultValues[key];
298
+ if (typeof val === 'object' && val !== null) {
299
+ obj[key] = Array.isArray(val) ? val.slice() : {
300
+ ...val
301
+ };
302
+ } else {
303
+ obj[key] = val;
304
+ }
299
305
  }
300
306
  }
301
307
  return obj;
@@ -1 +1 @@
1
- {"version":3,"file":"rx-schema-helper.js","names":["newRxError","ensureNotFalsy","flatClone","getProperty","isMaybeReadonlyArray","REGEX_ALL_DOTS","RX_META_LWT_MINIMUM","sortObject","trimDots","getPseudoSchemaForVersion","version","primaryKey","pseudoSchema","fillWithDefaultSettings","type","properties","maxLength","value","indexes","required","SCHEMA_PATH_CACHE","WeakMap","getSchemaByObjectPath","rxJsonSchema","path","pathCache","get","pathStr","cached","Map","set","usePath","replace","ret","fillPrimaryKey","primaryPath","jsonSchema","documentData","newPrimary","getComposedPrimaryKeyOfDocumentData","existingPrimary","args","schema","getPrimaryFieldOfPrimaryKey","key","getLengthOfPrimaryKey","schemaPart","compositePrimary","fields","map","field","join","separator","normalizeRxJsonSchema","normalizedSchema","getDefaultIndex","schemaObj","additionalProperties","Object","prototype","hasOwnProperty","call","keyCompression","slice","encrypted","_rev","minLength","_attachments","_deleted","_meta","RX_META_SCHEMA","push","filter","includes","elem","pos","arr","indexOf","useIndexes","index","arIndex","unshift","length","internalIndexes","idx","hasIndex","Set","indexStr","has","add","META_LWT_UNIX_TIME_MAX","lwt","minimum","maximum","multipleOf","getFinalFields","keys","final","forEach","fillObjectWithDefaults","rxSchema","obj","defaultKeys","defaultValues","i","undefined","DEFAULT_CHECKPOINT_SCHEMA","id"],"sources":["../../src/rx-schema-helper.ts"],"sourcesContent":["import { newRxError } from './rx-error.ts';\r\nimport type {\r\n CompositePrimaryKey,\r\n DeepReadonly,\r\n JsonSchema,\r\n PrimaryKey,\r\n RxDocumentData,\r\n RxJsonSchema,\r\n RxStorageDefaultCheckpoint,\r\n StringKeys\r\n} from './types/index.d.ts';\r\nimport {\r\n ensureNotFalsy,\r\n flatClone,\r\n getProperty,\r\n isMaybeReadonlyArray,\r\n REGEX_ALL_DOTS,\r\n RX_META_LWT_MINIMUM,\r\n sortObject,\r\n trimDots\r\n} from './plugins/utils/index.ts';\r\nimport type { RxSchema } from './rx-schema.ts';\r\n\r\n/**\r\n * Helper function to create a valid RxJsonSchema\r\n * with a given version.\r\n */\r\nexport function getPseudoSchemaForVersion<T = any>(\r\n version: number,\r\n primaryKey: StringKeys<T>\r\n): RxJsonSchema<RxDocumentData<T>> {\r\n const pseudoSchema: RxJsonSchema<RxDocumentData<T>> = fillWithDefaultSettings({\r\n version,\r\n type: 'object',\r\n primaryKey: primaryKey as any,\r\n properties: {\r\n [primaryKey]: {\r\n type: 'string',\r\n maxLength: 100\r\n },\r\n value: {\r\n type: 'string'\r\n }\r\n } as any,\r\n indexes: [\r\n [primaryKey]\r\n ],\r\n required: [primaryKey]\r\n });\r\n return pseudoSchema;\r\n}\r\n\r\n/**\r\n * Cache for getSchemaByObjectPath results.\r\n * Uses a WeakMap keyed by the schema object reference\r\n * so the cache is automatically cleaned up when schemas are garbage collected.\r\n */\r\nconst SCHEMA_PATH_CACHE = new WeakMap<object, Map<string, JsonSchema>>();\r\n\r\n/**\r\n * Returns the sub-schema for a given path.\r\n * Results are cached per schema reference and path\r\n * to avoid redundant string operations and property lookups.\r\n */\r\nexport function getSchemaByObjectPath<T = any>(\r\n rxJsonSchema: RxJsonSchema<T>,\r\n path: keyof T | string\r\n): JsonSchema {\r\n let pathCache = SCHEMA_PATH_CACHE.get(rxJsonSchema as any);\r\n const pathStr = path as string;\r\n if (pathCache) {\r\n const cached = pathCache.get(pathStr);\r\n if (cached) {\r\n return cached;\r\n }\r\n } else {\r\n pathCache = new Map();\r\n SCHEMA_PATH_CACHE.set(rxJsonSchema as any, pathCache);\r\n }\r\n\r\n let usePath: string = pathStr;\r\n usePath = usePath.replace(REGEX_ALL_DOTS, '.properties.');\r\n usePath = 'properties.' + usePath;\r\n usePath = trimDots(usePath);\r\n\r\n const ret = getProperty(rxJsonSchema, usePath);\r\n pathCache.set(pathStr, ret);\r\n return ret;\r\n}\r\n\r\nexport function fillPrimaryKey<T>(\r\n primaryPath: keyof T,\r\n jsonSchema: RxJsonSchema<T>,\r\n documentData: RxDocumentData<T>\r\n): RxDocumentData<T> {\r\n // optimization shortcut.\r\n if (typeof jsonSchema.primaryKey === 'string') {\r\n return documentData;\r\n }\r\n\r\n const newPrimary = getComposedPrimaryKeyOfDocumentData<T>(\r\n jsonSchema,\r\n documentData\r\n );\r\n const existingPrimary: string | undefined = documentData[primaryPath] as any;\r\n if (\r\n existingPrimary &&\r\n existingPrimary !== newPrimary\r\n ) {\r\n throw newRxError(\r\n 'DOC19',\r\n {\r\n args: {\r\n documentData,\r\n existingPrimary,\r\n newPrimary,\r\n },\r\n schema: jsonSchema\r\n });\r\n }\r\n\r\n (documentData as any)[primaryPath] = newPrimary;\r\n return documentData;\r\n}\r\n\r\nexport function getPrimaryFieldOfPrimaryKey<RxDocType>(\r\n primaryKey: PrimaryKey<RxDocType>\r\n): StringKeys<RxDocType> {\r\n if (typeof primaryKey === 'string') {\r\n return primaryKey as any;\r\n } else {\r\n return (primaryKey as CompositePrimaryKey<RxDocType>).key;\r\n }\r\n}\r\n\r\nexport function getLengthOfPrimaryKey<RxDocType>(\r\n schema: RxJsonSchema<RxDocumentData<RxDocType>>\r\n): number {\r\n const primaryPath = getPrimaryFieldOfPrimaryKey(schema.primaryKey);\r\n const schemaPart = getSchemaByObjectPath(schema, primaryPath);\r\n return ensureNotFalsy(schemaPart.maxLength);\r\n}\r\n\r\n/**\r\n * Returns the composed primaryKey of a document by its data.\r\n */\r\nexport function getComposedPrimaryKeyOfDocumentData<RxDocType>(\r\n jsonSchema: RxJsonSchema<RxDocType> | RxJsonSchema<RxDocumentData<RxDocType>>,\r\n documentData: Partial<RxDocType>\r\n): string {\r\n if (typeof jsonSchema.primaryKey === 'string') {\r\n return (documentData as any)[jsonSchema.primaryKey];\r\n }\r\n\r\n const compositePrimary: CompositePrimaryKey<RxDocType> = jsonSchema.primaryKey as any;\r\n return compositePrimary.fields.map(field => {\r\n const value = getProperty(documentData as any, field as string);\r\n if (typeof value === 'undefined') {\r\n throw newRxError('DOC18', { args: { field, documentData } });\r\n }\r\n return value;\r\n }).join(compositePrimary.separator);\r\n}\r\n\r\n\r\n/**\r\n * Normalize the RxJsonSchema.\r\n * We need this to ensure everything is set up properly\r\n * and we have the same hash on schemas that represent the same value but\r\n * have different json.\r\n *\r\n * - Orders the schemas attributes by alphabetical order\r\n * - Adds the primaryKey to all indexes that do not contain the primaryKey\r\n * - We need this for deterministic sort order on all queries, which is required for event-reduce to work.\r\n *\r\n * @return RxJsonSchema - ordered and filled\r\n */\r\nexport function normalizeRxJsonSchema<T>(jsonSchema: RxJsonSchema<T>): RxJsonSchema<T> {\r\n const normalizedSchema: RxJsonSchema<T> = sortObject(jsonSchema, true);\r\n return normalizedSchema;\r\n}\r\n\r\n/**\r\n * If the schema does not specify any index,\r\n * we add this index so we at least can run RxQuery()\r\n * and only select non-deleted fields.\r\n */\r\nexport function getDefaultIndex(primaryPath: string) {\r\n return ['_deleted', primaryPath];\r\n}\r\n\r\n/**\r\n * fills the schema-json with default-settings\r\n * @return cloned schemaObj\r\n */\r\nexport function fillWithDefaultSettings<T = any>(\r\n schemaObj: RxJsonSchema<T>\r\n): RxJsonSchema<RxDocumentData<T>> {\r\n schemaObj = flatClone(schemaObj);\r\n const primaryPath: string = getPrimaryFieldOfPrimaryKey(schemaObj.primaryKey);\r\n schemaObj.properties = flatClone(schemaObj.properties);\r\n\r\n // additionalProperties is always false\r\n schemaObj.additionalProperties = false;\r\n\r\n // fill with key-compression-state ()\r\n if (!Object.prototype.hasOwnProperty.call(schemaObj, 'keyCompression')) {\r\n schemaObj.keyCompression = false;\r\n }\r\n\r\n // indexes must be array\r\n schemaObj.indexes = schemaObj.indexes ? schemaObj.indexes.slice(0) : [];\r\n\r\n // required must be array\r\n schemaObj.required = schemaObj.required ? schemaObj.required.slice(0) : [];\r\n\r\n // encrypted must be array\r\n schemaObj.encrypted = schemaObj.encrypted ? schemaObj.encrypted.slice(0) : [];\r\n\r\n // add _rev\r\n (schemaObj.properties as any)._rev = {\r\n type: 'string',\r\n minLength: 1\r\n };\r\n\r\n // add attachments\r\n (schemaObj.properties as any)._attachments = {\r\n type: 'object'\r\n };\r\n\r\n // add deleted flag\r\n (schemaObj.properties as any)._deleted = {\r\n type: 'boolean'\r\n };\r\n\r\n // add meta property\r\n (schemaObj.properties as any)._meta = RX_META_SCHEMA;\r\n\r\n /**\r\n * meta fields are all required\r\n */\r\n schemaObj.required = schemaObj.required ? schemaObj.required.slice(0) : [];\r\n (schemaObj.required as string[]).push('_deleted');\r\n (schemaObj.required as string[]).push('_rev');\r\n (schemaObj.required as string[]).push('_meta');\r\n (schemaObj.required as string[]).push('_attachments');\r\n\r\n // primaryKey is always required\r\n (schemaObj.required as any).push(primaryPath);\r\n\r\n schemaObj.required = schemaObj.required\r\n .filter((field: string) => !field.includes('.'))\r\n .filter((elem: any, pos: any, arr: any) => arr.indexOf(elem) === pos); // unique;\r\n\r\n\r\n // version is 0 by default\r\n schemaObj.version = schemaObj.version || 0;\r\n\r\n const useIndexes: string[][] = schemaObj.indexes.map(index => {\r\n const arIndex = isMaybeReadonlyArray(index) ? index.slice(0) : [index];\r\n /**\r\n * Append primary key to indexes that do not contain the primaryKey.\r\n * All indexes must have the primaryKey to ensure a deterministic sort order.\r\n */\r\n if (!arIndex.includes(primaryPath)) {\r\n arIndex.push(primaryPath);\r\n }\r\n\r\n // add _deleted flag to all indexes so we can query only non-deleted fields\r\n // in RxDB itself\r\n if (arIndex[0] !== '_deleted') {\r\n arIndex.unshift('_deleted');\r\n }\r\n\r\n return arIndex;\r\n });\r\n\r\n if (useIndexes.length === 0) {\r\n useIndexes.push(getDefaultIndex(primaryPath));\r\n }\r\n\r\n // we need this index for the getChangedDocumentsSince() method\r\n useIndexes.push(['_meta.lwt', primaryPath]);\r\n\r\n // also add the internalIndexes\r\n if (schemaObj.internalIndexes) {\r\n schemaObj.internalIndexes.map(idx => {\r\n useIndexes.push(idx);\r\n });\r\n }\r\n\r\n // make indexes unique\r\n const hasIndex = new Set<string>();\r\n useIndexes.filter(index => {\r\n const indexStr = index.join(',');\r\n if (hasIndex.has(indexStr)) {\r\n return false;\r\n } else {\r\n hasIndex.add(indexStr);\r\n return true;\r\n }\r\n });\r\n\r\n schemaObj.indexes = useIndexes;\r\n\r\n return schemaObj as any;\r\n}\r\n\r\nexport const META_LWT_UNIX_TIME_MAX = 1000000000000000;\r\nexport const RX_META_SCHEMA: JsonSchema = {\r\n type: 'object',\r\n properties: {\r\n /**\r\n * The last-write time.\r\n * Unix time in milliseconds.\r\n */\r\n lwt: {\r\n type: 'number',\r\n /**\r\n * We use 1 as minimum so that the value is never falsy.\r\n */\r\n minimum: RX_META_LWT_MINIMUM,\r\n maximum: META_LWT_UNIX_TIME_MAX,\r\n multipleOf: 0.01\r\n }\r\n },\r\n /**\r\n * Additional properties are allowed\r\n * and can be used by plugins to set various flags.\r\n */\r\n additionalProperties: true as any,\r\n required: [\r\n 'lwt'\r\n ]\r\n};\r\n\r\n\r\n/**\r\n * returns the final-fields of the schema\r\n * @return field-names of the final-fields\r\n */\r\nexport function getFinalFields<T = any>(\r\n jsonSchema: RxJsonSchema<T>\r\n): string[] {\r\n const ret = Object.keys(jsonSchema.properties)\r\n .filter(key => (jsonSchema as any).properties[key].final);\r\n\r\n // primary is also final\r\n const primaryPath = getPrimaryFieldOfPrimaryKey(jsonSchema.primaryKey);\r\n ret.push(primaryPath);\r\n\r\n // fields of composite primary are final\r\n if (typeof jsonSchema.primaryKey !== 'string') {\r\n (jsonSchema.primaryKey as CompositePrimaryKey<T>).fields\r\n .forEach(field => ret.push(field as string));\r\n }\r\n\r\n return ret;\r\n}\r\n\r\n/**\r\n * fills all unset fields with default-values if set\r\n * @hotPath\r\n */\r\nexport function fillObjectWithDefaults(rxSchema: RxSchema<any>, obj: any): any {\r\n const defaultKeys = Object.keys(rxSchema.defaultValues);\r\n for (let i = 0; i < defaultKeys.length; ++i) {\r\n const key = defaultKeys[i];\r\n if (obj[key] === undefined) {\r\n obj[key] = rxSchema.defaultValues[key];\r\n }\r\n }\r\n return obj;\r\n}\r\n\r\nexport const DEFAULT_CHECKPOINT_SCHEMA: DeepReadonly<JsonSchema<RxStorageDefaultCheckpoint>> = {\r\n type: 'object',\r\n properties: {\r\n id: {\r\n type: 'string'\r\n },\r\n lwt: {\r\n type: 'number'\r\n }\r\n },\r\n required: [\r\n 'id',\r\n 'lwt'\r\n ],\r\n additionalProperties: false\r\n} as const;\r\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"rx-schema-helper.js","names":["newRxError","ensureNotFalsy","flatClone","getProperty","isMaybeReadonlyArray","REGEX_ALL_DOTS","RX_META_LWT_MINIMUM","sortObject","trimDots","getPseudoSchemaForVersion","version","primaryKey","pseudoSchema","fillWithDefaultSettings","type","properties","maxLength","value","indexes","required","SCHEMA_PATH_CACHE","WeakMap","getSchemaByObjectPath","rxJsonSchema","path","pathCache","get","pathStr","cached","Map","set","usePath","replace","ret","fillPrimaryKey","primaryPath","jsonSchema","documentData","newPrimary","getComposedPrimaryKeyOfDocumentData","existingPrimary","args","schema","getPrimaryFieldOfPrimaryKey","key","getLengthOfPrimaryKey","schemaPart","compositePrimary","fields","map","field","join","separator","normalizeRxJsonSchema","normalizedSchema","getDefaultIndex","schemaObj","additionalProperties","Object","prototype","hasOwnProperty","call","keyCompression","slice","encrypted","_rev","minLength","_attachments","_deleted","_meta","RX_META_SCHEMA","push","filter","includes","elem","pos","arr","indexOf","useIndexes","index","arIndex","unshift","length","internalIndexes","idx","hasIndex","Set","indexStr","has","add","META_LWT_UNIX_TIME_MAX","lwt","minimum","maximum","multipleOf","getFinalFields","keys","final","forEach","fillObjectWithDefaults","rxSchema","obj","defaultKeys","defaultValues","i","undefined","val","Array","isArray","DEFAULT_CHECKPOINT_SCHEMA","id"],"sources":["../../src/rx-schema-helper.ts"],"sourcesContent":["import { newRxError } from './rx-error.ts';\r\nimport type {\r\n CompositePrimaryKey,\r\n DeepReadonly,\r\n JsonSchema,\r\n PrimaryKey,\r\n RxDocumentData,\r\n RxJsonSchema,\r\n RxStorageDefaultCheckpoint,\r\n StringKeys\r\n} from './types/index.d.ts';\r\nimport {\r\n ensureNotFalsy,\r\n flatClone,\r\n getProperty,\r\n isMaybeReadonlyArray,\r\n REGEX_ALL_DOTS,\r\n RX_META_LWT_MINIMUM,\r\n sortObject,\r\n trimDots\r\n} from './plugins/utils/index.ts';\r\nimport type { RxSchema } from './rx-schema.ts';\r\n\r\n/**\r\n * Helper function to create a valid RxJsonSchema\r\n * with a given version.\r\n */\r\nexport function getPseudoSchemaForVersion<T = any>(\r\n version: number,\r\n primaryKey: StringKeys<T>\r\n): RxJsonSchema<RxDocumentData<T>> {\r\n const pseudoSchema: RxJsonSchema<RxDocumentData<T>> = fillWithDefaultSettings({\r\n version,\r\n type: 'object',\r\n primaryKey: primaryKey as any,\r\n properties: {\r\n [primaryKey]: {\r\n type: 'string',\r\n maxLength: 100\r\n },\r\n value: {\r\n type: 'string'\r\n }\r\n } as any,\r\n indexes: [\r\n [primaryKey]\r\n ],\r\n required: [primaryKey]\r\n });\r\n return pseudoSchema;\r\n}\r\n\r\n/**\r\n * Cache for getSchemaByObjectPath results.\r\n * Uses a WeakMap keyed by the schema object reference\r\n * so the cache is automatically cleaned up when schemas are garbage collected.\r\n */\r\nconst SCHEMA_PATH_CACHE = new WeakMap<object, Map<string, JsonSchema>>();\r\n\r\n/**\r\n * Returns the sub-schema for a given path.\r\n * Results are cached per schema reference and path\r\n * to avoid redundant string operations and property lookups.\r\n */\r\nexport function getSchemaByObjectPath<T = any>(\r\n rxJsonSchema: RxJsonSchema<T>,\r\n path: keyof T | string\r\n): JsonSchema {\r\n let pathCache = SCHEMA_PATH_CACHE.get(rxJsonSchema as any);\r\n const pathStr = path as string;\r\n if (pathCache) {\r\n const cached = pathCache.get(pathStr);\r\n if (cached) {\r\n return cached;\r\n }\r\n } else {\r\n pathCache = new Map();\r\n SCHEMA_PATH_CACHE.set(rxJsonSchema as any, pathCache);\r\n }\r\n\r\n let usePath: string = pathStr;\r\n usePath = usePath.replace(REGEX_ALL_DOTS, '.properties.');\r\n usePath = 'properties.' + usePath;\r\n usePath = trimDots(usePath);\r\n\r\n const ret = getProperty(rxJsonSchema, usePath);\r\n pathCache.set(pathStr, ret);\r\n return ret;\r\n}\r\n\r\nexport function fillPrimaryKey<T>(\r\n primaryPath: keyof T,\r\n jsonSchema: RxJsonSchema<T>,\r\n documentData: RxDocumentData<T>\r\n): RxDocumentData<T> {\r\n // optimization shortcut.\r\n if (typeof jsonSchema.primaryKey === 'string') {\r\n return documentData;\r\n }\r\n\r\n const newPrimary = getComposedPrimaryKeyOfDocumentData<T>(\r\n jsonSchema,\r\n documentData\r\n );\r\n const existingPrimary: string | undefined = documentData[primaryPath] as any;\r\n if (\r\n existingPrimary &&\r\n existingPrimary !== newPrimary\r\n ) {\r\n throw newRxError(\r\n 'DOC19',\r\n {\r\n args: {\r\n documentData,\r\n existingPrimary,\r\n newPrimary,\r\n },\r\n schema: jsonSchema\r\n });\r\n }\r\n\r\n (documentData as any)[primaryPath] = newPrimary;\r\n return documentData;\r\n}\r\n\r\nexport function getPrimaryFieldOfPrimaryKey<RxDocType>(\r\n primaryKey: PrimaryKey<RxDocType>\r\n): StringKeys<RxDocType> {\r\n if (typeof primaryKey === 'string') {\r\n return primaryKey as any;\r\n } else {\r\n return (primaryKey as CompositePrimaryKey<RxDocType>).key;\r\n }\r\n}\r\n\r\nexport function getLengthOfPrimaryKey<RxDocType>(\r\n schema: RxJsonSchema<RxDocumentData<RxDocType>>\r\n): number {\r\n const primaryPath = getPrimaryFieldOfPrimaryKey(schema.primaryKey);\r\n const schemaPart = getSchemaByObjectPath(schema, primaryPath);\r\n return ensureNotFalsy(schemaPart.maxLength);\r\n}\r\n\r\n/**\r\n * Returns the composed primaryKey of a document by its data.\r\n */\r\nexport function getComposedPrimaryKeyOfDocumentData<RxDocType>(\r\n jsonSchema: RxJsonSchema<RxDocType> | RxJsonSchema<RxDocumentData<RxDocType>>,\r\n documentData: Partial<RxDocType>\r\n): string {\r\n if (typeof jsonSchema.primaryKey === 'string') {\r\n return (documentData as any)[jsonSchema.primaryKey];\r\n }\r\n\r\n const compositePrimary: CompositePrimaryKey<RxDocType> = jsonSchema.primaryKey as any;\r\n return compositePrimary.fields.map(field => {\r\n const value = getProperty(documentData as any, field as string);\r\n if (typeof value === 'undefined') {\r\n throw newRxError('DOC18', { args: { field, documentData } });\r\n }\r\n return value;\r\n }).join(compositePrimary.separator);\r\n}\r\n\r\n\r\n/**\r\n * Normalize the RxJsonSchema.\r\n * We need this to ensure everything is set up properly\r\n * and we have the same hash on schemas that represent the same value but\r\n * have different json.\r\n *\r\n * - Orders the schemas attributes by alphabetical order\r\n * - Adds the primaryKey to all indexes that do not contain the primaryKey\r\n * - We need this for deterministic sort order on all queries, which is required for event-reduce to work.\r\n *\r\n * @return RxJsonSchema - ordered and filled\r\n */\r\nexport function normalizeRxJsonSchema<T>(jsonSchema: RxJsonSchema<T>): RxJsonSchema<T> {\r\n const normalizedSchema: RxJsonSchema<T> = sortObject(jsonSchema, true);\r\n return normalizedSchema;\r\n}\r\n\r\n/**\r\n * If the schema does not specify any index,\r\n * we add this index so we at least can run RxQuery()\r\n * and only select non-deleted fields.\r\n */\r\nexport function getDefaultIndex(primaryPath: string) {\r\n return ['_deleted', primaryPath];\r\n}\r\n\r\n/**\r\n * fills the schema-json with default-settings\r\n * @return cloned schemaObj\r\n */\r\nexport function fillWithDefaultSettings<T = any>(\r\n schemaObj: RxJsonSchema<T>\r\n): RxJsonSchema<RxDocumentData<T>> {\r\n schemaObj = flatClone(schemaObj);\r\n const primaryPath: string = getPrimaryFieldOfPrimaryKey(schemaObj.primaryKey);\r\n schemaObj.properties = flatClone(schemaObj.properties);\r\n\r\n // additionalProperties is always false\r\n schemaObj.additionalProperties = false;\r\n\r\n // fill with key-compression-state ()\r\n if (!Object.prototype.hasOwnProperty.call(schemaObj, 'keyCompression')) {\r\n schemaObj.keyCompression = false;\r\n }\r\n\r\n // indexes must be array\r\n schemaObj.indexes = schemaObj.indexes ? schemaObj.indexes.slice(0) : [];\r\n\r\n // required must be array\r\n schemaObj.required = schemaObj.required ? schemaObj.required.slice(0) : [];\r\n\r\n // encrypted must be array\r\n schemaObj.encrypted = schemaObj.encrypted ? schemaObj.encrypted.slice(0) : [];\r\n\r\n // add _rev\r\n (schemaObj.properties as any)._rev = {\r\n type: 'string',\r\n minLength: 1\r\n };\r\n\r\n // add attachments\r\n (schemaObj.properties as any)._attachments = {\r\n type: 'object'\r\n };\r\n\r\n // add deleted flag\r\n (schemaObj.properties as any)._deleted = {\r\n type: 'boolean'\r\n };\r\n\r\n // add meta property\r\n (schemaObj.properties as any)._meta = RX_META_SCHEMA;\r\n\r\n /**\r\n * meta fields are all required\r\n */\r\n schemaObj.required = schemaObj.required ? schemaObj.required.slice(0) : [];\r\n (schemaObj.required as string[]).push('_deleted');\r\n (schemaObj.required as string[]).push('_rev');\r\n (schemaObj.required as string[]).push('_meta');\r\n (schemaObj.required as string[]).push('_attachments');\r\n\r\n // primaryKey is always required\r\n (schemaObj.required as any).push(primaryPath);\r\n\r\n schemaObj.required = schemaObj.required\r\n .filter((field: string) => !field.includes('.'))\r\n .filter((elem: any, pos: any, arr: any) => arr.indexOf(elem) === pos); // unique;\r\n\r\n\r\n // version is 0 by default\r\n schemaObj.version = schemaObj.version || 0;\r\n\r\n const useIndexes: string[][] = schemaObj.indexes.map(index => {\r\n const arIndex = isMaybeReadonlyArray(index) ? index.slice(0) : [index];\r\n /**\r\n * Append primary key to indexes that do not contain the primaryKey.\r\n * All indexes must have the primaryKey to ensure a deterministic sort order.\r\n */\r\n if (!arIndex.includes(primaryPath)) {\r\n arIndex.push(primaryPath);\r\n }\r\n\r\n // add _deleted flag to all indexes so we can query only non-deleted fields\r\n // in RxDB itself\r\n if (arIndex[0] !== '_deleted') {\r\n arIndex.unshift('_deleted');\r\n }\r\n\r\n return arIndex;\r\n });\r\n\r\n if (useIndexes.length === 0) {\r\n useIndexes.push(getDefaultIndex(primaryPath));\r\n }\r\n\r\n // we need this index for the getChangedDocumentsSince() method\r\n useIndexes.push(['_meta.lwt', primaryPath]);\r\n\r\n // also add the internalIndexes\r\n if (schemaObj.internalIndexes) {\r\n schemaObj.internalIndexes.map(idx => {\r\n useIndexes.push(idx);\r\n });\r\n }\r\n\r\n // make indexes unique\r\n const hasIndex = new Set<string>();\r\n schemaObj.indexes = useIndexes.filter(index => {\r\n const indexStr = index.join(',');\r\n if (hasIndex.has(indexStr)) {\r\n return false;\r\n } else {\r\n hasIndex.add(indexStr);\r\n return true;\r\n }\r\n });\r\n\r\n return schemaObj as any;\r\n}\r\n\r\nexport const META_LWT_UNIX_TIME_MAX = 1000000000000000;\r\nexport const RX_META_SCHEMA: JsonSchema = {\r\n type: 'object',\r\n properties: {\r\n /**\r\n * The last-write time.\r\n * Unix time in milliseconds.\r\n */\r\n lwt: {\r\n type: 'number',\r\n /**\r\n * We use 1 as minimum so that the value is never falsy.\r\n */\r\n minimum: RX_META_LWT_MINIMUM,\r\n maximum: META_LWT_UNIX_TIME_MAX,\r\n multipleOf: 0.01\r\n }\r\n },\r\n /**\r\n * Additional properties are allowed\r\n * and can be used by plugins to set various flags.\r\n */\r\n additionalProperties: true as any,\r\n required: [\r\n 'lwt'\r\n ]\r\n};\r\n\r\n\r\n/**\r\n * returns the final-fields of the schema\r\n * @return field-names of the final-fields\r\n */\r\nexport function getFinalFields<T = any>(\r\n jsonSchema: RxJsonSchema<T>\r\n): string[] {\r\n const ret = Object.keys(jsonSchema.properties)\r\n .filter(key => (jsonSchema as any).properties[key].final);\r\n\r\n // primary is also final\r\n const primaryPath = getPrimaryFieldOfPrimaryKey(jsonSchema.primaryKey);\r\n ret.push(primaryPath);\r\n\r\n // fields of composite primary are final\r\n if (typeof jsonSchema.primaryKey !== 'string') {\r\n (jsonSchema.primaryKey as CompositePrimaryKey<T>).fields\r\n .forEach(field => ret.push(field as string));\r\n }\r\n\r\n return ret;\r\n}\r\n\r\n/**\r\n * fills all unset fields with default-values if set\r\n * @hotPath\r\n */\r\nexport function fillObjectWithDefaults(rxSchema: RxSchema<any>, obj: any): any {\r\n const defaultKeys = Object.keys(rxSchema.defaultValues);\r\n for (let i = 0; i < defaultKeys.length; ++i) {\r\n const key = defaultKeys[i];\r\n if (obj[key] === undefined) {\r\n const val = rxSchema.defaultValues[key];\r\n if (typeof val === 'object' && val !== null) {\r\n obj[key] = Array.isArray(val) ? val.slice() : { ...val };\r\n } else {\r\n obj[key] = val;\r\n }\r\n }\r\n }\r\n return obj;\r\n}\r\n\r\nexport const DEFAULT_CHECKPOINT_SCHEMA: DeepReadonly<JsonSchema<RxStorageDefaultCheckpoint>> = {\r\n type: 'object',\r\n properties: {\r\n id: {\r\n type: 'string'\r\n },\r\n lwt: {\r\n type: 'number'\r\n }\r\n },\r\n required: [\r\n 'id',\r\n 'lwt'\r\n ],\r\n additionalProperties: false\r\n} as const;\r\n"],"mappings":"AAAA,SAASA,UAAU,QAAQ,eAAe;AAW1C,SACIC,cAAc,EACdC,SAAS,EACTC,WAAW,EACXC,oBAAoB,EACpBC,cAAc,EACdC,mBAAmB,EACnBC,UAAU,EACVC,QAAQ,QACL,0BAA0B;AAGjC;AACA;AACA;AACA;AACA,OAAO,SAASC,yBAAyBA,CACrCC,OAAe,EACfC,UAAyB,EACM;EAC/B,IAAMC,YAA6C,GAAGC,uBAAuB,CAAC;IAC1EH,OAAO;IACPI,IAAI,EAAE,QAAQ;IACdH,UAAU,EAAEA,UAAiB;IAC7BI,UAAU,EAAE;MACR,CAACJ,UAAU,GAAG;QACVG,IAAI,EAAE,QAAQ;QACdE,SAAS,EAAE;MACf,CAAC;MACDC,KAAK,EAAE;QACHH,IAAI,EAAE;MACV;IACJ,CAAQ;IACRI,OAAO,EAAE,CACL,CAACP,UAAU,CAAC,CACf;IACDQ,QAAQ,EAAE,CAACR,UAAU;EACzB,CAAC,CAAC;EACF,OAAOC,YAAY;AACvB;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAMQ,iBAAiB,GAAG,IAAIC,OAAO,CAAkC,CAAC;;AAExE;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,qBAAqBA,CACjCC,YAA6B,EAC7BC,IAAsB,EACZ;EACV,IAAIC,SAAS,GAAGL,iBAAiB,CAACM,GAAG,CAACH,YAAmB,CAAC;EAC1D,IAAMI,OAAO,GAAGH,IAAc;EAC9B,IAAIC,SAAS,EAAE;IACX,IAAMG,MAAM,GAAGH,SAAS,CAACC,GAAG,CAACC,OAAO,CAAC;IACrC,IAAIC,MAAM,EAAE;MACR,OAAOA,MAAM;IACjB;EACJ,CAAC,MAAM;IACHH,SAAS,GAAG,IAAII,GAAG,CAAC,CAAC;IACrBT,iBAAiB,CAACU,GAAG,CAACP,YAAY,EAASE,SAAS,CAAC;EACzD;EAEA,IAAIM,OAAe,GAAGJ,OAAO;EAC7BI,OAAO,GAAGA,OAAO,CAACC,OAAO,CAAC3B,cAAc,EAAE,cAAc,CAAC;EACzD0B,OAAO,GAAG,aAAa,GAAGA,OAAO;EACjCA,OAAO,GAAGvB,QAAQ,CAACuB,OAAO,CAAC;EAE3B,IAAME,GAAG,GAAG9B,WAAW,CAACoB,YAAY,EAAEQ,OAAO,CAAC;EAC9CN,SAAS,CAACK,GAAG,CAACH,OAAO,EAAEM,GAAG,CAAC;EAC3B,OAAOA,GAAG;AACd;AAEA,OAAO,SAASC,cAAcA,CAC1BC,WAAoB,EACpBC,UAA2B,EAC3BC,YAA+B,EACd;EACjB;EACA,IAAI,OAAOD,UAAU,CAACzB,UAAU,KAAK,QAAQ,EAAE;IAC3C,OAAO0B,YAAY;EACvB;EAEA,IAAMC,UAAU,GAAGC,mCAAmC,CAClDH,UAAU,EACVC,YACJ,CAAC;EACD,IAAMG,eAAmC,GAAGH,YAAY,CAACF,WAAW,CAAQ;EAC5E,IACIK,eAAe,IACfA,eAAe,KAAKF,UAAU,EAChC;IACE,MAAMtC,UAAU,CACZ,OAAO,EACP;MACIyC,IAAI,EAAE;QACFJ,YAAY;QACZG,eAAe;QACfF;MACJ,CAAC;MACDI,MAAM,EAAEN;IACZ,CAAC,CAAC;EACV;EAECC,YAAY,CAASF,WAAW,CAAC,GAAGG,UAAU;EAC/C,OAAOD,YAAY;AACvB;AAEA,OAAO,SAASM,2BAA2BA,CACvChC,UAAiC,EACZ;EACrB,IAAI,OAAOA,UAAU,KAAK,QAAQ,EAAE;IAChC,OAAOA,UAAU;EACrB,CAAC,MAAM;IACH,OAAQA,UAAU,CAAoCiC,GAAG;EAC7D;AACJ;AAEA,OAAO,SAASC,qBAAqBA,CACjCH,MAA+C,EACzC;EACN,IAAMP,WAAW,GAAGQ,2BAA2B,CAACD,MAAM,CAAC/B,UAAU,CAAC;EAClE,IAAMmC,UAAU,GAAGxB,qBAAqB,CAACoB,MAAM,EAAEP,WAAW,CAAC;EAC7D,OAAOlC,cAAc,CAAC6C,UAAU,CAAC9B,SAAS,CAAC;AAC/C;;AAEA;AACA;AACA;AACA,OAAO,SAASuB,mCAAmCA,CAC/CH,UAA6E,EAC7EC,YAAgC,EAC1B;EACN,IAAI,OAAOD,UAAU,CAACzB,UAAU,KAAK,QAAQ,EAAE;IAC3C,OAAQ0B,YAAY,CAASD,UAAU,CAACzB,UAAU,CAAC;EACvD;EAEA,IAAMoC,gBAAgD,GAAGX,UAAU,CAACzB,UAAiB;EACrF,OAAOoC,gBAAgB,CAACC,MAAM,CAACC,GAAG,CAACC,KAAK,IAAI;IACxC,IAAMjC,KAAK,GAAGd,WAAW,CAACkC,YAAY,EAASa,KAAe,CAAC;IAC/D,IAAI,OAAOjC,KAAK,KAAK,WAAW,EAAE;MAC9B,MAAMjB,UAAU,CAAC,OAAO,EAAE;QAAEyC,IAAI,EAAE;UAAES,KAAK;UAAEb;QAAa;MAAE,CAAC,CAAC;IAChE;IACA,OAAOpB,KAAK;EAChB,CAAC,CAAC,CAACkC,IAAI,CAACJ,gBAAgB,CAACK,SAAS,CAAC;AACvC;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,qBAAqBA,CAAIjB,UAA2B,EAAmB;EACnF,IAAMkB,gBAAiC,GAAG/C,UAAU,CAAC6B,UAAU,EAAE,IAAI,CAAC;EACtE,OAAOkB,gBAAgB;AAC3B;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,eAAeA,CAACpB,WAAmB,EAAE;EACjD,OAAO,CAAC,UAAU,EAAEA,WAAW,CAAC;AACpC;;AAEA;AACA;AACA;AACA;AACA,OAAO,SAAStB,uBAAuBA,CACnC2C,SAA0B,EACK;EAC/BA,SAAS,GAAGtD,SAAS,CAACsD,SAAS,CAAC;EAChC,IAAMrB,WAAmB,GAAGQ,2BAA2B,CAACa,SAAS,CAAC7C,UAAU,CAAC;EAC7E6C,SAAS,CAACzC,UAAU,GAAGb,SAAS,CAACsD,SAAS,CAACzC,UAAU,CAAC;;EAEtD;EACAyC,SAAS,CAACC,oBAAoB,GAAG,KAAK;;EAEtC;EACA,IAAI,CAACC,MAAM,CAACC,SAAS,CAACC,cAAc,CAACC,IAAI,CAACL,SAAS,EAAE,gBAAgB,CAAC,EAAE;IACpEA,SAAS,CAACM,cAAc,GAAG,KAAK;EACpC;;EAEA;EACAN,SAAS,CAACtC,OAAO,GAAGsC,SAAS,CAACtC,OAAO,GAAGsC,SAAS,CAACtC,OAAO,CAAC6C,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE;;EAEvE;EACAP,SAAS,CAACrC,QAAQ,GAAGqC,SAAS,CAACrC,QAAQ,GAAGqC,SAAS,CAACrC,QAAQ,CAAC4C,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE;;EAE1E;EACAP,SAAS,CAACQ,SAAS,GAAGR,SAAS,CAACQ,SAAS,GAAGR,SAAS,CAACQ,SAAS,CAACD,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE;;EAE7E;EACCP,SAAS,CAACzC,UAAU,CAASkD,IAAI,GAAG;IACjCnD,IAAI,EAAE,QAAQ;IACdoD,SAAS,EAAE;EACf,CAAC;;EAED;EACCV,SAAS,CAACzC,UAAU,CAASoD,YAAY,GAAG;IACzCrD,IAAI,EAAE;EACV,CAAC;;EAED;EACC0C,SAAS,CAACzC,UAAU,CAASqD,QAAQ,GAAG;IACrCtD,IAAI,EAAE;EACV,CAAC;;EAED;EACC0C,SAAS,CAACzC,UAAU,CAASsD,KAAK,GAAGC,cAAc;;EAEpD;AACJ;AACA;EACId,SAAS,CAACrC,QAAQ,GAAGqC,SAAS,CAACrC,QAAQ,GAAGqC,SAAS,CAACrC,QAAQ,CAAC4C,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE;EACzEP,SAAS,CAACrC,QAAQ,CAAcoD,IAAI,CAAC,UAAU,CAAC;EAChDf,SAAS,CAACrC,QAAQ,CAAcoD,IAAI,CAAC,MAAM,CAAC;EAC5Cf,SAAS,CAACrC,QAAQ,CAAcoD,IAAI,CAAC,OAAO,CAAC;EAC7Cf,SAAS,CAACrC,QAAQ,CAAcoD,IAAI,CAAC,cAAc,CAAC;;EAErD;EACCf,SAAS,CAACrC,QAAQ,CAASoD,IAAI,CAACpC,WAAW,CAAC;EAE7CqB,SAAS,CAACrC,QAAQ,GAAGqC,SAAS,CAACrC,QAAQ,CAClCqD,MAAM,CAAEtB,KAAa,IAAK,CAACA,KAAK,CAACuB,QAAQ,CAAC,GAAG,CAAC,CAAC,CAC/CD,MAAM,CAAC,CAACE,IAAS,EAAEC,GAAQ,EAAEC,GAAQ,KAAKA,GAAG,CAACC,OAAO,CAACH,IAAI,CAAC,KAAKC,GAAG,CAAC,CAAC,CAAC;;EAG3E;EACAnB,SAAS,CAAC9C,OAAO,GAAG8C,SAAS,CAAC9C,OAAO,IAAI,CAAC;EAE1C,IAAMoE,UAAsB,GAAGtB,SAAS,CAACtC,OAAO,CAAC+B,GAAG,CAAC8B,KAAK,IAAI;IAC1D,IAAMC,OAAO,GAAG5E,oBAAoB,CAAC2E,KAAK,CAAC,GAAGA,KAAK,CAAChB,KAAK,CAAC,CAAC,CAAC,GAAG,CAACgB,KAAK,CAAC;IACtE;AACR;AACA;AACA;IACQ,IAAI,CAACC,OAAO,CAACP,QAAQ,CAACtC,WAAW,CAAC,EAAE;MAChC6C,OAAO,CAACT,IAAI,CAACpC,WAAW,CAAC;IAC7B;;IAEA;IACA;IACA,IAAI6C,OAAO,CAAC,CAAC,CAAC,KAAK,UAAU,EAAE;MAC3BA,OAAO,CAACC,OAAO,CAAC,UAAU,CAAC;IAC/B;IAEA,OAAOD,OAAO;EAClB,CAAC,CAAC;EAEF,IAAIF,UAAU,CAACI,MAAM,KAAK,CAAC,EAAE;IACzBJ,UAAU,CAACP,IAAI,CAAChB,eAAe,CAACpB,WAAW,CAAC,CAAC;EACjD;;EAEA;EACA2C,UAAU,CAACP,IAAI,CAAC,CAAC,WAAW,EAAEpC,WAAW,CAAC,CAAC;;EAE3C;EACA,IAAIqB,SAAS,CAAC2B,eAAe,EAAE;IAC3B3B,SAAS,CAAC2B,eAAe,CAAClC,GAAG,CAACmC,GAAG,IAAI;MACjCN,UAAU,CAACP,IAAI,CAACa,GAAG,CAAC;IACxB,CAAC,CAAC;EACN;;EAEA;EACA,IAAMC,QAAQ,GAAG,IAAIC,GAAG,CAAS,CAAC;EAClC9B,SAAS,CAACtC,OAAO,GAAG4D,UAAU,CAACN,MAAM,CAACO,KAAK,IAAI;IAC3C,IAAMQ,QAAQ,GAAGR,KAAK,CAAC5B,IAAI,CAAC,GAAG,CAAC;IAChC,IAAIkC,QAAQ,CAACG,GAAG,CAACD,QAAQ,CAAC,EAAE;MACxB,OAAO,KAAK;IAChB,CAAC,MAAM;MACHF,QAAQ,CAACI,GAAG,CAACF,QAAQ,CAAC;MACtB,OAAO,IAAI;IACf;EACJ,CAAC,CAAC;EAEF,OAAO/B,SAAS;AACpB;AAEA,OAAO,IAAMkC,sBAAsB,GAAG,gBAAgB;AACtD,OAAO,IAAMpB,cAA0B,GAAG;EACtCxD,IAAI,EAAE,QAAQ;EACdC,UAAU,EAAE;IACR;AACR;AACA;AACA;IACQ4E,GAAG,EAAE;MACD7E,IAAI,EAAE,QAAQ;MACd;AACZ;AACA;MACY8E,OAAO,EAAEtF,mBAAmB;MAC5BuF,OAAO,EAAEH,sBAAsB;MAC/BI,UAAU,EAAE;IAChB;EACJ,CAAC;EACD;AACJ;AACA;AACA;EACIrC,oBAAoB,EAAE,IAAW;EACjCtC,QAAQ,EAAE,CACN,KAAK;AAEb,CAAC;;AAGD;AACA;AACA;AACA;AACA,OAAO,SAAS4E,cAAcA,CAC1B3D,UAA2B,EACnB;EACR,IAAMH,GAAG,GAAGyB,MAAM,CAACsC,IAAI,CAAC5D,UAAU,CAACrB,UAAU,CAAC,CACzCyD,MAAM,CAAC5B,GAAG,IAAKR,UAAU,CAASrB,UAAU,CAAC6B,GAAG,CAAC,CAACqD,KAAK,CAAC;;EAE7D;EACA,IAAM9D,WAAW,GAAGQ,2BAA2B,CAACP,UAAU,CAACzB,UAAU,CAAC;EACtEsB,GAAG,CAACsC,IAAI,CAACpC,WAAW,CAAC;;EAErB;EACA,IAAI,OAAOC,UAAU,CAACzB,UAAU,KAAK,QAAQ,EAAE;IAC1CyB,UAAU,CAACzB,UAAU,CAA4BqC,MAAM,CACnDkD,OAAO,CAAChD,KAAK,IAAIjB,GAAG,CAACsC,IAAI,CAACrB,KAAe,CAAC,CAAC;EACpD;EAEA,OAAOjB,GAAG;AACd;;AAEA;AACA;AACA;AACA;AACA,OAAO,SAASkE,sBAAsBA,CAACC,QAAuB,EAAEC,GAAQ,EAAO;EAC3E,IAAMC,WAAW,GAAG5C,MAAM,CAACsC,IAAI,CAACI,QAAQ,CAACG,aAAa,CAAC;EACvD,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGF,WAAW,CAACpB,MAAM,EAAE,EAAEsB,CAAC,EAAE;IACzC,IAAM5D,GAAG,GAAG0D,WAAW,CAACE,CAAC,CAAC;IAC1B,IAAIH,GAAG,CAACzD,GAAG,CAAC,KAAK6D,SAAS,EAAE;MACxB,IAAMC,GAAG,GAAGN,QAAQ,CAACG,aAAa,CAAC3D,GAAG,CAAC;MACvC,IAAI,OAAO8D,GAAG,KAAK,QAAQ,IAAIA,GAAG,KAAK,IAAI,EAAE;QACzCL,GAAG,CAACzD,GAAG,CAAC,GAAG+D,KAAK,CAACC,OAAO,CAACF,GAAG,CAAC,GAAGA,GAAG,CAAC3C,KAAK,CAAC,CAAC,GAAG;UAAE,GAAG2C;QAAI,CAAC;MAC5D,CAAC,MAAM;QACHL,GAAG,CAACzD,GAAG,CAAC,GAAG8D,GAAG;MAClB;IACJ;EACJ;EACA,OAAOL,GAAG;AACd;AAEA,OAAO,IAAMQ,yBAA+E,GAAG;EAC3F/F,IAAI,EAAE,QAAQ;EACdC,UAAU,EAAE;IACR+F,EAAE,EAAE;MACAhG,IAAI,EAAE;IACV,CAAC;IACD6E,GAAG,EAAE;MACD7E,IAAI,EAAE;IACV;EACJ,CAAC;EACDK,QAAQ,EAAE,CACN,IAAI,EACJ,KAAK,CACR;EACDsC,oBAAoB,EAAE;AAC1B,CAAU","ignoreList":[]}
@@ -31,6 +31,7 @@ export var RxSchema = /*#__PURE__*/function () {
31
31
  var jsonSchema = flatClone(this.jsonSchema);
32
32
  jsonSchema.properties = flatClone(jsonSchema.properties);
33
33
  delete jsonSchema.properties._deleted;
34
+ delete jsonSchema.properties._rev;
34
35
  delete jsonSchema.properties._meta;
35
36
  delete jsonSchema.properties._attachments;
36
37
  if (jsonSchema.required) {
@@ -1 +1 @@
1
- {"version":3,"file":"rx-schema.js","names":["overwriteGetterForCaching","isMaybeReadonlyArray","deepEqual","newRxError","runPluginHooks","fillWithDefaultSettings","getComposedPrimaryKeyOfDocumentData","getFinalFields","getPrimaryFieldOfPrimaryKey","getSchemaByObjectPath","normalizeRxJsonSchema","overwritable","flatClone","RxSchema","jsonSchema","hashFunction","indexes","getIndexes","primaryPath","primaryKey","properties","maxLength","schema","finalFields","_proto","prototype","getJsonSchemaWithoutMeta","_deleted","_meta","_attachments","required","filter","r","startsWith","validateChange","dataBefore","dataAfter","forEach","fieldName","getDocumentPrototype","proto","pathProperties","Object","keys","key","fullPath","__defineGetter__","get","undefined","ret","defineProperty","get$","enumerable","configurable","get$$","populate","getPrimaryOfDocumentData","documentData","_createClass","version","values","entries","v","hasOwnProperty","call","k","default","JSON","stringify","map","index","getPreviousVersions","c","Array","fill","createRxSchema","runPreCreateHooks","useJsonSchema","deepFreezeWhenDevMode","isRxSchema","obj","toTypedRxJsonSchema"],"sources":["../../src/rx-schema.ts"],"sourcesContent":["import {\r\n overwriteGetterForCaching,\r\n isMaybeReadonlyArray,\r\n deepEqual\r\n} from './plugins/utils/index.ts';\r\nimport {\r\n newRxError,\r\n} from './rx-error.ts';\r\nimport {\r\n runPluginHooks\r\n} from './hooks.ts';\r\n\r\nimport type {\r\n DeepMutable,\r\n DeepReadonly,\r\n HashFunction,\r\n MaybeReadonly,\r\n RxDocument,\r\n RxDocumentData,\r\n RxJsonSchema,\r\n StringKeys\r\n} from './types/index.d.ts';\r\nimport {\r\n fillWithDefaultSettings,\r\n getComposedPrimaryKeyOfDocumentData,\r\n getFinalFields,\r\n getPrimaryFieldOfPrimaryKey,\r\n getSchemaByObjectPath,\r\n normalizeRxJsonSchema\r\n} from './rx-schema-helper.ts';\r\nimport { overwritable } from './overwritable.ts';\r\nimport { flatClone } from 'event-reduce-js';\r\n\r\nexport class RxSchema<RxDocType = any> {\r\n public indexes: MaybeReadonly<string[]>[];\r\n public readonly primaryPath: StringKeys<RxDocumentData<RxDocType>>;\r\n public finalFields: string[];\r\n\r\n constructor(\r\n public readonly jsonSchema: RxJsonSchema<RxDocumentData<RxDocType>>,\r\n public readonly hashFunction: HashFunction\r\n ) {\r\n this.indexes = getIndexes(this.jsonSchema);\r\n\r\n // primary is always required\r\n this.primaryPath = getPrimaryFieldOfPrimaryKey(this.jsonSchema.primaryKey);\r\n\r\n /**\r\n * Many people accidentally put in wrong schema state\r\n * without the dev-mode plugin, so we need this check here\r\n * even in non-dev-mode.\r\n */\r\n if (!jsonSchema.properties[this.primaryPath].maxLength) {\r\n throw newRxError('SC39', { schema: jsonSchema });\r\n }\r\n\r\n this.finalFields = getFinalFields(this.jsonSchema);\r\n }\r\n\r\n public get version(): number {\r\n return this.jsonSchema.version;\r\n }\r\n\r\n public get defaultValues(): { [P in keyof RxDocType]: RxDocType[P] } {\r\n const values = {} as { [P in keyof RxDocType]: RxDocType[P] };\r\n Object\r\n .entries(this.jsonSchema.properties)\r\n .filter(([, v]) => Object.prototype.hasOwnProperty.call(v, 'default'))\r\n .forEach(([k, v]) => (values as any)[k] = (v as any).default);\r\n return overwriteGetterForCaching(\r\n this,\r\n 'defaultValues',\r\n values\r\n );\r\n }\r\n\r\n public getJsonSchemaWithoutMeta(): RxJsonSchema<RxDocumentData<RxDocType>> {\r\n const jsonSchema: any = flatClone(this.jsonSchema);\r\n jsonSchema.properties = flatClone(jsonSchema.properties);\r\n delete jsonSchema.properties._deleted;\r\n delete jsonSchema.properties._meta;\r\n delete jsonSchema.properties._attachments;\r\n\r\n if (jsonSchema.required) {\r\n jsonSchema.required = jsonSchema.required.filter((r: string) => !r.startsWith('_'));\r\n }\r\n\r\n return jsonSchema as RxJsonSchema<RxDocumentData<RxDocType>>;\r\n }\r\n\r\n /**\r\n * @overrides itself on the first call\r\n */\r\n public get hash(): Promise<string> {\r\n return overwriteGetterForCaching(\r\n this,\r\n 'hash',\r\n this.hashFunction(JSON.stringify(this.jsonSchema))\r\n );\r\n }\r\n\r\n /**\r\n * checks if a given change on a document is allowed\r\n * Ensures that:\r\n * - final fields are not modified\r\n * @throws {Error} if not valid\r\n */\r\n validateChange(dataBefore: any, dataAfter: any): void {\r\n this.finalFields.forEach(fieldName => {\r\n if (!deepEqual(dataBefore[fieldName], dataAfter[fieldName])) {\r\n throw newRxError('DOC9', {\r\n dataBefore,\r\n dataAfter,\r\n fieldName,\r\n schema: this.jsonSchema\r\n });\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * creates the schema-based document-prototype,\r\n * see RxCollection.getDocumentPrototype()\r\n */\r\n public getDocumentPrototype(): any {\r\n const proto: any = {};\r\n\r\n /**\r\n * On the top level, we know all keys\r\n * and therefore do not have to create a new Proxy object\r\n * for each document. Instead we define the getter in the prototype once.\r\n */\r\n const pathProperties = getSchemaByObjectPath(\r\n this.jsonSchema,\r\n ''\r\n );\r\n Object.keys(pathProperties)\r\n .forEach(key => {\r\n const fullPath = key;\r\n\r\n // getter - value\r\n proto.__defineGetter__(\r\n key,\r\n function (this: RxDocument) {\r\n if (!this.get || typeof this.get !== 'function') {\r\n /**\r\n * When an object gets added to the state of a vuejs-component,\r\n * it happens that this getter is called with another scope.\r\n * To prevent errors, we have to return undefined in this case\r\n */\r\n return undefined;\r\n }\r\n const ret = this.get(fullPath);\r\n return ret;\r\n }\r\n );\r\n // getter - observable$\r\n Object.defineProperty(proto, key + '$', {\r\n get: function () {\r\n return this.get$(fullPath);\r\n },\r\n enumerable: false,\r\n configurable: false\r\n });\r\n // getter - reactivity$$\r\n Object.defineProperty(proto, key + '$$', {\r\n get: function () {\r\n return this.get$$(fullPath);\r\n },\r\n enumerable: false,\r\n configurable: false\r\n });\r\n // getter - populate_\r\n Object.defineProperty(proto, key + '_', {\r\n get: function () {\r\n return this.populate(fullPath);\r\n },\r\n enumerable: false,\r\n configurable: false\r\n });\r\n });\r\n\r\n overwriteGetterForCaching(\r\n this,\r\n 'getDocumentPrototype',\r\n () => proto\r\n );\r\n return proto;\r\n }\r\n\r\n\r\n getPrimaryOfDocumentData(\r\n documentData: Partial<RxDocType>\r\n ): string {\r\n return getComposedPrimaryKeyOfDocumentData(\r\n this.jsonSchema,\r\n documentData\r\n );\r\n }\r\n}\r\n\r\nexport function getIndexes<RxDocType = any>(\r\n jsonSchema: RxJsonSchema<RxDocType>\r\n): MaybeReadonly<string[]>[] {\r\n return (jsonSchema.indexes || []).map(index => isMaybeReadonlyArray(index) ? index : [index]);\r\n}\r\n\r\n/**\r\n * array with previous version-numbers\r\n */\r\nexport function getPreviousVersions(schema: RxJsonSchema<any>): number[] {\r\n const version = schema.version ? schema.version : 0;\r\n let c = 0;\r\n return new Array(version)\r\n .fill(0)\r\n .map(() => c++);\r\n}\r\n\r\nexport function createRxSchema<T>(\r\n jsonSchema: RxJsonSchema<T>,\r\n hashFunction: HashFunction,\r\n runPreCreateHooks = true\r\n): RxSchema<T> {\r\n if (runPreCreateHooks) {\r\n runPluginHooks('preCreateRxSchema', jsonSchema);\r\n }\r\n\r\n let useJsonSchema = fillWithDefaultSettings(jsonSchema);\r\n useJsonSchema = normalizeRxJsonSchema(useJsonSchema);\r\n overwritable.deepFreezeWhenDevMode(useJsonSchema);\r\n\r\n const schema = new RxSchema(useJsonSchema, hashFunction);\r\n runPluginHooks('createRxSchema', schema);\r\n return schema;\r\n}\r\n\r\nexport function isRxSchema(obj: any): boolean {\r\n return obj instanceof RxSchema;\r\n}\r\n\r\n/**\r\n * Used as helper function the generate the document type out of the schema via typescript.\r\n * @link https://github.com/pubkey/rxdb/discussions/3467\r\n */\r\nexport function toTypedRxJsonSchema<T extends DeepReadonly<RxJsonSchema<any>>>(schema: T): DeepMutable<T> {\r\n return schema as any;\r\n}\r\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"rx-schema.js","names":["overwriteGetterForCaching","isMaybeReadonlyArray","deepEqual","newRxError","runPluginHooks","fillWithDefaultSettings","getComposedPrimaryKeyOfDocumentData","getFinalFields","getPrimaryFieldOfPrimaryKey","getSchemaByObjectPath","normalizeRxJsonSchema","overwritable","flatClone","RxSchema","jsonSchema","hashFunction","indexes","getIndexes","primaryPath","primaryKey","properties","maxLength","schema","finalFields","_proto","prototype","getJsonSchemaWithoutMeta","_deleted","_rev","_meta","_attachments","required","filter","r","startsWith","validateChange","dataBefore","dataAfter","forEach","fieldName","getDocumentPrototype","proto","pathProperties","Object","keys","key","fullPath","__defineGetter__","get","undefined","ret","defineProperty","get$","enumerable","configurable","get$$","populate","getPrimaryOfDocumentData","documentData","_createClass","version","values","entries","v","hasOwnProperty","call","k","default","JSON","stringify","map","index","getPreviousVersions","c","Array","fill","createRxSchema","runPreCreateHooks","useJsonSchema","deepFreezeWhenDevMode","isRxSchema","obj","toTypedRxJsonSchema"],"sources":["../../src/rx-schema.ts"],"sourcesContent":["import {\r\n overwriteGetterForCaching,\r\n isMaybeReadonlyArray,\r\n deepEqual\r\n} from './plugins/utils/index.ts';\r\nimport {\r\n newRxError,\r\n} from './rx-error.ts';\r\nimport {\r\n runPluginHooks\r\n} from './hooks.ts';\r\n\r\nimport type {\r\n DeepMutable,\r\n DeepReadonly,\r\n HashFunction,\r\n MaybeReadonly,\r\n RxDocument,\r\n RxDocumentData,\r\n RxJsonSchema,\r\n StringKeys\r\n} from './types/index.d.ts';\r\nimport {\r\n fillWithDefaultSettings,\r\n getComposedPrimaryKeyOfDocumentData,\r\n getFinalFields,\r\n getPrimaryFieldOfPrimaryKey,\r\n getSchemaByObjectPath,\r\n normalizeRxJsonSchema\r\n} from './rx-schema-helper.ts';\r\nimport { overwritable } from './overwritable.ts';\r\nimport { flatClone } from 'event-reduce-js';\r\n\r\nexport class RxSchema<RxDocType = any> {\r\n public indexes: MaybeReadonly<string[]>[];\r\n public readonly primaryPath: StringKeys<RxDocumentData<RxDocType>>;\r\n public finalFields: string[];\r\n\r\n constructor(\r\n public readonly jsonSchema: RxJsonSchema<RxDocumentData<RxDocType>>,\r\n public readonly hashFunction: HashFunction\r\n ) {\r\n this.indexes = getIndexes(this.jsonSchema);\r\n\r\n // primary is always required\r\n this.primaryPath = getPrimaryFieldOfPrimaryKey(this.jsonSchema.primaryKey);\r\n\r\n /**\r\n * Many people accidentally put in wrong schema state\r\n * without the dev-mode plugin, so we need this check here\r\n * even in non-dev-mode.\r\n */\r\n if (!jsonSchema.properties[this.primaryPath].maxLength) {\r\n throw newRxError('SC39', { schema: jsonSchema });\r\n }\r\n\r\n this.finalFields = getFinalFields(this.jsonSchema);\r\n }\r\n\r\n public get version(): number {\r\n return this.jsonSchema.version;\r\n }\r\n\r\n public get defaultValues(): { [P in keyof RxDocType]: RxDocType[P] } {\r\n const values = {} as { [P in keyof RxDocType]: RxDocType[P] };\r\n Object\r\n .entries(this.jsonSchema.properties)\r\n .filter(([, v]) => Object.prototype.hasOwnProperty.call(v, 'default'))\r\n .forEach(([k, v]) => (values as any)[k] = (v as any).default);\r\n return overwriteGetterForCaching(\r\n this,\r\n 'defaultValues',\r\n values\r\n );\r\n }\r\n\r\n public getJsonSchemaWithoutMeta(): RxJsonSchema<RxDocumentData<RxDocType>> {\r\n const jsonSchema: any = flatClone(this.jsonSchema);\r\n jsonSchema.properties = flatClone(jsonSchema.properties);\r\n delete jsonSchema.properties._deleted;\r\n delete jsonSchema.properties._rev;\r\n delete jsonSchema.properties._meta;\r\n delete jsonSchema.properties._attachments;\r\n\r\n if (jsonSchema.required) {\r\n jsonSchema.required = jsonSchema.required.filter((r: string) => !r.startsWith('_'));\r\n }\r\n\r\n return jsonSchema as RxJsonSchema<RxDocumentData<RxDocType>>;\r\n }\r\n\r\n /**\r\n * @overrides itself on the first call\r\n */\r\n public get hash(): Promise<string> {\r\n return overwriteGetterForCaching(\r\n this,\r\n 'hash',\r\n this.hashFunction(JSON.stringify(this.jsonSchema))\r\n );\r\n }\r\n\r\n /**\r\n * checks if a given change on a document is allowed\r\n * Ensures that:\r\n * - final fields are not modified\r\n * @throws {Error} if not valid\r\n */\r\n validateChange(dataBefore: any, dataAfter: any): void {\r\n this.finalFields.forEach(fieldName => {\r\n if (!deepEqual(dataBefore[fieldName], dataAfter[fieldName])) {\r\n throw newRxError('DOC9', {\r\n dataBefore,\r\n dataAfter,\r\n fieldName,\r\n schema: this.jsonSchema\r\n });\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * creates the schema-based document-prototype,\r\n * see RxCollection.getDocumentPrototype()\r\n */\r\n public getDocumentPrototype(): any {\r\n const proto: any = {};\r\n\r\n /**\r\n * On the top level, we know all keys\r\n * and therefore do not have to create a new Proxy object\r\n * for each document. Instead we define the getter in the prototype once.\r\n */\r\n const pathProperties = getSchemaByObjectPath(\r\n this.jsonSchema,\r\n ''\r\n );\r\n Object.keys(pathProperties)\r\n .forEach(key => {\r\n const fullPath = key;\r\n\r\n // getter - value\r\n proto.__defineGetter__(\r\n key,\r\n function (this: RxDocument) {\r\n if (!this.get || typeof this.get !== 'function') {\r\n /**\r\n * When an object gets added to the state of a vuejs-component,\r\n * it happens that this getter is called with another scope.\r\n * To prevent errors, we have to return undefined in this case\r\n */\r\n return undefined;\r\n }\r\n const ret = this.get(fullPath);\r\n return ret;\r\n }\r\n );\r\n // getter - observable$\r\n Object.defineProperty(proto, key + '$', {\r\n get: function () {\r\n return this.get$(fullPath);\r\n },\r\n enumerable: false,\r\n configurable: false\r\n });\r\n // getter - reactivity$$\r\n Object.defineProperty(proto, key + '$$', {\r\n get: function () {\r\n return this.get$$(fullPath);\r\n },\r\n enumerable: false,\r\n configurable: false\r\n });\r\n // getter - populate_\r\n Object.defineProperty(proto, key + '_', {\r\n get: function () {\r\n return this.populate(fullPath);\r\n },\r\n enumerable: false,\r\n configurable: false\r\n });\r\n });\r\n\r\n overwriteGetterForCaching(\r\n this,\r\n 'getDocumentPrototype',\r\n () => proto\r\n );\r\n return proto;\r\n }\r\n\r\n\r\n getPrimaryOfDocumentData(\r\n documentData: Partial<RxDocType>\r\n ): string {\r\n return getComposedPrimaryKeyOfDocumentData(\r\n this.jsonSchema,\r\n documentData\r\n );\r\n }\r\n}\r\n\r\nexport function getIndexes<RxDocType = any>(\r\n jsonSchema: RxJsonSchema<RxDocType>\r\n): MaybeReadonly<string[]>[] {\r\n return (jsonSchema.indexes || []).map(index => isMaybeReadonlyArray(index) ? index : [index]);\r\n}\r\n\r\n/**\r\n * array with previous version-numbers\r\n */\r\nexport function getPreviousVersions(schema: RxJsonSchema<any>): number[] {\r\n const version = schema.version ? schema.version : 0;\r\n let c = 0;\r\n return new Array(version)\r\n .fill(0)\r\n .map(() => c++);\r\n}\r\n\r\nexport function createRxSchema<T>(\r\n jsonSchema: RxJsonSchema<T>,\r\n hashFunction: HashFunction,\r\n runPreCreateHooks = true\r\n): RxSchema<T> {\r\n if (runPreCreateHooks) {\r\n runPluginHooks('preCreateRxSchema', jsonSchema);\r\n }\r\n\r\n let useJsonSchema = fillWithDefaultSettings(jsonSchema);\r\n useJsonSchema = normalizeRxJsonSchema(useJsonSchema);\r\n overwritable.deepFreezeWhenDevMode(useJsonSchema);\r\n\r\n const schema = new RxSchema(useJsonSchema, hashFunction);\r\n runPluginHooks('createRxSchema', schema);\r\n return schema;\r\n}\r\n\r\nexport function isRxSchema(obj: any): boolean {\r\n return obj instanceof RxSchema;\r\n}\r\n\r\n/**\r\n * Used as helper function the generate the document type out of the schema via typescript.\r\n * @link https://github.com/pubkey/rxdb/discussions/3467\r\n */\r\nexport function toTypedRxJsonSchema<T extends DeepReadonly<RxJsonSchema<any>>>(schema: T): DeepMutable<T> {\r\n return schema as any;\r\n}\r\n"],"mappings":";AAAA,SACIA,yBAAyB,EACzBC,oBAAoB,EACpBC,SAAS,QACN,0BAA0B;AACjC,SACIC,UAAU,QACP,eAAe;AACtB,SACIC,cAAc,QACX,YAAY;AAYnB,SACIC,uBAAuB,EACvBC,mCAAmC,EACnCC,cAAc,EACdC,2BAA2B,EAC3BC,qBAAqB,EACrBC,qBAAqB,QAClB,uBAAuB;AAC9B,SAASC,YAAY,QAAQ,mBAAmB;AAChD,SAASC,SAAS,QAAQ,iBAAiB;AAE3C,WAAaC,QAAQ;EAKjB,SAAAA,SACoBC,UAAmD,EACnDC,YAA0B,EAC5C;IAAA,KAFkBD,UAAmD,GAAnDA,UAAmD;IAAA,KACnDC,YAA0B,GAA1BA,YAA0B;IAE1C,IAAI,CAACC,OAAO,GAAGC,UAAU,CAAC,IAAI,CAACH,UAAU,CAAC;;IAE1C;IACA,IAAI,CAACI,WAAW,GAAGV,2BAA2B,CAAC,IAAI,CAACM,UAAU,CAACK,UAAU,CAAC;;IAE1E;AACR;AACA;AACA;AACA;IACQ,IAAI,CAACL,UAAU,CAACM,UAAU,CAAC,IAAI,CAACF,WAAW,CAAC,CAACG,SAAS,EAAE;MACpD,MAAMlB,UAAU,CAAC,MAAM,EAAE;QAAEmB,MAAM,EAAER;MAAW,CAAC,CAAC;IACpD;IAEA,IAAI,CAACS,WAAW,GAAGhB,cAAc,CAAC,IAAI,CAACO,UAAU,CAAC;EACtD;EAAC,IAAAU,MAAA,GAAAX,QAAA,CAAAY,SAAA;EAAAD,MAAA,CAmBME,wBAAwB,GAA/B,SAAOA,wBAAwBA,CAAA,EAA4C;IACvE,IAAMZ,UAAe,GAAGF,SAAS,CAAC,IAAI,CAACE,UAAU,CAAC;IAClDA,UAAU,CAACM,UAAU,GAAGR,SAAS,CAACE,UAAU,CAACM,UAAU,CAAC;IACxD,OAAON,UAAU,CAACM,UAAU,CAACO,QAAQ;IACrC,OAAOb,UAAU,CAACM,UAAU,CAACQ,IAAI;IACjC,OAAOd,UAAU,CAACM,UAAU,CAACS,KAAK;IAClC,OAAOf,UAAU,CAACM,UAAU,CAACU,YAAY;IAEzC,IAAIhB,UAAU,CAACiB,QAAQ,EAAE;MACrBjB,UAAU,CAACiB,QAAQ,GAAGjB,UAAU,CAACiB,QAAQ,CAACC,MAAM,CAAEC,CAAS,IAAK,CAACA,CAAC,CAACC,UAAU,CAAC,GAAG,CAAC,CAAC;IACvF;IAEA,OAAOpB,UAAU;EACrB;;EAEA;AACJ;AACA,KAFI;EAWA;AACJ;AACA;AACA;AACA;AACA;EALIU,MAAA,CAMAW,cAAc,GAAd,SAAAA,cAAcA,CAACC,UAAe,EAAEC,SAAc,EAAQ;IAClD,IAAI,CAACd,WAAW,CAACe,OAAO,CAACC,SAAS,IAAI;MAClC,IAAI,CAACrC,SAAS,CAACkC,UAAU,CAACG,SAAS,CAAC,EAAEF,SAAS,CAACE,SAAS,CAAC,CAAC,EAAE;QACzD,MAAMpC,UAAU,CAAC,MAAM,EAAE;UACrBiC,UAAU;UACVC,SAAS;UACTE,SAAS;UACTjB,MAAM,EAAE,IAAI,CAACR;QACjB,CAAC,CAAC;MACN;IACJ,CAAC,CAAC;EACN;;EAEA;AACJ;AACA;AACA,KAHI;EAAAU,MAAA,CAIOgB,oBAAoB,GAA3B,SAAOA,oBAAoBA,CAAA,EAAQ;IAC/B,IAAMC,KAAU,GAAG,CAAC,CAAC;;IAErB;AACR;AACA;AACA;AACA;IACQ,IAAMC,cAAc,GAAGjC,qBAAqB,CACxC,IAAI,CAACK,UAAU,EACf,EACJ,CAAC;IACD6B,MAAM,CAACC,IAAI,CAACF,cAAc,CAAC,CACtBJ,OAAO,CAACO,GAAG,IAAI;MACZ,IAAMC,QAAQ,GAAGD,GAAG;;MAEpB;MACAJ,KAAK,CAACM,gBAAgB,CAClBF,GAAG,EACH,YAA4B;QACxB,IAAI,CAAC,IAAI,CAACG,GAAG,IAAI,OAAO,IAAI,CAACA,GAAG,KAAK,UAAU,EAAE;UAC7C;AAC5B;AACA;AACA;AACA;UAC4B,OAAOC,SAAS;QACpB;QACA,IAAMC,GAAG,GAAG,IAAI,CAACF,GAAG,CAACF,QAAQ,CAAC;QAC9B,OAAOI,GAAG;MACd,CACJ,CAAC;MACD;MACAP,MAAM,CAACQ,cAAc,CAACV,KAAK,EAAEI,GAAG,GAAG,GAAG,EAAE;QACpCG,GAAG,EAAE,SAAAA,CAAA,EAAY;UACb,OAAO,IAAI,CAACI,IAAI,CAACN,QAAQ,CAAC;QAC9B,CAAC;QACDO,UAAU,EAAE,KAAK;QACjBC,YAAY,EAAE;MAClB,CAAC,CAAC;MACF;MACAX,MAAM,CAACQ,cAAc,CAACV,KAAK,EAAEI,GAAG,GAAG,IAAI,EAAE;QACrCG,GAAG,EAAE,SAAAA,CAAA,EAAY;UACb,OAAO,IAAI,CAACO,KAAK,CAACT,QAAQ,CAAC;QAC/B,CAAC;QACDO,UAAU,EAAE,KAAK;QACjBC,YAAY,EAAE;MAClB,CAAC,CAAC;MACF;MACAX,MAAM,CAACQ,cAAc,CAACV,KAAK,EAAEI,GAAG,GAAG,GAAG,EAAE;QACpCG,GAAG,EAAE,SAAAA,CAAA,EAAY;UACb,OAAO,IAAI,CAACQ,QAAQ,CAACV,QAAQ,CAAC;QAClC,CAAC;QACDO,UAAU,EAAE,KAAK;QACjBC,YAAY,EAAE;MAClB,CAAC,CAAC;IACN,CAAC,CAAC;IAENtD,yBAAyB,CACrB,IAAI,EACJ,sBAAsB,EACtB,MAAMyC,KACV,CAAC;IACD,OAAOA,KAAK;EAChB,CAAC;EAAAjB,MAAA,CAGDiC,wBAAwB,GAAxB,SAAAA,wBAAwBA,CACpBC,YAAgC,EAC1B;IACN,OAAOpD,mCAAmC,CACtC,IAAI,CAACQ,UAAU,EACf4C,YACJ,CAAC;EACL,CAAC;EAAA,OAAAC,YAAA,CAAA9C,QAAA;IAAAgC,GAAA;IAAAG,GAAA,EA5ID,SAAAA,CAAA,EAA6B;MACzB,OAAO,IAAI,CAAClC,UAAU,CAAC8C,OAAO;IAClC;EAAC;IAAAf,GAAA;IAAAG,GAAA,EAED,SAAAA,CAAA,EAAqE;MACjE,IAAMa,MAAM,GAAG,CAAC,CAA6C;MAC7DlB,MAAM,CACDmB,OAAO,CAAC,IAAI,CAAChD,UAAU,CAACM,UAAU,CAAC,CACnCY,MAAM,CAAC,CAAC,GAAG+B,CAAC,CAAC,KAAKpB,MAAM,CAAClB,SAAS,CAACuC,cAAc,CAACC,IAAI,CAACF,CAAC,EAAE,SAAS,CAAC,CAAC,CACrEzB,OAAO,CAAC,CAAC,CAAC4B,CAAC,EAAEH,CAAC,CAAC,KAAMF,MAAM,CAASK,CAAC,CAAC,GAAIH,CAAC,CAASI,OAAO,CAAC;MACjE,OAAOnE,yBAAyB,CAC5B,IAAI,EACJ,eAAe,EACf6D,MACJ,CAAC;IACL;EAAC;IAAAhB,GAAA;IAAAG,GAAA,EAoBD,SAAAA,CAAA,EAAmC;MAC/B,OAAOhD,yBAAyB,CAC5B,IAAI,EACJ,MAAM,EACN,IAAI,CAACe,YAAY,CAACqD,IAAI,CAACC,SAAS,CAAC,IAAI,CAACvD,UAAU,CAAC,CACrD,CAAC;IACL;EAAC;AAAA;AAsGL,OAAO,SAASG,UAAUA,CACtBH,UAAmC,EACV;EACzB,OAAO,CAACA,UAAU,CAACE,OAAO,IAAI,EAAE,EAAEsD,GAAG,CAACC,KAAK,IAAItE,oBAAoB,CAACsE,KAAK,CAAC,GAAGA,KAAK,GAAG,CAACA,KAAK,CAAC,CAAC;AACjG;;AAEA;AACA;AACA;AACA,OAAO,SAASC,mBAAmBA,CAAClD,MAAyB,EAAY;EACrE,IAAMsC,OAAO,GAAGtC,MAAM,CAACsC,OAAO,GAAGtC,MAAM,CAACsC,OAAO,GAAG,CAAC;EACnD,IAAIa,CAAC,GAAG,CAAC;EACT,OAAO,IAAIC,KAAK,CAACd,OAAO,CAAC,CACpBe,IAAI,CAAC,CAAC,CAAC,CACPL,GAAG,CAAC,MAAMG,CAAC,EAAE,CAAC;AACvB;AAEA,OAAO,SAASG,cAAcA,CAC1B9D,UAA2B,EAC3BC,YAA0B,EAC1B8D,iBAAiB,GAAG,IAAI,EACb;EACX,IAAIA,iBAAiB,EAAE;IACnBzE,cAAc,CAAC,mBAAmB,EAAEU,UAAU,CAAC;EACnD;EAEA,IAAIgE,aAAa,GAAGzE,uBAAuB,CAACS,UAAU,CAAC;EACvDgE,aAAa,GAAGpE,qBAAqB,CAACoE,aAAa,CAAC;EACpDnE,YAAY,CAACoE,qBAAqB,CAACD,aAAa,CAAC;EAEjD,IAAMxD,MAAM,GAAG,IAAIT,QAAQ,CAACiE,aAAa,EAAE/D,YAAY,CAAC;EACxDX,cAAc,CAAC,gBAAgB,EAAEkB,MAAM,CAAC;EACxC,OAAOA,MAAM;AACjB;AAEA,OAAO,SAAS0D,UAAUA,CAACC,GAAQ,EAAW;EAC1C,OAAOA,GAAG,YAAYpE,QAAQ;AAClC;;AAEA;AACA;AACA;AACA;AACA,OAAO,SAASqE,mBAAmBA,CAA4C5D,MAAS,EAAkB;EACtG,OAAOA,MAAM;AACjB","ignoreList":[]}
@@ -11,6 +11,35 @@ import { normalizeMangoQuery, prepareQuery } from "./rx-query-helper.js";
11
11
  import { HOOKS, runPluginHooks } from "./hooks.js";
12
12
  export var INTERNAL_STORAGE_NAME = '_rxdb_internal';
13
13
  export var RX_DATABASE_LOCAL_DOCS_STORAGE_NAME = 'rxdatabase_storage_local';
14
+
15
+ /**
16
+ * Context string used by RxCollection.bulkInsert().
17
+ * Documents written with this context are already cloned
18
+ * by fillObjectDataBeforeInsert(), so the wrapped storage
19
+ * can safely mutate them in place instead of cloning again.
20
+ */
21
+ export var RX_COLLECTION_BULK_INSERT_CONTEXT = 'rx-collection-bulk-insert';
22
+
23
+ /**
24
+ * Set of bulkWrite context strings whose documents
25
+ * are already cloned by the caller and can be safely
26
+ * mutated in place (skip flatClone in the insert path).
27
+ *
28
+ * Plugins can register additional contexts via
29
+ * registerMutableWriteContext().
30
+ */
31
+ var MUTABLE_DOCUMENT_WRITE_CONTEXTS = new Set([RX_COLLECTION_BULK_INSERT_CONTEXT]);
32
+
33
+ /**
34
+ * Register a bulkWrite context string as "mutable",
35
+ * meaning the caller guarantees that insert documents
36
+ * are already cloned and safe to mutate in place.
37
+ * This allows the wrapped storage to skip a redundant
38
+ * flatClone() call on the insert hot path.
39
+ */
40
+ export function registerMutableWriteContext(context) {
41
+ MUTABLE_DOCUMENT_WRITE_CONTEXTS.add(context);
42
+ }
14
43
  export async function getSingleDocument(storageInstance, documentId) {
15
44
  var results = await storageInstance.findDocumentsById([documentId], false);
16
45
  var doc = results[0];
@@ -137,7 +166,7 @@ onInsert, onUpdate) {
137
166
  * @performance is really important in this loop!
138
167
  */
139
168
  var rowAmount = bulkWriteRows.length;
140
- var _loop = function () {
169
+ for (var rowId = 0; rowId < rowAmount; rowId++) {
141
170
  var writeRow = bulkWriteRows[rowId];
142
171
 
143
172
  // use these variables to have less property accesses
@@ -150,15 +179,18 @@ onInsert, onUpdate) {
150
179
  if (hasDocsInDb) {
151
180
  documentInDb = docsInDb.get(docId);
152
181
  }
153
- var attachmentError;
182
+ var attachmentError = void 0;
154
183
  if (!documentInDb) {
155
184
  /**
156
185
  * It is possible to insert already deleted documents,
157
186
  * this can happen on replication.
158
187
  */
159
- var insertedIsDeleted = documentDeleted ? true : false;
160
188
  if (hasAttachments) {
161
- Object.entries(document._attachments).forEach(([attachmentId, attachmentData]) => {
189
+ var atts = document._attachments;
190
+ var attKeys = Object.keys(atts);
191
+ for (var a = 0; a < attKeys.length; a++) {
192
+ var attachmentId = attKeys[a];
193
+ var attachmentData = atts[attachmentId];
162
194
  if (!attachmentData.data) {
163
195
  attachmentError = {
164
196
  documentId: docId,
@@ -177,27 +209,27 @@ onInsert, onUpdate) {
177
209
  digest: attachmentData.digest
178
210
  });
179
211
  }
180
- });
212
+ }
181
213
  }
214
+ var insertedRow = void 0;
182
215
  if (!attachmentError) {
183
- if (hasAttachments) {
184
- bulkInsertDocs.push(stripAttachmentsDataFromRow(writeRow));
185
- if (onInsert) {
186
- onInsert(document);
187
- }
188
- } else {
189
- bulkInsertDocs.push(writeRow);
190
- if (onInsert) {
191
- onInsert(document);
192
- }
216
+ var row = hasAttachments ? stripAttachmentsDataFromRow(writeRow) : writeRow;
217
+ insertedRow = row;
218
+ bulkInsertDocs.push(row);
219
+ if (onInsert) {
220
+ onInsert(document);
193
221
  }
194
- newestRow = writeRow;
222
+ newestRow = row;
195
223
  }
196
- if (!insertedIsDeleted) {
224
+ if (!documentDeleted) {
225
+ var eventDocData = document;
226
+ if (hasAttachments) {
227
+ eventDocData = insertedRow ? insertedRow.document : stripAttachmentsDataFromDocument(document);
228
+ }
197
229
  var event = {
198
230
  documentId: docId,
199
231
  operation: 'INSERT',
200
- documentData: hasAttachments ? stripAttachmentsDataFromDocument(document) : document,
232
+ documentData: eventDocData,
201
233
  previousDocumentData: hasAttachments && previous ? stripAttachmentsDataFromDocument(previous) : previous
202
234
  };
203
235
  eventBulkEvents.push(event);
@@ -220,7 +252,7 @@ onInsert, onUpdate) {
220
252
  context
221
253
  };
222
254
  errors.push(err);
223
- return 1; // continue
255
+ continue;
224
256
  }
225
257
 
226
258
  // handle attachments data
@@ -232,86 +264,96 @@ onInsert, onUpdate) {
232
264
  * Deleted documents must have cleared all their attachments.
233
265
  */
234
266
  if (previous) {
235
- Object.keys(previous._attachments).forEach(attachmentId => {
267
+ var prevAtts = previous._attachments;
268
+ var prevAttKeys = Object.keys(prevAtts);
269
+ for (var _a = 0; _a < prevAttKeys.length; _a++) {
270
+ var _attachmentId = prevAttKeys[_a];
236
271
  attachmentsRemove.push({
237
272
  documentId: docId,
238
- attachmentId,
239
- digest: ensureNotFalsy(previous)._attachments[attachmentId].digest
273
+ attachmentId: _attachmentId,
274
+ digest: prevAtts[_attachmentId].digest
240
275
  });
241
- });
276
+ }
242
277
  }
243
278
  } else {
244
279
  // first check for errors
245
- Object.entries(document._attachments).find(([attachmentId, attachmentData]) => {
246
- var previousAttachmentData = previous ? previous._attachments[attachmentId] : undefined;
247
- if (!previousAttachmentData && !attachmentData.data) {
280
+ var docAtts = document._attachments;
281
+ var docAttKeys = Object.keys(docAtts);
282
+ for (var _a2 = 0; _a2 < docAttKeys.length; _a2++) {
283
+ var _attachmentId2 = docAttKeys[_a2];
284
+ var _attachmentData = docAtts[_attachmentId2];
285
+ var previousAttachmentData = previous ? previous._attachments[_attachmentId2] : undefined;
286
+ if (!previousAttachmentData && !_attachmentData.data) {
248
287
  attachmentError = {
249
288
  documentId: docId,
250
289
  documentInDb: documentInDb,
251
290
  isError: true,
252
291
  status: 510,
253
292
  writeRow,
254
- attachmentId,
293
+ attachmentId: _attachmentId2,
255
294
  context
256
295
  };
296
+ break;
257
297
  }
258
- return true;
259
- });
298
+ }
260
299
  if (!attachmentError) {
261
- Object.entries(document._attachments).forEach(([attachmentId, attachmentData]) => {
262
- var previousAttachmentData = previous ? previous._attachments[attachmentId] : undefined;
263
- if (!previousAttachmentData) {
300
+ for (var _a3 = 0; _a3 < docAttKeys.length; _a3++) {
301
+ var _attachmentId3 = docAttKeys[_a3];
302
+ var _attachmentData2 = docAtts[_attachmentId3];
303
+ var _previousAttachmentData = previous ? previous._attachments[_attachmentId3] : undefined;
304
+ if (!_previousAttachmentData) {
264
305
  attachmentsAdd.push({
265
306
  documentId: docId,
266
- attachmentId,
267
- attachmentData: attachmentData,
268
- digest: attachmentData.digest
307
+ attachmentId: _attachmentId3,
308
+ attachmentData: _attachmentData2,
309
+ digest: _attachmentData2.digest
269
310
  });
270
311
  } else {
271
- var newDigest = updatedRow.document._attachments[attachmentId].digest;
272
- if (attachmentData.data &&
312
+ var newDigest = updatedRow.document._attachments[_attachmentId3].digest;
313
+ if (_attachmentData2.data &&
273
314
  /**
274
315
  * Performance shortcut,
275
316
  * do not update the attachment data if it did not change.
276
317
  */
277
- previousAttachmentData.digest !== newDigest) {
318
+ _previousAttachmentData.digest !== newDigest) {
278
319
  attachmentsUpdate.push({
279
320
  documentId: docId,
280
- attachmentId,
281
- attachmentData: attachmentData,
282
- digest: attachmentData.digest
321
+ attachmentId: _attachmentId3,
322
+ attachmentData: _attachmentData2,
323
+ digest: _attachmentData2.digest
283
324
  });
284
325
  }
285
326
  }
286
- });
327
+ }
287
328
  }
288
329
  }
289
330
  }
290
331
  if (attachmentError) {
291
332
  errors.push(attachmentError);
292
333
  } else {
293
- if (hasAttachments) {
294
- bulkUpdateDocs.push(stripAttachmentsDataFromRow(updatedRow));
295
- if (onUpdate) {
296
- onUpdate(document);
297
- }
298
- } else {
299
- bulkUpdateDocs.push(updatedRow);
300
- if (onUpdate) {
301
- onUpdate(document);
302
- }
334
+ /**
335
+ * updatedRow already has attachments stripped (line above),
336
+ * so push it directly without stripping again.
337
+ */
338
+ bulkUpdateDocs.push(updatedRow);
339
+ if (onUpdate) {
340
+ onUpdate(document);
303
341
  }
304
342
  newestRow = updatedRow;
305
343
  }
306
- var eventDocumentData;
344
+ var eventDocumentData = void 0;
307
345
  var previousEventDocumentData = null;
308
- var operation;
346
+ var operation = void 0;
309
347
  if (previousDeleted && !documentDeleted) {
310
348
  operation = 'INSERT';
311
- eventDocumentData = hasAttachments ? stripAttachmentsDataFromDocument(document) : document;
349
+ /**
350
+ * Reuse the already-stripped document from updatedRow
351
+ * instead of calling stripAttachmentsDataFromDocument() again.
352
+ */
353
+ eventDocumentData = hasAttachments ? updatedRow.document : document;
312
354
  } else if (previous && !previousDeleted && !documentDeleted) {
313
355
  operation = 'UPDATE';
314
- eventDocumentData = hasAttachments ? stripAttachmentsDataFromDocument(document) : document;
356
+ eventDocumentData = hasAttachments ? updatedRow.document : document;
315
357
  previousEventDocumentData = previous;
316
358
  } else if (documentDeleted) {
317
359
  operation = 'DELETE';
@@ -332,9 +374,6 @@ onInsert, onUpdate) {
332
374
  };
333
375
  eventBulkEvents.push(_event);
334
376
  }
335
- };
336
- for (var rowId = 0; rowId < rowAmount; rowId++) {
337
- if (_loop()) continue;
338
377
  }
339
378
  return {
340
379
  bulkInsertDocs,
@@ -387,10 +426,13 @@ export function stripAttachmentsDataFromDocument(doc) {
387
426
  return doc;
388
427
  }
389
428
  var useDoc = flatClone(doc);
390
- useDoc._attachments = {};
391
- Object.entries(doc._attachments).forEach(([attachmentId, attachmentData]) => {
392
- useDoc._attachments[attachmentId] = attachmentWriteDataToNormalData(attachmentData);
393
- });
429
+ var destAtts = {};
430
+ var attKeys = Object.keys(atts);
431
+ for (var i = 0; i < attKeys.length; i++) {
432
+ var attachmentId = attKeys[i];
433
+ destAtts[attachmentId] = attachmentWriteDataToNormalData(atts[attachmentId]);
434
+ }
435
+ useDoc._attachments = destAtts;
394
436
  return useDoc;
395
437
  }
396
438
 
@@ -401,9 +443,12 @@ export function stripAttachmentsDataFromDocument(doc) {
401
443
  * during replication etc.
402
444
  */
403
445
  export function flatCloneDocWithMeta(doc) {
404
- return Object.assign({}, doc, {
405
- _meta: flatClone(doc._meta)
406
- });
446
+ return {
447
+ ...doc,
448
+ _meta: {
449
+ ...doc._meta
450
+ }
451
+ };
407
452
  }
408
453
  /**
409
454
  * Wraps the normal storageInstance of a RxCollection
@@ -428,7 +473,6 @@ rxJsonSchema) {
428
473
  options: storageInstance.options,
429
474
  async bulkWrite(rows, context) {
430
475
  var databaseToken = database.token;
431
- var toStorageWriteRows = new Array(rows.length);
432
476
  /**
433
477
  * Use the same timestamp for all docs of this rows-set.
434
478
  * This improves performance because calling Date.now() inside of the now() function
@@ -441,30 +485,68 @@ rxJsonSchema) {
441
485
  * inside the hot loop.
442
486
  */
443
487
  var firstRevision = '1-' + databaseToken;
444
- for (var index = 0; index < rows.length; index++) {
445
- var writeRow = rows[index];
446
- var previous = writeRow.previous;
447
- var document = void 0;
448
- if (previous) {
449
- document = flatCloneDocWithMeta(writeRow.document);
450
- document._meta.lwt = time;
451
- document._rev = createRevision(databaseToken, previous);
452
- } else {
453
- /**
454
- * Optimized insert path:
455
- * - Skip cloning _meta since we overwrite it entirely with { lwt: time }
456
- * - Use pre-computed firstRevision instead of calling createRevision()
457
- */
458
- document = flatClone(writeRow.document);
459
- document._meta = {
460
- lwt: time
461
- };
488
+ /**
489
+ * Share a single _meta object for all insert rows in this batch.
490
+ * All inserts in the same bulkWrite share the same timestamp,
491
+ * so we avoid creating a new { lwt: time } object per row.
492
+ * This shared reference is safe because:
493
+ * - All documents in one batch receive identical metadata values.
494
+ * - When a document is later updated, flatCloneDocWithMeta() creates
495
+ * a new _meta object, so the shared reference is never mutated.
496
+ */
497
+ var insertMeta = {
498
+ lwt: time
499
+ };
500
+
501
+ /**
502
+ * When the caller has already cloned the documents (registered
503
+ * via MUTABLE_DOCUMENT_WRITE_CONTEXTS), we can mutate them
504
+ * in place and reuse the input array, avoiding redundant
505
+ * flatClone() and wrapper-object allocations on every insert row.
506
+ */
507
+ var isMutableContext = MUTABLE_DOCUMENT_WRITE_CONTEXTS.has(context);
508
+ var toStorageWriteRows;
509
+ if (isMutableContext) {
510
+ /**
511
+ * Fast path: documents are already cloned by the caller.
512
+ * Set _meta/_rev directly on the document and reuse the
513
+ * input rows array without allocating wrapper objects.
514
+ */
515
+ for (var index = 0; index < rows.length; index++) {
516
+ var document = rows[index].document;
517
+ document._meta = insertMeta;
462
518
  document._rev = firstRevision;
463
519
  }
464
- toStorageWriteRows[index] = {
465
- document,
466
- previous
467
- };
520
+ toStorageWriteRows = rows;
521
+ } else {
522
+ toStorageWriteRows = new Array(rows.length);
523
+ for (var _index = 0; _index < rows.length; _index++) {
524
+ var writeRow = rows[_index];
525
+ var previous = writeRow.previous;
526
+ var _document = void 0;
527
+ if (previous) {
528
+ _document = flatCloneDocWithMeta(writeRow.document);
529
+ _document._meta.lwt = time;
530
+ _document._rev = createRevision(databaseToken, previous);
531
+ } else {
532
+ /**
533
+ * Insert path: flatClone is required because the input document
534
+ * may be a direct reference to another storage's internal data
535
+ * (e.g., during migration, query results from the old storage are
536
+ * passed directly as insert rows to the new storage).
537
+ *
538
+ * Use a shared insertMeta object instead of allocating { lwt: time }
539
+ * per row, since all inserts in the same batch share the same timestamp.
540
+ */
541
+ _document = flatClone(writeRow.document);
542
+ _document._meta = insertMeta;
543
+ _document._rev = firstRevision;
544
+ }
545
+ toStorageWriteRows[_index] = {
546
+ document: _document,
547
+ previous
548
+ };
549
+ }
468
550
  }
469
551
  if (HOOKS.preStorageWrite.length > 0) {
470
552
  runPluginHooks('preStorageWrite', {
@@ -676,8 +758,8 @@ export function getWrittenDocumentsFromBulkWriteResponse(primaryPath, writeRows,
676
758
  var error = response.error[index];
677
759
  errorIds.add(error.documentId);
678
760
  }
679
- for (var _index = 0; _index < realWriteRows.length; _index++) {
680
- var doc = realWriteRows[_index].document;
761
+ for (var _index2 = 0; _index2 < realWriteRows.length; _index2++) {
762
+ var doc = realWriteRows[_index2].document;
681
763
  if (!errorIds.has(doc[primaryPath])) {
682
764
  ret.push(stripAttachmentsDataFromDocument(doc));
683
765
  }
@@ -685,9 +767,9 @@ export function getWrittenDocumentsFromBulkWriteResponse(primaryPath, writeRows,
685
767
  } else {
686
768
  // pre-set array size for better performance
687
769
  ret.length = writeRows.length - response.error.length;
688
- for (var _index2 = 0; _index2 < realWriteRows.length; _index2++) {
689
- var _doc = realWriteRows[_index2].document;
690
- ret[_index2] = stripAttachmentsDataFromDocument(_doc);
770
+ for (var _index3 = 0; _index3 < realWriteRows.length; _index3++) {
771
+ var _doc = realWriteRows[_index3].document;
772
+ ret[_index3] = stripAttachmentsDataFromDocument(_doc);
691
773
  }
692
774
  }
693
775
  return ret;