@connecttomahdi/rxdb 17.0.0-beta.17 → 17.1.1
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.
- package/AGENTS.md +4 -0
- package/CHANGELOG.md +47 -4
- package/CLAUDE.md +2 -0
- package/dist/cjs/change-event-buffer.js +2 -1
- package/dist/cjs/change-event-buffer.js.map +1 -1
- package/dist/cjs/custom-index.js +85 -12
- package/dist/cjs/custom-index.js.map +1 -1
- package/dist/cjs/doc-cache.js +117 -35
- package/dist/cjs/doc-cache.js.map +1 -1
- package/dist/cjs/event-reduce.js +10 -1
- package/dist/cjs/event-reduce.js.map +1 -1
- package/dist/cjs/plugin-helpers.js +16 -0
- package/dist/cjs/plugin-helpers.js.map +1 -1
- package/dist/cjs/plugins/attachments/index.js +3 -3
- package/dist/cjs/plugins/attachments/index.js.map +1 -1
- package/dist/cjs/plugins/cleanup/cleanup.js +5 -3
- package/dist/cjs/plugins/cleanup/cleanup.js.map +1 -1
- package/dist/cjs/plugins/crdt/index.js +52 -0
- package/dist/cjs/plugins/crdt/index.js.map +1 -1
- package/dist/cjs/plugins/dev-mode/check-query.js +7 -1
- package/dist/cjs/plugins/dev-mode/check-query.js.map +1 -1
- package/dist/cjs/plugins/dev-mode/check-schema.js +2 -1
- package/dist/cjs/plugins/dev-mode/check-schema.js.map +1 -1
- package/dist/cjs/plugins/dev-mode/error-messages.js +43 -5
- package/dist/cjs/plugins/dev-mode/error-messages.js.map +1 -1
- package/dist/cjs/plugins/encryption-crypto-js/index.js +22 -6
- package/dist/cjs/plugins/encryption-crypto-js/index.js.map +1 -1
- package/dist/cjs/plugins/leader-election/index.js +5 -5
- package/dist/cjs/plugins/leader-election/index.js.map +1 -1
- package/dist/cjs/plugins/local-documents/local-documents.js +20 -13
- package/dist/cjs/plugins/local-documents/local-documents.js.map +1 -1
- package/dist/cjs/plugins/migration-schema/migration-helpers.js +3 -0
- package/dist/cjs/plugins/migration-schema/migration-helpers.js.map +1 -1
- package/dist/cjs/plugins/migration-schema/rx-migration-state.js +1 -1
- package/dist/cjs/plugins/migration-schema/rx-migration-state.js.map +1 -1
- package/dist/cjs/plugins/pipeline/rx-pipeline.js +5 -1
- package/dist/cjs/plugins/pipeline/rx-pipeline.js.map +1 -1
- package/dist/cjs/plugins/query-builder/mquery/nosql-query-builder.js +4 -2
- package/dist/cjs/plugins/query-builder/mquery/nosql-query-builder.js.map +1 -1
- package/dist/cjs/plugins/replication/index.js +40 -2
- package/dist/cjs/plugins/replication/index.js.map +1 -1
- package/dist/cjs/plugins/replication-google-drive/document-handling.js +17 -6
- package/dist/cjs/plugins/replication-google-drive/document-handling.js.map +1 -1
- package/dist/cjs/plugins/replication-google-drive/google-drive-helper.js +1 -1
- package/dist/cjs/plugins/replication-google-drive/google-drive-helper.js.map +1 -1
- package/dist/cjs/plugins/replication-google-drive/google-drive-types.js.map +1 -1
- package/dist/cjs/plugins/replication-google-drive/signaling.js +4 -1
- package/dist/cjs/plugins/replication-google-drive/signaling.js.map +1 -1
- package/dist/cjs/plugins/replication-google-drive/upstream.js +7 -4
- package/dist/cjs/plugins/replication-google-drive/upstream.js.map +1 -1
- package/dist/cjs/plugins/replication-microsoft-onedrive/signaling.js +4 -1
- package/dist/cjs/plugins/replication-microsoft-onedrive/signaling.js.map +1 -1
- package/dist/cjs/plugins/state/rx-state.js +14 -3
- package/dist/cjs/plugins/state/rx-state.js.map +1 -1
- package/dist/cjs/plugins/storage-dexie/rx-storage-instance-dexie.js +0 -7
- package/dist/cjs/plugins/storage-dexie/rx-storage-instance-dexie.js.map +1 -1
- package/dist/cjs/plugins/storage-memory/binary-search-bounds.js +112 -40
- package/dist/cjs/plugins/storage-memory/binary-search-bounds.js.map +1 -1
- package/dist/cjs/plugins/storage-memory/memory-helper.js +127 -40
- package/dist/cjs/plugins/storage-memory/memory-helper.js.map +1 -1
- package/dist/cjs/plugins/storage-memory/memory-indexes.js +1 -0
- package/dist/cjs/plugins/storage-memory/memory-indexes.js.map +1 -1
- package/dist/cjs/plugins/storage-memory/memory-types.js.map +1 -1
- package/dist/cjs/plugins/storage-memory/rx-storage-instance-memory.js +97 -37
- package/dist/cjs/plugins/storage-memory/rx-storage-instance-memory.js.map +1 -1
- package/dist/cjs/plugins/storage-mongodb/mongodb-helper.js +42 -1
- package/dist/cjs/plugins/storage-mongodb/mongodb-helper.js.map +1 -1
- package/dist/cjs/plugins/storage-mongodb/rx-storage-instance-mongodb.js +7 -7
- package/dist/cjs/plugins/storage-mongodb/rx-storage-instance-mongodb.js.map +1 -1
- package/dist/cjs/plugins/test-utils/config.js +1 -1
- package/dist/cjs/plugins/test-utils/config.js.map +1 -1
- package/dist/cjs/plugins/test-utils/performance.js +122 -92
- package/dist/cjs/plugins/test-utils/performance.js.map +1 -1
- package/dist/cjs/plugins/test-utils/schema-objects.js +1 -1
- package/dist/cjs/plugins/test-utils/schema-objects.js.map +1 -1
- package/dist/cjs/plugins/test-utils/test-util.js +62 -0
- package/dist/cjs/plugins/test-utils/test-util.js.map +1 -1
- package/dist/cjs/plugins/utils/utils-map.js +2 -2
- package/dist/cjs/plugins/utils/utils-map.js.map +1 -1
- package/dist/cjs/plugins/utils/utils-object-deep-equal.js +3 -2
- package/dist/cjs/plugins/utils/utils-object-deep-equal.js.map +1 -1
- package/dist/cjs/plugins/utils/utils-object-dot-prop.js +25 -0
- package/dist/cjs/plugins/utils/utils-object-dot-prop.js.map +1 -1
- package/dist/cjs/plugins/utils/utils-object.js +102 -27
- package/dist/cjs/plugins/utils/utils-object.js.map +1 -1
- package/dist/cjs/plugins/utils/utils-other.js +9 -4
- package/dist/cjs/plugins/utils/utils-other.js.map +1 -1
- package/dist/cjs/plugins/utils/utils-premium.js +5 -23
- package/dist/cjs/plugins/utils/utils-premium.js.map +1 -1
- package/dist/cjs/plugins/utils/utils-revision.js +20 -10
- package/dist/cjs/plugins/utils/utils-revision.js.map +1 -1
- package/dist/cjs/plugins/utils/utils-rxdb-version.js +1 -1
- package/dist/cjs/plugins/utils/utils-rxdb-version.js.map +1 -1
- package/dist/cjs/plugins/utils/utils-string.js +11 -8
- package/dist/cjs/plugins/utils/utils-string.js.map +1 -1
- package/dist/cjs/plugins/utils/utils-time.js +21 -16
- package/dist/cjs/plugins/utils/utils-time.js.map +1 -1
- package/dist/cjs/query-cache.js +6 -4
- package/dist/cjs/query-cache.js.map +1 -1
- package/dist/cjs/query-planner.js +2 -2
- package/dist/cjs/query-planner.js.map +1 -1
- package/dist/cjs/replication-protocol/downstream.js +1 -1
- package/dist/cjs/replication-protocol/downstream.js.map +1 -1
- package/dist/cjs/rx-collection-helper.js +11 -6
- package/dist/cjs/rx-collection-helper.js.map +1 -1
- package/dist/cjs/rx-collection.js +34 -6
- package/dist/cjs/rx-collection.js.map +1 -1
- package/dist/cjs/rx-database.js +40 -7
- package/dist/cjs/rx-database.js.map +1 -1
- package/dist/cjs/rx-document.js +10 -3
- package/dist/cjs/rx-document.js.map +1 -1
- package/dist/cjs/rx-query-helper.js +35 -12
- package/dist/cjs/rx-query-helper.js.map +1 -1
- package/dist/cjs/rx-query-single-result.js +9 -2
- package/dist/cjs/rx-query-single-result.js.map +1 -1
- package/dist/cjs/rx-query.js +72 -29
- package/dist/cjs/rx-query.js.map +1 -1
- package/dist/cjs/rx-schema-helper.js +9 -3
- package/dist/cjs/rx-schema-helper.js.map +1 -1
- package/dist/cjs/rx-schema.js +1 -0
- package/dist/cjs/rx-schema.js.map +1 -1
- package/dist/cjs/rx-storage-helper.js +212 -129
- package/dist/cjs/rx-storage-helper.js.map +1 -1
- package/dist/cjs/types/rx-error.d.js.map +1 -1
- package/dist/cjs/types/rx-schema.d.js.map +1 -1
- package/dist/esm/change-event-buffer.js +2 -1
- package/dist/esm/change-event-buffer.js.map +1 -1
- package/dist/esm/custom-index.js +85 -12
- package/dist/esm/custom-index.js.map +1 -1
- package/dist/esm/doc-cache.js +118 -36
- package/dist/esm/doc-cache.js.map +1 -1
- package/dist/esm/event-reduce.js +10 -1
- package/dist/esm/event-reduce.js.map +1 -1
- package/dist/esm/plugin-helpers.js +16 -0
- package/dist/esm/plugin-helpers.js.map +1 -1
- package/dist/esm/plugins/attachments/index.js +3 -3
- package/dist/esm/plugins/attachments/index.js.map +1 -1
- package/dist/esm/plugins/cleanup/cleanup.js +5 -3
- package/dist/esm/plugins/cleanup/cleanup.js.map +1 -1
- package/dist/esm/plugins/crdt/index.js +52 -0
- package/dist/esm/plugins/crdt/index.js.map +1 -1
- package/dist/esm/plugins/dev-mode/check-query.js +7 -1
- package/dist/esm/plugins/dev-mode/check-query.js.map +1 -1
- package/dist/esm/plugins/dev-mode/check-schema.js +2 -1
- package/dist/esm/plugins/dev-mode/check-schema.js.map +1 -1
- package/dist/esm/plugins/dev-mode/error-messages.js +43 -5
- package/dist/esm/plugins/dev-mode/error-messages.js.map +1 -1
- package/dist/esm/plugins/encryption-crypto-js/index.js +22 -6
- package/dist/esm/plugins/encryption-crypto-js/index.js.map +1 -1
- package/dist/esm/plugins/leader-election/index.js +4 -4
- package/dist/esm/plugins/leader-election/index.js.map +1 -1
- package/dist/esm/plugins/local-documents/local-documents.js +20 -13
- package/dist/esm/plugins/local-documents/local-documents.js.map +1 -1
- package/dist/esm/plugins/migration-schema/migration-helpers.js +3 -0
- package/dist/esm/plugins/migration-schema/migration-helpers.js.map +1 -1
- package/dist/esm/plugins/migration-schema/rx-migration-state.js +1 -1
- package/dist/esm/plugins/migration-schema/rx-migration-state.js.map +1 -1
- package/dist/esm/plugins/pipeline/rx-pipeline.js +5 -1
- package/dist/esm/plugins/pipeline/rx-pipeline.js.map +1 -1
- package/dist/esm/plugins/query-builder/mquery/nosql-query-builder.js +4 -2
- package/dist/esm/plugins/query-builder/mquery/nosql-query-builder.js.map +1 -1
- package/dist/esm/plugins/replication/index.js +40 -2
- package/dist/esm/plugins/replication/index.js.map +1 -1
- package/dist/esm/plugins/replication-google-drive/document-handling.js +17 -6
- package/dist/esm/plugins/replication-google-drive/document-handling.js.map +1 -1
- package/dist/esm/plugins/replication-google-drive/google-drive-helper.js +1 -1
- package/dist/esm/plugins/replication-google-drive/google-drive-helper.js.map +1 -1
- package/dist/esm/plugins/replication-google-drive/google-drive-types.js.map +1 -1
- package/dist/esm/plugins/replication-google-drive/signaling.js +4 -1
- package/dist/esm/plugins/replication-google-drive/signaling.js.map +1 -1
- package/dist/esm/plugins/replication-google-drive/upstream.js +7 -4
- package/dist/esm/plugins/replication-google-drive/upstream.js.map +1 -1
- package/dist/esm/plugins/replication-microsoft-onedrive/signaling.js +4 -1
- package/dist/esm/plugins/replication-microsoft-onedrive/signaling.js.map +1 -1
- package/dist/esm/plugins/state/rx-state.js +15 -4
- package/dist/esm/plugins/state/rx-state.js.map +1 -1
- package/dist/esm/plugins/storage-dexie/rx-storage-instance-dexie.js +1 -8
- package/dist/esm/plugins/storage-dexie/rx-storage-instance-dexie.js.map +1 -1
- package/dist/esm/plugins/storage-memory/binary-search-bounds.js +107 -40
- package/dist/esm/plugins/storage-memory/binary-search-bounds.js.map +1 -1
- package/dist/esm/plugins/storage-memory/memory-helper.js +128 -41
- package/dist/esm/plugins/storage-memory/memory-helper.js.map +1 -1
- package/dist/esm/plugins/storage-memory/memory-indexes.js +1 -0
- package/dist/esm/plugins/storage-memory/memory-indexes.js.map +1 -1
- package/dist/esm/plugins/storage-memory/memory-types.js.map +1 -1
- package/dist/esm/plugins/storage-memory/rx-storage-instance-memory.js +90 -30
- package/dist/esm/plugins/storage-memory/rx-storage-instance-memory.js.map +1 -1
- package/dist/esm/plugins/storage-mongodb/mongodb-helper.js +39 -0
- package/dist/esm/plugins/storage-mongodb/mongodb-helper.js.map +1 -1
- package/dist/esm/plugins/storage-mongodb/rx-storage-instance-mongodb.js +8 -8
- package/dist/esm/plugins/storage-mongodb/rx-storage-instance-mongodb.js.map +1 -1
- package/dist/esm/plugins/test-utils/config.js +1 -1
- package/dist/esm/plugins/test-utils/config.js.map +1 -1
- package/dist/esm/plugins/test-utils/performance.js +122 -92
- package/dist/esm/plugins/test-utils/performance.js.map +1 -1
- package/dist/esm/plugins/test-utils/schema-objects.js +1 -1
- package/dist/esm/plugins/test-utils/schema-objects.js.map +1 -1
- package/dist/esm/plugins/test-utils/test-util.js +59 -0
- package/dist/esm/plugins/test-utils/test-util.js.map +1 -1
- package/dist/esm/plugins/utils/utils-map.js +2 -2
- package/dist/esm/plugins/utils/utils-map.js.map +1 -1
- package/dist/esm/plugins/utils/utils-object-deep-equal.js +3 -2
- package/dist/esm/plugins/utils/utils-object-deep-equal.js.map +1 -1
- package/dist/esm/plugins/utils/utils-object-dot-prop.js +25 -0
- package/dist/esm/plugins/utils/utils-object-dot-prop.js.map +1 -1
- package/dist/esm/plugins/utils/utils-object.js +102 -27
- package/dist/esm/plugins/utils/utils-object.js.map +1 -1
- package/dist/esm/plugins/utils/utils-other.js +9 -4
- package/dist/esm/plugins/utils/utils-other.js.map +1 -1
- package/dist/esm/plugins/utils/utils-premium.js +5 -23
- package/dist/esm/plugins/utils/utils-premium.js.map +1 -1
- package/dist/esm/plugins/utils/utils-revision.js +20 -10
- package/dist/esm/plugins/utils/utils-revision.js.map +1 -1
- package/dist/esm/plugins/utils/utils-rxdb-version.js +1 -1
- package/dist/esm/plugins/utils/utils-rxdb-version.js.map +1 -1
- package/dist/esm/plugins/utils/utils-string.js +11 -8
- package/dist/esm/plugins/utils/utils-string.js.map +1 -1
- package/dist/esm/plugins/utils/utils-time.js +21 -16
- package/dist/esm/plugins/utils/utils-time.js.map +1 -1
- package/dist/esm/query-cache.js +7 -5
- package/dist/esm/query-cache.js.map +1 -1
- package/dist/esm/query-planner.js +2 -2
- package/dist/esm/query-planner.js.map +1 -1
- package/dist/esm/replication-protocol/downstream.js +1 -1
- package/dist/esm/replication-protocol/downstream.js.map +1 -1
- package/dist/esm/rx-collection-helper.js +12 -7
- package/dist/esm/rx-collection-helper.js.map +1 -1
- package/dist/esm/rx-collection.js +35 -7
- package/dist/esm/rx-collection.js.map +1 -1
- package/dist/esm/rx-database.js +40 -7
- package/dist/esm/rx-database.js.map +1 -1
- package/dist/esm/rx-document.js +11 -4
- package/dist/esm/rx-document.js.map +1 -1
- package/dist/esm/rx-query-helper.js +35 -12
- package/dist/esm/rx-query-helper.js.map +1 -1
- package/dist/esm/rx-query-single-result.js +10 -3
- package/dist/esm/rx-query-single-result.js.map +1 -1
- package/dist/esm/rx-query.js +72 -29
- package/dist/esm/rx-query.js.map +1 -1
- package/dist/esm/rx-schema-helper.js +9 -3
- package/dist/esm/rx-schema-helper.js.map +1 -1
- package/dist/esm/rx-schema.js +1 -0
- package/dist/esm/rx-schema.js.map +1 -1
- package/dist/esm/rx-storage-helper.js +176 -94
- package/dist/esm/rx-storage-helper.js.map +1 -1
- package/dist/esm/types/rx-error.d.js.map +1 -1
- package/dist/esm/types/rx-schema.d.js.map +1 -1
- package/dist/types/custom-index.d.ts +5 -0
- package/dist/types/doc-cache.d.ts +1 -1
- package/dist/types/plugins/dev-mode/error-messages.d.ts +36 -0
- package/dist/types/plugins/leader-election/index.d.ts +1 -0
- package/dist/types/plugins/replication-google-drive/document-handling.d.ts +4 -1
- package/dist/types/plugins/replication-google-drive/google-drive-types.d.ts +1 -0
- package/dist/types/plugins/state/rx-state.d.ts +1 -1
- package/dist/types/plugins/storage-denokv/index.d.ts +1 -1
- package/dist/types/plugins/storage-dexie/rx-storage-dexie.d.ts +1 -1
- package/dist/types/plugins/storage-localstorage/index.d.ts +1 -1
- package/dist/types/plugins/storage-memory/binary-search-bounds.d.ts +21 -10
- package/dist/types/plugins/storage-memory/memory-helper.d.ts +7 -3
- package/dist/types/plugins/storage-memory/memory-types.d.ts +5 -0
- package/dist/types/plugins/storage-mongodb/mongodb-helper.d.ts +9 -1
- package/dist/types/plugins/storage-mongodb/rx-storage-instance-mongodb.d.ts +2 -2
- package/dist/types/plugins/storage-mongodb/rx-storage-mongodb.d.ts +1 -1
- package/dist/types/plugins/storage-remote/rx-storage-remote.d.ts +1 -1
- package/dist/types/plugins/storage-sqlite/index.d.ts +1 -1
- package/dist/types/plugins/test-utils/performance.d.ts +36 -0
- package/dist/types/plugins/test-utils/test-util.d.ts +17 -0
- package/dist/types/plugins/utils/utils-object.d.ts +8 -3
- package/dist/types/plugins/utils/utils-premium.d.ts +0 -2
- package/dist/types/plugins/utils/utils-rxdb-version.d.ts +1 -1
- package/dist/types/rx-database.d.ts +1 -1
- package/dist/types/rx-query-single-result.d.ts +1 -1
- package/dist/types/rx-query.d.ts +3 -2
- package/dist/types/rx-storage-helper.d.ts +15 -0
- package/dist/types/types/rx-error.d.ts +3 -0
- package/dist/types/types/rx-schema.d.ts +5 -0
- package/eslint.config.mjs +2 -1
- package/package.json +38 -35
- package/scripts/check-code-block-line-length.js +91 -0
- package/scripts/check-em-dashes.js +53 -0
- package/scripts/copy-path.mjs +20 -0
- package/scripts/docs-fetch-git-history.mjs +36 -0
- package/scripts/fix-types.mjs +15 -8
- package/scripts/install-foundationdb.sh +0 -6
- package/scripts/notify-indexnow.mjs +171 -0
- package/scripts/start-foundationdb-docker.sh +73 -0
- package/src/change-event-buffer.ts +4 -1
- package/src/custom-index.ts +93 -16
- package/src/doc-cache.ts +117 -41
- package/src/event-reduce.ts +10 -1
- package/src/plugin-helpers.ts +10 -0
- package/src/plugins/attachments/index.ts +10 -12
- package/src/plugins/cleanup/cleanup.ts +5 -3
- package/src/plugins/crdt/index.ts +55 -0
- package/src/plugins/dev-mode/check-query.ts +7 -1
- package/src/plugins/dev-mode/check-schema.ts +2 -1
- package/src/plugins/dev-mode/error-messages.ts +45 -5
- package/src/plugins/encryption-crypto-js/index.ts +18 -6
- package/src/plugins/leader-election/index.ts +9 -8
- package/src/plugins/local-documents/local-documents.ts +21 -12
- package/src/plugins/migration-schema/migration-helpers.ts +3 -0
- package/src/plugins/migration-schema/rx-migration-state.ts +1 -1
- package/src/plugins/pipeline/rx-pipeline.ts +5 -1
- package/src/plugins/query-builder/mquery/nosql-query-builder.ts +8 -2
- package/src/plugins/replication/index.ts +41 -3
- package/src/plugins/replication-google-drive/document-handling.ts +17 -5
- package/src/plugins/replication-google-drive/google-drive-helper.ts +1 -1
- package/src/plugins/replication-google-drive/google-drive-types.ts +1 -0
- package/src/plugins/replication-google-drive/signaling.ts +4 -1
- package/src/plugins/replication-google-drive/upstream.ts +7 -4
- package/src/plugins/replication-microsoft-onedrive/signaling.ts +4 -1
- package/src/plugins/state/rx-state.ts +17 -5
- package/src/plugins/storage-dexie/rx-storage-instance-dexie.ts +0 -27
- package/src/plugins/storage-memory/binary-search-bounds.ts +105 -40
- package/src/plugins/storage-memory/memory-helper.ts +158 -67
- package/src/plugins/storage-memory/memory-indexes.ts +1 -0
- package/src/plugins/storage-memory/memory-types.ts +5 -0
- package/src/plugins/storage-memory/rx-storage-instance-memory.ts +104 -53
- package/src/plugins/storage-mongodb/mongodb-helper.ts +43 -1
- package/src/plugins/storage-mongodb/rx-storage-instance-mongodb.ts +11 -9
- package/src/plugins/test-utils/config.ts +2 -1
- package/src/plugins/test-utils/performance.ts +159 -85
- package/src/plugins/test-utils/schema-objects.ts +1 -1
- package/src/plugins/test-utils/test-util.ts +71 -0
- package/src/plugins/utils/utils-map.ts +2 -2
- package/src/plugins/utils/utils-object-deep-equal.ts +2 -4
- package/src/plugins/utils/utils-object-dot-prop.ts +25 -0
- package/src/plugins/utils/utils-object.ts +103 -28
- package/src/plugins/utils/utils-other.ts +9 -4
- package/src/plugins/utils/utils-premium.ts +11 -37
- package/src/plugins/utils/utils-revision.ts +20 -9
- package/src/plugins/utils/utils-rxdb-version.ts +1 -1
- package/src/plugins/utils/utils-string.ts +11 -9
- package/src/plugins/utils/utils-time.ts +21 -17
- package/src/query-cache.ts +6 -5
- package/src/query-planner.ts +2 -2
- package/src/replication-protocol/downstream.ts +1 -1
- package/src/rx-collection-helper.ts +12 -6
- package/src/rx-collection.ts +39 -8
- package/src/rx-database.ts +49 -17
- package/src/rx-document.ts +12 -3
- package/src/rx-query-helper.ts +36 -15
- package/src/rx-query-single-result.ts +10 -3
- package/src/rx-query.ts +48 -8
- package/src/rx-schema-helper.ts +7 -4
- package/src/rx-schema.ts +1 -0
- package/src/rx-storage-helper.ts +210 -139
- package/src/types/rx-error.d.ts +3 -0
- package/src/types/rx-schema.d.ts +5 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["_rxError","require","_index","_index2","_mingoUpdater","updateCRDT","entry","overwritable","deepFreezeWhenDevMode","jsonSchema","collection","schema","crdt","newRxError","queryObj","crdtOptions","ensureNotFalsy","storageToken","database","incrementalModify","docData","crdtDocField","clone","getProperty","field","operation","body","toArray","creator","time","now","lastAr","operations","push","hash","hashCRDTOperations","hashFunction","runOperationOnDocument","setProperty","RX_CRDT_CONTEXT","insertCRDT","Array","isArray","insertData","result","insert","catch","err","code","doc","findOne","parameters","id","exec","sortOperationComparator","a","b","entryParts","forEach","entryPart","isMatching","selector","query","sort","skip","matcher","getQueryMatcher","ifMatch","mingoUpdater","ifNotMatch","crdts","hashObj","map","op","JSON","stringify","getCRDTSchemaPart","operationSchema","type","properties","items","additionalProperties","minItems","minimum","maximum","META_LWT_UNIX_TIME_MAX","multipleOf","required","minLength","mergeCRDTFields","crdtsA","crdtsB","length","ret","row","index","mergedOps","ids","Set","add","has","rebuildFromCRDT","base","_deleted","getCRDTConflictHandler","crdtField","getCRDTValue","objectPathMonad","conflictHandler","isEqual","ctx","resolve","i","newDocCrdt","newDocumentState","masterDocCrdt","realMasterState","mergedCrdt","mergedDoc","exports","RxDBcrdtPlugin","name","rxdb","prototypes","RxDocument","proto","oldRemove","remove","bind","$set","oldincrementalPatch","incrementalPatch","patch","oldincrementalModify","fn","context","primary","args","RxCollection","hooks","preCreateRxCollection","after","data","createRxCollection","getCrdt","isDevMode","bulkWriteBefore","storageInstance","bulkWrite","writes","Promise","all","write","newDocState","document","rebuild","docWithoutMeta","Object","entries","k","v","startsWith","deepEqual","recalculatedHash","bulkInsertBefore","bulkInsert","docsData","useDocsData","setMe","key","value","crdtOperations"],"sources":["../../../../src/plugins/crdt/index.ts"],"sourcesContent":["import { newRxError } from '../../rx-error.ts';\r\nimport type {\r\n CRDTDocumentField,\r\n CRDTEntry,\r\n CRDTOperation,\r\n FilledMangoQuery,\r\n HashFunction,\r\n JsonSchema,\r\n RxConflictHandler,\r\n RxConflictHandlerInput,\r\n RxDocument,\r\n RxDocumentData,\r\n RxJsonSchema,\r\n RxPlugin,\r\n WithDeleted\r\n} from '../../types/index.d.ts';\r\nimport {\r\n clone,\r\n deepEqual,\r\n ensureNotFalsy,\r\n getProperty,\r\n now,\r\n objectPathMonad,\r\n setProperty,\r\n toArray\r\n} from '../../plugins/utils/index.ts';\r\nimport {\r\n getQueryMatcher,\r\n META_LWT_UNIX_TIME_MAX,\r\n overwritable,\r\n RxCollection,\r\n RxDocumentWriteData,\r\n RxError\r\n} from '../../index.ts';\r\nimport { mingoUpdater } from '../update/mingo-updater.ts';\r\n\r\n\r\n\r\nexport async function updateCRDT<RxDocType>(\r\n this: RxDocument<RxDocType>,\r\n entry: CRDTEntry<RxDocType> | CRDTEntry<RxDocType>[]\r\n) {\r\n entry = overwritable.deepFreezeWhenDevMode(entry) as any;\r\n\r\n const jsonSchema = this.collection.schema.jsonSchema;\r\n if (!jsonSchema.crdt) {\r\n throw newRxError('CRDT1', {\r\n schema: jsonSchema,\r\n queryObj: entry\r\n });\r\n }\r\n const crdtOptions = ensureNotFalsy(jsonSchema.crdt);\r\n const storageToken = await this.collection.database.storageToken;\r\n\r\n return this.incrementalModify(async (docData) => {\r\n const crdtDocField: CRDTDocumentField<RxDocType> = clone(getProperty(docData as any, crdtOptions.field));\r\n const operation: CRDTOperation<RxDocType> = {\r\n body: toArray(entry),\r\n creator: storageToken,\r\n time: now()\r\n };\r\n\r\n /**\r\n * A new write will ALWAYS be an operation in the last\r\n * array which was non existing before.\r\n */\r\n const lastAr: CRDTOperation<RxDocType>[] = [operation];\r\n crdtDocField.operations.push(lastAr);\r\n crdtDocField.hash = await hashCRDTOperations(this.collection.database.hashFunction, crdtDocField);\r\n\r\n docData = runOperationOnDocument(\r\n this.collection.schema.jsonSchema,\r\n docData,\r\n operation\r\n );\r\n setProperty(docData, crdtOptions.field, crdtDocField);\r\n return docData;\r\n }, RX_CRDT_CONTEXT);\r\n}\r\n\r\n\r\nexport async function insertCRDT<RxDocType>(\r\n this: RxCollection<RxDocType>,\r\n entry: CRDTEntry<RxDocType> | CRDTEntry<RxDocType>[]\r\n) {\r\n entry = overwritable.deepFreezeWhenDevMode(entry) as any;\r\n\r\n const jsonSchema = this.schema.jsonSchema;\r\n if (!jsonSchema.crdt) {\r\n throw newRxError('CRDT1', {\r\n schema: jsonSchema,\r\n queryObj: entry\r\n });\r\n }\r\n const crdtOptions = ensureNotFalsy(jsonSchema.crdt);\r\n const storageToken = await this.database.storageToken;\r\n const operation: CRDTOperation<RxDocType> = {\r\n body: Array.isArray(entry) ? entry : [entry],\r\n creator: storageToken,\r\n time: now()\r\n };\r\n\r\n let insertData: RxDocumentWriteData<RxDocType> = {} as any;\r\n insertData = runOperationOnDocument(\r\n this.schema.jsonSchema,\r\n insertData as any,\r\n operation\r\n ) as any;\r\n const crdtDocField: CRDTDocumentField<RxDocType> = {\r\n operations: [],\r\n hash: ''\r\n };\r\n setProperty(insertData as any, crdtOptions.field, crdtDocField);\r\n\r\n const lastAr: CRDTOperation<RxDocType>[] = [operation];\r\n crdtDocField.operations.push(lastAr);\r\n crdtDocField.hash = await hashCRDTOperations(this.database.hashFunction, crdtDocField);\r\n\r\n const result = await this.insert(insertData).catch(async (err: RxError) => {\r\n if (err.code === 'CONFLICT') {\r\n // was a conflict, update document instead of inserting\r\n const doc = await this.findOne(err.parameters.id).exec(true);\r\n return doc.updateCRDT(entry);\r\n } else {\r\n throw err;\r\n }\r\n });\r\n return result;\r\n}\r\n\r\n\r\nexport function sortOperationComparator<RxDocType>(a: CRDTOperation<RxDocType>, b: CRDTOperation<RxDocType>) {\r\n return a.creator > b.creator ? 1 : -1;\r\n}\r\n\r\n\r\nfunction runOperationOnDocument<RxDocType>(\r\n schema: RxJsonSchema<RxDocumentData<RxDocType>>,\r\n docData: WithDeleted<RxDocType>,\r\n operation: CRDTOperation<RxDocType>\r\n): WithDeleted<RxDocType> {\r\n const entryParts = operation.body;\r\n entryParts.forEach(entryPart => {\r\n let isMatching: boolean;\r\n if (entryPart.selector) {\r\n const query: FilledMangoQuery<RxDocType> = {\r\n selector: ensureNotFalsy(entryPart.selector as any),\r\n sort: [],\r\n skip: 0\r\n };\r\n const matcher = getQueryMatcher(schema, query);\r\n isMatching = matcher(docData as any);\r\n } else {\r\n isMatching = true;\r\n }\r\n if (isMatching) {\r\n if (entryPart.ifMatch) {\r\n docData = mingoUpdater<WithDeleted<RxDocType>>(docData, entryPart.ifMatch);\r\n }\r\n } else {\r\n if (entryPart.ifNotMatch) {\r\n docData = mingoUpdater<WithDeleted<RxDocType>>(docData, entryPart.ifNotMatch);\r\n }\r\n }\r\n });\r\n return docData;\r\n}\r\n\r\nexport async function hashCRDTOperations(\r\n hashFunction: HashFunction,\r\n crdts: CRDTDocumentField<any>\r\n): Promise<string> {\r\n const hashObj = crdts.operations.map((operations) => {\r\n return operations.map(op => op.creator);\r\n });\r\n const hash = await hashFunction(JSON.stringify(hashObj));\r\n return hash;\r\n}\r\n\r\nexport function getCRDTSchemaPart<RxDocType>(): JsonSchema<CRDTDocumentField<RxDocType>> {\r\n const operationSchema: JsonSchema<CRDTOperation<RxDocType>> = {\r\n type: 'object',\r\n properties: {\r\n body: {\r\n type: 'array',\r\n items: {\r\n type: 'object',\r\n properties: {\r\n selector: {\r\n type: 'object'\r\n },\r\n ifMatch: {\r\n type: 'object'\r\n },\r\n ifNotMatch: {\r\n type: 'object'\r\n }\r\n },\r\n additionalProperties: false\r\n },\r\n minItems: 1\r\n },\r\n creator: {\r\n type: 'string'\r\n },\r\n time: {\r\n type: 'number',\r\n minimum: 1,\r\n maximum: META_LWT_UNIX_TIME_MAX,\r\n multipleOf: 0.01\r\n }\r\n },\r\n additionalProperties: false,\r\n required: [\r\n 'body',\r\n 'creator',\r\n 'time'\r\n ]\r\n };\r\n return {\r\n type: 'object',\r\n properties: {\r\n operations: {\r\n type: 'array',\r\n items: {\r\n type: 'array',\r\n items: operationSchema\r\n }\r\n },\r\n hash: {\r\n type: 'string',\r\n // set a minLength to not accidentally store an empty string\r\n minLength: 2\r\n }\r\n },\r\n additionalProperties: false,\r\n required: ['operations', 'hash']\r\n };\r\n}\r\n\r\n\r\nexport async function mergeCRDTFields<RxDocType>(\r\n hashFunction: HashFunction,\r\n crdtsA: CRDTDocumentField<RxDocType>,\r\n crdtsB: CRDTDocumentField<RxDocType>\r\n): Promise<CRDTDocumentField<RxDocType>> {\r\n\r\n // the value with most operations must be A to\r\n // ensure we not miss out rows when iterating over both fields.\r\n if (crdtsA.operations.length < crdtsB.operations.length) {\r\n [crdtsA, crdtsB] = [crdtsB, crdtsA];\r\n }\r\n\r\n const ret: CRDTDocumentField<RxDocType> = {\r\n operations: [],\r\n hash: ''\r\n };\r\n crdtsA.operations.forEach((row, index) => {\r\n let mergedOps: CRDTOperation<RxDocType>[] = [];\r\n const ids = new Set<string>(); // used to deduplicate\r\n\r\n row.forEach(op => {\r\n ids.add(op.creator);\r\n mergedOps.push(op);\r\n });\r\n if (crdtsB.operations[index]) {\r\n crdtsB.operations[index].forEach(op => {\r\n if (!ids.has(op.creator)) {\r\n mergedOps.push(op);\r\n }\r\n });\r\n }\r\n mergedOps = mergedOps.sort(sortOperationComparator);\r\n ret.operations[index] = mergedOps;\r\n });\r\n\r\n\r\n ret.hash = await hashCRDTOperations(hashFunction, ret);\r\n return ret;\r\n}\r\n\r\nexport function rebuildFromCRDT<RxDocType>(\r\n schema: RxJsonSchema<RxDocumentData<RxDocType>>,\r\n docData: WithDeleted<RxDocType> | RxDocType,\r\n crdts: CRDTDocumentField<RxDocType>\r\n): WithDeleted<RxDocType> {\r\n let base: WithDeleted<RxDocType> = {\r\n _deleted: false\r\n } as any;\r\n setProperty(base, ensureNotFalsy(schema.crdt).field, crdts);\r\n crdts.operations.forEach(operations => {\r\n operations.forEach(op => {\r\n base = runOperationOnDocument(\r\n schema,\r\n base,\r\n op\r\n );\r\n });\r\n });\r\n return base;\r\n}\r\n\r\n\r\nexport function getCRDTConflictHandler<RxDocType>(\r\n hashFunction: HashFunction,\r\n schema: RxJsonSchema<RxDocumentData<RxDocType>>\r\n): RxConflictHandler<RxDocType> {\r\n const crdtOptions = ensureNotFalsy(schema.crdt);\r\n const crdtField = crdtOptions.field;\r\n const getCRDTValue = objectPathMonad<WithDeleted<RxDocType> | RxDocType, CRDTDocumentField<RxDocType>>(crdtField);\r\n\r\n const conflictHandler: RxConflictHandler<RxDocType> = {\r\n isEqual(a, b, ctx) {\r\n return getCRDTValue(a).hash === getCRDTValue(b).hash;\r\n },\r\n async resolve(i) {\r\n const newDocCrdt = getCRDTValue(i.newDocumentState);\r\n const masterDocCrdt = getCRDTValue(i.realMasterState);\r\n const mergedCrdt = await mergeCRDTFields(hashFunction, newDocCrdt, masterDocCrdt);\r\n const mergedDoc = rebuildFromCRDT(\r\n schema,\r\n i.newDocumentState,\r\n mergedCrdt\r\n );\r\n return mergedDoc;\r\n }\r\n }\r\n return conflictHandler;\r\n}\r\n\r\n\r\nexport const RX_CRDT_CONTEXT = 'rx-crdt';\r\n\r\nexport const RxDBcrdtPlugin: RxPlugin = {\r\n name: 'crdt',\r\n rxdb: true,\r\n prototypes: {\r\n RxDocument: (proto: any) => {\r\n proto.updateCRDT = updateCRDT;\r\n\r\n const oldRemove = proto.remove;\r\n proto.remove = function (this: RxDocument) {\r\n if (!this.collection.schema.jsonSchema.crdt) {\r\n return oldRemove.bind(this)();\r\n }\r\n return this.updateCRDT({\r\n ifMatch: {\r\n $set: {\r\n _deleted: true\r\n }\r\n }\r\n });\r\n };\r\n\r\n const oldincrementalPatch = proto.incrementalPatch;\r\n proto.incrementalPatch = function (this: RxDocument, patch: any) {\r\n if (!this.collection.schema.jsonSchema.crdt) {\r\n return oldincrementalPatch.bind(this)(patch);\r\n }\r\n return this.updateCRDT({\r\n ifMatch: {\r\n $set: patch\r\n }\r\n });\r\n };\r\n const oldincrementalModify = proto.incrementalModify;\r\n proto.incrementalModify = function (fn: any, context: string) {\r\n if (!this.collection.schema.jsonSchema.crdt) {\r\n return oldincrementalModify.bind(this)(fn);\r\n }\r\n if (context === RX_CRDT_CONTEXT) {\r\n return oldincrementalModify.bind(this)(fn);\r\n } else {\r\n throw newRxError('CRDT2', {\r\n id: this.primary,\r\n args: { context }\r\n });\r\n }\r\n };\r\n },\r\n RxCollection: (proto: any) => {\r\n proto.insertCRDT = insertCRDT;\r\n }\r\n },\r\n overwritable: {},\r\n hooks: {\r\n preCreateRxCollection: {\r\n after: (data) => {\r\n if (!data.schema.crdt) {\r\n return;\r\n }\r\n if (data.conflictHandler) {\r\n throw newRxError('CRDT3', {\r\n collection: data.name,\r\n schema: data.schema\r\n });\r\n }\r\n data.conflictHandler = getCRDTConflictHandler(\r\n data.database.hashFunction,\r\n data.schema\r\n );\r\n }\r\n },\r\n createRxCollection: {\r\n after: ({ collection }) => {\r\n if (!collection.schema.jsonSchema.crdt) {\r\n return;\r\n }\r\n\r\n const crdtOptions = ensureNotFalsy(collection.schema.jsonSchema.crdt);\r\n const crdtField = crdtOptions.field;\r\n const getCrdt = objectPathMonad<any, CRDTDocumentField<any>>(crdtOptions.field);\r\n\r\n /**\r\n * In dev-mode we have to ensure that all document writes\r\n * have the correct crdt state so that nothing is missed out\r\n * or could accidentally do non-crdt writes to the document.\r\n */\r\n if (overwritable.isDevMode()) {\r\n const bulkWriteBefore = collection.storageInstance.bulkWrite.bind(collection.storageInstance);\r\n collection.storageInstance.bulkWrite = async function (writes, context) {\r\n\r\n await Promise.all(\r\n writes.map(async (write) => {\r\n const newDocState: typeof write.document = clone(write.document);\r\n const crdts = getCrdt(newDocState);\r\n\r\n const rebuild = rebuildFromCRDT(\r\n collection.schema.jsonSchema,\r\n newDocState,\r\n crdts\r\n );\r\n\r\n function docWithoutMeta(doc: any) {\r\n const ret: any = {};\r\n Object.entries(doc).forEach(([k, v]) => {\r\n if (\r\n !k.startsWith('_') &&\r\n typeof v !== 'undefined'\r\n ) {\r\n ret[k] = v;\r\n }\r\n });\r\n return ret;\r\n }\r\n if (!deepEqual(docWithoutMeta(newDocState), docWithoutMeta(rebuild))) {\r\n throw newRxError('SNH', {\r\n document: newDocState\r\n });\r\n }\r\n const recalculatedHash = await hashCRDTOperations(collection.database.hashFunction, crdts);\r\n if (crdts.hash !== recalculatedHash) {\r\n throw newRxError('SNH', {\r\n document: newDocState,\r\n args: { hash: crdts.hash, recalculatedHash }\r\n });\r\n }\r\n })\r\n );\r\n\r\n return bulkWriteBefore(writes, context);\r\n };\r\n }\r\n\r\n\r\n const bulkInsertBefore = collection.bulkInsert.bind(collection);\r\n collection.bulkInsert = async function (docsData: any[]) {\r\n const storageToken = await collection.database.storageToken;\r\n const useDocsData = await Promise.all(\r\n docsData.map(async (docData) => {\r\n const setMe: Partial<RxDocumentData<any>> = {};\r\n Object.entries(docData).forEach(([key, value]) => {\r\n if (\r\n !key.startsWith('_') &&\r\n key !== crdtField\r\n ) {\r\n setMe[key] = value;\r\n }\r\n });\r\n\r\n const crdtOperations: CRDTDocumentField<any> = {\r\n operations: [\r\n [{\r\n creator: storageToken,\r\n body: [{\r\n ifMatch: {\r\n $set: setMe\r\n }\r\n }],\r\n time: now()\r\n }]\r\n ],\r\n hash: ''\r\n };\r\n crdtOperations.hash = await hashCRDTOperations(collection.database.hashFunction, crdtOperations);\r\n setProperty(docData, crdtOptions.field, crdtOperations);\r\n return docData;\r\n })\r\n );\r\n return bulkInsertBefore(useDocsData);\r\n };\r\n }\r\n }\r\n }\r\n};\r\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"index.js","names":["_rxError","require","_index","_index2","_mingoUpdater","_rxSchemaHelper","updateCRDT","entry","overwritable","deepFreezeWhenDevMode","jsonSchema","collection","schema","crdt","newRxError","queryObj","crdtOptions","ensureNotFalsy","storageToken","database","incrementalModify","docData","crdtDocField","clone","getProperty","field","operation","body","toArray","creator","time","now","lastAr","operations","push","hash","hashCRDTOperations","hashFunction","runOperationOnDocument","setProperty","RX_CRDT_CONTEXT","insertCRDT","Array","isArray","insertData","result","insert","catch","err","code","doc","findOne","parameters","id","exec","sortOperationComparator","a","b","entryParts","forEach","entryPart","isMatching","selector","query","sort","skip","matcher","getQueryMatcher","ifMatch","mingoUpdater","ifNotMatch","crdts","hashObj","map","op","JSON","stringify","getCRDTSchemaPart","operationSchema","type","properties","items","additionalProperties","minItems","minimum","maximum","META_LWT_UNIX_TIME_MAX","multipleOf","required","minLength","mergeCRDTFields","crdtsA","crdtsB","length","ret","row","index","mergedOps","ids","Set","add","has","rebuildFromCRDT","base","_deleted","getCRDTConflictHandler","crdtField","getCRDTValue","objectPathMonad","conflictHandler","isEqual","ctx","resolve","i","newDocCrdt","newDocumentState","masterDocCrdt","realMasterState","mergedCrdt","mergedDoc","exports","RxDBcrdtPlugin","name","rxdb","prototypes","RxDocument","proto","oldRemove","remove","bind","$set","oldincrementalRemove","incrementalRemove","call","oldModify","modify","fn","context","primary","args","method","oldPatch","patch","oldincrementalPatch","incrementalPatch","oldincrementalModify","oldUpdate","update","updateObj","RxCollection","hooks","preCreateRxCollection","after","data","createRxCollection","getCrdt","isDevMode","bulkWriteBefore","storageInstance","bulkWrite","writes","Promise","all","write","newDocState","document","rebuild","docWithoutMeta","Object","entries","k","v","startsWith","deepEqual","recalculatedHash","bulkInsertBefore","bulkInsert","docsData","useDocsData","fillObjectWithDefaults","setMe","key","value","crdtOperations"],"sources":["../../../../src/plugins/crdt/index.ts"],"sourcesContent":["import { newRxError } from '../../rx-error.ts';\r\nimport type {\r\n CRDTDocumentField,\r\n CRDTEntry,\r\n CRDTOperation,\r\n FilledMangoQuery,\r\n HashFunction,\r\n JsonSchema,\r\n RxConflictHandler,\r\n RxConflictHandlerInput,\r\n RxDocument,\r\n RxDocumentData,\r\n RxJsonSchema,\r\n RxPlugin,\r\n WithDeleted\r\n} from '../../types/index.d.ts';\r\nimport {\r\n clone,\r\n deepEqual,\r\n ensureNotFalsy,\r\n getProperty,\r\n now,\r\n objectPathMonad,\r\n setProperty,\r\n toArray\r\n} from '../../plugins/utils/index.ts';\r\nimport {\r\n getQueryMatcher,\r\n META_LWT_UNIX_TIME_MAX,\r\n overwritable,\r\n RxCollection,\r\n RxDocumentWriteData,\r\n RxError\r\n} from '../../index.ts';\r\nimport { mingoUpdater } from '../update/mingo-updater.ts';\r\nimport { fillObjectWithDefaults } from '../../rx-schema-helper.ts';\r\n\r\n\r\n\r\nexport async function updateCRDT<RxDocType>(\r\n this: RxDocument<RxDocType>,\r\n entry: CRDTEntry<RxDocType> | CRDTEntry<RxDocType>[]\r\n) {\r\n entry = overwritable.deepFreezeWhenDevMode(entry) as any;\r\n\r\n const jsonSchema = this.collection.schema.jsonSchema;\r\n if (!jsonSchema.crdt) {\r\n throw newRxError('CRDT1', {\r\n schema: jsonSchema,\r\n queryObj: entry\r\n });\r\n }\r\n const crdtOptions = ensureNotFalsy(jsonSchema.crdt);\r\n const storageToken = await this.collection.database.storageToken;\r\n\r\n return this.incrementalModify(async (docData) => {\r\n const crdtDocField: CRDTDocumentField<RxDocType> = clone(getProperty(docData as any, crdtOptions.field));\r\n const operation: CRDTOperation<RxDocType> = {\r\n body: toArray(entry),\r\n creator: storageToken,\r\n time: now()\r\n };\r\n\r\n /**\r\n * A new write will ALWAYS be an operation in the last\r\n * array which was non existing before.\r\n */\r\n const lastAr: CRDTOperation<RxDocType>[] = [operation];\r\n crdtDocField.operations.push(lastAr);\r\n crdtDocField.hash = await hashCRDTOperations(this.collection.database.hashFunction, crdtDocField);\r\n\r\n docData = runOperationOnDocument(\r\n this.collection.schema.jsonSchema,\r\n docData,\r\n operation\r\n );\r\n setProperty(docData, crdtOptions.field, crdtDocField);\r\n return docData;\r\n }, RX_CRDT_CONTEXT);\r\n}\r\n\r\n\r\nexport async function insertCRDT<RxDocType>(\r\n this: RxCollection<RxDocType>,\r\n entry: CRDTEntry<RxDocType> | CRDTEntry<RxDocType>[]\r\n) {\r\n entry = overwritable.deepFreezeWhenDevMode(entry) as any;\r\n\r\n const jsonSchema = this.schema.jsonSchema;\r\n if (!jsonSchema.crdt) {\r\n throw newRxError('CRDT1', {\r\n schema: jsonSchema,\r\n queryObj: entry\r\n });\r\n }\r\n const crdtOptions = ensureNotFalsy(jsonSchema.crdt);\r\n const storageToken = await this.database.storageToken;\r\n const operation: CRDTOperation<RxDocType> = {\r\n body: Array.isArray(entry) ? entry : [entry],\r\n creator: storageToken,\r\n time: now()\r\n };\r\n\r\n let insertData: RxDocumentWriteData<RxDocType> = {} as any;\r\n insertData = runOperationOnDocument(\r\n this.schema.jsonSchema,\r\n insertData as any,\r\n operation\r\n ) as any;\r\n const crdtDocField: CRDTDocumentField<RxDocType> = {\r\n operations: [],\r\n hash: ''\r\n };\r\n setProperty(insertData as any, crdtOptions.field, crdtDocField);\r\n\r\n const lastAr: CRDTOperation<RxDocType>[] = [operation];\r\n crdtDocField.operations.push(lastAr);\r\n crdtDocField.hash = await hashCRDTOperations(this.database.hashFunction, crdtDocField);\r\n\r\n const result = await this.insert(insertData).catch(async (err: RxError) => {\r\n if (err.code === 'CONFLICT') {\r\n // was a conflict, update document instead of inserting\r\n const doc = await this.findOne(err.parameters.id).exec(true);\r\n return doc.updateCRDT(entry);\r\n } else {\r\n throw err;\r\n }\r\n });\r\n return result;\r\n}\r\n\r\n\r\nexport function sortOperationComparator<RxDocType>(a: CRDTOperation<RxDocType>, b: CRDTOperation<RxDocType>) {\r\n return a.creator > b.creator ? 1 : -1;\r\n}\r\n\r\n\r\nfunction runOperationOnDocument<RxDocType>(\r\n schema: RxJsonSchema<RxDocumentData<RxDocType>>,\r\n docData: WithDeleted<RxDocType>,\r\n operation: CRDTOperation<RxDocType>\r\n): WithDeleted<RxDocType> {\r\n const entryParts = operation.body;\r\n entryParts.forEach(entryPart => {\r\n let isMatching: boolean;\r\n if (entryPart.selector) {\r\n const query: FilledMangoQuery<RxDocType> = {\r\n selector: ensureNotFalsy(entryPart.selector as any),\r\n sort: [],\r\n skip: 0\r\n };\r\n const matcher = getQueryMatcher(schema, query);\r\n isMatching = matcher(docData as any);\r\n } else {\r\n isMatching = true;\r\n }\r\n if (isMatching) {\r\n if (entryPart.ifMatch) {\r\n docData = mingoUpdater<WithDeleted<RxDocType>>(docData, entryPart.ifMatch);\r\n }\r\n } else {\r\n if (entryPart.ifNotMatch) {\r\n docData = mingoUpdater<WithDeleted<RxDocType>>(docData, entryPart.ifNotMatch);\r\n }\r\n }\r\n });\r\n return docData;\r\n}\r\n\r\nexport async function hashCRDTOperations(\r\n hashFunction: HashFunction,\r\n crdts: CRDTDocumentField<any>\r\n): Promise<string> {\r\n const hashObj = crdts.operations.map((operations) => {\r\n return operations.map(op => op.creator);\r\n });\r\n const hash = await hashFunction(JSON.stringify(hashObj));\r\n return hash;\r\n}\r\n\r\nexport function getCRDTSchemaPart<RxDocType>(): JsonSchema<CRDTDocumentField<RxDocType>> {\r\n const operationSchema: JsonSchema<CRDTOperation<RxDocType>> = {\r\n type: 'object',\r\n properties: {\r\n body: {\r\n type: 'array',\r\n items: {\r\n type: 'object',\r\n properties: {\r\n selector: {\r\n type: 'object'\r\n },\r\n ifMatch: {\r\n type: 'object'\r\n },\r\n ifNotMatch: {\r\n type: 'object'\r\n }\r\n },\r\n additionalProperties: false\r\n },\r\n minItems: 1\r\n },\r\n creator: {\r\n type: 'string'\r\n },\r\n time: {\r\n type: 'number',\r\n minimum: 1,\r\n maximum: META_LWT_UNIX_TIME_MAX,\r\n multipleOf: 0.01\r\n }\r\n },\r\n additionalProperties: false,\r\n required: [\r\n 'body',\r\n 'creator',\r\n 'time'\r\n ]\r\n };\r\n return {\r\n type: 'object',\r\n properties: {\r\n operations: {\r\n type: 'array',\r\n items: {\r\n type: 'array',\r\n items: operationSchema\r\n }\r\n },\r\n hash: {\r\n type: 'string',\r\n // set a minLength to not accidentally store an empty string\r\n minLength: 2\r\n }\r\n },\r\n additionalProperties: false,\r\n required: ['operations', 'hash']\r\n };\r\n}\r\n\r\n\r\nexport async function mergeCRDTFields<RxDocType>(\r\n hashFunction: HashFunction,\r\n crdtsA: CRDTDocumentField<RxDocType>,\r\n crdtsB: CRDTDocumentField<RxDocType>\r\n): Promise<CRDTDocumentField<RxDocType>> {\r\n\r\n // the value with most operations must be A to\r\n // ensure we not miss out rows when iterating over both fields.\r\n if (crdtsA.operations.length < crdtsB.operations.length) {\r\n [crdtsA, crdtsB] = [crdtsB, crdtsA];\r\n }\r\n\r\n const ret: CRDTDocumentField<RxDocType> = {\r\n operations: [],\r\n hash: ''\r\n };\r\n crdtsA.operations.forEach((row, index) => {\r\n let mergedOps: CRDTOperation<RxDocType>[] = [];\r\n const ids = new Set<string>(); // used to deduplicate\r\n\r\n row.forEach(op => {\r\n ids.add(op.creator);\r\n mergedOps.push(op);\r\n });\r\n if (crdtsB.operations[index]) {\r\n crdtsB.operations[index].forEach(op => {\r\n if (!ids.has(op.creator)) {\r\n mergedOps.push(op);\r\n }\r\n });\r\n }\r\n mergedOps = mergedOps.sort(sortOperationComparator);\r\n ret.operations[index] = mergedOps;\r\n });\r\n\r\n\r\n ret.hash = await hashCRDTOperations(hashFunction, ret);\r\n return ret;\r\n}\r\n\r\nexport function rebuildFromCRDT<RxDocType>(\r\n schema: RxJsonSchema<RxDocumentData<RxDocType>>,\r\n docData: WithDeleted<RxDocType> | RxDocType,\r\n crdts: CRDTDocumentField<RxDocType>\r\n): WithDeleted<RxDocType> {\r\n let base: WithDeleted<RxDocType> = {\r\n _deleted: false\r\n } as any;\r\n setProperty(base, ensureNotFalsy(schema.crdt).field, crdts);\r\n crdts.operations.forEach(operations => {\r\n operations.forEach(op => {\r\n base = runOperationOnDocument(\r\n schema,\r\n base,\r\n op\r\n );\r\n });\r\n });\r\n return base;\r\n}\r\n\r\n\r\nexport function getCRDTConflictHandler<RxDocType>(\r\n hashFunction: HashFunction,\r\n schema: RxJsonSchema<RxDocumentData<RxDocType>>\r\n): RxConflictHandler<RxDocType> {\r\n const crdtOptions = ensureNotFalsy(schema.crdt);\r\n const crdtField = crdtOptions.field;\r\n const getCRDTValue = objectPathMonad<WithDeleted<RxDocType> | RxDocType, CRDTDocumentField<RxDocType>>(crdtField);\r\n\r\n const conflictHandler: RxConflictHandler<RxDocType> = {\r\n isEqual(a, b, ctx) {\r\n return getCRDTValue(a).hash === getCRDTValue(b).hash;\r\n },\r\n async resolve(i) {\r\n const newDocCrdt = getCRDTValue(i.newDocumentState);\r\n const masterDocCrdt = getCRDTValue(i.realMasterState);\r\n const mergedCrdt = await mergeCRDTFields(hashFunction, newDocCrdt, masterDocCrdt);\r\n const mergedDoc = rebuildFromCRDT(\r\n schema,\r\n i.newDocumentState,\r\n mergedCrdt\r\n );\r\n return mergedDoc;\r\n }\r\n }\r\n return conflictHandler;\r\n}\r\n\r\n\r\nexport const RX_CRDT_CONTEXT = 'rx-crdt';\r\n\r\nexport const RxDBcrdtPlugin: RxPlugin = {\r\n name: 'crdt',\r\n rxdb: true,\r\n prototypes: {\r\n RxDocument: (proto: any) => {\r\n proto.updateCRDT = updateCRDT;\r\n\r\n const oldRemove = proto.remove;\r\n proto.remove = function (this: RxDocument) {\r\n if (!this.collection.schema.jsonSchema.crdt) {\r\n return oldRemove.bind(this)();\r\n }\r\n return this.updateCRDT({\r\n ifMatch: {\r\n $set: {\r\n _deleted: true\r\n }\r\n }\r\n });\r\n };\r\n\r\n const oldincrementalRemove = proto.incrementalRemove;\r\n proto.incrementalRemove = function (this: RxDocument) {\r\n if (!this.collection.schema.jsonSchema.crdt) {\r\n return oldincrementalRemove.call(this);\r\n }\r\n return this.updateCRDT({\r\n ifMatch: {\r\n $set: {\r\n _deleted: true\r\n }\r\n }\r\n });\r\n };\r\n\r\n const oldModify = proto.modify;\r\n proto.modify = function (this: RxDocument, fn: any, context?: string) {\r\n if (!this.collection.schema.jsonSchema.crdt) {\r\n return oldModify.call(this, fn, context);\r\n }\r\n throw newRxError('CRDT4', {\r\n id: this.primary,\r\n args: { method: 'modify' }\r\n });\r\n };\r\n\r\n const oldPatch = proto.patch;\r\n proto.patch = function (this: RxDocument, patch: any) {\r\n if (!this.collection.schema.jsonSchema.crdt) {\r\n return oldPatch.call(this, patch);\r\n }\r\n return this.updateCRDT({\r\n ifMatch: {\r\n $set: patch\r\n }\r\n });\r\n };\r\n\r\n const oldincrementalPatch = proto.incrementalPatch;\r\n proto.incrementalPatch = function (this: RxDocument, patch: any) {\r\n if (!this.collection.schema.jsonSchema.crdt) {\r\n return oldincrementalPatch.bind(this)(patch);\r\n }\r\n return this.updateCRDT({\r\n ifMatch: {\r\n $set: patch\r\n }\r\n });\r\n };\r\n const oldincrementalModify = proto.incrementalModify;\r\n proto.incrementalModify = function (fn: any, context: string) {\r\n if (!this.collection.schema.jsonSchema.crdt) {\r\n return oldincrementalModify.bind(this)(fn);\r\n }\r\n if (context === RX_CRDT_CONTEXT) {\r\n return oldincrementalModify.bind(this)(fn);\r\n } else {\r\n throw newRxError('CRDT2', {\r\n id: this.primary,\r\n args: { context }\r\n });\r\n }\r\n };\r\n\r\n const oldUpdate = proto.update;\r\n proto.update = function (this: RxDocument, updateObj: any) {\r\n if (!this.collection.schema.jsonSchema.crdt) {\r\n return oldUpdate.call(this, updateObj);\r\n }\r\n return this.updateCRDT({\r\n ifMatch: updateObj\r\n });\r\n };\r\n },\r\n RxCollection: (proto: any) => {\r\n proto.insertCRDT = insertCRDT;\r\n }\r\n },\r\n overwritable: {},\r\n hooks: {\r\n preCreateRxCollection: {\r\n after: (data) => {\r\n if (!data.schema.crdt) {\r\n return;\r\n }\r\n if (data.conflictHandler) {\r\n throw newRxError('CRDT3', {\r\n collection: data.name,\r\n schema: data.schema\r\n });\r\n }\r\n data.conflictHandler = getCRDTConflictHandler(\r\n data.database.hashFunction,\r\n data.schema\r\n );\r\n }\r\n },\r\n createRxCollection: {\r\n after: ({ collection }) => {\r\n if (!collection.schema.jsonSchema.crdt) {\r\n return;\r\n }\r\n\r\n const crdtOptions = ensureNotFalsy(collection.schema.jsonSchema.crdt);\r\n const crdtField = crdtOptions.field;\r\n const getCrdt = objectPathMonad<any, CRDTDocumentField<any>>(crdtOptions.field);\r\n\r\n /**\r\n * In dev-mode we have to ensure that all document writes\r\n * have the correct crdt state so that nothing is missed out\r\n * or could accidentally do non-crdt writes to the document.\r\n */\r\n if (overwritable.isDevMode()) {\r\n const bulkWriteBefore = collection.storageInstance.bulkWrite.bind(collection.storageInstance);\r\n collection.storageInstance.bulkWrite = async function (writes, context) {\r\n\r\n await Promise.all(\r\n writes.map(async (write) => {\r\n const newDocState: typeof write.document = clone(write.document);\r\n const crdts = getCrdt(newDocState);\r\n\r\n const rebuild = rebuildFromCRDT(\r\n collection.schema.jsonSchema,\r\n newDocState,\r\n crdts\r\n );\r\n\r\n function docWithoutMeta(doc: any) {\r\n const ret: any = {};\r\n Object.entries(doc).forEach(([k, v]) => {\r\n if (\r\n !k.startsWith('_') &&\r\n typeof v !== 'undefined'\r\n ) {\r\n ret[k] = v;\r\n }\r\n });\r\n return ret;\r\n }\r\n if (!deepEqual(docWithoutMeta(newDocState), docWithoutMeta(rebuild))) {\r\n throw newRxError('SNH', {\r\n document: newDocState\r\n });\r\n }\r\n const recalculatedHash = await hashCRDTOperations(collection.database.hashFunction, crdts);\r\n if (crdts.hash !== recalculatedHash) {\r\n throw newRxError('SNH', {\r\n document: newDocState,\r\n args: { hash: crdts.hash, recalculatedHash }\r\n });\r\n }\r\n })\r\n );\r\n\r\n return bulkWriteBefore(writes, context);\r\n };\r\n }\r\n\r\n\r\n const bulkInsertBefore = collection.bulkInsert.bind(collection);\r\n collection.bulkInsert = async function (docsData: any[]) {\r\n const storageToken = await collection.database.storageToken;\r\n const useDocsData = await Promise.all(\r\n docsData.map(async (docData) => {\r\n /**\r\n * Fill schema default values before creating CRDT operations,\r\n * so that default values are captured in the operations and\r\n * will be preserved during rebuildFromCRDT (conflict resolution).\r\n */\r\n fillObjectWithDefaults(collection.schema, docData);\r\n\r\n const setMe: Partial<RxDocumentData<any>> = {};\r\n Object.entries(docData).forEach(([key, value]) => {\r\n if (\r\n !key.startsWith('_') &&\r\n key !== crdtField\r\n ) {\r\n setMe[key] = value;\r\n }\r\n });\r\n\r\n const crdtOperations: CRDTDocumentField<any> = {\r\n operations: [\r\n [{\r\n creator: storageToken,\r\n body: [{\r\n ifMatch: {\r\n $set: setMe\r\n }\r\n }],\r\n time: now()\r\n }]\r\n ],\r\n hash: ''\r\n };\r\n crdtOperations.hash = await hashCRDTOperations(collection.database.hashFunction, crdtOperations);\r\n setProperty(docData, crdtOptions.field, crdtOperations);\r\n return docData;\r\n })\r\n );\r\n return bulkInsertBefore(useDocsData);\r\n };\r\n }\r\n }\r\n }\r\n};\r\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -40,7 +40,13 @@ function checkQuery(args) {
|
|
|
40
40
|
}
|
|
41
41
|
});
|
|
42
42
|
|
|
43
|
-
|
|
43
|
+
/**
|
|
44
|
+
* Count queries cannot use skip or limit.
|
|
45
|
+
* The storage.count() method returns the total number of matching documents
|
|
46
|
+
* and is designed to ignore skip/limit (see rx-storage.interface.d.ts).
|
|
47
|
+
* This is intentional by design - count should always return the total.
|
|
48
|
+
* @intentional This is correct behavior, not a bug.
|
|
49
|
+
*/
|
|
44
50
|
if (args.op === 'count' && (args.queryObj.limit || args.queryObj.skip)) {
|
|
45
51
|
throw (0, _rxError.newRxError)('QU15', {
|
|
46
52
|
collection: args.collection.name,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"check-query.js","names":["_rxError","require","_index","_rxQueryHelper","checkQuery","args","isPlainObject","Object","prototype","toString","call","queryObj","newRxTypeError","op","collection","name","validKeys","keys","forEach","key","includes","limit","skip","newRxError","query","ensureObjectDoesNotContainRegExp","checkMangoQuery","schema","rxQuery","jsonSchema","undefinedFieldPath","findUndefinedPath","mangoQuery","field","massagedSelector","selector","schemaTopLevelFields","properties","filter","fieldOrOperator","startsWith","schemaIndexes","indexes","index","isInSchema","find","schemaIndex","deepEqual","areSelectorsSatisfiedByIndex","database","allowSlowCount","sort","map","sortPart","preparedQuery","prepareQuery","queryPlan","selectorSatisfiedByIndex","value","RegExp","Array","isArray","item","isQueryAllowed"],"sources":["../../../../src/plugins/dev-mode/check-query.ts"],"sourcesContent":["import type {\r\n RxPluginPreCreateRxQueryArgs,\r\n MangoQuery,\r\n RxPluginPrePrepareQueryArgs,\r\n FilledMangoQuery,\r\n RxJsonSchema,\r\n RxDocumentData,\r\n MangoQuerySelector,\r\n PreparedQuery,\r\n RxQueryOP,\r\n RxPluginPrePrepareRxQueryArgs\r\n} from '../../types/index.d.ts';\r\nimport { newRxError, newRxTypeError } from '../../rx-error.ts';\r\nimport { deepEqual, findUndefinedPath } from '../utils/index.ts';\r\nimport { prepareQuery } from '../../rx-query-helper.ts';\r\n\r\n/**\r\n * accidentally passing a non-valid object into the query params\r\n * is very hard to debug especially when queries are observed\r\n * This is why we do some checks here in dev-mode\r\n */\r\nexport function checkQuery(args: RxPluginPreCreateRxQueryArgs) {\r\n const isPlainObject = Object.prototype.toString.call(args.queryObj) === '[object Object]';\r\n if (!isPlainObject) {\r\n throw newRxTypeError('QU11', {\r\n op: args.op,\r\n collection: args.collection.name,\r\n queryObj: args.queryObj\r\n });\r\n }\r\n\r\n const validKeys: (keyof MangoQuery)[] = [\r\n 'selector',\r\n 'limit',\r\n 'skip',\r\n 'sort',\r\n 'index'\r\n ];\r\n Object.keys(args.queryObj).forEach(key => {\r\n if (!(validKeys as string[]).includes(key)) {\r\n throw newRxTypeError('QU11', {\r\n op: args.op,\r\n collection: args.collection.name,\r\n queryObj: args.queryObj,\r\n key,\r\n args: {\r\n validKeys\r\n }\r\n });\r\n }\r\n });\r\n\r\n // do not allow skip or limit for count queries\r\n if (\r\n args.op === 'count' &&\r\n (\r\n args.queryObj.limit ||\r\n args.queryObj.skip\r\n )\r\n ) {\r\n throw newRxError(\r\n 'QU15',\r\n {\r\n collection: args.collection.name,\r\n query: args.queryObj\r\n }\r\n );\r\n }\r\n\r\n ensureObjectDoesNotContainRegExp(args.queryObj);\r\n}\r\n\r\n\r\nexport function checkMangoQuery(args: RxPluginPrePrepareQueryArgs) {\r\n const schema = args.rxQuery.collection.schema.jsonSchema;\r\n\r\n const undefinedFieldPath = findUndefinedPath(args.mangoQuery);\r\n if (undefinedFieldPath) {\r\n throw newRxError('QU19', {\r\n field: undefinedFieldPath,\r\n query: args.mangoQuery,\r\n });\r\n }\r\n\r\n /**\r\n * Ensure that all top level fields are included in the schema.\r\n * TODO this check can be augmented to also check sub-fields.\r\n */\r\n const massagedSelector: MangoQuerySelector<any> = args.mangoQuery.selector;\r\n const schemaTopLevelFields = Object.keys(schema.properties);\r\n Object.keys(massagedSelector)\r\n // do not check operators\r\n .filter(fieldOrOperator => !fieldOrOperator.startsWith('$'))\r\n // skip this check on non-top-level fields\r\n .filter(field => !field.includes('.'))\r\n .forEach(field => {\r\n if (!schemaTopLevelFields.includes(field)) {\r\n throw newRxError('QU13', {\r\n schema,\r\n field,\r\n query: args.mangoQuery,\r\n });\r\n }\r\n });\r\n\r\n /**\r\n * ensure if custom index is set,\r\n * it is also defined in the schema\r\n */\r\n const schemaIndexes = schema.indexes ? schema.indexes : [];\r\n const index = args.mangoQuery.index;\r\n if (index) {\r\n const isInSchema = schemaIndexes.find(schemaIndex => deepEqual(schemaIndex, index));\r\n if (!isInSchema) {\r\n throw newRxError(\r\n 'QU12',\r\n {\r\n collection: args.rxQuery.collection.name,\r\n query: args.mangoQuery,\r\n schema\r\n }\r\n );\r\n }\r\n }\r\n\r\n\r\n /**\r\n * Ensure that a count() query can only be used\r\n * with selectors that are fully satisfied by the used index.\r\n */\r\n if (args.rxQuery.op === 'count') {\r\n if (\r\n !areSelectorsSatisfiedByIndex(\r\n args.rxQuery.collection.schema.jsonSchema,\r\n args.mangoQuery\r\n ) &&\r\n !args.rxQuery.collection.database.allowSlowCount\r\n ) {\r\n throw newRxError('QU14', {\r\n collection: args.rxQuery.collection,\r\n query: args.mangoQuery\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Ensure that sort only runs on known fields\r\n * TODO also check nested fields\r\n */\r\n if (args.mangoQuery.sort) {\r\n args.mangoQuery.sort\r\n .map(sortPart => Object.keys(sortPart)[0])\r\n .filter(field => !field.includes('.'))\r\n .forEach(field => {\r\n if (!schemaTopLevelFields.includes(field)) {\r\n throw newRxError('QU13', {\r\n schema,\r\n field,\r\n query: args.mangoQuery,\r\n });\r\n }\r\n });\r\n }\r\n\r\n // Do not allow RexExp instances\r\n ensureObjectDoesNotContainRegExp(args.mangoQuery);\r\n}\r\n\r\n\r\nexport function areSelectorsSatisfiedByIndex<RxDocType>(\r\n schema: RxJsonSchema<RxDocumentData<RxDocType>>,\r\n query: FilledMangoQuery<RxDocType>\r\n): boolean {\r\n const preparedQuery: PreparedQuery<any> = prepareQuery(\r\n schema,\r\n query\r\n );\r\n return preparedQuery.queryPlan.selectorSatisfiedByIndex;\r\n}\r\n\r\n/**\r\n * Ensures that the selector does not contain any RegExp instance.\r\n * @recursive\r\n */\r\nexport function ensureObjectDoesNotContainRegExp(selector: any) {\r\n if (typeof selector !== 'object' || selector === null) {\r\n return;\r\n }\r\n const keys = Object.keys(selector);\r\n keys.forEach(key => {\r\n const value: any = selector[key];\r\n if (value instanceof RegExp) {\r\n throw newRxError('QU16', {\r\n field: key,\r\n query: selector,\r\n });\r\n } else if (Array.isArray(value)) {\r\n value.forEach(item => ensureObjectDoesNotContainRegExp(item));\r\n } else {\r\n ensureObjectDoesNotContainRegExp(value);\r\n }\r\n });\r\n}\r\n\r\n\r\n/**\r\n * People often use queries wrong\r\n * so we have some checks here.\r\n * For example people use numbers as primary keys\r\n * which is not allowed.\r\n */\r\nexport function isQueryAllowed(args: RxPluginPrePrepareRxQueryArgs) {\r\n if (args.op === 'findOne') {\r\n if (\r\n typeof args.queryObj === 'number' ||\r\n Array.isArray(args.queryObj)\r\n ) {\r\n throw newRxTypeError('COL6', {\r\n collection: args.collection.name,\r\n queryObj: args.queryObj\r\n });\r\n }\r\n } else if (args.op === 'find') {\r\n if (typeof args.queryObj === 'string') {\r\n throw newRxError('COL5', {\r\n collection: args.collection.name,\r\n queryObj: args.queryObj\r\n });\r\n }\r\n }\r\n}\r\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"check-query.js","names":["_rxError","require","_index","_rxQueryHelper","checkQuery","args","isPlainObject","Object","prototype","toString","call","queryObj","newRxTypeError","op","collection","name","validKeys","keys","forEach","key","includes","limit","skip","newRxError","query","ensureObjectDoesNotContainRegExp","checkMangoQuery","schema","rxQuery","jsonSchema","undefinedFieldPath","findUndefinedPath","mangoQuery","field","massagedSelector","selector","schemaTopLevelFields","properties","filter","fieldOrOperator","startsWith","schemaIndexes","indexes","index","isInSchema","find","schemaIndex","deepEqual","areSelectorsSatisfiedByIndex","database","allowSlowCount","sort","map","sortPart","preparedQuery","prepareQuery","queryPlan","selectorSatisfiedByIndex","value","RegExp","Array","isArray","item","isQueryAllowed"],"sources":["../../../../src/plugins/dev-mode/check-query.ts"],"sourcesContent":["import type {\r\n RxPluginPreCreateRxQueryArgs,\r\n MangoQuery,\r\n RxPluginPrePrepareQueryArgs,\r\n FilledMangoQuery,\r\n RxJsonSchema,\r\n RxDocumentData,\r\n MangoQuerySelector,\r\n PreparedQuery,\r\n RxQueryOP,\r\n RxPluginPrePrepareRxQueryArgs\r\n} from '../../types/index.d.ts';\r\nimport { newRxError, newRxTypeError } from '../../rx-error.ts';\r\nimport { deepEqual, findUndefinedPath } from '../utils/index.ts';\r\nimport { prepareQuery } from '../../rx-query-helper.ts';\r\n\r\n/**\r\n * accidentally passing a non-valid object into the query params\r\n * is very hard to debug especially when queries are observed\r\n * This is why we do some checks here in dev-mode\r\n */\r\nexport function checkQuery(args: RxPluginPreCreateRxQueryArgs) {\r\n const isPlainObject = Object.prototype.toString.call(args.queryObj) === '[object Object]';\r\n if (!isPlainObject) {\r\n throw newRxTypeError('QU11', {\r\n op: args.op,\r\n collection: args.collection.name,\r\n queryObj: args.queryObj\r\n });\r\n }\r\n\r\n const validKeys: (keyof MangoQuery)[] = [\r\n 'selector',\r\n 'limit',\r\n 'skip',\r\n 'sort',\r\n 'index'\r\n ];\r\n Object.keys(args.queryObj).forEach(key => {\r\n if (!(validKeys as string[]).includes(key)) {\r\n throw newRxTypeError('QU11', {\r\n op: args.op,\r\n collection: args.collection.name,\r\n queryObj: args.queryObj,\r\n key,\r\n args: {\r\n validKeys\r\n }\r\n });\r\n }\r\n });\r\n\r\n /**\r\n * Count queries cannot use skip or limit.\r\n * The storage.count() method returns the total number of matching documents\r\n * and is designed to ignore skip/limit (see rx-storage.interface.d.ts).\r\n * This is intentional by design - count should always return the total.\r\n * @intentional This is correct behavior, not a bug.\r\n */\r\n if (\r\n args.op === 'count' &&\r\n (\r\n args.queryObj.limit ||\r\n args.queryObj.skip\r\n )\r\n ) {\r\n throw newRxError(\r\n 'QU15',\r\n {\r\n collection: args.collection.name,\r\n query: args.queryObj\r\n }\r\n );\r\n }\r\n\r\n ensureObjectDoesNotContainRegExp(args.queryObj);\r\n}\r\n\r\n\r\nexport function checkMangoQuery(args: RxPluginPrePrepareQueryArgs) {\r\n const schema = args.rxQuery.collection.schema.jsonSchema;\r\n\r\n const undefinedFieldPath = findUndefinedPath(args.mangoQuery);\r\n if (undefinedFieldPath) {\r\n throw newRxError('QU19', {\r\n field: undefinedFieldPath,\r\n query: args.mangoQuery,\r\n });\r\n }\r\n\r\n /**\r\n * Ensure that all top level fields are included in the schema.\r\n * TODO this check can be augmented to also check sub-fields.\r\n */\r\n const massagedSelector: MangoQuerySelector<any> = args.mangoQuery.selector;\r\n const schemaTopLevelFields = Object.keys(schema.properties);\r\n Object.keys(massagedSelector)\r\n // do not check operators\r\n .filter(fieldOrOperator => !fieldOrOperator.startsWith('$'))\r\n // skip this check on non-top-level fields\r\n .filter(field => !field.includes('.'))\r\n .forEach(field => {\r\n if (!schemaTopLevelFields.includes(field)) {\r\n throw newRxError('QU13', {\r\n schema,\r\n field,\r\n query: args.mangoQuery,\r\n });\r\n }\r\n });\r\n\r\n /**\r\n * ensure if custom index is set,\r\n * it is also defined in the schema\r\n */\r\n const schemaIndexes = schema.indexes ? schema.indexes : [];\r\n const index = args.mangoQuery.index;\r\n if (index) {\r\n const isInSchema = schemaIndexes.find(schemaIndex => deepEqual(schemaIndex, index));\r\n if (!isInSchema) {\r\n throw newRxError(\r\n 'QU12',\r\n {\r\n collection: args.rxQuery.collection.name,\r\n query: args.mangoQuery,\r\n schema\r\n }\r\n );\r\n }\r\n }\r\n\r\n\r\n /**\r\n * Ensure that a count() query can only be used\r\n * with selectors that are fully satisfied by the used index.\r\n */\r\n if (args.rxQuery.op === 'count') {\r\n if (\r\n !areSelectorsSatisfiedByIndex(\r\n args.rxQuery.collection.schema.jsonSchema,\r\n args.mangoQuery\r\n ) &&\r\n !args.rxQuery.collection.database.allowSlowCount\r\n ) {\r\n throw newRxError('QU14', {\r\n collection: args.rxQuery.collection,\r\n query: args.mangoQuery\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Ensure that sort only runs on known fields\r\n * TODO also check nested fields\r\n */\r\n if (args.mangoQuery.sort) {\r\n args.mangoQuery.sort\r\n .map(sortPart => Object.keys(sortPart)[0])\r\n .filter(field => !field.includes('.'))\r\n .forEach(field => {\r\n if (!schemaTopLevelFields.includes(field)) {\r\n throw newRxError('QU13', {\r\n schema,\r\n field,\r\n query: args.mangoQuery,\r\n });\r\n }\r\n });\r\n }\r\n\r\n // Do not allow RexExp instances\r\n ensureObjectDoesNotContainRegExp(args.mangoQuery);\r\n}\r\n\r\n\r\nexport function areSelectorsSatisfiedByIndex<RxDocType>(\r\n schema: RxJsonSchema<RxDocumentData<RxDocType>>,\r\n query: FilledMangoQuery<RxDocType>\r\n): boolean {\r\n const preparedQuery: PreparedQuery<any> = prepareQuery(\r\n schema,\r\n query\r\n );\r\n return preparedQuery.queryPlan.selectorSatisfiedByIndex;\r\n}\r\n\r\n/**\r\n * Ensures that the selector does not contain any RegExp instance.\r\n * @recursive\r\n */\r\nexport function ensureObjectDoesNotContainRegExp(selector: any) {\r\n if (typeof selector !== 'object' || selector === null) {\r\n return;\r\n }\r\n const keys = Object.keys(selector);\r\n keys.forEach(key => {\r\n const value: any = selector[key];\r\n if (value instanceof RegExp) {\r\n throw newRxError('QU16', {\r\n field: key,\r\n query: selector,\r\n });\r\n } else if (Array.isArray(value)) {\r\n value.forEach(item => ensureObjectDoesNotContainRegExp(item));\r\n } else {\r\n ensureObjectDoesNotContainRegExp(value);\r\n }\r\n });\r\n}\r\n\r\n\r\n/**\r\n * People often use queries wrong\r\n * so we have some checks here.\r\n * For example people use numbers as primary keys\r\n * which is not allowed.\r\n */\r\nexport function isQueryAllowed(args: RxPluginPrePrepareRxQueryArgs) {\r\n if (args.op === 'findOne') {\r\n if (\r\n typeof args.queryObj === 'number' ||\r\n Array.isArray(args.queryObj)\r\n ) {\r\n throw newRxTypeError('COL6', {\r\n collection: args.collection.name,\r\n queryObj: args.queryObj\r\n });\r\n }\r\n } else if (args.op === 'find') {\r\n if (typeof args.queryObj === 'string') {\r\n throw newRxError('COL5', {\r\n collection: args.collection.name,\r\n queryObj: args.queryObj\r\n });\r\n }\r\n }\r\n}\r\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -262,10 +262,11 @@ function checkSchema(jsonSchema) {
|
|
|
262
262
|
}
|
|
263
263
|
validateFieldsDeep(jsonSchema);
|
|
264
264
|
checkPrimaryKey(jsonSchema);
|
|
265
|
+
var primaryPath = (0, _rxSchemaHelper.getPrimaryFieldOfPrimaryKey)(jsonSchema.primaryKey);
|
|
265
266
|
Object.keys(jsonSchema.properties).forEach(key => {
|
|
266
267
|
var value = jsonSchema.properties[key];
|
|
267
268
|
// check primary
|
|
268
|
-
if (key ===
|
|
269
|
+
if (key === primaryPath) {
|
|
269
270
|
if (jsonSchema.indexes && jsonSchema.indexes.includes(key)) {
|
|
270
271
|
throw (0, _rxError.newRxError)('SC13', {
|
|
271
272
|
value,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"check-schema.js","names":["_rxError","require","_rxSchemaHelper","_index","_entityProperties","checkFieldNameRegex","fieldName","includes","newRxError","regexStr","regex","RegExp","match","validateFieldsDeep","rxJsonSchema","primaryPath","getPrimaryFieldOfPrimaryKey","primaryKey","checkField","schemaObj","path","Array","isArray","split","pop","Object","prototype","hasOwnProperty","call","type","required","length","items","isNested","default","charAt","traverse","currentObj","currentPath","keys","forEach","attributeName","properties","nextPath","checkPrimaryKey","jsonSchema","schema","validatePrimarySchemaPart","schemaPart","args","key","compositePrimaryKey","keySchemaPart","getSchemaByObjectPath","fields","field","primaryPathSchemaPart","maxLength","isFinite","getSchemaPropertyRealPath","shortPath","pathParts","realPath","i","concat","trimDots","checkSchema","_rev","version","value","indexes","unique","encrypted","rxDocumentProperties","isMaybeReadonlyArray","index","indexAsArray","multipleOf","maximum","minimum","parentPath","lastPathPart","partParts","join","parentSchemaPart","flattenObject","map","filter","elem","pos","arr","indexOf","getProperty","replace","reduce","indexPaths","currentIndex","push","indexPath","propPath"],"sources":["../../../../src/plugins/dev-mode/check-schema.ts"],"sourcesContent":["/**\r\n * does additional checks over the schema-json\r\n * to ensure nothing is broken or not supported\r\n */\r\nimport {\r\n newRxError\r\n} from '../../rx-error.ts';\r\nimport {\r\n getPrimaryFieldOfPrimaryKey,\r\n getSchemaByObjectPath\r\n} from '../../rx-schema-helper.ts';\r\nimport type {\r\n CompositePrimaryKey,\r\n JsonSchema,\r\n JsonSchemaTypes,\r\n RxJsonSchema,\r\n TopLevelProperty\r\n} from '../../types/index.d.ts';\r\nimport {\r\n flattenObject,\r\n getProperty,\r\n isMaybeReadonlyArray,\r\n trimDots\r\n} from '../../plugins/utils/index.ts';\r\nimport { rxDocumentProperties } from './entity-properties.ts';\r\n\r\n/**\r\n * checks if the fieldname is allowed\r\n * this makes sure that the fieldnames can be transformed into javascript-vars\r\n * and does not conquer the observe$ and populate_ fields\r\n * @throws {Error}\r\n */\r\nexport function checkFieldNameRegex(fieldName: string) {\r\n if (fieldName === '_deleted') {\r\n return;\r\n }\r\n\r\n if (['properties'].includes(fieldName)) {\r\n throw newRxError('SC23', {\r\n fieldName\r\n });\r\n }\r\n\r\n const regexStr = '^[a-zA-Z](?:[[a-zA-Z0-9_]*]?[a-zA-Z0-9])?$';\r\n const regex = new RegExp(regexStr);\r\n if (\r\n /**\r\n * It must be allowed to set _id as primaryKey.\r\n * This makes it sometimes easier to work with RxDB+CouchDB\r\n * @link https://github.com/pubkey/rxdb/issues/681\r\n */\r\n fieldName !== '_id' &&\r\n !fieldName.match(regex)\r\n ) {\r\n throw newRxError('SC1', {\r\n regex: regexStr,\r\n fieldName\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * validate that all schema-related things are ok\r\n */\r\nexport function validateFieldsDeep(rxJsonSchema: RxJsonSchema<any>): true {\r\n\r\n const primaryPath = getPrimaryFieldOfPrimaryKey(rxJsonSchema.primaryKey);\r\n\r\n function checkField(\r\n fieldName: string,\r\n schemaObj: JsonSchema<any>,\r\n path: string\r\n ) {\r\n if (\r\n typeof fieldName === 'string' &&\r\n typeof schemaObj === 'object' &&\r\n !Array.isArray(schemaObj) &&\r\n path.split('.').pop() !== 'patternProperties'\r\n ) checkFieldNameRegex(fieldName);\r\n\r\n // 'item' only allowed it type=='array'\r\n if (Object.prototype.hasOwnProperty.call(schemaObj, 'item') && schemaObj.type !== 'array') {\r\n throw newRxError('SC2', {\r\n fieldName\r\n });\r\n }\r\n\r\n /**\r\n * required fields cannot be set via 'required: true',\r\n * but must be set via required: []\r\n */\r\n if (\r\n Object.prototype.hasOwnProperty.call(schemaObj, 'required') &&\r\n typeof schemaObj.required === 'boolean'\r\n ) {\r\n throw newRxError('SC24', {\r\n fieldName\r\n });\r\n }\r\n\r\n // $ref is not allowed\r\n if (Object.prototype.hasOwnProperty.call(schemaObj, '$ref')) {\r\n throw newRxError('SC40', {\r\n fieldName\r\n });\r\n }\r\n\r\n\r\n // if ref given, must be type=='string', type=='array' with string-items or type==['string','null']\r\n if (Object.prototype.hasOwnProperty.call(schemaObj, 'ref')) {\r\n if (Array.isArray(schemaObj.type)) {\r\n if (schemaObj.type.length > 2 || !schemaObj.type.includes('string') || !schemaObj.type.includes('null')) {\r\n throw newRxError('SC4', {\r\n fieldName\r\n });\r\n }\r\n } else {\r\n switch (schemaObj.type) {\r\n case 'string':\r\n break;\r\n case 'array':\r\n if (\r\n !schemaObj.items ||\r\n !(schemaObj.items as any).type ||\r\n (schemaObj.items as any).type !== 'string'\r\n ) {\r\n throw newRxError('SC3', {\r\n fieldName\r\n });\r\n }\r\n break;\r\n default:\r\n throw newRxError('SC4', {\r\n fieldName\r\n });\r\n }\r\n }\r\n }\r\n\r\n const isNested = path.split('.').length >= 2;\r\n\r\n // nested only\r\n if (isNested) {\r\n if ((schemaObj as any).default) {\r\n throw newRxError('SC7', {\r\n path\r\n });\r\n }\r\n }\r\n\r\n // first level\r\n if (!isNested) {\r\n\r\n // if _id is used, it must be primaryKey\r\n if (\r\n fieldName === '_id' &&\r\n primaryPath !== '_id'\r\n ) {\r\n throw newRxError('COL2', {\r\n fieldName\r\n });\r\n }\r\n\r\n // check underscore fields\r\n if (fieldName.charAt(0) === '_') {\r\n if (\r\n // exceptional allow underscore on these fields.\r\n fieldName === '_id' ||\r\n fieldName === '_deleted'\r\n ) {\r\n return;\r\n }\r\n throw newRxError('SC8', {\r\n fieldName\r\n });\r\n }\r\n }\r\n }\r\n\r\n function traverse(currentObj: any, currentPath: any) {\r\n if (!currentObj || typeof currentObj !== 'object') {\r\n return;\r\n }\r\n Object.keys(currentObj).forEach(attributeName => {\r\n const schemaObj = currentObj[attributeName];\r\n if (\r\n !currentObj.properties &&\r\n schemaObj &&\r\n typeof schemaObj === 'object' &&\r\n !Array.isArray(currentObj)\r\n ) {\r\n checkField(\r\n attributeName,\r\n schemaObj,\r\n currentPath\r\n );\r\n }\r\n let nextPath = currentPath;\r\n if (attributeName !== 'properties') nextPath = nextPath + '.' + attributeName;\r\n traverse(schemaObj, nextPath);\r\n });\r\n }\r\n traverse(rxJsonSchema, '');\r\n return true;\r\n}\r\n\r\nexport function checkPrimaryKey(\r\n jsonSchema: RxJsonSchema<any>\r\n) {\r\n if (!jsonSchema.primaryKey) {\r\n throw newRxError('SC30', { schema: jsonSchema });\r\n }\r\n\r\n\r\n\r\n function validatePrimarySchemaPart(\r\n schemaPart: JsonSchema | TopLevelProperty\r\n ) {\r\n if (!schemaPart) {\r\n throw newRxError('SC33', { schema: jsonSchema });\r\n }\r\n\r\n const type: string = schemaPart.type as any;\r\n if (\r\n !type ||\r\n !['string', 'number', 'integer'].includes(type)\r\n ) {\r\n throw newRxError('SC32', { schema: jsonSchema, args: { schemaPart } });\r\n }\r\n }\r\n\r\n if (typeof jsonSchema.primaryKey === 'string') {\r\n const key = jsonSchema.primaryKey;\r\n const schemaPart = jsonSchema.properties[key];\r\n validatePrimarySchemaPart(schemaPart);\r\n } else {\r\n const compositePrimaryKey: CompositePrimaryKey<any> = jsonSchema.primaryKey as any;\r\n\r\n const keySchemaPart = getSchemaByObjectPath(jsonSchema, compositePrimaryKey.key);\r\n validatePrimarySchemaPart(keySchemaPart);\r\n\r\n compositePrimaryKey.fields.forEach(field => {\r\n const schemaPart = getSchemaByObjectPath(jsonSchema, field);\r\n validatePrimarySchemaPart(schemaPart);\r\n });\r\n }\r\n\r\n\r\n /**\r\n * The primary key must have a maxLength set\r\n * which is required by some RxStorage implementations\r\n * to ensure we can craft custom index strings.\r\n */\r\n const primaryPath = getPrimaryFieldOfPrimaryKey(jsonSchema.primaryKey);\r\n const primaryPathSchemaPart = jsonSchema.properties[primaryPath];\r\n if (!primaryPathSchemaPart.maxLength) {\r\n throw newRxError('SC39', { schema: jsonSchema, args: { primaryPathSchemaPart } });\r\n } else if (!isFinite(primaryPathSchemaPart.maxLength)) {\r\n throw newRxError('SC41', { schema: jsonSchema, args: { primaryPathSchemaPart } });\r\n }\r\n}\r\n\r\n/**\r\n * computes real path of the object path in the collection schema\r\n */\r\nfunction getSchemaPropertyRealPath(shortPath: string) {\r\n const pathParts = shortPath.split('.');\r\n let realPath = '';\r\n for (let i = 0; i < pathParts.length; i += 1) {\r\n if (pathParts[i] !== '[]') {\r\n realPath = realPath.concat('.properties.'.concat(pathParts[i]));\r\n } else {\r\n realPath = realPath.concat('.items');\r\n }\r\n }\r\n return trimDots(realPath);\r\n}\r\n\r\n/**\r\n * does the checking\r\n * @throws {Error} if something is not ok\r\n */\r\nexport function checkSchema(jsonSchema: RxJsonSchema<any>) {\r\n\r\n if (!jsonSchema.primaryKey) {\r\n throw newRxError('SC30', {\r\n schema: jsonSchema\r\n });\r\n }\r\n\r\n if (!Object.prototype.hasOwnProperty.call(jsonSchema, 'properties')) {\r\n throw newRxError('SC29', {\r\n schema: jsonSchema\r\n });\r\n }\r\n\r\n // _rev MUST NOT exist, it is added by RxDB\r\n if (jsonSchema.properties._rev) {\r\n throw newRxError('SC10', {\r\n schema: jsonSchema\r\n });\r\n }\r\n\r\n // check version\r\n if (!Object.prototype.hasOwnProperty.call(jsonSchema, 'version') ||\r\n typeof jsonSchema.version !== 'number' ||\r\n jsonSchema.version < 0\r\n ) {\r\n throw newRxError('SC11', {\r\n version: jsonSchema.version\r\n });\r\n }\r\n\r\n validateFieldsDeep(jsonSchema);\r\n checkPrimaryKey(jsonSchema);\r\n\r\n Object.keys(jsonSchema.properties).forEach(key => {\r\n const value: any = jsonSchema.properties[key];\r\n // check primary\r\n if (key === jsonSchema.primaryKey) {\r\n if (jsonSchema.indexes && jsonSchema.indexes.includes(key)) {\r\n throw newRxError('SC13', {\r\n value,\r\n schema: jsonSchema\r\n });\r\n }\r\n if (value.unique) {\r\n throw newRxError('SC14', {\r\n value,\r\n schema: jsonSchema\r\n });\r\n }\r\n if (jsonSchema.encrypted && jsonSchema.encrypted.includes(key)) {\r\n throw newRxError('SC15', {\r\n value,\r\n schema: jsonSchema\r\n });\r\n }\r\n if (value.type !== 'string') {\r\n throw newRxError('SC16', {\r\n value,\r\n schema: jsonSchema\r\n });\r\n }\r\n }\r\n\r\n // check if RxDocument-property\r\n if (rxDocumentProperties().includes(key)) {\r\n throw newRxError('SC17', {\r\n key,\r\n schema: jsonSchema\r\n });\r\n }\r\n });\r\n\r\n // check format of jsonSchema.indexes\r\n if (jsonSchema.indexes) {\r\n // should be an array\r\n if (!isMaybeReadonlyArray(jsonSchema.indexes)) {\r\n throw newRxError('SC18', {\r\n indexes: jsonSchema.indexes,\r\n schema: jsonSchema\r\n });\r\n }\r\n\r\n jsonSchema.indexes.forEach(index => {\r\n // should contain strings or array of strings\r\n if (!(typeof index === 'string' || Array.isArray(index))) {\r\n throw newRxError('SC19', { index, schema: jsonSchema });\r\n }\r\n // if is a compound index it must contain strings\r\n if (Array.isArray(index)) {\r\n for (let i = 0; i < index.length; i += 1) {\r\n if (typeof index[i] !== 'string') {\r\n throw newRxError('SC20', { index, schema: jsonSchema });\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * To be able to craft custom indexable string with compound fields,\r\n * we need to know the maximum fieldlength of the fields values\r\n * when they are transformed to strings.\r\n * Therefore we need to enforce some properties inside of the schema.\r\n */\r\n const indexAsArray = isMaybeReadonlyArray(index) ? index : [index];\r\n indexAsArray.forEach(fieldName => {\r\n const schemaPart = getSchemaByObjectPath(\r\n jsonSchema,\r\n fieldName\r\n );\r\n\r\n\r\n const type: JsonSchemaTypes = schemaPart.type as any;\r\n switch (type) {\r\n case 'string':\r\n const maxLength = schemaPart.maxLength;\r\n if (!maxLength) {\r\n throw newRxError('SC34', {\r\n index,\r\n field: fieldName,\r\n schema: jsonSchema\r\n });\r\n }\r\n if (maxLength > 2048) {\r\n throw newRxError('SC42', {\r\n index,\r\n field: fieldName,\r\n schema: jsonSchema\r\n });\r\n }\r\n break;\r\n case 'number':\r\n case 'integer':\r\n const multipleOf = schemaPart.multipleOf;\r\n if (!multipleOf) {\r\n throw newRxError('SC35', {\r\n index,\r\n field: fieldName,\r\n schema: jsonSchema\r\n });\r\n }\r\n const maximum = schemaPart.maximum;\r\n const minimum = schemaPart.minimum;\r\n if (\r\n typeof maximum === 'undefined' ||\r\n typeof minimum === 'undefined'\r\n ) {\r\n throw newRxError('SC37', {\r\n index,\r\n field: fieldName,\r\n schema: jsonSchema\r\n });\r\n }\r\n\r\n if (\r\n !isFinite(maximum) ||\r\n !isFinite(minimum)\r\n ) {\r\n throw newRxError('SC41', {\r\n index,\r\n field: fieldName,\r\n schema: jsonSchema\r\n });\r\n }\r\n\r\n break;\r\n case 'boolean':\r\n /**\r\n * If a boolean field is used as an index,\r\n * it must be required.\r\n */\r\n let parentPath = '';\r\n let lastPathPart = fieldName;\r\n if (fieldName.includes('.')) {\r\n const partParts = fieldName.split('.');\r\n lastPathPart = partParts.pop();\r\n parentPath = partParts.join('.');\r\n }\r\n const parentSchemaPart = parentPath === '' ? jsonSchema : getSchemaByObjectPath(\r\n jsonSchema,\r\n parentPath\r\n );\r\n\r\n if (\r\n !parentSchemaPart.required ||\r\n !parentSchemaPart.required.includes(lastPathPart)\r\n ) {\r\n throw newRxError('SC38', {\r\n index,\r\n field: fieldName,\r\n schema: jsonSchema\r\n });\r\n }\r\n break;\r\n\r\n default:\r\n throw newRxError('SC36', {\r\n fieldName,\r\n type: schemaPart.type as any,\r\n schema: jsonSchema,\r\n });\r\n }\r\n });\r\n\r\n });\r\n }\r\n\r\n // remove backward-compatibility for index: true\r\n Object.keys(flattenObject(jsonSchema))\r\n .map(key => {\r\n // flattenObject returns only ending paths, we need all paths pointing to an object\r\n const split = key.split('.');\r\n split.pop(); // all but last\r\n return split.join('.');\r\n })\r\n .filter(key => key !== '')\r\n .filter((elem, pos, arr) => arr.indexOf(elem) === pos) // unique\r\n .filter(key => { // check if this path defines an index\r\n const value = getProperty(jsonSchema, key);\r\n return value && !!value.index;\r\n })\r\n .forEach(key => { // replace inner properties\r\n key = key.replace('properties.', ''); // first\r\n key = key.replace(/\\.properties\\./g, '.'); // middle\r\n throw newRxError('SC26', {\r\n index: trimDots(key),\r\n schema: jsonSchema\r\n });\r\n });\r\n\r\n /* check types of the indexes */\r\n (jsonSchema.indexes || [])\r\n .reduce((indexPaths: string[], currentIndex) => {\r\n if (isMaybeReadonlyArray(currentIndex)) {\r\n indexPaths = indexPaths.concat(currentIndex);\r\n } else {\r\n indexPaths.push(currentIndex);\r\n }\r\n return indexPaths;\r\n }, [])\r\n .filter((elem, pos, arr) => arr.indexOf(elem) === pos) // from now on working only with unique indexes\r\n .map(indexPath => {\r\n const realPath = getSchemaPropertyRealPath(indexPath); // real path in the collection schema\r\n const schemaObj = getProperty(jsonSchema, realPath); // get the schema of the indexed property\r\n if (!schemaObj || typeof schemaObj !== 'object') {\r\n throw newRxError('SC21', {\r\n index: indexPath,\r\n schema: jsonSchema\r\n });\r\n }\r\n return { indexPath, schemaObj };\r\n })\r\n .filter(index =>\r\n index.schemaObj.type !== 'string' &&\r\n index.schemaObj.type !== 'integer' &&\r\n index.schemaObj.type !== 'number' &&\r\n index.schemaObj.type !== 'boolean'\r\n )\r\n .forEach(index => {\r\n throw newRxError('SC22', {\r\n key: index.indexPath,\r\n type: index.schemaObj.type,\r\n schema: jsonSchema\r\n });\r\n });\r\n\r\n /* ensure encrypted fields exist in the schema */\r\n if (jsonSchema.encrypted) {\r\n jsonSchema.encrypted\r\n .forEach(propPath => {\r\n // real path in the collection schema\r\n const realPath = getSchemaPropertyRealPath(propPath);\r\n // get the schema of the indexed property\r\n const schemaObj = getProperty(jsonSchema, realPath);\r\n if (!schemaObj || typeof schemaObj !== 'object') {\r\n throw newRxError('SC28', {\r\n field: propPath,\r\n schema: jsonSchema\r\n });\r\n }\r\n });\r\n }\r\n}\r\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"check-schema.js","names":["_rxError","require","_rxSchemaHelper","_index","_entityProperties","checkFieldNameRegex","fieldName","includes","newRxError","regexStr","regex","RegExp","match","validateFieldsDeep","rxJsonSchema","primaryPath","getPrimaryFieldOfPrimaryKey","primaryKey","checkField","schemaObj","path","Array","isArray","split","pop","Object","prototype","hasOwnProperty","call","type","required","length","items","isNested","default","charAt","traverse","currentObj","currentPath","keys","forEach","attributeName","properties","nextPath","checkPrimaryKey","jsonSchema","schema","validatePrimarySchemaPart","schemaPart","args","key","compositePrimaryKey","keySchemaPart","getSchemaByObjectPath","fields","field","primaryPathSchemaPart","maxLength","isFinite","getSchemaPropertyRealPath","shortPath","pathParts","realPath","i","concat","trimDots","checkSchema","_rev","version","value","indexes","unique","encrypted","rxDocumentProperties","isMaybeReadonlyArray","index","indexAsArray","multipleOf","maximum","minimum","parentPath","lastPathPart","partParts","join","parentSchemaPart","flattenObject","map","filter","elem","pos","arr","indexOf","getProperty","replace","reduce","indexPaths","currentIndex","push","indexPath","propPath"],"sources":["../../../../src/plugins/dev-mode/check-schema.ts"],"sourcesContent":["/**\r\n * does additional checks over the schema-json\r\n * to ensure nothing is broken or not supported\r\n */\r\nimport {\r\n newRxError\r\n} from '../../rx-error.ts';\r\nimport {\r\n getPrimaryFieldOfPrimaryKey,\r\n getSchemaByObjectPath\r\n} from '../../rx-schema-helper.ts';\r\nimport type {\r\n CompositePrimaryKey,\r\n JsonSchema,\r\n JsonSchemaTypes,\r\n RxJsonSchema,\r\n TopLevelProperty\r\n} from '../../types/index.d.ts';\r\nimport {\r\n flattenObject,\r\n getProperty,\r\n isMaybeReadonlyArray,\r\n trimDots\r\n} from '../../plugins/utils/index.ts';\r\nimport { rxDocumentProperties } from './entity-properties.ts';\r\n\r\n/**\r\n * checks if the fieldname is allowed\r\n * this makes sure that the fieldnames can be transformed into javascript-vars\r\n * and does not conquer the observe$ and populate_ fields\r\n * @throws {Error}\r\n */\r\nexport function checkFieldNameRegex(fieldName: string) {\r\n if (fieldName === '_deleted') {\r\n return;\r\n }\r\n\r\n if (['properties'].includes(fieldName)) {\r\n throw newRxError('SC23', {\r\n fieldName\r\n });\r\n }\r\n\r\n const regexStr = '^[a-zA-Z](?:[[a-zA-Z0-9_]*]?[a-zA-Z0-9])?$';\r\n const regex = new RegExp(regexStr);\r\n if (\r\n /**\r\n * It must be allowed to set _id as primaryKey.\r\n * This makes it sometimes easier to work with RxDB+CouchDB\r\n * @link https://github.com/pubkey/rxdb/issues/681\r\n */\r\n fieldName !== '_id' &&\r\n !fieldName.match(regex)\r\n ) {\r\n throw newRxError('SC1', {\r\n regex: regexStr,\r\n fieldName\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * validate that all schema-related things are ok\r\n */\r\nexport function validateFieldsDeep(rxJsonSchema: RxJsonSchema<any>): true {\r\n\r\n const primaryPath = getPrimaryFieldOfPrimaryKey(rxJsonSchema.primaryKey);\r\n\r\n function checkField(\r\n fieldName: string,\r\n schemaObj: JsonSchema<any>,\r\n path: string\r\n ) {\r\n if (\r\n typeof fieldName === 'string' &&\r\n typeof schemaObj === 'object' &&\r\n !Array.isArray(schemaObj) &&\r\n path.split('.').pop() !== 'patternProperties'\r\n ) checkFieldNameRegex(fieldName);\r\n\r\n // 'item' only allowed it type=='array'\r\n if (Object.prototype.hasOwnProperty.call(schemaObj, 'item') && schemaObj.type !== 'array') {\r\n throw newRxError('SC2', {\r\n fieldName\r\n });\r\n }\r\n\r\n /**\r\n * required fields cannot be set via 'required: true',\r\n * but must be set via required: []\r\n */\r\n if (\r\n Object.prototype.hasOwnProperty.call(schemaObj, 'required') &&\r\n typeof schemaObj.required === 'boolean'\r\n ) {\r\n throw newRxError('SC24', {\r\n fieldName\r\n });\r\n }\r\n\r\n // $ref is not allowed\r\n if (Object.prototype.hasOwnProperty.call(schemaObj, '$ref')) {\r\n throw newRxError('SC40', {\r\n fieldName\r\n });\r\n }\r\n\r\n\r\n // if ref given, must be type=='string', type=='array' with string-items or type==['string','null']\r\n if (Object.prototype.hasOwnProperty.call(schemaObj, 'ref')) {\r\n if (Array.isArray(schemaObj.type)) {\r\n if (schemaObj.type.length > 2 || !schemaObj.type.includes('string') || !schemaObj.type.includes('null')) {\r\n throw newRxError('SC4', {\r\n fieldName\r\n });\r\n }\r\n } else {\r\n switch (schemaObj.type) {\r\n case 'string':\r\n break;\r\n case 'array':\r\n if (\r\n !schemaObj.items ||\r\n !(schemaObj.items as any).type ||\r\n (schemaObj.items as any).type !== 'string'\r\n ) {\r\n throw newRxError('SC3', {\r\n fieldName\r\n });\r\n }\r\n break;\r\n default:\r\n throw newRxError('SC4', {\r\n fieldName\r\n });\r\n }\r\n }\r\n }\r\n\r\n const isNested = path.split('.').length >= 2;\r\n\r\n // nested only\r\n if (isNested) {\r\n if ((schemaObj as any).default) {\r\n throw newRxError('SC7', {\r\n path\r\n });\r\n }\r\n }\r\n\r\n // first level\r\n if (!isNested) {\r\n\r\n // if _id is used, it must be primaryKey\r\n if (\r\n fieldName === '_id' &&\r\n primaryPath !== '_id'\r\n ) {\r\n throw newRxError('COL2', {\r\n fieldName\r\n });\r\n }\r\n\r\n // check underscore fields\r\n if (fieldName.charAt(0) === '_') {\r\n if (\r\n // exceptional allow underscore on these fields.\r\n fieldName === '_id' ||\r\n fieldName === '_deleted'\r\n ) {\r\n return;\r\n }\r\n throw newRxError('SC8', {\r\n fieldName\r\n });\r\n }\r\n }\r\n }\r\n\r\n function traverse(currentObj: any, currentPath: any) {\r\n if (!currentObj || typeof currentObj !== 'object') {\r\n return;\r\n }\r\n Object.keys(currentObj).forEach(attributeName => {\r\n const schemaObj = currentObj[attributeName];\r\n if (\r\n !currentObj.properties &&\r\n schemaObj &&\r\n typeof schemaObj === 'object' &&\r\n !Array.isArray(currentObj)\r\n ) {\r\n checkField(\r\n attributeName,\r\n schemaObj,\r\n currentPath\r\n );\r\n }\r\n let nextPath = currentPath;\r\n if (attributeName !== 'properties') nextPath = nextPath + '.' + attributeName;\r\n traverse(schemaObj, nextPath);\r\n });\r\n }\r\n traverse(rxJsonSchema, '');\r\n return true;\r\n}\r\n\r\nexport function checkPrimaryKey(\r\n jsonSchema: RxJsonSchema<any>\r\n) {\r\n if (!jsonSchema.primaryKey) {\r\n throw newRxError('SC30', { schema: jsonSchema });\r\n }\r\n\r\n\r\n\r\n function validatePrimarySchemaPart(\r\n schemaPart: JsonSchema | TopLevelProperty\r\n ) {\r\n if (!schemaPart) {\r\n throw newRxError('SC33', { schema: jsonSchema });\r\n }\r\n\r\n const type: string = schemaPart.type as any;\r\n if (\r\n !type ||\r\n !['string', 'number', 'integer'].includes(type)\r\n ) {\r\n throw newRxError('SC32', { schema: jsonSchema, args: { schemaPart } });\r\n }\r\n }\r\n\r\n if (typeof jsonSchema.primaryKey === 'string') {\r\n const key = jsonSchema.primaryKey;\r\n const schemaPart = jsonSchema.properties[key];\r\n validatePrimarySchemaPart(schemaPart);\r\n } else {\r\n const compositePrimaryKey: CompositePrimaryKey<any> = jsonSchema.primaryKey as any;\r\n\r\n const keySchemaPart = getSchemaByObjectPath(jsonSchema, compositePrimaryKey.key);\r\n validatePrimarySchemaPart(keySchemaPart);\r\n\r\n compositePrimaryKey.fields.forEach(field => {\r\n const schemaPart = getSchemaByObjectPath(jsonSchema, field);\r\n validatePrimarySchemaPart(schemaPart);\r\n });\r\n }\r\n\r\n\r\n /**\r\n * The primary key must have a maxLength set\r\n * which is required by some RxStorage implementations\r\n * to ensure we can craft custom index strings.\r\n */\r\n const primaryPath = getPrimaryFieldOfPrimaryKey(jsonSchema.primaryKey);\r\n const primaryPathSchemaPart = jsonSchema.properties[primaryPath];\r\n if (!primaryPathSchemaPart.maxLength) {\r\n throw newRxError('SC39', { schema: jsonSchema, args: { primaryPathSchemaPart } });\r\n } else if (!isFinite(primaryPathSchemaPart.maxLength)) {\r\n throw newRxError('SC41', { schema: jsonSchema, args: { primaryPathSchemaPart } });\r\n }\r\n}\r\n\r\n/**\r\n * computes real path of the object path in the collection schema\r\n */\r\nfunction getSchemaPropertyRealPath(shortPath: string) {\r\n const pathParts = shortPath.split('.');\r\n let realPath = '';\r\n for (let i = 0; i < pathParts.length; i += 1) {\r\n if (pathParts[i] !== '[]') {\r\n realPath = realPath.concat('.properties.'.concat(pathParts[i]));\r\n } else {\r\n realPath = realPath.concat('.items');\r\n }\r\n }\r\n return trimDots(realPath);\r\n}\r\n\r\n/**\r\n * does the checking\r\n * @throws {Error} if something is not ok\r\n */\r\nexport function checkSchema(jsonSchema: RxJsonSchema<any>) {\r\n\r\n if (!jsonSchema.primaryKey) {\r\n throw newRxError('SC30', {\r\n schema: jsonSchema\r\n });\r\n }\r\n\r\n if (!Object.prototype.hasOwnProperty.call(jsonSchema, 'properties')) {\r\n throw newRxError('SC29', {\r\n schema: jsonSchema\r\n });\r\n }\r\n\r\n // _rev MUST NOT exist, it is added by RxDB\r\n if (jsonSchema.properties._rev) {\r\n throw newRxError('SC10', {\r\n schema: jsonSchema\r\n });\r\n }\r\n\r\n // check version\r\n if (!Object.prototype.hasOwnProperty.call(jsonSchema, 'version') ||\r\n typeof jsonSchema.version !== 'number' ||\r\n jsonSchema.version < 0\r\n ) {\r\n throw newRxError('SC11', {\r\n version: jsonSchema.version\r\n });\r\n }\r\n\r\n validateFieldsDeep(jsonSchema);\r\n checkPrimaryKey(jsonSchema);\r\n\r\n const primaryPath = getPrimaryFieldOfPrimaryKey(jsonSchema.primaryKey);\r\n Object.keys(jsonSchema.properties).forEach(key => {\r\n const value: any = jsonSchema.properties[key];\r\n // check primary\r\n if (key === primaryPath) {\r\n if (jsonSchema.indexes && jsonSchema.indexes.includes(key)) {\r\n throw newRxError('SC13', {\r\n value,\r\n schema: jsonSchema\r\n });\r\n }\r\n if (value.unique) {\r\n throw newRxError('SC14', {\r\n value,\r\n schema: jsonSchema\r\n });\r\n }\r\n if (jsonSchema.encrypted && jsonSchema.encrypted.includes(key)) {\r\n throw newRxError('SC15', {\r\n value,\r\n schema: jsonSchema\r\n });\r\n }\r\n if (value.type !== 'string') {\r\n throw newRxError('SC16', {\r\n value,\r\n schema: jsonSchema\r\n });\r\n }\r\n }\r\n\r\n // check if RxDocument-property\r\n if (rxDocumentProperties().includes(key)) {\r\n throw newRxError('SC17', {\r\n key,\r\n schema: jsonSchema\r\n });\r\n }\r\n });\r\n\r\n // check format of jsonSchema.indexes\r\n if (jsonSchema.indexes) {\r\n // should be an array\r\n if (!isMaybeReadonlyArray(jsonSchema.indexes)) {\r\n throw newRxError('SC18', {\r\n indexes: jsonSchema.indexes,\r\n schema: jsonSchema\r\n });\r\n }\r\n\r\n jsonSchema.indexes.forEach(index => {\r\n // should contain strings or array of strings\r\n if (!(typeof index === 'string' || Array.isArray(index))) {\r\n throw newRxError('SC19', { index, schema: jsonSchema });\r\n }\r\n // if is a compound index it must contain strings\r\n if (Array.isArray(index)) {\r\n for (let i = 0; i < index.length; i += 1) {\r\n if (typeof index[i] !== 'string') {\r\n throw newRxError('SC20', { index, schema: jsonSchema });\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * To be able to craft custom indexable string with compound fields,\r\n * we need to know the maximum fieldlength of the fields values\r\n * when they are transformed to strings.\r\n * Therefore we need to enforce some properties inside of the schema.\r\n */\r\n const indexAsArray = isMaybeReadonlyArray(index) ? index : [index];\r\n indexAsArray.forEach(fieldName => {\r\n const schemaPart = getSchemaByObjectPath(\r\n jsonSchema,\r\n fieldName\r\n );\r\n\r\n\r\n const type: JsonSchemaTypes = schemaPart.type as any;\r\n switch (type) {\r\n case 'string':\r\n const maxLength = schemaPart.maxLength;\r\n if (!maxLength) {\r\n throw newRxError('SC34', {\r\n index,\r\n field: fieldName,\r\n schema: jsonSchema\r\n });\r\n }\r\n if (maxLength > 2048) {\r\n throw newRxError('SC42', {\r\n index,\r\n field: fieldName,\r\n schema: jsonSchema\r\n });\r\n }\r\n break;\r\n case 'number':\r\n case 'integer':\r\n const multipleOf = schemaPart.multipleOf;\r\n if (!multipleOf) {\r\n throw newRxError('SC35', {\r\n index,\r\n field: fieldName,\r\n schema: jsonSchema\r\n });\r\n }\r\n const maximum = schemaPart.maximum;\r\n const minimum = schemaPart.minimum;\r\n if (\r\n typeof maximum === 'undefined' ||\r\n typeof minimum === 'undefined'\r\n ) {\r\n throw newRxError('SC37', {\r\n index,\r\n field: fieldName,\r\n schema: jsonSchema\r\n });\r\n }\r\n\r\n if (\r\n !isFinite(maximum) ||\r\n !isFinite(minimum)\r\n ) {\r\n throw newRxError('SC41', {\r\n index,\r\n field: fieldName,\r\n schema: jsonSchema\r\n });\r\n }\r\n\r\n break;\r\n case 'boolean':\r\n /**\r\n * If a boolean field is used as an index,\r\n * it must be required.\r\n */\r\n let parentPath = '';\r\n let lastPathPart = fieldName;\r\n if (fieldName.includes('.')) {\r\n const partParts = fieldName.split('.');\r\n lastPathPart = partParts.pop();\r\n parentPath = partParts.join('.');\r\n }\r\n const parentSchemaPart = parentPath === '' ? jsonSchema : getSchemaByObjectPath(\r\n jsonSchema,\r\n parentPath\r\n );\r\n\r\n if (\r\n !parentSchemaPart.required ||\r\n !parentSchemaPart.required.includes(lastPathPart)\r\n ) {\r\n throw newRxError('SC38', {\r\n index,\r\n field: fieldName,\r\n schema: jsonSchema\r\n });\r\n }\r\n break;\r\n\r\n default:\r\n throw newRxError('SC36', {\r\n fieldName,\r\n type: schemaPart.type as any,\r\n schema: jsonSchema,\r\n });\r\n }\r\n });\r\n\r\n });\r\n }\r\n\r\n // remove backward-compatibility for index: true\r\n Object.keys(flattenObject(jsonSchema))\r\n .map(key => {\r\n // flattenObject returns only ending paths, we need all paths pointing to an object\r\n const split = key.split('.');\r\n split.pop(); // all but last\r\n return split.join('.');\r\n })\r\n .filter(key => key !== '')\r\n .filter((elem, pos, arr) => arr.indexOf(elem) === pos) // unique\r\n .filter(key => { // check if this path defines an index\r\n const value = getProperty(jsonSchema, key);\r\n return value && !!value.index;\r\n })\r\n .forEach(key => { // replace inner properties\r\n key = key.replace('properties.', ''); // first\r\n key = key.replace(/\\.properties\\./g, '.'); // middle\r\n throw newRxError('SC26', {\r\n index: trimDots(key),\r\n schema: jsonSchema\r\n });\r\n });\r\n\r\n /* check types of the indexes */\r\n (jsonSchema.indexes || [])\r\n .reduce((indexPaths: string[], currentIndex) => {\r\n if (isMaybeReadonlyArray(currentIndex)) {\r\n indexPaths = indexPaths.concat(currentIndex);\r\n } else {\r\n indexPaths.push(currentIndex);\r\n }\r\n return indexPaths;\r\n }, [])\r\n .filter((elem, pos, arr) => arr.indexOf(elem) === pos) // from now on working only with unique indexes\r\n .map(indexPath => {\r\n const realPath = getSchemaPropertyRealPath(indexPath); // real path in the collection schema\r\n const schemaObj = getProperty(jsonSchema, realPath); // get the schema of the indexed property\r\n if (!schemaObj || typeof schemaObj !== 'object') {\r\n throw newRxError('SC21', {\r\n index: indexPath,\r\n schema: jsonSchema\r\n });\r\n }\r\n return { indexPath, schemaObj };\r\n })\r\n .filter(index =>\r\n index.schemaObj.type !== 'string' &&\r\n index.schemaObj.type !== 'integer' &&\r\n index.schemaObj.type !== 'number' &&\r\n index.schemaObj.type !== 'boolean'\r\n )\r\n .forEach(index => {\r\n throw newRxError('SC22', {\r\n key: index.indexPath,\r\n type: index.schemaObj.type,\r\n schema: jsonSchema\r\n });\r\n });\r\n\r\n /* ensure encrypted fields exist in the schema */\r\n if (jsonSchema.encrypted) {\r\n jsonSchema.encrypted\r\n .forEach(propPath => {\r\n // real path in the collection schema\r\n const realPath = getSchemaPropertyRealPath(propPath);\r\n // get the schema of the indexed property\r\n const schemaObj = getProperty(jsonSchema, realPath);\r\n if (!schemaObj || typeof schemaObj !== 'object') {\r\n throw newRxError('SC28', {\r\n field: propPath,\r\n schema: jsonSchema\r\n });\r\n }\r\n });\r\n }\r\n}\r\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -122,7 +122,7 @@ var ERROR_MESSAGES = exports.ERROR_MESSAGES = {
|
|
|
122
122
|
},
|
|
123
123
|
QU10: {
|
|
124
124
|
message: 'result empty and throwIfMissing: true',
|
|
125
|
-
cause: 'exec(true) was called but the document was not found.',
|
|
125
|
+
cause: 'exec(true) or remove(true) was called on a findOne() query but the document was not found.',
|
|
126
126
|
fix: 'Ensure the document exists or do not use the throwIfMissing flag.',
|
|
127
127
|
docs: ''
|
|
128
128
|
},
|
|
@@ -441,7 +441,7 @@ var ERROR_MESSAGES = exports.ERROR_MESSAGES = {
|
|
|
441
441
|
docs: 'https://rxdb.info/transactions-conflicts-revisions.html?console=errors&code=CONFLICT'
|
|
442
442
|
},
|
|
443
443
|
COL22: {
|
|
444
|
-
message: '.bulkInsert() and .bulkUpsert() cannot be run with multiple documents that have the same primary key',
|
|
444
|
+
message: '.bulkInsert() and .bulkUpsert() cannot be run with multiple documents that have the same primary key. Conflicting primary key(s) are in the error parameters (duplicateIds)',
|
|
445
445
|
cause: 'You provided multiple documents with the same primary key in a bulk write.',
|
|
446
446
|
fix: 'Ensure all documents in a bulk write have unique primary keys.',
|
|
447
447
|
docs: ''
|
|
@@ -679,6 +679,12 @@ var ERROR_MESSAGES = exports.ERROR_MESSAGES = {
|
|
|
679
679
|
fix: 'Check the password.',
|
|
680
680
|
docs: 'https://rxdb.info/encryption.html?console=errors&code=EN4'
|
|
681
681
|
},
|
|
682
|
+
EN5: {
|
|
683
|
+
message: 'Storage wrapper received a string instead of an array from the storage. This happens when a storage like OPFS is used inside of a worker and the usesRxDatabaseInWorker option is not set.',
|
|
684
|
+
cause: 'Some RxStorage implementations (like OPFS) return JSON strings instead of arrays for performance. When you wrap such a storage with encryption (or other plugins) inside of a worker, the wrapper receives the raw string and cannot process it.',
|
|
685
|
+
fix: 'Set usesRxDatabaseInWorker: true in your storage options. For example: getRxStorageOPFS({ usesRxDatabaseInWorker: true }).',
|
|
686
|
+
docs: 'https://rxdb.info/encryption.html?console=errors&code=EN5'
|
|
687
|
+
},
|
|
682
688
|
// plugins/json-dump.js
|
|
683
689
|
JD1: {
|
|
684
690
|
message: 'You must create the collections before you can import their data',
|
|
@@ -1139,6 +1145,12 @@ var ERROR_MESSAGES = exports.ERROR_MESSAGES = {
|
|
|
1139
1145
|
fix: 'Remove the custom conflict handler.',
|
|
1140
1146
|
docs: 'https://rxdb.info/crdt.html?console=errors&code=CRDT3'
|
|
1141
1147
|
},
|
|
1148
|
+
CRDT4: {
|
|
1149
|
+
message: 'RxDocument.modify() cannot be used when CRDTs are activated.',
|
|
1150
|
+
cause: 'modify() takes an arbitrary function that cannot be converted to a CRDT operation.',
|
|
1151
|
+
fix: 'Use updateCRDT() instead of modify().',
|
|
1152
|
+
docs: 'https://rxdb.info/crdt.html?console=errors&code=CRDT4'
|
|
1153
|
+
},
|
|
1142
1154
|
// plugins/storage-dexie/
|
|
1143
1155
|
DXE1: {
|
|
1144
1156
|
message: 'non-required index fields are not possible with the dexie.js RxStorage: https://github.com/pubkey/rxdb/pull/6643#issuecomment-2505310082',
|
|
@@ -1237,6 +1249,12 @@ var ERROR_MESSAGES = exports.ERROR_MESSAGES = {
|
|
|
1237
1249
|
fix: 'Try to reproduce the error in a unit test and make a PR with a test case.',
|
|
1238
1250
|
docs: 'https://rxdb.info/replication-google-drive.html?console=errors&code=GDR19'
|
|
1239
1251
|
},
|
|
1252
|
+
GDR20: {
|
|
1253
|
+
message: 'Document file update conflict',
|
|
1254
|
+
cause: 'Another client modified the document file during the transaction. This indicates a transaction timeout overlap.',
|
|
1255
|
+
fix: 'Increase the transactionTimeout or investigate why two clients are writing to the same document concurrently.',
|
|
1256
|
+
docs: 'https://rxdb.info/replication-google-drive.html?console=errors&code=GDR20'
|
|
1257
|
+
},
|
|
1240
1258
|
// plugins/replication-microsoft-onedrive
|
|
1241
1259
|
ODR1: {
|
|
1242
1260
|
message: 'Microsoft OneDrive: folderPath must not be the root folder or undefined',
|
|
@@ -1280,6 +1298,26 @@ var ERROR_MESSAGES = exports.ERROR_MESSAGES = {
|
|
|
1280
1298
|
fix: 'Check the network connection and the server logs.',
|
|
1281
1299
|
docs: ''
|
|
1282
1300
|
},
|
|
1301
|
+
// custom-index errors
|
|
1302
|
+
CI1: {
|
|
1303
|
+
message: 'Field not in schema',
|
|
1304
|
+
cause: 'The given field is not defined in the RxJsonSchema.',
|
|
1305
|
+
fix: 'Make sure the field name is spelled correctly and exists in the schema.',
|
|
1306
|
+
docs: ''
|
|
1307
|
+
},
|
|
1308
|
+
CI2: {
|
|
1309
|
+
message: 'Unknown index type',
|
|
1310
|
+
cause: 'The schema field type is not supported for indexing.',
|
|
1311
|
+
fix: 'Use a supported type (string, boolean, number, integer) for the indexed field.',
|
|
1312
|
+
docs: ''
|
|
1313
|
+
},
|
|
1314
|
+
// change-event-buffer errors
|
|
1315
|
+
COB1: {
|
|
1316
|
+
message: 'ChangeEventBuffer out of bounds',
|
|
1317
|
+
cause: 'The requested pointer is out of the change event buffer bounds.',
|
|
1318
|
+
fix: 'This means something in RxDB itself behaves wrong because any access to the api should not make an out of bounds request.',
|
|
1319
|
+
docs: ''
|
|
1320
|
+
},
|
|
1283
1321
|
/**
|
|
1284
1322
|
* Should never be thrown, use this for
|
|
1285
1323
|
* null checks etc. so you do not have to increase the
|
|
@@ -1287,9 +1325,9 @@ var ERROR_MESSAGES = exports.ERROR_MESSAGES = {
|
|
|
1287
1325
|
*/
|
|
1288
1326
|
SNH: {
|
|
1289
1327
|
message: 'This should never happen',
|
|
1290
|
-
cause: '',
|
|
1291
|
-
fix: '',
|
|
1292
|
-
docs: ''
|
|
1328
|
+
cause: 'Should never be thrown. This error code is used for internal things like null-checks etc.',
|
|
1329
|
+
fix: 'If this throws, you likely found a bug and should make a PR with a test case to the RxDB repo, so we can reproduce it.',
|
|
1330
|
+
docs: 'https://rxdb.info/contribution.html'
|
|
1293
1331
|
}
|
|
1294
1332
|
};
|
|
1295
1333
|
//# sourceMappingURL=error-messages.js.map
|